وسائل لوڈ ہو رہے ہیں... لوڈنگ...

BitMEX زیر التواء آرڈر کی حکمت عملی کی تفصیلی وضاحت

مصنف:نیکی, تخلیق: 2019-01-16 15:28:13, تازہ کاری: 2019-01-22 14:16:48

بٹ ایم ای ایکس کریپٹوکرنسی لیوریج ٹریڈنگ کے لئے پسندیدہ پلیٹ فارم بن گیا ہے ، لیکن اس کی اے پی آئی ٹریڈنگ کی پابندیاں سخت ہیں اور خودکار تاجروں کو بہت الجھا ہوا محسوس کرتی ہیں۔ یہ مضمون بنیادی طور پر ایف ایم زیڈ مقداری تجارتی پلیٹ فارم میں اے پی آئی کے استعمال کے بارے میں کچھ نکات شیئر کرتا ہے ، بنیادی طور پر مارکیٹ بنانے کی حکمت عملی کے لئے۔

بٹ میکس کی خصوصیات

سب سے اہم فائدہ یہ ہے کہ ٹریڈنگ لیکویڈیٹی بہت فعال ہے ، خاص طور پر بٹ کوائن دائمی معاہدہ ، ٹرانزیکشن کی رقم فی منٹ اکثر ایک ملین یا اس سے بھی دس ملین امریکی ڈالر سے زیادہ ہوتی ہے۔ بٹ ایم ای ایکس زیر التواء آرڈرز ٹریڈنگ میں واپسی کمیشن فیس کی پالیسی ہے ، حالانکہ یہ زیادہ نہیں ہے ، لیکن اس نے بڑی تعداد میں مارکیٹ بنانے والی تجارت کو راغب کیا ، جس نے قیمت کی گہرائی کو بہت امیر بنا دیا۔ تازہ ترین خرید و فروخت کی قیمت میں اکثر ایک ملین ڈالر سے زیادہ کے زیر التواء آرڈرز ہوتے ہیں۔ اس نقطہ کی وجہ سے ، ٹرانزیکشن کی قیمت اکثر کم سے کم تبدیلی یونٹ کے ارد گرد گھومتی ہے۔ $ 0.50.

2.BitMEX API تعدد کی حد

REST API کی درخواست کی تعدد ہر 5 منٹ میں 300 بار تک محدود ہے ، جو تقریباً ہر سیکنڈ میں 1 بار کے برابر ہے ، اس حد کو دوسرے تجارتی پلیٹ فارمز کے مقابلے میں بہت سخت کہا جاسکتا ہے۔ حد سے تجاوز کرنے کے بعد ، Rate limit exceeded کو اشارہ کیا جائے گا۔ اگر آپ حد سے تجاوز کرتے رہتے ہیں تو ، آئی پی ایک گھنٹے تک غیر فعال ہوسکتا ہے۔ مختصر وقت میں متعدد غیر فعال ہونے کے نتیجے میں ایک ہفتہ غیر فعال ہوجائے گا۔ ہر API درخواست کے ل Bit ، BitMEX ہیڈر ڈیٹا واپس کردے گا ، ہیڈر ڈیٹا کا استعمال باقی درخواستوں کی موجودہ تعداد کو دیکھنے کے لئے کیا جاتا ہے۔ در حقیقت ، اگر API کو صحیح طریقے سے استعمال کیا جاتا ہے تو ، یہ تعدد کی حد سے تجاوز نہیں کرے گا اور عام طور پر اس کی جانچ پڑتال کی ضرورت نہیں ہے۔

3.مارکیٹ کوٹ حاصل کرنے کے لئے ویب ساکٹ کا استعمال کریں

BitMEX REST API زیادہ محدود ہے۔ سرکاری سفارش یہ ہے کہ ویب ساکٹ پروٹوکول کو زیادہ استعمال کریں ، اور اوسط تبادلہ سے زیادہ ڈیٹا کی اقسام کو آگے بڑھائیں۔ مخصوص استعمال کے لئے درج ذیل نکات پر توجہ دیں:

اگر گہرائی کے اعداد و شمار کو آگے بڑھانے کا وقت بہت لمبا ہے تو ، ایک غلطی ہوگی ، جو اصل گہرائی سے مطابقت نہیں رکھتی ہے۔ یہ اندازہ لگایا جاتا ہے کہ گہرائی میں بہت زیادہ تبدیلیاں ہوتی ہیں اور آگے بڑھنے میں کمی ہوتی ہے ، لیکن عام طور پر ، بہترین روانی کی وجہ سے ، آپ ticker یا trades کو سبسکرائب کرسکتے ہیں۔ آرڈر کی تفصیلات کو آگے بڑھانے کے لئے بہت زیادہ غائب ہے اور تقریبا دستیاب نہیں ہے. اکاؤنٹ کی معلومات کو آگے بڑھانے میں کافی تاخیر ہوتی ہے ، ترجیحا REST API کا استعمال کرتے ہوئے۔ جب مارکیٹ میں بہت زیادہ اتار چڑھاؤ ہوتا ہے، تو دھکا تاخیر چند سیکنڈ تک پہنچ جائے گی. مندرجہ ذیل کوڈ ریئل ٹائم میں مارکیٹ اور اکاؤنٹ کی معلومات حاصل کرنے کے لئے ویب ساکٹ پروٹوکول کا استعمال کرتا ہے۔

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)  
    }
}

