Cara Mengeksploitasi Robot Penjual Tanpa Otak dengan Strategi Frekuensi Tinggi dalam 80 Baris Kode

Penulis:Lydia, Dibuat: 2023-12-25 13:12:00, Diperbarui: 2024-01-02 21:23:26

img

Pengamatan Kesempatan

Baru-baru ini, saya menemukan bahwa Binance memiliki pasar mata uang STORJ sangat aneh secara tidak sengaja ketika saya menonton pasar, volume perdagangan sangat besar, dan frekuensi perdagangan sangat cepat, garis K satu menit spesifik dari grafik berikut, kita dapat melihat bahwa volume perdagangan setiap menit konsisten, dan menit K-line dapat dilihat dalam garis bayangan bawah yang panjang.

img

Perhatikan dengan Binance 1-detik K-line, saya menemukan akhir cerita, seseorang dipasarkan 10.000-20.000 STORJ setiap 5-7s, terlepas dari biaya, dan menghancurkan lubang kecil di K-line secara langsung, sementara harga pulih dalam jangka pendek. Operasi ini jelas disebabkan oleh robot pada komisi gunung es. Operasi penjualan ini berlangsung sangat lama, total diperkirakan $ 10 juta, dan dalam banyak kasus menyebabkan slippage hingga 0,1%, yang berarti bahwa pelaku strategi ini kehilangan puluhan ribu dolar dalam slippage pada perdagangan saja. Tetapi dengan operasi mekanis dan perdagangan aktif, ada peluang yang jelas untuk membuat scalping pasar.

img

Perubahan sederhana dari strategi HF spot asli, dan dalam beberapa menit saya punya bot ini yang mengkhususkan diri dalam mengeksploitasi penjualan komisi gunung es yang tidak berotak ini.

Ide Strategi

Karena pasar menjual dengan harga pasar setiap beberapa detik, kita hanya perlu menemukan kedalaman 10k di buku order beli dan menggantung order di depannya. sehingga ketika gunung es menjual, kemungkinan tinggi bahwa robot pembuat pasar hanya dapat menerima, dan pada saat ini transaksi sangat aktif, penurunan harga sesaat juga memicu beberapa pesanan beli. Dengan cara yang sama, menggantung pesanan jual dapat dilemparkan ke dalam tren, sehingga operasi berulang. Frekuensi transaksi sangat tinggi, bahkan jika setiap kali hasil tidak cukup besar, total pengembalian juga cukup besar. Tentu saja, premis dari semuanya adalah memiliki akun biaya rendah, jika biaya pembelian dan penjualan adalah 0,1%, maka ruang tidak cukup untuk membayar biaya.

Kinerja Strategi

Strategi ini berjalan seperti berikut, pada awalnya, tidak ada keuntungan yang dicetak, jadi saya mengubahnya sore ini, dan mencetak keuntungan, robot penjual gila telah mengubah volume menjadi sekitar 5000 pada satu waktu, jadi sudah lewat waktu yang optimal untuk arbitrase. Saya mungkin membuat 100-200U per jam pada awalnya, kuncinya bebas risiko dan biaya rendah. Di sisi lain, komisi gunung es sebenarnya memiliki banyak keterampilan, jika Anda tahu cara menulis strategi, Anda dapat menghabiskan sepuluh menit di FMZ untuk menulis strategi komisi gunung es yang mengamati kedalaman pesanan beli untuk memutuskan ukuran dan harga pesanan, mengamati ukuran pesanan beli aktif untuk menyesuaikan ukuran pesanan menunggu dan mengambil pasar dan karakteristik lainnya, menghemat puluhan ribu dolar pemantauan dengan mudah.

img

Kode Sumber Strategi

Kode strategi sangat sederhana, hanya 80 baris, yang cocok untuk pemula, di sini adalah beberapa parameter seperti presisi pesanan dan sebagainya tertulis tetap dalam program, Anda dapat mengubah parameter sebagai 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 banyak