Đơ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ệt so với giá giao dịch hiện tại. Ví dụ: Nếu số điểm lơ lửng trung bình đơn được đặt là 10 thì: Số lượng của mỗi lệnh là 90% - 110% so với giá trung bình đơn đặt hàng của nó, giá đặt hàng là 1 giá mua mới nhất * ((1-thần độ đặt hàng), một lệnh mới được thực hiện sau khi lệnh trước đã hoàn tất, tự động hủy bỏ và tái đặt hàng khi giá giao dịch mới nhất vượt quá chiều sâu đặt hàng * 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)); }