Penjelasan terperinci mengenai strategi pesanan yang menunggu BitMEX

Penulis:Kebaikan, Dicipta: 2019-01-16 15:28:13, Dikemas kini: 2019-01-22 14:16:48

BitMEX telah menjadi platform pilihan untuk perdagangan leverage cryptocurrency, tetapi sekatan perdagangan APInya ketat dan membuat pedagang automatik merasa sangat keliru.

1. Ciri-ciri BitMEX

Kelebihan yang paling ketara adalah bahawa kecairan perdagangan sangat aktif, terutamanya kontrak kekal Bitcoin, jumlah transaksi setiap minit sering melebihi satu juta atau bahkan sepuluh juta dolar AS; Perdagangan pesanan tertunda BitMEX mempunyai dasar bayaran komisen pulangan, walaupun tidak banyak, tetapi menarik sejumlah besar perdagangan pembuatan pasaran, yang menjadikan kedalaman harga sangat kaya. harga beli dan jual terkini sering mempunyai lebih daripada satu juta dolar bernilai pesanan tertunda; kerana titik ini, harga transaksi sering berfluktuasi di sekitar unit perubahan minimum $ 0.50.

2.BitMEX API had kekerapan

frekuensi permintaan REST API adalah terhad kepada 300 kali setiap 5 minit, hampir sama dengan 1 kali setiap saat, had ini boleh dikatakan sangat ketat berbanding dengan platform dagangan lain. Selepas had melebihi, Rate limit exceeded akan diminta. Jika anda terus melebihi had, IP mungkin dilumpuhkan selama satu jam. Pelbagai kecacatan dalam masa yang singkat akan mengakibatkan seminggu yang dilumpuhkan. Untuk setiap permintaan API, BitMEX akan mengembalikan data header, data header digunakan untuk melihat jumlah permintaan yang tersisa. Sebenarnya, jika API digunakan dengan betul, ia tidak akan melebihi had frekuensi dan umumnya tidak perlu diperiksa.

3.Gunakan websocket untuk mendapatkan harga pasaran

BitMEX REST API lebih terhad. Cadangan rasmi adalah untuk menggunakan protokol websocket lebih banyak, dan mendorong lebih banyak jenis data daripada pertukaran purata. Perhatikan perkara berikut untuk penggunaan khusus:

Jika masa dorongan data kedalaman terlalu lama, akan ada ralat, yang tidak sepadan dengan kedalaman sebenar. Pesan maklumat push hilang banyak dan hampir tidak tersedia. Terdapat kelewatan yang ketara dalam menolak maklumat akaun, lebih baik menggunakan REST API. Apabila pasaran berubah-ubah terlalu besar, kelewatan dorongan akan mencapai beberapa saat. Kod berikut menggunakan protokol websocket untuk mendapatkan maklumat pasaran dan akaun dalam masa nyata, terutamanya untuk strategi pembuatan pasaran.

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. Kemahiran meletakkan perintah

BitMEX secara rasmi mengesyorkan menggunakan pemesanan pukal dan pengubahsuaian pesanan untuk meletakkan pesanan. pemesanan pukal boleh dilaksanakan dengan lebih cepat kerana audit masa nyata BitMEX, pemeriksaan risiko, pengiraan margin, dan pengoperasian. Oleh itu, kekerapan pemesanan pukal dikira sebagai sepersepuluh daripada kekerapan normal. Selain itu, operasi pesanan kita harus menggunakan kaedah pemesanan pukal dan pengubahsuaian pesanan untuk meminimumkan penggunaan API. Status pesanan pertanyaan juga perlu menggunakan API menggunakan kekerapan. Ia boleh menilai status pesanan mengikut perubahan atau kegagalan kedudukan pesanan pengubahsuaian.

bulk ordering tidak mengehadkan kuantiti pesanan (tidak boleh terlalu banyak), sebenarnya, satu pesanan juga boleh menggunakan antara muka bulk ordering. Oleh kerana operasi mengubah suai pesanan, kita boleh pre-order beberapa pesanan di mana harga menyimpang sangat, pesanan ini tidak akan dilaksanakan, tetapi apabila kita perlu meletakkan pesanan, kita hanya perlu mengubah suai harga dan kuantiti pesanan yang diletakkan. apabila mengubah suai pesanan berlaku kegagalan, ia juga boleh digunakan sebagai isyarat untuk pesanan yang akan dilaksanakan.

Berikut adalah kod pelaksanaan 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. Lain

Server BitMEX terletak di pelayan Amazon di Dublin, Ireland. Ping pelayan berjalan kurang dari 1ms apabila anda memilih pelayan awan AWS di Dublin, tetapi apabila masih ada kelewatan dalam mendorong, masalah beban berlebihan tidak dapat diselesaikan. Di samping itu, apabila akaun masuk, ejen pelayan tidak boleh berada di Amerika Syarikat dan tempat lain di mana tidak membenarkan perdagangan cryptocurrency. Oleh kerana peraturan, akaun akan dilarang.

Kod dalam artikel ini telah diubahsuai dari strategi peribadi saya dan tidak dijamin benar sepenuhnya untuk rujukan. Penggunaan khusus kod pasaran harus dilaksanakan dalam fungsi utama, kod yang berkaitan dengan perdagangan diletakkan sebelum fungsi utama, dan fungsi perdagangan diletakkan dalam sebut harga pasaran dorong.


Lebih lanjut

gmgphilSambungan WS menghasilkan ralat: ReferenceError: pengiktirafan 'data' tidak ditakrifkan pada...

RumputKesilapan kod, masalah telah diselesaikan