Die Strategie der Eisbergkommission

Schriftsteller:Gutes, Erstellt: 2018-08-29 10:37:14, Aktualisiert: 2019-12-03 17:29:30

Die Strategie der Eisbergkommissionwww.fmz.comDie Iceberg-Provision bezieht sich auf die Investors groß angelegte Transaktion, um zu vermeiden, dass übermäßige Auswirkungen auf den Markt, die große einzelne Provision ist automatisch aufgeteilt ein großer Auftrag in mehrere kleine Aufträge, nach dem aktuellen letzten Kauf / Verkauf Preis und Kunden-Einstellungspreis. Die Strategie automatisch führt die kleine Auftrag Delegation, und automatisch wieder zu platzieren die Aufträge, wenn die vorherige Bestellung vollständig verkauft ist oder der letzte Preis deutlich vom aktuellen Platzierungspreis abweicht.

Beispiel: Wenn der gleitende Durchschnittswert auf 10 gesetzt ist, dann:

Die Anzahl jeder Platzierung beträgt 90%~110% des Durchschnittswerts der einzelnen Platzierung, und der Platzierungspreis ist der letzte Kaufpreis, sagen wir 1 Mal (minus 1 Delegationstiefe), und ein neues Platzierungsangebot wird nach Abschluss der letzten Platzierung vorgenommen. automatisch den Auftrag zurückziehen und erneut platzieren, wenn der letzte Transaktionspreis die Platzierungstiefe * 2 übersteigt.

Die Platzierung wird eingestellt, wenn das Gesamtvolumen der Strategie der Gesamtzahl der Aufträge entspricht. Wenn der letzte Transaktionspreis des Marktes höher ist als sein maximaler Kaufpreis, wird die Provision gestoppt und die Provision wieder aufgenommen, wenn der letzte Transaktionspreis niedriger als der höchste Kaufpreis ist.

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

Mehr

Kleine TräumeDas ist toll!