Заказ на покупку Айсберга

Автор:Трава, Дата: 2018-07-04 15:07:54
Тэги:Помощь в торговле

Гигантские поручения обозначают то, что инвесторы при проведении крупных сделок, чтобы избежать чрезмерного воздействия на рынок, автоматически распадают большие поручения на несколько поручений, автоматически выполняют небольшие поручения в соответствии с текущей последней ценой покупки/продажи и ценовой стратегией, установленной клиентом, автоматически возобновляют поручения, когда предыдущий поручение полностью выполнено или последней ценой значительно отклоняется от текущей цены поручения. Примеры: Если число плавающих точек с однократным средним значением установлено на 10, то: Количество каждого поручения составляет от 90% до 110% от его среднего единовременного объема поручения. Цена поручения составляет 1* (длина поручения - 1) последней покупки, после чего новый поручение выполняется после того, как все сделки предыдущего поручения были завершены, после чего последней сделки автоматически отменяется и переназначается, когда цена последней сделки превышает глубину поручения. Заказ прекращается, когда общий объем стратегических сделок равен его общему количеству поручений. Заказ прекращается, когда цена последней сделки на рынке выше ее максимальной покупной цены, а заказ возобновляется после того, как последняя сделка снова выполняется ниже максимальной покупной цены.


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));
}


Связанные

Больше