Penjelasan rinci tentang strategi pesanan BitMEX yang sedang menunggu

Penulis:Kebaikan, Dibuat: 2019-01-16 15:28:13, Diperbarui: 2019-01-22 14:16:48

BitMEX telah menjadi platform pilihan untuk perdagangan leverage cryptocurrency, tetapi pembatasan perdagangan API-nya ketat dan membuat pedagang otomatis merasa sangat bingung.

1. Fitur BitMEX

Keuntungan yang paling signifikan adalah bahwa likuiditas perdagangan sangat aktif, terutama kontrak abadi Bitcoin, jumlah transaksi per menit sering melebihi satu juta atau bahkan sepuluh juta dolar AS; BitMEX pending orders trading memiliki kebijakan biaya komisi pengembalian, meskipun tidak banyak, tetapi menarik sejumlah besar perdagangan pembuatan pasar, yang membuat kedalaman harga sangat kaya. harga beli dan jual terbaru sering memiliki lebih dari satu juta dolar senilai pending orders; karena titik ini, harga transaksi sering berfluktuasi di sekitar unit perubahan minimum $ 0,50.

2.BitMEX API batas frekuensi

Frekuensi permintaan API REST dibatasi hingga 300 kali setiap 5 menit, hampir sama dengan 1 kali setiap detik, batas ini dapat dikatakan sangat ketat dibandingkan dengan platform perdagangan lainnya. Setelah batas tersebut melebihi, Rate limit exceeded akan diminta. Jika Anda terus melebihi batas, IP mungkin dinonaktifkan selama satu jam. Beberapa penonaktifkan dalam waktu singkat akan mengakibatkan seminggu dinonaktifkan. Untuk setiap permintaan API, BitMEX akan mengembalikan data header, data header digunakan untuk melihat jumlah permintaan yang tersisa.

3.Menggunakan websocket untuk mendapatkan penawaran pasar

BitMEX REST API lebih membatasi. Rekomendasi resmi adalah untuk menggunakan protokol websocket lebih banyak, dan mendorong lebih banyak jenis data daripada pertukaran rata-rata. Perhatikan poin berikut untuk penggunaan khusus:

Jika waktu push data kedalaman terlalu lama, akan terjadi kesalahan, yang tidak sesuai dengan kedalaman yang sebenarnya. Diperkirakan bahwa ada terlalu banyak perubahan kedalaman dan ada kelalaian dalam push, tetapi secara umum, karena fluiditas yang sangat baik, Anda dapat berlangganan ticker atau trades. Pesan detail push banyak hilang dan hampir tidak tersedia. Ada keterlambatan yang signifikan dalam mendorong informasi akun, sebaiknya menggunakan REST API. Ketika volatilitas pasar terlalu besar, delay push akan mencapai beberapa detik. Kode berikut menggunakan protokol websocket untuk mendapatkan informasi pasar dan akun secara real time, terutama untuk strategi pembuatan pasar.

var ticker  = {price:0, buy:0, sell:0, time:0} //Ticker information, the latest price, "buy one" price, "sell one" price, update time
//Account information, respectively, position, buying and selling price, buying and selling quantity, position status, order Id
var info = {position:0, buyPrice:0, sellPrice:0, buyAmount:0, sellAmount:0, buyState:0, sellState:0, buyId:0, sellId:0}
var buyListId = []//Global variables, pre-emptive buying id list, will described below
var sellListId = []
var APIKEY = 'your api id' //Need to fill in the BitMEX API ID here. Note that it is not a key, which is required for websocket protocol authentication.
var expires = parseInt(Date.now() / 1000) + 10
var signature = exchange.HMAC("sha256", "hex", "GET/realtime" + expires, "{{secretkey}}")//The secretkey will be automatically replaced at the bottom level and does not need to be filled in.
var bitmexClient = Dial("wss://www.bitmex.com/realtime", 60)
var auth = JSON.stringify({args: [APIKEY, expires, signature], op: "authKeyExpires"})//Authentication information, otherwise you cannot subscribe to the account
bitmexClient.write(auth)
bitmexClient.write('{"op": "subscribe", "args": ["position","execution","trade:XBTUSD"]}')//Subscribed to positions, order execution and perpetual contract real-time transaction
while(true){
    var data = bitmexClient.read()
    if(data){
        bitmexData = JSON.parse(data)
        if('table' in bitmexData && bitmexData.table == 'trade'){
            data = bitmexData.data
            ticker.price = parseFloat(data[data.length-1].price)//The latest transaction price, will push multiple transactions at a time, take one will be ok
            //You can get the "buy one" and "sell one" price according to the direction of the latest transaction, without subscribing to the depth.
            if(data[data.length-1].side == 'Buy'){
                ticker.sell = parseFloat(data[data.length-1].price)
                ticker.buy = parseFloat(data[data.length-1].price)-0.5
            }else{
                ticker.buy = parseFloat(data[data.length-1].price)
                ticker.sell = parseFloat(data[data.length-1].price)+0.5
            }
            ticker.time =  new Date(data[data.length-1].timestamp);//Update time, can be used to determine the delay
        }
    }else if(bitmexData.table == 'position'){
        var position = parseInt(bitmexData.data[0].currentQty)  
        if(position != info.position){
            Log('Position changeļ¼š ', position, info.position, '#FF0000@')//Position change Log, and pushed to WeChat, remove @ means Do not push
            info.position = position  
        }
        info.position  = parseInt(bitmexData.data[0].currentQty)  
    }
}

