Стратегия комиссии по айсбергу

Автор:Доброта, Создано: 2018-08-29 10:37:14, Обновлено: 2019-12-03 17:29:30

Стратегия комиссии по айсбергуwww.fmz.comПроцентная комиссия относится к крупномасштабной сделке инвестора, для того чтобы избежать чрезмерного воздействия на рынок, большая единая комиссия автоматически разделяется один большой заказ на несколько небольших заказов, в соответствии с текущей последней ценой покупки / продажи и ценой, установленной клиентом. Стратегия автоматически выполняет делегирование небольших заказов и автоматически переставляет заказы, когда предыдущий заказ полностью продан или последняя цена значительно отклоняется от текущей цены размещения.

Пример: Если плавающая точка средней величины установлена на 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));
}

Больше

Маленькие мечтыОтлично!