可以选择在几点进场,几点离场,系统强制建仓,强制平仓,会不停的尝试建仓与平仓, 默认0点进场买,8点出场卖, 设置成进场23,离场8意思就晚上23点进场,第二天8点离场, 如果设置也8.5就是8点半的意思, 设置成8.6就是8点36分,小数点位乘6就是分钟数,止损可以禁止如果勾掉开启止损,止损点如果为0.1表示如果跌0.1%就强制卖出。如果止损价参考最高价,意思就是比如1000买进的,涨到2000了,如果2000跌了0.1%就止损,如果不参考最高价,就是比平均买入价跌了0.1%就止损.
// 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); } }template: strategy.tpl:40:21: executing "strategy.tpl" at <.api.GetStrategyListByName>: wrong number of args for GetStrategyListByName: want 7 got 6