کثیر علامت کی حکمت عملی کی تعمیر کے لئے کریپٹوکرنسی پلیٹ فارم مجموعی مارکیٹ انٹرفیس کا استعمال کریں

مصنف:نینا باداس, تخلیق: 2022-04-24 17:34:03, تازہ کاری:

کثیر علامت کی حکمت عملی کی تعمیر کے لئے کریپٹوکرنسی پلیٹ فارم مجموعی مارکیٹ انٹرفیس کا استعمال کریں

[Live سیکشن میں] (https://www.fmz.com/liveایف ایم زیڈ کوانٹ ٹریڈنگ پلیٹ فارم (ایف ایم زیڈ کوانٹ ٹریڈنگ پلیٹ فارم) کے ، ملٹی علامت کی حکمت عملی اکثر دیکھی جاتی ہے ، جو ایک ہی وقت میں درجنوں علامتوں یا یہاں تک کہ ایک پورے پلیٹ فارم کی مارکیٹ کے حالات کا پتہ لگاسکتی ہے۔ یہ کیسے کیا جاتا ہے؟ اور اسے کس طرح ڈیزائن کیا جانا چاہئے؟ یہ مضمون آپ کو ملٹی علامت کی حکمت عملی بنانے کے لئے پلیٹ فارم کے مجموعی مارکیٹ انٹرفیس کا استعمال کرنے کے بارے میں بات کرنے کے لئے لے جاتا ہے۔

مثال کے طور پر بائننس اور ہووبی کو لیں؛ اگر آپ ان کے API دستاویزات کو چیک کرتے ہیں تو ، آپ کو مل جائے گا کہ مجموعی طور پر انٹرفیس موجود ہیں:

مارکیٹ انٹرفیس

  • بائننس معاہدہ:https://fapi.binance.com/fapi/v1/ticker/bookTickerانٹرفیس واپس کردہ ڈیٹا:

    [
        {
            "symbol": "BTCUSDT", // trading pair
            "bidPrice": "4.00000000", //optimum bid price 
            "bidQty": "431.00000000", //bid quantity 
            "askPrice": "4.00000200", //optimum ask price 
            "askQty": "9.00000000", //ask quantity 
            "time": 1589437530011   // matching engine time 
        }
        ...
    ]
    
  • Huobi جگہ:https://api.huobi.pro/market/tickersانٹرفیس واپس کردہ ڈیٹا:

    [  
        {  
            "open":0.044297,      // open price 
            "close":0.042178,     // close price 
            "low":0.040110,       // the lowest price 
            "high":0.045255,      // the highest price 
            "amount":12880.8510,  
            "count":12838,
            "vol":563.0388715740,
            "symbol":"ethbtc",
            "bid":0.007545,
            "bidSize":0.008,
            "ask":0.008088,
            "askSize":0.009
        }, 
        ...
    ]
    

    تاہم، نتیجہ اصل میں ایسا نہیں ہے، اور Huobi انٹرفیس کی طرف سے واپس اصل ساخت ہے:

    {
        "status": "ok",
        "ts": 1616032188422,
        "data": [{
      	  "symbol": "hbcbtc",
      	  "open": 0.00024813,
      	  "high": 0.00024927,
      	  "low": 0.00022871,
      	  "close": 0.00023495,
      	  "amount": 2124.32,
      	  "vol": 0.517656218,
      	  "count": 1715,
      	  "bid": 0.00023427,
      	  "bidSize": 2.3,
      	  "ask": 0.00023665,
      	  "askSize": 2.93
        }, ...]
    }
    

    انٹرفیس کی طرف سے واپس آئے اعداد و شمار کی پروسیسنگ کے دوران توجہ دی جانی چاہئے.

حکمت عملی پروگرام کی ساخت کی تعمیر

کس طرح حکمت عملی میں دونوں انٹرفیس کو احاطہ کرنے کے لئے، اور کس طرح اعداد و شمار کو پروسیس کرنے کے لئے؟ چلو ایک نظر ڈالیں.

سب سے پہلے، ایک کنسٹرکٹر لکھیں، کنٹرول اشیاء کی تعمیر کے لئے

// parameter e is used to import the exchange object; parameter subscribeList is the trading pair list to be processed, such as ["BTCUSDT", "ETHUSDT", "EOSUSDT", "LTCUSDT", "ETCUSDT", "XRPUSDT"]
function createManager(e, subscribeList) {           
    var self = {}
    self.supportList = ["Futures_Binance", "Huobi"]  // the supported platform's 

    // object attribute 
    self.e = e
    self.name = e.GetName()
    self.type = self.name.includes("Futures_") ? "Futures" : "Spot"
    self.label = e.GetLabel()
    self.quoteCurrency = ""  
    self.subscribeList = subscribeList   // subscribeList : [strSymbol1, strSymbol2, ...]
    self.tickers = []                    // all market data obtained by the interfaces; define the data format as: {bid1: 123, ask1: 123, symbol: "xxx"}}
    self.subscribeTickers = []           // the market data needed; define the data format as: {bid1: 123, ask1: 123, symbol: "xxx"}}
    self.accData = null                  // used to record the account asset data 

    // initialization function 
    self.init = function() { 
    	// judge whether a platform is supported 
        if (!_.contains(self.supportList, self.name)) {        	
        	throw "not support"
        }
    }

    // judge the data precision 
    self.judgePrecision = function (p) {
        var arr = p.toString().split(".")
        if (arr.length != 2) {
            if (arr.length == 1) {
                return 0
            }
            throw "judgePrecision error, p:" + String(p)
        }
        
        return arr[1].length
    }

    // update assets 
    self.updateAcc = function(callBackFuncGetAcc) {
        var ret = callBackFuncGetAcc(self)
        if (!ret) {
        	return false 
        }
        self.accData = ret 
        return true 
    }

    // update market data 
    self.updateTicker = function(url, callBackFuncGetArr, callBackFuncGetTicker) {
    	var tickers = []
    	var subscribeTickers = []
    	var ret = self.httpQuery(url)
    	if (!ret) {
    		return false 
    	}
    	try {
            _.each(callBackFuncGetArr(ret), function(ele) {
            	var ticker = callBackFuncGetTicker(ele)
            	tickers.push(ticker)
            	for (var i = 0 ; i < self.subscribeList.length ; i++) {
            		if (self.subscribeList[i] == ele.symbol) {
            			subscribeTickers.push(ticker)
            		}
            	}
            })
        } catch(err) {
        	Log("error:", err)
        	return false 
        }

        self.tickers = tickers
        self.subscribeTickers = subscribeTickers
        return true 
    }

    self.httpQuery = function(url) {
    	var ret = null
        try {
            var retHttpQuery = HttpQuery(url)
            ret = JSON.parse(retHttpQuery)
        } catch (err) {
            // Log("error:", err)
            ret = null
        }
        return ret 
    }

    self.returnTickersTbl = function() {
        var tickersTbl = {
        	type : "table", 
        	title : "tickers",
        	cols : ["symbol", "ask1", "bid1"], 
        	rows : []
        }
        _.each(self.subscribeTickers, function(ticker) {        
        	tickersTbl.rows.push([ticker.symbol, ticker.ask1, ticker.bid1])
        })
        return tickersTbl
    }

    // initialization 
    self.init()
	return self 
}

FMZ API فنکشن استعمال کریںHttpQueryپلیٹ فارم انٹرفیس تک رسائی کے لئے ایک درخواست بھیجنے کے لئے.HttpQuery، آپ کو استثناء پروسیسنگ کا استعمال کرنے کی ضرورت ہےtry...catchاستثناء جیسے انٹرفیس واپسی کی ناکامی کو سنبھالنے کے لئے. یہاں کچھ طلباء پوچھ سکتے ہیں: پلیٹ فارم انٹرفیس کے ذریعہ واپس آنے والے ڈیٹا ڈھانچے کافی مختلف ہیں ، تو اس سے کیسے نمٹا جائے؟ اسی پروسیسنگ کے طریقہ کار کو استعمال کرنا ممکن نہیں ہونا چاہئے۔ دراصل ، نہ صرف پلیٹ فارم انٹرفیس کے ذریعہ واپس آنے والے ڈیٹا ڈھانچے مختلف ہیں ، بلکہ واپس آنے والے ڈیٹا فیلڈز کے نام بھی مختلف ہیں۔ ایک ہی معنی کو مختلف طریقے سے نامزد کیا جاسکتا ہے۔ مثال کے طور پر ، انٹرفیس جو ہم نے اوپر درج کیے ہیں۔ ایک ہی اظہار کا مطلب خرید1 قیمت ہے ، جسے کہا جاتا ہے:bidPriceبائننس میں، لیکنbidHuobi میں.

ہم یہاں کال بیک فنکشن کا استعمال کرتے ہیں اور ان حصوں کو الگ کرتے ہیں جن کو خصوصی پروسیسنگ کی ضرورت ہوتی ہے. تو مندرجہ بالا آبجیکٹ شروع کیا جاتا ہے کے بعد، یہ مخصوص استعمال میں اس طرح بن جاتا ہے: (نیچے دیئے گئے کوڈ میں کنسٹرکٹر کو نظر انداز کیا گیا ہےcreateManager) بائننس فیوچر کے زیر نگرانی معاہدوں:["BTCUSDT", "ETHUSDT", "EOSUSDT", "LTCUSDT", "ETCUSDT", "XRPUSDT"]Huobi Spot کے زیر نگرانی اسپاٹ ٹریڈنگ کے جوڑے:["btcusdt", "ethusdt", "eosusdt", "etcusdt", "ltcusdt", "xrpusdt"]

function main() {
    var manager1 = createManager(exchanges[0], ["BTCUSDT", "ETHUSDT", "EOSUSDT", "LTCUSDT", "ETCUSDT", "XRPUSDT"])
    var manager2 = createManager(exchanges[1], ["btcusdt", "ethusdt", "eosusdt", "etcusdt", "ltcusdt", "xrpusdt"])   

    while (true) {
    	// update market data 
    	var ticker1GetSucc = manager1.updateTicker("https://fapi.binance.com/fapi/v1/ticker/bookTicker", 
    		function(data) {return data}, 
    		function (ele) {return {bid1: ele.bidPrice, ask1: ele.askPrice, symbol: ele.symbol}})
    	var ticker2GetSucc = manager2.updateTicker("https://api.huobi.pro/market/tickers", 
    		function(data) {return data.data}, 
    		function(ele) {return {bid1: ele.bid, ask1: ele.ask, symbol: ele.symbol}})
        if (!ticker1GetSucc || !ticker2GetSucc) {
        	Sleep(1000)
        	continue
        }
        
        var tbl1 = {
        	type : "table", 
        	title : "futures market data",
        	cols : ["futures contract", "futures buy1", "futures sell1"], 
        	rows : []
        }
        _.each(manager1.subscribeTickers, function(ticker) {
        	tbl1.rows.push([ticker.symbol, ticker.bid1, ticker.ask1])
        })
        var tbl2 = {
        	type : "table", 
        	title : "spot market data",
        	cols : ["spot contract", "spot buy1", "spot sell1"], 
        	rows : []
        }
        _.each(manager2.subscribeTickers, function(ticker) {
        	tbl2.rows.push([ticker.symbol, ticker.bid1, ticker.ask1])
        })
        LogStatus(_D(), "\n`" + JSON.stringify(tbl1) + "`", "\n`" + JSON.stringify(tbl2) + "`")
        Sleep(10000)
    }
}

آپریشن ٹیسٹ: بائننس فیوچر کو پہلا ایکسچینج آبجیکٹ اور ہوبی اسپاٹ کو دوسرا ایکسچینج آبجیکٹ کے طور پر شامل کریں۔
img

img

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

    	var ticker1GetSucc = manager1.updateTicker("https://fapi.binance.com/fapi/v1/ticker/bookTicker", 
    		function(data) {return data}, 
    		function (ele) {return {bid1: ele.bidPrice, ask1: ele.askPrice, symbol: ele.symbol}})
    	var ticker2GetSucc = manager2.updateTicker("https://api.huobi.pro/market/tickers", 
    		function(data) {return data.data}, 
    		function(ele) {return {bid1: ele.bid, ask1: ele.ask, symbol: ele.symbol}})

مارکیٹ کے اعداد و شمار کو حاصل کرنے کے طریقہ کار کو ڈیزائن کرنے کے بعد ، ہم مارکیٹ کے اعداد و شمار کو حاصل کرنے کا ایک طریقہ تشکیل دے سکتے ہیں۔ کیونکہ یہ ایک کثیر علامت حکمت عملی ہے ، اکاؤنٹ اثاثہ ڈیٹا بھی متعدد ہے۔ خوش قسمتی سے ، ایک پلیٹ فارم اکاؤنٹ اثاثہ انٹرفیس عام طور پر مکمل اثاثہ ڈیٹا واپس کرتا ہے۔

کنسٹرکٹر میں اثاثے حاصل کرنے کا طریقہ شامل کریںcreateManager:

    // update assets
    self.updateAcc = function(callBackFuncGetAcc) {
        var ret = callBackFuncGetAcc(self)
        if (!ret) {
        	return false 
        }
        self.accData = ret 
        return true 
    }

اسی طرح، مختلف پلیٹ فارم انٹرفیس کی طرف سے واپس فارمیٹس کے لئے اور میدان کے نام مختلف ہیں، یہاں ہم خصوصی پروسیسنگ کرنے کے لئے کال بیک تقریب کا استعمال کرنے کی ضرورت ہے.

Huobi Spot اور Binance Futures کو مثال کے طور پر لیں، اور کال بیک فنکشن کو اس طرح لکھا جا سکتا ہے:

    // the callback function of obtaining the account assets 
    var callBackFuncGetHuobiAcc = function(self) {
        var account = self.e.GetAccount()
        var ret = []
        if (!account) {
        	return false 
        }
        // construct the array structure of assets 
        var list = account.Info.data.list
        _.each(self.subscribeList, function(symbol) {
            var coinName = symbol.split("usdt")[0]
            var acc = {symbol: symbol}
            for (var i = 0 ; i < list.length ; i++) {
            	if (coinName == list[i].currency) {
                    if (list[i].type == "trade") {
                        acc.Stocks = parseFloat(list[i].balance)
                    } else if (list[i].type == "frozen") {
                    	acc.FrozenStocks = parseFloat(list[i].balance)
                    }
                } else if (list[i].currency == "usdt") {
                	if (list[i].type == "trade") {
                		acc.Balance = parseFloat(list[i].balance)
                	} else if (list[i].type == "frozen") {
                		acc.FrozenBalance = parseFloat(list[i].balance)
                	}
                }
            }
            ret.push(acc)
        })
        return ret 
    }

    var callBackFuncGetFutures_BinanceAcc = function(self) {
    	self.e.SetCurrency("BTC_USDT")   // set to USDT-margined contract trading pair 
        self.e.SetContractType("swap")   // all are perpetual contracts
        var account = self.e.GetAccount() 
        var ret = []
        if (!account) {
        	return false 
        }
        var balance = account.Balance
        var frozenBalance = account.FrozenBalance
        // construct asset data structure 
        _.each(self.subscribeList, function(symbol) {
            var acc = {symbol: symbol}
            acc.Balance = balance
            acc.FrozenBalance = frozenBalance
            ret.push(acc)
        })
        return ret 
    }

مارکیٹ کے اعداد و شمار اور اثاثوں کو حاصل کرنے کے فنکشن کے ساتھ حکمت عملی کی ساخت کو چلائیں

مارکیٹ:img

اثاثہ جات:img

یہ دیکھا جا سکتا ہے کہ مارکیٹ کے اعداد و شمار حاصل کرنے کے بعد، آپ کو ہر علامت کی قیمت پھیلاؤ کا حساب کرنے کے لئے اعداد و شمار کی پروسیسنگ کر سکتے ہیں، اور کئی ٹریڈنگ جوڑوں کے مستقبل کی جگہ کی قیمت پھیلاؤ کی نگرانی. اور پھر آپ ایک کثیر علامت فیوچر ہیجنگ کی حکمت عملی ڈیزائن کر سکتے ہیں.

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


مزید