몇 개의 입점, 몇 개의 출점, 시스템 강제 입금, 강제 평형, 0 포인트 입점 구매, 8 포인트 출점 판매를 기본으로 설정, 입점 23, 출점 8을 설정하면 저녁 23시에 입점, 다음 날 8 시 출점, 8.5을 설정하면 8.5도 8시 30분 의미, 8.6을 설정하면 836점, 소수점 × 6은 분자, 스톱 손실을 금지 할 수 있습니다.
// 0 means wait buy, 1 means wait sell var state = 0; var lastBuyAmount = 0; var lastHighPrice = 0; var lastBuyPrice = 0; var initBalance = 0; function cancelAllOrders() { var orders = null; while (!(orders = exchange.GetOrders())) { Sleep(2000); } if (orders.length > 0) { for (var j = 0; j < orders.length; j++) { exchange.CancelOrder(orders[j].Id); if (j < (orders.length-1)) { Sleep(2000); } } } } function MustBuy() { var buyAmount = 0; var initAccount = _C(exchange.GetAccount); if (initBalance == 0) { initBalance = initAccount.Balance; if (initAccount.Balance < UsedFund) { throw "账户余额不足,少于设定值 " + UsedFund; } } UsedFund = Math.min(initAccount.Balance, UsedFund); var spend = 0; var buyAmount = 0; while (spend < UsedFund) { var ticker = _C(exchange.GetTicker); var amount = _N((UsedFund - spend) / (ticker.Last + SlidePrice)); if (amount < 0.001) { break; } exchange.Buy(ticker.Last + SlidePrice, amount); Sleep(RetryInterval * 1000); cancelAllOrders(); var account = _C(exchange.GetAccount); spend = initAccount.Balance - account.Balance; buyAmount = account.Stocks - initAccount.Stocks; } if (buyAmount > 0) { lastBuyPrice = lastHighPrice = (spend / buyAmount); Log("平均买入价", _N(lastHighPrice)); } return buyAmount; } function MustSell(sellAmount) { var remaind = sellAmount; var initAccount = _C(exchange.GetAccount); while (remaind >= 0.001) { var ticker = _C(exchange.GetTicker); exchange.Sell(ticker.Last - SlidePrice, remaind); Sleep(RetryInterval * 1000); cancelAllOrders(); var newAccount = _C(exchange.GetAccount); remaind -= (initAccount.Stocks - newAccount.Stocks); initAccount = newAccount; } LogProfit(initAccount.Balance - initBalance); } function onTick() { var now = new Date(); var h = now.getHours() + (now.getMinutes() / 60); if (state == 0 && ( (EnterHour < LeaveHour && h >= EnterHour && h < LeaveHour) || (EnterHour > LeaveHour && (h >= EnterHour || h < LeaveHour)) )) { lastBuyAmount = MustBuy(); state = 1; } else if (state == 1 && ( (EnterHour < LeaveHour && (h >= LeaveHour || h < EnterHour)) || (EnterHour > LeaveHour && (h >= LeaveHour && h < EnterHour)) )) { if (lastBuyAmount > 0) { MustSell(lastBuyAmount); lastBuyAmount = 0; } state = 0; } else if ((EnableStopProfit || EnableStopLoss) && lastBuyAmount > 0) { var ticker = _C(exchange.GetTicker); if (RefHigh) { lastHighPrice = Math.max(lastHighPrice, ticker.Last); } var ratioStopLoss = Math.abs((lastHighPrice - ticker.Last) / lastHighPrice); var ratioStopProfit = Math.abs((lastBuyPrice - ticker.Last) / lastBuyPrice); var shouldSell = false; if (EnableStopLoss && ticker.Last < lastHighPrice && (ratioStopLoss >= (StopLoss/100))) { // Stop loss Log("开始止损, 当前跌价点数:", _N(ratioStopLoss*100), "当前价格", ticker.Last, "对比价格", _N(lastHighPrice)); shouldSell = true; } else if (EnableStopProfit && ticker.Last > lastBuyPrice && (ratioStopProfit >= (StopProfit/100))) { // Stop loss Log("开始止赢, 当前涨价点数:", _N(ratioStopProfit*100), "当前价格", ticker.Last, "对比价格", _N(lastBuyPrice)); shouldSell = true; } if (shouldSell) { MustSell(lastBuyAmount); lastBuyAmount = 0; } } } function main() { if (EnterHour == LeaveHour) { throw "进场时间跟离场时间不能相等!"; } Log(_C(exchange.GetAccount)); while(true) { onTick(); Sleep(60000); } }