Đơn đặt hàng núi băng đề cập đến việc nhà đầu tư trong khi thực hiện giao dịch lớn, để tránh gây ra một cú sốc quá lớn cho thị trường, tự động phân chia đơn đặt hàng lớn thành nhiều đơn đặt hàng, tự động thực hiện đơn đặt hàng nhỏ theo giá mua / bán mới nhất hiện tại và chiến lược giá được đặt ra bởi khách hàng, tự động thực hiện lại đơn đặt hàng khi đơn đặt hàng trước đó được hoàn thành hoàn toàn hoặc giá mới nhất đi xa rõ ràng so với giá giao dịch hiện tại. Ví dụ: Nếu số điểm lơ lửng trung bình duy nhất được đặt là 10: Số lượng mỗi lệnh là 90% - 110% so với giá trung bình đơn đặt hàng của nó, giá giao dịch là giá bán gần nhất 1* ((1+ độ sâu giao dịch), một lệnh mới được thực hiện sau khi lệnh trước đã được giao dịch hoàn toàn, tự động bị hủy bỏ và tái giao dịch khi giá giao dịch gần nhất vượt quá độ sâu giao dịch * 2; lệnh dừng khi tổng khối lượng giao dịch chiến lược bằng với tổng số lệnh của nó. Khi giá giao dịch mới nhất trên thị trường thấp hơn giá bán thấp nhất của nó, lệnh ngừng giao dịch, lệnh bắt đầu lại sau khi giá giao dịch mới nhất cao hơn mức bán thấp nhất.
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)); }