Die Ressourcen sind geladen. Beförderung...

Ausführliche Erläuterungen zur Strategie der BitMEX-Pending-Orders

Schriftsteller:Gutes, Erstellt: 2019-01-16 15:28:13, aktualisiert: 2019-01-22 14:16:48

BitMEX ist zur bevorzugten Plattform für den Handel mit Kryptowährungs-Leverage geworden, aber seine API-Handelsbeschränkungen sind streng und machen automatische Händler sehr verwirrt.

1. Merkmale von BitMEX

Der wichtigste Vorteil ist, dass die Handelsliquidität sehr aktiv ist, insbesondere der Bitcoin-Perpetual-Kontrakt, der Transaktionsbetrag pro Minute übersteigt oft eine Million oder sogar zehn Millionen US-Dollar; BitMEX pending orders trading haben die Politik der Rückkehr Provisionsgebühr, obwohl es nicht viel ist, aber zog eine große Anzahl von Markt machen Trades, die die Preistiefe sehr reich gemacht. der neueste Kauf- und Verkaufspreis haben oft mehr als eine Million Dollar wert pending orders; wegen dieses Punktes schwankt der Transaktionspreis oft um die Mindeständerungseinheit von $ 0,50.

2.BitMEX-API-Frequenzgrenze

Die Anforderungsfrequenz der REST-API ist auf 300 Mal alle 5 Minuten begrenzt, fast gleich 1 Mal pro Sekunde, dieses Limit kann man sagen, ist im Vergleich zu anderen Handelsplattformen sehr streng. Nach Überschreitung des Limits wird Rate limit exceeded angefordert. Wenn Sie das Limit überschreiten, kann die IP für eine Stunde deaktiviert werden. Mehrere Deaktivierungen in kurzer Zeit führen zu einer Woche Deaktivierung. Für jede API-Anfrage gibt BitMEX die Header-Daten zurück, Header-Daten werden verwendet, um die aktuelle Anzahl der verbleibenden Anfragen zu sehen. In der Tat, wenn die API richtig verwendet wird, wird sie die Frequenzgrenze nicht überschreiten und muss im Allgemeinen nicht überprüft werden.

3.Verwenden Sie Websocket, um das Marktangebot zu erhalten

Die BitMEX REST API ist restriktiver. Die offizielle Empfehlung besteht darin, das Websocket-Protokoll stärker zu verwenden und mehr Datentypen als der durchschnittliche Austausch zu verschieben. Achten Sie auf folgende Punkte für die spezifische Verwendung:

Wenn die Tiefendaten-Push-Zeit zu lang ist, wird ein Fehler auftreten, der nicht der tatsächlichen Tiefe entspricht. Die Bestelldetails fehlen oft und sind fast nicht verfügbar. Es gibt eine erhebliche Verzögerung bei der Übermittlung von Kontoinformationen, vorzugsweise mit der REST-API. Wenn der Markt zu volatil ist, beträgt die Push-Verzögerung einige Sekunden. Der folgende Code verwendet das Websocket-Protokoll, um Markt- und Kontoinformationen in Echtzeit zu erhalten, hauptsächlich für Market-Making-Strategien.

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. Befehlsgebende Fähigkeiten

BitMEX empfiehlt offiziell die Verwendung von bulk ordering und order modification zur Bestellung. bulk ordering kann aufgrund von BitMEX-Echtzeit-Auditing, Risikoüberprüfung, Margin-Berechnung und Inbetriebnahme schneller ausgeführt werden. Daher wird die Häufigkeit der bulk ordering als ein Zehntel der normalen Häufigkeit berechnet. Darüber hinaus sollte unser Auftragsbetrieb die Methode bulk ordering und order modification verwenden, um die Verwendung von API zu minimieren. Der Auftragsstatus der Abfrage muss auch die API mit Frequenz verbrauchen. Er kann den Auftragsstatus nach der Änderung oder dem Ausfall der Änderungsposition beurteilen.

bulk ordering beschränkt nicht die Bestellmenge (kann nicht zu viel sein), in der Tat kann eine einzelne Bestellung auch die bulk ordering-Schnittstelle verwenden. Aufgrund der Operation der Änderung der Bestellung können wir vorbestellen einige Aufträge, bei denen der Preis stark abweicht, diese Aufträge werden nicht ausgeführt, aber wenn wir eine Bestellung aufgeben müssen, müssen wir nur den Preis und die Menge der platzierten Bestellung ändern. wenn die Änderung der Bestellung fehlschlägt, kann es auch als Signal für die Ausführung der Bestellung verwendet werden.

Der spezifische Durchführungscode lautet:

// 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. Andere

BitMEXs Server befindet sich auf dem Amazons Server in Dublin, Irland. Der Server-Running-Ping beträgt weniger als 1 ms, wenn Sie einen AWS-Cloud-Server in Dublin wählen, aber wenn es immer noch eine Verzögerung beim Drücken gibt, kann das Überlastproblem nicht gelöst werden. Außerdem kann der Server-Agent nicht in den Vereinigten Staaten und anderen Orten, an denen keine Kryptowährungsgeschäfte erlaubt werden, angeschlossen werden. Aufgrund der Verordnung wird das Konto verboten.

Der Code in diesem Artikel wurde aus meiner persönlichen Strategie geändert und ist nicht garantiert, dass er zur Referenz vollständig korrekt ist. Die spezifische Verwendung des Marktcodes sollte in der Hauptfunktion ausgeführt werden, der handelsbezogene Code wird vor der Hauptfunktion platziert und die Trade() -Funktion wird in der Push-Marktnotierung platziert.


Mehr

gmgphilDer WS-Anschluss erzeugt einen Fehler: ReferenceError: Identifikator "Daten" nicht definiert bei...

Das GrasEin Codefehler, das Problem wurde behoben.