Los encargos de la montaña de hielo se refieren a que los inversores, cuando realizan transacciones masivas, para evitar causar un impacto excesivo en el mercado, desglosan automáticamente el encargo de la orden grande en varios encargos, realizan automáticamente el encargo pequeño de acuerdo con el último precio de compra / venta actual y la estrategia de precios establecida por el cliente, y vuelven a realizar el encargo automáticamente cuando el último encargo se haya completado o el último precio se desvíe significativamente del precio del encargo actual. Ejemplos: Si el número de puntos flotantes de un solo promedio se establece en 10, entonces: El número de pedidos es del 90% al 110% de su promedio de pedidos únicos, el precio de compra más reciente es de 1* (aproximadamente 1-profundidad de pedido), se realiza un nuevo pedido después de que se haya completado todo el pedido anterior, se retira automáticamente y se vuelve a realizar el pedido cuando el precio de la última transacción excede la profundidad de pedido * 2; el pedido se detiene cuando el total de transacciones estratégicas es igual a su cantidad total de pedidos. El pedido se detiene cuando el precio de la última transacción en el mercado es mayor que su precio de compra más alto, y se reanuda después de que el precio de entrega más reciente sea inferior al precio de compra más alto.
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)); }