۴. حکم دینے کی مہارت

BitMEX سرکاری طور پر آرڈر دینے کے لئے بلک آرڈرنگ اور آرڈر میں ترمیم کا استعمال کرنے کی سفارش کرتا ہے۔ بلک آرڈرنگ کو BitMEX ریئل ٹائم آڈیٹنگ ، رسک چیک ، مارجن کیلکولیشن اور کمیشننگ کی وجہ سے تیزی سے انجام دیا جاسکتا ہے۔ لہذا ، بلک آرڈرنگ کی تعدد کا حساب معمول کی تعدد کا دسواں حصہ کیا جاتا ہے۔ مزید برآں ، ہمارے آرڈر آپریشن کو API کے استعمال کو کم سے کم کرنے کے لئے بلک آرڈرنگ اور آرڈر میں ترمیم کا طریقہ استعمال کرنا چاہئے۔ استفسار آرڈر کی حیثیت کو بھی تعدد کا استعمال کرتے ہوئے API استعمال کرنے کی ضرورت ہے۔ یہ تبدیلی یا ترمیم آرڈر کی پوزیشن کی ناکامی کے مطابق آرڈر کی حیثیت کا فیصلہ کرسکتا ہے۔

بلک آرڈرنگ آرڈر کی مقدار کو محدود نہیں کرتی ہے (زیادہ نہیں ہوسکتی ہے) ، در حقیقت ، ایک ہی آرڈر بھی بلک آرڈرنگ انٹرفیس کا استعمال کرسکتا ہے۔ آرڈر میں ترمیم کے آپریشن کی وجہ سے ، ہم پری آرڈر کچھ آرڈرز کرسکتے ہیں جہاں قیمت بہت زیادہ انحراف کرتی ہے ، ان آرڈرز کو عمل میں نہیں لایا جائے گا ، لیکن جب ہمیں آرڈر دینے کی ضرورت ہوتی ہے تو ، ہمیں صرف دیئے گئے آرڈر کی قیمت اور مقدار میں ترمیم کرنے کی ضرورت ہوتی ہے۔ جب آرڈر میں ترمیم کرنے میں ناکامی واقع ہوتی ہے تو ، اسے آرڈر پر عمل درآمد کرنے کے لئے سگنل کے طور پر بھی استعمال کیا جاسکتا ہے۔

مندرجہ ذیل مخصوص نفاذ کا کوڈ ہے:

// 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. دیگر

BitMEX کا سرور آئرلینڈ کے شہر ڈبلن میں واقع ایمیزون کے سرور میں ہے۔ جب آپ ڈبلن میں AWS کلاؤڈ سرور کا انتخاب کرتے ہیں تو سرور چلانے کی حکمت عملی پنگ 1ms سے بھی کم ہوتی ہے ، لیکن جب دھکا دینے میں ابھی بھی تاخیر ہوتی ہے تو ، اوورلوڈ کا مسئلہ حل نہیں ہوسکتا ہے۔ اس کے علاوہ ، جب اکاؤنٹ میں لاگ ان ہوتا ہے تو ، سرور ایجنٹ ریاستہائے متحدہ اور دیگر جگہوں پر نہیں ہوسکتا ہے جہاں کریپٹوکرنسی ٹریڈنگ کی اجازت نہیں ہے۔ ضابطے کی وجہ سے ، اکاؤنٹ پر پابندی عائد کردی جائے گی۔

اس مضمون میں موجود کوڈ کو میری ذاتی حکمت عملی سے تبدیل کیا گیا ہے اور اس بات کی ضمانت نہیں دی جاتی ہے کہ یہ حوالہ کے لئے مکمل طور پر درست ہے۔ مارکیٹ کوڈ کا مخصوص استعمال مرکزی فنکشن میں انجام دیا جانا چاہئے ، تجارتی سے متعلق کوڈ کو مرکزی فنکشن سے پہلے رکھا جاتا ہے ، اور trade() فنکشن کو پش مارکیٹ کوٹیشن میں رکھا جاتا ہے۔


مزید

جی ایم جی فِلWS کنیکٹر ایک غلطی پیدا کرتا ہے: ReferenceError: شناخت کنندہ 'ڈیٹا' undefined at...

گھاسایک کوڈ غلطی، مسئلہ طے کیا گیا ہے