avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

کثیر مصنوعات کی حکمت عملی بنانے کے لیے ڈیجیٹل کرنسی ایکسچینج کے مجموعی مارکیٹ انٹرفیس کا استعمال کریں۔

میں تخلیق کیا: 2021-03-17 18:38:47, تازہ کاری: 2024-12-05 22:00:42
comments   13
hits   2466

کثیر مصنوعات کی حکمت عملی بنانے کے لیے ڈیجیٹل کرنسی ایکسچینج کے مجموعی مارکیٹ انٹرفیس کا استعمال کریں۔

کثیر مصنوعات کی حکمت عملی بنانے کے لیے ڈیجیٹل کرنسی ایکسچینج کے مجموعی مارکیٹ انٹرفیس کا استعمال کریں۔

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

Binance اور Huobi کو مثال کے طور پر لیں، اور ان کے API دستاویزات کو چیک کریں۔

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

  [
      {
          "symbol": "BTCUSDT", // 交易对
          "bidPrice": "4.00000000", //最优买单价
          "bidQty": "431.00000000", //挂单量
          "askPrice": "4.00000200", //最优卖单价
          "askQty": "9.00000000", //挂单量
          "time": 1589437530011   // 撮合引擎时间
      }
      ...
  ]
  [  
      {  
          "open":0.044297,      // 开盘价
          "close":0.042178,     // 收盘价
          "low":0.040110,       // 最低价
          "high":0.045255,      // 最高价
          "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
      }, ...]
  }

انٹرفیس کے ذریعے واپس کیے گئے ڈیٹا پر کارروائی کرتے وقت محتاط رہیں۔

پالیسی پروگرام کے فریم ورک کی تعمیر

حکمت عملی میں ان دو انٹرفیس کو کیسے سمیٹنا ہے اور ڈیٹا کو کیسے پروسیس کرنا ہے؟ آئیے مل کر اس پر ایک نظر ڈالیں۔

آئیے پہلے کنٹرول آبجیکٹ کو بنانے کے لیے کنسٹرکٹر لکھیں۔

// 参数e用于传入exchange交易所对象,参数subscribeList是需要处理的交易对列表,例如["BTCUSDT", "ETHUSDT", "EOSUSDT", "LTCUSDT", "ETCUSDT", "XRPUSDT"]
function createManager(e, subscribeList) {           
    var self = {}
    self.supportList = ["Futures_Binance", "Huobi"]  // 支持的交易所的

    // 对象属性
    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 = []                    // 接口获取的所有行情数据,定义数据格式:{bid1: 123, ask1: 123, symbol: "xxx"}}
    self.subscribeTickers = []           // 需要的行情数据,定义数据格式:{bid1: 123, ask1: 123, symbol: "xxx"}}
    self.accData = null                  // 用于记录账户资产数据

    // 初始化函数
    self.init = function() { 
    	// 判断是否支持该交易所
        if (!_.contains(self.supportList, self.name)) {        	
        	throw "not support"
        }
    }

    // 判断数据精度
    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
    }

    // 更新资产
    self.updateAcc = function(callBackFuncGetAcc) {
        var ret = callBackFuncGetAcc(self)
        if (!ret) {
        	return false 
        }
        self.accData = ret 
        return true 
    }

    // 更新行情数据
    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("错误:", 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("错误:", 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
    }

    // 初始化
    self.init()
	return self 
}

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

ہم ان خصوصی پروسیسنگ حصوں کو الگ کرنے کے لیے یہاں کال بیک فنکشن استعمال کرتے ہیں۔ لہذا مندرجہ بالا اعتراض کو شروع کرنے کے بعد، یہ اس طرح بن جاتا ہے جب استعمال کیا جاتا ہے: (مندرجہ ذیل کوڈ کنسٹرکٹر کو چھوڑ دیتا ہے۔createManager) Binance Futures کے ساتھ ان معاہدوں کی نگرانی کریں:["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) {
    	// 更新行情数据
    	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 : "期货行情数据",
        	cols : ["期货合约", "期货买一", "期货卖一"], 
        	rows : []
        }
        _.each(manager1.subscribeTickers, function(ticker) {
        	tbl1.rows.push([ticker.symbol, ticker.bid1, ticker.ask1])
        })
        var tbl2 = {
        	type : "table", 
        	title : "现货行情数据",
        	cols : ["现货合约", "现货买一", "现货卖一"], 
        	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)
    }
}

ٹیسٹ چلائیں: پہلی ایکسچینج آبجیکٹ Binance فیوچرز کا اضافہ کرتی ہے، اور دوسری ایکسچینج آبجیکٹ Huobi اسپاٹ کا اضافہ کرتی ہے۔ کثیر مصنوعات کی حکمت عملی بنانے کے لیے ڈیجیٹل کرنسی ایکسچینج کے مجموعی مارکیٹ انٹرفیس کا استعمال کریں۔

کثیر مصنوعات کی حکمت عملی بنانے کے لیے ڈیجیٹل کرنسی ایکسچینج کے مجموعی مارکیٹ انٹرفیس کا استعمال کریں۔

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

    	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اثاثے حاصل کرنے کا طریقہ شامل کریں۔

    // 更新资产
    self.updateAcc = function(callBackFuncGetAcc) {
        var ret = callBackFuncGetAcc(self)
        if (!ret) {
        	return false 
        }
        self.accData = ret 
        return true 
    }

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

مثال کے طور پر ہوبی اسپاٹ اور بائننس فیوچر کو لے کر، کال بیک فنکشن کو اس طرح لکھا جا سکتا ہے:

    // 获取账户资产的回调函数
    var callBackFuncGetHuobiAcc = function(self) {
        var account = self.e.GetAccount()
        var ret = []
        if (!account) {
        	return false 
        }
        // 构造资产的数组结构
        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")   // 设置为U本位合约的交易对
        self.e.SetContractType("swap")   // 合约都是永续合约
        var account = self.e.GetAccount() 
        var ret = []
        if (!account) {
        	return false 
        }
        var balance = account.Balance
        var frozenBalance = account.FrozenBalance
        // 构造资产数据结构
        _.each(self.subscribeList, function(symbol) {
            var acc = {symbol: symbol}
            acc.Balance = balance
            acc.FrozenBalance = frozenBalance
            ret.push(acc)
        })
        return ret 
    }

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

اقتباسات: کثیر مصنوعات کی حکمت عملی بنانے کے لیے ڈیجیٹل کرنسی ایکسچینج کے مجموعی مارکیٹ انٹرفیس کا استعمال کریں۔

اثاثے: کثیر مصنوعات کی حکمت عملی بنانے کے لیے ڈیجیٹل کرنسی ایکسچینج کے مجموعی مارکیٹ انٹرفیس کا استعمال کریں۔

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

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