A estratégia da Comissão do iceberg

Autora:Bem-estar, Criado: 2018-08-29 10:37:14, Atualizado: 2019-12-03 17:29:30

A estratégia da Comissão do icebergwww.fmz.comA comissão iceberg refere-se à transação em grande escala do investidor, a fim de evitar um impacto excessivo no mercado, a grande comissão única é automaticamente dividida uma grande ordem em várias pequenas ordens, de acordo com o último preço de compra/venda atual e o preço de fixação do cliente. A estratégia realiza automaticamente a delegação de pequenas ordens e automaticamente re-coloca as ordens quando a ordem anterior é completamente vendida ou o último preço se desvia significativamente do preço de colocação atual.

Exemplo: Se o ponto flutuante da média única for definido em 10, então:

O número de cada colocação é de 90% ~ 110% do valor médio da colocação única, e o preço de colocação é o último preço de compra digamos 1 vez (menos 1 profundidade de delegação), e uma nova colocação é feita após a última colocação ser concluída. automaticamente retirar a ordem e re-colocação quando o último preço de transação é maior que a profundidade de colocação * 2.

A colocação é interrompida quando o volume total da estratégia é igual ao seu número total de ordens. Quando o último preço de transação do mercado é superior ao seu preço máximo de compra, a comissão é interrompida e a comissão é retomada após o último preço de transação ser inferior ao preço de compra mais 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));
}

Mais.

Sonhos pequenos- Óptimo!