4. Membuat perintah

BitMEX secara resmi merekomendasikan menggunakan bulk ordering dan order modification untuk melakukan pemesanan. bulk ordering dapat dieksekusi lebih cepat karena audit waktu nyata BitMEX, pemeriksaan risiko, perhitungan margin, dan komisi. Oleh karena itu, frekuensi bulk ordering dihitung sebagai sepersepuluh frekuensi normal. Selanjutnya, operasi order kami harus menggunakan metode bulk ordering dan order modification untuk meminimalkan penggunaan API. Status order query juga perlu mengkonsumsi API menggunakan frekuensi. Ini dapat menilai status order sesuai dengan posisi perubahan atau kegagalan modifikasi pesanan.

bulk ordering tidak membatasi jumlah order (tidak bisa terlalu banyak), pada kenyataannya, satu order juga dapat menggunakan bulk ordering interface. Karena operasi memodifikasi order, kita dapat pre-order beberapa order di mana harga menyimpang jauh, order ini tidak akan dieksekusi, tetapi ketika kita perlu menempatkan order, kita hanya perlu memodifikasi harga dan jumlah order yang ditempatkan. ketika memodifikasi order terjadi kegagalan, itu juga dapat digunakan sebagai sinyal untuk order yang akan dieksekusi.

Berikut ini adalah kode implementasi khusus:

