实盘运行时, 如何限定价格的小数位

Author: Zayne, Created: 2019-11-02 15:00:19, Updated:

如题,最近在实盘动作时,经常出现报错,可能我使用的交易所价格只能有一位小数,求指点 img


More

发明者量化 https://www.fmz.com/api#setprecision

小草 先别急着运行策略,把论坛置顶的教程大概看看吧

小草 先别急着运行策略,把论坛置顶的教程大概看看吧

小草 exchange.Buy(_N(buyPrice,2),_N(buyAmount,3))

小草 公开的策略一般没有特别限制精度,对不同的币种自己手动用_N设置一下

小草 _N(2.312,1)

Zayne 基本上公开的策略好多都有这个问题,试了好几个都是这样,价格凑巧是一位小数的整数,也会成交,频繁报错,该执行买卖会执行不到位,策略完全达不到预期效果

Zayne 好的

Zayne 加代码在哪个位置 比如这个抢盘口策略 function CancelPendingOrders(orderType) { while (true) { var orders = _C(exchange.GetOrders); var count = 0; if (typeof(orderType) != 'undefined') { for (var i = 0; i < orders.length; i++) { if (orders[i].Type == orderType) { count++; } } } else { count = orders.length; } if (count == 0) { return; } for (var j = 0; j < orders.length; j++) { if (typeof(orderType) == 'undefined' || (orderType == orders[j].Type)) { exchange.CancelOrder(orders[j].Id, orders[j]); if (j < (orders.length-1)) { Sleep(Interval); } } } } } 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(netNow - netInit); } var InitAccount = null; var LastBuyPrice = 0; var LastSellPrice = 0; function onTick() { var ticker = _C(exchange.GetTicker); var BuyPrice = ticker.Buy + SlidePrice; var SellPrice = ticker.Sell - SlidePrice; // 利润消失 if ((SellPrice - BuyPrice) <= MaxDiff) { CancelPendingOrders(); return; } var cancelType = null; if (LastBuyPrice > 0 && (ticker.Buy - LastBuyPrice) > SlidePrice) { cancelType = ORDER_TYPE_BUY; } if (LastSellPrice > 0 && (LastSellPrice - ticker.Sell) > SlidePrice) { if (cancelType == null) { cancelType = ORDER_TYPE_SELL; } else { cancelType = -1; } } if (cancelType == -1) { CancelPendingOrders(); } else if (cancelType != null) { CancelPendingOrders(cancelType); } var orders = _C(exchange.GetOrders); if (orders.length == 2) { return; } var account = _C(exchange.GetAccount); var amountBuy = _N(Math.min(account.Balance / BuyPrice, Lot)); var amountSell = Math.min(account.Stocks, Lot); if (amountBuy >= MinStock) { if (orders.length == 0 || orders[0].Type == ORDER_TYPE_SELL) { if (orders.length > 0) { updateProfit(InitAccount, account, ticker); } exchange.Buy(BuyPrice, amountBuy); LastBuyPrice = BuyPrice; } } if (amountSell >= MinStock) { if (orders.length == 0 || orders[0].Type == ORDER_TYPE_BUY) { if (orders.length > 0) { updateProfit(InitAccount, account, ticker); } exchange.Sell(SellPrice, amountSell); LastSellPrice = SellPrice; } } } function onexit() { CancelPendingOrders(); } function main() { InitAccount = _C(exchange.GetAccount); Log(InitAccount); SetErrorFilter("502:|503:|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|received|EOF"); exchange.SetRate(1); LoopInterval = Math.max(LoopInterval, 1); Lot = Math.max(MinStock, Lot); while (true) { onTick(); Sleep(LoopInterval * 1000); } }