Bagaimana untuk mengeksploitasi bot jualan tanpa otak dengan strategi frekuensi tinggi dalam 80 baris kod

Penulis:Lydia, Dicipta: 2023-12-25 13:12:00, Dikemas kini: 2024-01-02 21:23:26

img

Pengamatan Peluang

Baru-baru ini, saya mendapati bahawa Binance mempunyai pasaran mata wang STORJ adalah sangat pelik tanpa disengajakan apabila saya sedang menonton pasaran, jumlah dagangan adalah sangat besar, dan kekerapan dagangan adalah sangat cepat, garis K-minit tertentu carta berikut, kita boleh melihat bahawa jumlah dagangan setiap minit adalah konsisten, dan minit K-garis boleh dilihat dalam garis bayang-bayang bawah yang panjang.

img

Perhatikan dengan Binance 1-detik K-garis, saya mendapati akhir cerita, seseorang dipasarkan 10,000-20,000 STORJ setiap 5-7s, tanpa mengira kos, dan memecahkan lubang kecil di K-garis secara langsung, sementara harga pulih dalam jangka pendek. Operasi ini jelas disebabkan oleh robot pada komisen aisberg. Operasi penjualan ini berlangsung untuk masa yang sangat lama, berjumlah kira-kira $ 10 juta, dan dalam banyak kes menyebabkan kemerosotan sehingga 0,1%, yang bermaksud bahawa pelaksana strategi ini kehilangan puluhan ribu dolar dalam kemerosotan hanya pada perdagangan. Tetapi dengan operasi mekanikal dan perdagangan aktif seperti itu, terdapat peluang yang jelas untuk membuat scalping pasaran.

img

Satu perubahan mudah kepada strategi HF spot asal, dan dalam beberapa minit saya mendapat bot ini yang mengkhususkan diri dalam mengeksploitasi jualan iceberg komisen ini.

Idea Strategi

Oleh kerana pasaran menjual dalam harga pasaran setiap beberapa saat, kita hanya perlu mencari kedalaman 10k dalam buku pesanan beli dan menggantung pesanan di hadapannya. Sehingga apabila gunung ais menjual, kemungkinan besar bahawa robot pembuat pasaran hanya dapat menerima, dan pada masa ini urus niaga sangat aktif, penurunan harga sesaat juga mencetuskan beberapa pesanan beli. Dengan cara yang sama, pesanan jual gantung boleh dilemparkan dalam trend, jadi operasi berulang. Frekuensi transaksi sangat tinggi, walaupun setiap kali hasil tidak cukup besar, pulangan keseluruhan juga cukup besar. Sudah tentu, premis segalanya adalah untuk mempunyai akaun bayaran rendah, jika kedua-dua bayaran pembelian dan penjualan adalah 0,1%, maka ruang tidak mencukupi untuk membayar bayaran.

Prestasi Strategi

Strategi ini berfungsi seperti berikut, pada mulanya, tiada keuntungan yang dicetak, jadi saya mengubahnya petang ini, dan mencetak keuntungan, robot penjualan gila telah mengubah jumlahnya menjadi sekitar 5000 pada satu masa, jadi sudah lewat masa optimum untuk arbitrage. Saya mungkin membuat 100-200U sejam pada mulanya, kuncinya adalah bebas risiko dan kos rendah. Di sisi lain, suruhanjaya aisberg sebenarnya mempunyai banyak kemahiran, jika anda tahu bagaimana untuk menulis strategi, anda boleh menghabiskan sepuluh minit di FMZ untuk menulis strategi suruhanjaya aisberg yang mengamati kedalaman pesanan beli untuk memutuskan saiz dan harga pesanan, mengamati saiz pesanan beli aktif untuk menyesuaikan saiz pesanan yang sedang menunggu dan mengambil pasaran dan ciri-ciri lain, menjimatkan puluhan ribu dolar pemantauan dengan mudah.

img

Kod Sumber Strategi

Kod strategi adalah sangat mudah, hanya 80 baris, yang sesuai untuk pemula, di sini adalah beberapa parameter seperti ketepatan pesanan dan sebagainya tertulis tetap dalam program, anda boleh mengubah parameter seperti berikut.

img

function CancelPendingOrders() {
    var orders = _C(exchange.GetOrders)
    for (var j = 0; j < orders.length; j++) {
        exchange.CancelOrder(orders[j].Id, orders[j])
    }
}

function onexit(){
    CancelPendingOrders()
}

function GetPrice(Type, Depth) {
    var sumAmount = 0
    var checkAmount = Type == "Buy" ? CheckBuyAmount : CheckSellAmount
    var deep = Type == "Buy" ? Depth.Bids : Depth.Asks
    for(var i = 0; i < Math.min(20, deep.length); i++) {
        if(Type == "Buy"  && deep[i].Price == lastBuyPrice && buyId){
            sumAmount += deep[i].Amount - amountBuy //Subtract your own pending orders here
        }else if(Type == "Sell"  && deep[i].Price == lastSellPrice && sellId){
            sumAmount += deep[i].Amount - amountSell
        }else{
            sumAmount += deep[i].Amount
        }
        if(sumAmount >= checkAmount){
            return deep[i].Price
        }
    }
    return deep[19].Price
}

function OnTick() {
    var depth = _C(exchange.GetDepth)
    var buyPrice = _N(Math.min(GetPrice("Buy", depth) + 0.0001, depth.Asks[0].Price-0.0001) , 4) //Guaranteed at the market
    var sellPrice = _N(Math.max(GetPrice("Sell", depth) - 0.0001, depth.Bids[0].Price+0.0001), 4)
    LogStatus('buy_price:'+buyPrice, '  sell price: '+sellPrice)
    if ((sellPrice - buyPrice) < DiffPrice) {
        buyPrice = 0
    }
    if(sellPrice != lastSellPrice && sellId){
        exchange.CancelOrder(sellId);
        sellId = 0
        lastSellPrice = 0
    }
    if(buyPrice != lastBuyPrice && buyId){
        exchange.CancelOrder(buyId);
        buyId = 0
        lastBuyPrice = 0
    }   
    var acc = _C(exchange.GetAccount)
    if(account.Stocks+account.FrozenStocks != acc.Stocks+acc.FrozenStocks){
        LogProfit((acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance - 2000)
        Log('free '+acc.Stocks, ' lock: '+ acc.FrozenStocks, ' total: ' , (acc.Stocks+acc.FrozenStocks)*depth.Bids[0].Price+acc.Balance+acc.FrozenBalance)
    }
    account = acc
    amountBuy = _N(Math.min(account.Balance / buyPrice - 0.1, Amount), 0)
    amountSell = _N(account.Stocks, 0)
    if (sellPrice > 0 && amountSell > 40 && sellId == 0) {
        sellId = exchange.Sell(_N(sellPrice,4), amountSell)
        lastSellPrice = sellPrice
    }
    if (buyPrice>0 && amountBuy > 40 && buyId == 0) {
        buyId = exchange.Buy(_N(buyPrice,4), amountBuy)
        lastBuyPrice = buyPrice
    }
    Sleep(Interval)
}
var account = {Stocks:0, FrozenStocks:0, Balance:0, FrozenBalance:0}
var buyId = 0
var sellId = 0
var lastBuyPrice = 0
var lastSellPrice = 0
var amountSell = 0
var amountBuy = 0
var log_account_time = 0
function main() {
    CancelPendingOrders()
    while (true) {
        OnTick()
    }
}

Lebih lanjut