Исконт-поручение - это то, что инвесторы при проведении крупных сделок, чтобы избежать чрезмерного воздействия на рынок, автоматически разрывают большой заказ на несколько заказов, автоматически выполняют небольшие заказы в соответствии с текущей последней ценой покупки/продажи и ценовой стратегией, установленной клиентом, автоматически возобновляют заказ, когда предыдущий заказ полностью выполнен или последней ценой значительно отклоняется от текущей цены заказа. Примеры: Если число плавающих точек с однократным средним значением установлено на 10, то: Количество каждого поручения составляет от 90% до 110% от его среднего единовременного объема поручения. Цена поручения составляет 1* ((1+ глубина поручения)), после того, как последнее поручение было полностью реализовано, новое поручение производится, после чего последнее поручение автоматически отменяется и перезаказывается, когда цена последней сделки превышает глубину поручения. Заказ прекращается, когда общий объем стратегии равен его общему количеству поручений. Заказ прекращается, когда цена последней сделки на рынке ниже ее минимальной продажной цены, а заказ возобновляется после последней сделки, когда цена последней сделки снова выше минимальной продажной цены.
function CancelPendingOrders() { while (true) { var orders = _C(exchange.GetOrders); if (orders.length == 0) { return; } for (var j = 0; j < orders.length; j++) { exchange.CancelOrder(orders[j].Id); if (j < (orders.length-1)) { Sleep(Interval); } } } } var LastSellPrice = 0; var InitAccount = null; function dispatch() { var account = null; var ticker = _C(exchange.GetTicker); // 在最新成交价格距离该笔委托超过委托深度*2时自动撤单并重新进行委托 if (LastSellPrice > 0) { // 订单没有完成 if (_C(exchange.GetOrders).length > 0) { if (ticker.Last < LastSellPrice && ((LastSellPrice - ticker.Last) / ticker.Last) > (2*(EntrustDepth/100))) { Log('偏离过多, 最新成交价:', ticker.Last, '委托价', LastSellPrice); CancelPendingOrders(); } else { return true; } } else { account = _C(exchange.GetAccount); Log("卖单完成, 累计卖出:", _N(InitAccount.Stocks - account.Stocks), "平均卖出价:", _N((account.Balance - InitAccount.Balance) / (InitAccount.Stocks - account.Stocks))); } LastSellPrice = 0; } // 委托价格为最新卖1价*(1+委托深度) var SellPrice = _N(ticker.Sell * (1 + EntrustDepth/100)); if (SellPrice < MinSellPrice) { return true; } if (!account) { account = _C(exchange.GetAccount); } if ((InitAccount.Stocks - account.Stocks) >= TotalSellStocks) { return false; } var RandomAvgSellOnce = (AvgSellOnce * ((100 - FloatPoint) / 100)) + (((FloatPoint * 2) / 100) * AvgSellOnce * Math.random()); var SellAmount = Math.min(TotalSellStocks - (InitAccount.Stocks - account.Stocks), RandomAvgSellOnce); if (SellAmount < MinStock) { return false; } LastSellPrice = SellPrice; exchange.Sell(SellPrice, SellAmount, '上次成交价', ticker.Last); return true; } function main() { if (exchange.GetName().indexOf('Futures_') != -1) { throw "只支持现货"; } CancelPendingOrders(); InitAccount = _C(exchange.GetAccount); Log(InitAccount); if (InitAccount.Stocks < TotalSellStocks) { throw "账户币数不足"; } LoopInterval = Math.max(LoopInterval, 1); while (dispatch()) { Sleep(LoopInterval); } Log("委托全部完成", _C(exchange.GetAccount)); }