Iceberg Kaufbefehl

Schriftsteller:Das Gras, Datum: 2018-07-04
Tags:Handelsunterstützt

Eisberg Auftrag bezieht sich auf den Investor, bei der Durchführung von großen Transaktionen, um zu vermeiden, dass der Markt zu einem übermäßigen Schock, die große Auftrag automatisch in mehrere Aufträge zu brechen, automatisch Auftrag nach dem aktuellen neuesten Kauf / Verkauf Preis und der Preis-Strategie des Kunden gesetzt, automatisch neu zu beauftragen, wenn der letzte Auftrag vollständig abgewickelt oder der neueste Preis deutlich von der aktuellen Auftragspreis abweicht. Ein Beispiel: Wenn die Anzahl der Floating Points mit einem einmaligen Mittelwert auf 10 gesetzt ist: Die Anzahl der Aufträge beträgt 90% bis 110% ihres Einzeltragsdurchschnitts. Der Aufträgspreis beträgt den neuesten Kaufpreis 1* (<1-Auftragstiefe), ein neuer Auftrag wird nach der vollständigen Abwicklung des vorherigen Auftrags ausgeführt, der automatisch zurückgenommen und erneut in Auftrag gegeben, wenn der neueste Kaufpreis von diesem Auftrag über die Auftragstiefe*2 liegt. Der Auftrag wird abgebrochen, wenn die Strategie-Gesamttransaktionen gleich der Gesamtzahl der Aufträge sind. Der Auftrag wird abgebrochen, wenn der neueste Kaufpreis im Markt höher als sein Höchstkaufpreis ist, und der Auftrag wird wieder aufgenommen, wenn der neueste Kaufpreis unter dem Höchstkaufpreis liegt.


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


Verwandt

Mehr