Pemesanan Iceberg

Penulis:Rumput, Tanggal: 2018-07-04 15:07:54
Tag:Bantuan perdagangan

Komitmen gunung es mengacu pada investor ketika melakukan transaksi besar, untuk menghindari dampak yang terlalu besar pada pasar, untuk mengkomitmen pesanan besar secara otomatis dipecah menjadi beberapa pesanan, berdasarkan harga beli / jual terbaru saat ini dan strategi harga yang ditetapkan pelanggan, untuk mengkomitmen ulang secara otomatis jika pesanan sebelumnya dieksekusi sepenuhnya atau harga terbaru jelas menyimpang dari harga pesanan saat ini. Contoh: Jika nilai rata-rata floating point tunggal disetel menjadi 10, maka: Jumlah setiap order adalah 90% - 110% dari rata-rata pesanan tunggalnya. Harga pesanan adalah harga pembelian terbaru 1 * (dalam-dalam pesanan), sebuah pesanan baru dilakukan setelah pesanan sebelumnya telah selesai, pesanan akan dibatalkan secara otomatis jika harga transaksi terbaru melebihi kedalaman pesanan * 2 dari pesanan tersebut.


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


Berkaitan

Lebih banyak