Strategi Suruhanjaya Iceberg

Penulis:Kebaikan, Dicipta: 2018-08-29 10:37:14, Dikemas kini: 2019-12-03 17:29:30

Strategi Suruhanjaya Icebergwww.fmz.comKomisen aisberg merujuk kepada urus niaga skala besar pelabur, untuk mengelakkan kesan yang berlebihan pada pasaran, komisen tunggal yang besar secara automatik dibahagikan satu pesanan besar ke dalam beberapa pesanan kecil, mengikut harga beli / jual terkini dan harga penentuan pelanggan semasa. Strategi ini secara automatik melakukan delegasi pesanan kecil, dan secara automatik meletakkan semula pesanan apabila pesanan sebelumnya dijual sepenuhnya atau harga terbaru menyimpang secara signifikan dari harga penempatan semasa.

Contoh: Jika titik terapung purata tunggal ditetapkan kepada 10, maka:

Bilangan setiap penempatan adalah 90% ~ 110% daripada nilai purata penempatan tunggal, dan harga penempatan adalah harga pembelian terkini mari kita katakan 1 kali (minus kedalaman penghantaran 1), dan penempatan baru dibuat selepas penempatan terakhir selesai. secara automatik menarik balik pesanan dan penempatan semula apabila harga urus niaga terkini adalah lebih daripada kedalaman penempatan * 2.

Penempatan dihentikan apabila jumlah keseluruhan strategi sama dengan jumlah pesanan. Apabila harga urus niaga terakhir pasaran lebih tinggi daripada harga pembelian maksimumnya, komisen dihentikan, dan komisen dilanjutkan selepas harga urus niaga terakhir lebih rendah daripada harga pembelian tertinggi.

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

Lebih lanjut

Mimpi kecilHebat!