氷山委託とは,投資家が大規模な取引を行うとき,市場への過剰な衝撃を避けるために,大きな注文を自動的に複数の注文に分割し,現在の最新の買/売価格と顧客が設定した価格戦略に基づいて自動的に小注文を委託し,前の注文が完全に取引された場合または最新の価格が現在の注文価格から明らかに偏った場合,自動的に再委託することを指します. 例えば: 単一平均値の浮遊点数が 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 LastBuyPrice = 0; var InitAccount = null; function dispatch() { var account = null; var ticker = _C(exchange.GetTicker); if (LastBuyPrice > 0) { if (_C(exchange.GetOrders).length > 0) { if (ticker.Last > LastBuyPrice && ((ticker.Last - LastBuyPrice) / LastBuyPrice) > (2*(EntrustDepth/100))) { Log('deviate to much, newest last price:', ticker.Last, 'order buy price', LastBuyPrice); CancelPendingOrders(); } else { return true; } } else { account = _C(exchange.GetAccount); Log("order finised, total cost:", _N(InitAccount.Balance - account.Balance), "avg buy price:", _N((InitAccount.Balance - account.Balance) / (account.Stocks - InitAccount.Stocks))); } LastBuyPrice = 0; } var BuyPrice = _N(ticker.Buy * (1 - EntrustDepth/100),PricePerision); if (BuyPrice > MaxBuyPrice) { return true; } if (!account) { account = _C(exchange.GetAccount); } if ((InitAccount.Balance - account.Balance) >= TotalBuyNet) { return false; } var RandomAvgBuyOnce = (AvgBuyOnce * ((100 - FloatPoint) / 100)) + (((FloatPoint * 2) / 100) * AvgBuyOnce * Math.random()); var UsedMoney = Math.min(account.Balance, RandomAvgBuyOnce, TotalBuyNet - (InitAccount.Balance - account.Balance)); var BuyAmount = _N(UsedMoney / BuyPrice, 3); if (BuyAmount < MinStock) { return false; } LastBuyPrice = BuyPrice; exchange.Buy(BuyPrice, BuyAmount, 'Cost: ', _N(UsedMoney), 'last price', ticker.Last); return true; } function main() { CancelPendingOrders(); InitAccount = _C(exchange.GetAccount); Log(InitAccount); if (InitAccount.Balance < TotalBuyNet) { throw "balance not enough"; } LoopInterval = Math.max(LoopInterval, 1); while (dispatch()) { Sleep(LoopInterval * 1000); } Log("All Done", _C(exchange.GetAccount)); }