// Cancel all orders and reset global variables
function cancelAll(){
    exchange.IO("api","DELETE","/api/v1/order/all","symbol=XBTUSD")//Call IO extension revocation
    info = {position:0, buyPrice:0, sellPrice:0, buyAmount:0, sellAmount:0, buyState:0, sellState:0, buyId:0, sellId:0}
    buyListId = []
    sellListId = []
}
//placing alternate order
function waitOrders(){
    var orders = []
    if(buyListId.length<4){
        //When the number of inspections is insufficient, place another "bulk"
        for(var i=0;i<7;i++){
            //Due to BitMEX restrictions, the price can not be excessively excessive, the order quantity can not be too small, and the "execInst" parameter guarantees that only the market making transaction can be executed.
            orders.push({symbol:'XBTUSD', side:'Buy', orderQty:100, price:ticker.buy-400+i, execInst:'ParticipateDoNotInitiate'})
        }
    }
    if(sellListId.length<4){
        for(var i=0;i<7;i++){
            orders.push({symbol:'XBTUSD', side:'Sell', orderQty:100, price:ticker.buy+400+i, execInst:'ParticipateDoNotInitiate'})
        }
    }
    if(orders.length>0){
        var param = "orders=" + JSON.stringify(orders);
        var ids = exchange.IO("api", "POST", "/api/v1/order/bulk", param);//Bulk orders submitted here
        for(var i=0;i<ids.length;i++){
            if(ids.side == 'Buy'){
                buyListId.push(ids.orderID)
            }else{
                sellListId.push(ids.orderID)
            }
        }
    }
}
//Modify order function
function amendOrders(order, direction, price, amount, id){
    var param = "orders=" + JSON.stringify(order);
    var ret = exchange.IO("api", "PUT", "/api/v1/order/bulk", param);//Modify one order at a time
    //Modification occurs error
    if(!ret){
        var err = GetLastError()
        //overloaded unmodified strategy, need to recycle the order id
        if(err.includes('The system is currently overloaded')){
            if(id){
                if(direction == 'buy'){
                    buyListId.push(id)
                }else{
                    sellListId.push(id)
                }
            }
            Sleep(1000)
            return
        }
        //Illegal order status, indicating that the order to be modified has been completely executed
        else if(err.includes('Invalid ordStatus')){
            Log(order, direction)
            if(direction == 'buy'){
                info.buyId = 0
                info.buyState = 0
                info.buyAmount = 0
                info.buyPrice = 0
            }else{
                info.sellId = 0
                info.sellState = 0
                info.sellAmount = 0
                info.sellPrice = 0
            }
            //Since the push is not timely, update the position with the "rest" protocol here.
            pos = _C(exchange.GetPosition)
            if(pos.length>0){
                info.position = pos[0].Type == 0 ? pos[0].Amount : -pos[0].Amount
            }else{
                info.position = 0
            }
        }
        //Unknown error cannot be modified, all orders are cancelled, reset once
        else if(err.includes('Invalid orderID')){
            cancelAll()
            Log('Invalid orderID,reset once')
        }
        //Exceed the frequency limit, you can continue to try after hibernation
        else if(err.includes('Rate limit exceeded')){
            Sleep(2000)
            return
        }
        //The account is banned, all orders are revoked, and sleep is awaiting recovery for a long time.
        else if(err.includes('403 Forbidden')){
            cancelAll()
            Log('403,reset once')
            Sleep(5*60*1000)
        }
    }else{
        //Modify order successfully
        if(direction == 'buy'){
            info.buyState = 1
            info.buyPrice = price
            info.buyAmount = amount
        }else{
            info.sellState = 1
            info.sellPrice = price
            info.sellAmount = amount
        }
    }
}
//0.5 price change
function fixSize(num){
    if(num>=_N(num,0)+0.75){
        num = _N(num,0)+1
    }else if(num>=_N(num,0)+0.5){
        num=_N(num,0)+0.5
    }else{
        num=_N(num,0)
    }
    return num
}
//Trading function
function trade(){
    waitOrders()//Check if you need a replacement order
    var buyPrice = fixSize(ticker.buy-5) //For demonstration purposes only, specific transactions should be written by yourself.
    var sellPrice = fixSize(ticker.sell+5)
    var buyAmount =  500
    var sellAmount = 500
    //Modify from an alternate order when there is no order
    if(info.buyState == 0  && buyListId.length > 0){
        info.buyId = buyListId.shift()
        amendOrders([{orderID:info.buyId, price:buyPrice, orderQty:buyAmount}],'buy', group, buyPrice, buyAmount, info.buyId)
    }
    if(info.sellState == 0 && sellListId.length > 0){
        info.sellId = sellListId.shift()
        amendOrders([{orderID: info.sellId, price:sellPrice, orderQty:sellAmount}],'sell', group, sellPrice, sellAmount, info.sellId )
    }
    //Existing orders need to change price
    if(buyPrice !=  info.buyPrice && info.buyState == 1){
        amendOrders([{orderID:info.buyId, price:buyPrice, orderQty:buyAmount}],'buy', group, buyPrice, buyAmount)
    }
    if(sellPrice != info.sellPrice && info.sellState == 1){
        amendOrders([{orderID:info.sellId, price:sellPrice, orderQty:sellAmount}],'sell', group, sellPrice, sellAmount)
    }
}

5. Lainnya

BitMEX s server berada di server Amazon s di Dublin, Irlandia. Server yang berjalan strategi ping kurang dari 1ms ketika Anda memilih AWS cloud server di Dublin, tetapi ketika masih ada keterlambatan dalam mendorong, masalah overload tidak dapat diselesaikan. Selain itu, ketika akun masuk, agen server tidak dapat berada di Amerika Serikat dan tempat lain di mana tidak mengizinkan perdagangan cryptocurrency. Karena peraturan, akun akan dilarang.

Kode dalam artikel ini telah dimodifikasi dari strategi pribadi saya dan tidak dijamin benar sepenuhnya untuk referensi. Penggunaan spesifik kode pasar harus dilaksanakan dalam fungsi utama, kode yang terkait dengan perdagangan ditempatkan sebelum fungsi utama, dan fungsi perdagangan ditempatkan dalam penawaran pasar push.


Lebih banyak

gmgphilKonektor WS menghasilkan kesalahan: ReferenceError: identifier 'data' tidak didefinisikan pada...

RumputKesalahan kode, masalah telah diperbaiki