시장 전략, 가장 기본적인 시장 전략, 한 번 구매 한 번 판매 한 번 주문 한 번 구매 한 번 판매 한 번 가격 차이. 예를 들어, 현재 판매 1은 60 구매 1은 70, 이 전략은 65의 중간, 65 아래의 채무, 65 이상의 채무 주문을 요구하기 때문에 계속 주문 배열을 조정합니다. 참고: GetTicker의 구매/판매 일정한 차이는 1.6이며 실제 효과는 실제 테스트가 필요합니다.
function adjustFloat(v) { return Math.floor(v*100)/100; } function GetOrders() { var orders = null; while (!(orders = exchange.GetOrders())) { Sleep(Interval); } return orders; } function GetAccount() { var account; while (!(account = exchange.GetAccount())) { Sleep(Interval); } return account; } function GetTicker(e) { if (typeof(e) == 'undefined') { e = exchange; } var ticker; while (!(ticker = e.GetTicker())) { Sleep(Interval); } return ticker; } function updateProfit(accountInit, accountNow, ticker) { var netNow = accountNow.Balance + accountNow.FrozenBalance + ((accountNow.Stocks + accountNow.FrozenStocks) * ticker.Buy); var netInit = accountInit.Balance + accountInit.FrozenBalance + ((accountInit.Stocks + accountInit.FrozenStocks) * ticker.Buy); LogProfit(adjustFloat(netNow - netInit)); } var InitAccount = null; var LastOrdersLength = null; function onTick() { var ticker = GetTicker(); var account = GetAccount(); var orders = GetOrders(); if (LastOrdersLength != null && LastOrdersLength != orders.length) { updateProfit(InitAccount, account, ticker); } LastOrdersLength = orders.length; var mid = adjustFloat(ticker.Buy + ((ticker.Sell - ticker.Buy) / 2)); var numBuy = parseInt(Math.min(MaxNets / 2 , (mid - ticker.Buy) / Step, account.Balance / ticker.Buy / Lot)); var numSell = parseInt(Math.min(MaxNets / 2, account.Stocks / Lot)); var num = Math.max(numBuy, numSell); var ordersKeep = []; var queue = []; for (var i = 1; i < num; i++) { var buyPrice = adjustFloat(mid - (i * Step)); var sellPrice = adjustFloat(mid + (i * Step)); var alreadyBuy = false; var alreadySell = false; for (j = 0; j < orders.length; j++) { if (orders[j].Type == ORDER_TYPE_BUY) { if (Math.abs(orders[j].Price - buyPrice) < (Step / 2)) { alreadyBuy = true; ordersKeep.push(orders[j].Id); } } else { if (Math.abs(orders[j].Price - sellPrice) < (Step / 2)) { alreadySell = true; ordersKeep.push(orders[j].Id); } } } if ((!alreadyBuy) && (i < numBuy)) { queue.push([buyPrice, ORDER_TYPE_BUY]); } if ((!alreadySell) && (i < numSell)) { queue.push([sellPrice, ORDER_TYPE_SELL]); } } for (var i = 0; i < orders.length; i++) { var keep = false; for (var j = 0; j < ordersKeep.length; j++) { if (orders[i].Id == ordersKeep[j]) { keep = true; } } if (!keep) { exchange.CancelOrder(orders[i].Id); LastOrdersLength--; } } for (var i = 0; i < queue.length; i++) { if (queue[i][1] == ORDER_TYPE_BUY) { exchange.Buy(queue[i][0], Lot); } else { exchange.Sell(queue[i][0], Lot); } LastOrdersLength++; } } function main() { if (DisableLog) { EnableLog(false); } InitAccount = GetAccount(); Log(InitAccount); LoopInterval = Math.max(LoopInterval, 1); Lot = Math.max(MinStock, Lot); while (true) { onTick(); Sleep(LoopInterval * 1000); } }
813380629미래에 사용할 수 없습니다, 변경되지 않습니다