氷山委託とは,投資家が大規模な取引を行うとき,市場への過剰な衝撃を避けるために,大きな注文を自動的に複数の注文に分割し,現在の最新の買/売価格と顧客が設定した価格戦略に基づいて自動的に小注文を委託し,前の注文が完全に取引された場合または最新の価格が現在の注文価格から明らかに偏った場合,自動的に再委託することを指します. 例えば: 単一平均値の浮遊点数が 10 に設定されている場合: 各委託の数は,単発委託平均値の90%~110%である.委託価格は,最新の販売価格* ((1+委託深さ) と1で,前の委託が完全に取引された後,新しい委託が実行され,最新の取引価格が,委託深さ*2を超えた場合,自動的に撤回され再委託される.戦略的総取引量は,総委託数に等しい場合,委託は停止される.市場の最新の取引価格が,最低販売価格を下回った場合,委託は停止され,最新の取引価格が最低販売価格を下回った場合,委託は再開される.
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)); }