निवेश के लिए एक पूंजी सीमा सेट करें, जैसे 10,000 युआन; एक धन और बिटकॉइन के मूल्य अनुपात सेट करें, जैसे 50:50; वर्तमान मूल्य के आधार पर धन और बिटकॉइन के मूल्य अनुपात को बनाए रखें।
उदाहरण के लिए, यदि प्रारंभिक पूंजी 10,000 यूरो है, तो धन और बिटकॉइन का अनुपात 30:70 है, और पहले लेनदेन में 7,000 यूरो बिटकॉइन खरीदे गए हैं (मान लें कि सिक्का की कीमत 1,000 यूरो है, 7 सिक्के खरीदे गए हैं), शेष धन 3,000 यूरो है, और अनुपात 30:70 है।
अगले ट्रेडिंग चक्र में, मान लीजिए कि सिक्का 1500 युआन में बदल जाता है, तो कुल मूल्य 1500 में बदल जाता है।7 + 3000 = 13500, तो हाथ में धनराशि 13500 रखना चाहिए0.3 = 4050 युआन, तो 4050 - 3000 = 1050 बिटकॉइन बेचे जाने चाहिए, बेचे जाने की संख्या 1050/1500 = 0.7 है, हाथ में शेष बिटकॉइन 7-0.7 = 6.3 हैं, सिक्के का मूल्य 6.3 * 1500 = 9450 है। धन और बिटकॉइन मूल्य का अनुपात 4050:9450 = 30:70 है।
इसी तरह, जब मुद्रा का मूल्य गिरता है, तो यह अनुपात बनाए रखने के लिए खरीदा जाता है।
var initAccount = null; var initPrice = 0; var stockHold = 0; var moneyHold = 0; var lastOrderID = null; var prices = []; function AdjustFloat(v) { return Math.floor(v * 1000) / 1000; } function GetAccount() { var account = null; while (!(account = exchange.GetAccount())) { Log('Get Account Error'); Sleep(ErrorInterval); } return account; } function GetCurrentPrice() { var ticker = null; while (!(ticker = exchange.GetTicker())) { Log('Get Ticker Error'); Sleep(ErrorInterval); } return AdjustFloat(ticker.Last); } function GetOrders() { var orders = null; while (!(orders = exchange.GetOrders())) { Log('Get Orders Error'); Sleep(ErrorInterval); } return orders; } function CancelPendingOrders() { while (true) { var orders = GetOrders(); if (orders.length === 0) { return; } for (var i = 0; i < orders.length; i++) { exchange.CancelOrder(orders[i].Id); if (i < (orders.length - 1)) { Sleep(ErrorInterval); } } } } function GetStatus() { var price = GetCurrentPrice(); var initStockValue = InitStock + InitMoney / initPrice; var initMoneyValue = InitMoney + InitStock * initPrice; var stockValueNow = stockHold + moneyHold / price; var moneyValueNow = stockHold * price + moneyHold; var stockEarned = stockValueNow - initStockValue; var moneyEarned = moneyValueNow - initMoneyValue; var averagePrice = 0; var alpha = (stockHold - InitStock) * (price - initPrice); var beta = moneyEarned - alpha; var sum = 0; if (prices.length > 0) { for (var i = prices.length - 1; i >= 0; i--) { sum += prices[i]; } averagePrice = sum / prices.length; } var logString = 'Stock Holding:' + AdjustFloat(stockHold) + '\n'; logString += 'Money Holding:' + AdjustFloat(moneyHold) + '\n'; logString += 'Stock Earned:' + AdjustFloat(stockEarned) + '\n'; logString += 'Money Earned:' + AdjustFloat(moneyEarned) + '\n'; logString += 'History Average price:' + averagePrice + '\n'; logString += 'Current Price:' + price + '\n'; logString += 'Alpha:' + alpha + '\n'; logString += 'Beta:' + beta; LogProfit(moneyEarned); return logString; } function CaculateHoldings() { CancelPendingOrders(); if (lastOrderID) { var order = exchange.GetOrder(lastOrderID); Log('last order:', order); if (order.Status === ORDER_STATE_CLOSED) { if (order.Type === ORDER_TYPE_BUY) { //Buy stockHold += order.DealAmount; moneyHold -= order.DealAmount * order.Price; Log("Order Buy. stockHold +=:", order.DealAmount, ',Money -=:', order.DealAmount * order.Price); } else { //Sell stockHold -= order.DealAmount; moneyHold += order.DealAmount * order.Price; Log("Order Sell. stockHold -=:", order.DealAmount, ',Money +=:', order.DealAmount * order.Price); } } } } function OnTick() { var currentPrice = GetCurrentPrice(); prices.push(currentPrice); //Log('History prices:',prices); var stockValue = 0; var totalValue = 0; var ratio = 0; stockValue = stockHold * currentPrice; totalValue = stockValue + moneyHold; ratio = stockValue / totalValue; Log('Current Price:', currentPrice); Log('stockHold:', stockHold); Log('moneyHold:', moneyHold); Log('stockValue:', stockValue); Log('Current Ratio:', ratio); if (ratio > StockRatio) { //Sell Log('Current ratio > StockRatio'); var sellAmt = (stockValue - totalValue * StockRatio) / (currentPrice - SlidePrice); lastOrderID = exchange.Sell(currentPrice - SlidePrice, sellAmt); } else { //Buy Log('Current ratio < StockRatio'); var buyAmt = (totalValue * StockRatio - stockValue) / (currentPrice + SlidePrice); lastOrderID = exchange.Buy(currentPrice + SlidePrice, buyAmt); } Log('Order ID:', lastOrderID); CaculateHoldings(); } function main() { if (InitStock < 0) { Log('Stock less than zero.'); return; } if (InitMoney < 0) { Log('Money less than zero.'); } //if(InvestInterval < 0){ // Log('InvestInterval less than zero.'); //} if (ErrorInterval < 0) { Log('ErrorInterval less than zero.'); } if (StockRatio < 0 || StockRatio > 1) { Log('StockRatio should be a number from 0 to 1.'); } EnableLogLocal(true); SetFailover(true); exchange.IO("websocket"); Log(exchange.GetName(), exchange.GetCurrency()); initAccount = _G('InitAccount'); if (initAccount === null) { initAccount = GetAccount(); _G('InitAccount', initAccount); } Log('InitAccount', initAccount); initPrice = _G('InitPrice'); if (initPrice === null) { initPrice = GetCurrentPrice(); _G('InitPrice', initPrice); } Log('InitPrice', initPrice); if (UseAccount) { InitMoney = initAccount.Balance + initAccount.FrozenBalance; InitStock = initAccount.Stocks + initAccount.FrozenStocks; } Log('InitMoney:', InitMoney); Log('InitStock:', InitStock); stockHold = _G('StockHold'); if (stockHold === null) { stockHold = InitStock; Log('Set Stock Hold', stockHold); } moneyHold = _G('MoneyHold'); if (moneyHold === null) { moneyHold = InitMoney; Log('Set Money Hold', moneyHold); } if (_G('Prices') !== null) { prices = _G('Prices'); } while (true) { OnTick(); LogStatus(GetStatus()); Sleep(InvestInterval * 1000 * 60); } } function onexit() { _G('StockHold', stockHold); _G('MoneyHold', moneyHold); //_G('Prices',prices); Log('Set Stock Hold', stockHold); Log('Set Money Hold', moneyHold); Log('Set prices:', prices); Log('Robot Stopped!#ff0000@'); }