ڈیجیٹل کرنسی کے تبادلے کا استعمال کرتے ہوئے مارکیٹ انٹرفیس کو اکٹھا کرنے کے لئے متعدد حکمت عملی تیار کریں

مصنف:چھوٹا سا خواب, تخلیق: 2021-03-17 18:38:47, تازہ کاری: 2023-09-26 20:58:11

img

ڈیجیٹل کرنسی کے تبادلے کا استعمال کرتے ہوئے مارکیٹ انٹرفیس کو اکٹھا کرنے کے لئے متعدد حکمت عملی تیار کریں

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

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

کاروباری انٹرفیس

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

    [
        {
            "symbol": "BTCUSDT", // 交易对
            "bidPrice": "4.00000000", //最优买单价
            "bidQty": "431.00000000", //挂单量
            "askPrice": "4.00000200", //最优卖单价
            "askQty": "9.00000000", //挂单量
            "time": 1589437530011   // 撮合引擎时间
        }
        ...
    ]
    
  • ٹوکن کی نقد رقم:https://api.huobi.pro/market/tickersانٹرفیس ڈیٹا واپس کرتا ہے

    [  
        {  
            "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
        }, 
        ...
    ]
    

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

    {
        "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 
}

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

یہاں ہم نے ان خصوصی عملوں کے حصوں کو الگ الگ کرنے کے لئے کال آؤٹ فنکشن حل کا استعمال کیا ہے۔ مندرجہ بالا اعتراض کو ابتدائی طور پر استعمال کرنے کے بعد ، اس کا استعمال اس طرح ہوتا ہے۔ (بنیادی افعال کو مندرجہ ذیل کوڈ میں نظر انداز کر دیا گیا ہے)createManager(بزبان انگریزی) یہ معاہدے بینکائن فیوچر کے ذریعہ نگرانی کیے جاتے ہیں:["BTCUSDT", "ETHUSDT", "EOSUSDT", "LTCUSDT", "ETCUSDT", "XRPUSDT"]اس کے علاوہ ، یہ بھی کہا جاتا ہے کہ یہ ایک بہت ہی عام چیز ہے۔["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)
    }
}

ٹیسٹ چلائیں: پہلی تبادلے کی اشیاء نے ٹوکن فیوچر شامل کیے ، دوسری تبادلے کی اشیاء نے ٹوکن کی نقد رقم شامل کی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اثاثوں کو حاصل کرنے کے طریقوں کو شامل کریں

    // 更新资产
    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 
    }

مارکیٹ تک رسائی، اثاثوں کی خصوصیات کے ساتھ ایک اسٹریٹجک فریم ورک چلانا

اس کے بارے میں:img

اثاثہ جات:img

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

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


متعلقہ

مزید

جیمی سے محبتcallBackFuncGetAcc ایک پیرامیٹر ہے یا ایک فنکشن؟ اس کے علاوہ اثاثہ اکاؤنٹ حاصل کرنے کے لئے دو کال بیک افعال callBackFuncGetHuobiAcc اور callBackFuncGetFutures_BinanceAcc ہیں.

جیمی سے محبتسوال: فاریکس ٹریڈنگ کے دوران ، کس طرح ایک ہی وقت میں ایک ٹریڈنگ جوڑی کے لئے فوری Bid1 اور فیوچر Ask1 کی قیمت نکالنے کے لئے؟

زلٹیزبردست

چھوٹا سا خواببائیوٹا کال بیک فنکشن۔

چھوٹا سا خوابیہ دو حلقے آپس میں جڑے ہوئے ہیں اور اس میں سے گزر رہے ہیں۔

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

جیمی سے محبتمیرا خیال ہے کہ آپ کو صحیح نظر نہیں آتا؟ اگر آپ کو بی ٹی سی یو ایس ڈی ٹی کی فوری خرید و فروخت کی قیمت اور بی ٹی سی یو ایس ڈی ٹی کی فیوچر فروخت کی قیمت کے درمیان فرق حاصل کرنا ہے تو: پہلے فیوچر مارکیٹ کے میٹرکس مینیجر 1.subscribeTickers پر جائیں ، بی ٹی سی یو ایس ڈی ٹی کی فروخت کی قیمت مینیجر 1.subscribeTickers[i].ask1 تلاش کریں ، سوال یہ ہے کہ فیوچر ٹریول میٹرکس کے دوران فوری طور پر بی ٹی سی یو ایس ڈی ٹی کی بولی کی قیمت کو کیسے نکالا جائے ، کیا آپ پھر فیوچر مارکیٹ کے میٹرکس مینیجر 1.subscribeTickers پر جاسوسی کریں گے؟

جیمی سے محبتمیرا مطلب یہ ہے کہ فیوچر اور فوری کے مابین فرق ، فیوچر یا فوری خرید و فروخت کا فرق نہیں ہے۔ مسئلہ یہ ہے کہ ایک ہی تجارت میں فیوچر کی خرید و فروخت کی قیمت اور فوری کی فروخت کی قیمت ایک ہی وقت میں حاصل نہیں کی جاسکتی ہے۔ مثال کے طور پر: بی ٹی سی یو ایس ڈی ٹی فیوچر کی خرید و فروخت کی قیمت اور بی ٹی سی یو ایس ڈی ٹی فیوچر کی فروخت کی قیمت کا فرق کیسے حاصل کیا جائے؟ میں نے لکھا ، مندرجہ ذیل کوڈ کا مسئلہ نہیں جانتا کہ کہاں سے آیا؟ function GetBAspot ((syboml، tickerspot، BA) { for (var i = 0؛ i < tickerspot.length؛ i++) { if ((tickerspot[i].syboml!==syboml) { جاری رکھیں }else if ((tickerspot[i].syboml===syboml) { var bidspot=tickerspot[i].bid1 var askspot=tickerspot[i].ask1 } } if(BA==="bid")return bidspot اگر آپ کے پاس کوئی ٹکٹ نہیں ہے تو ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے۔ if(BA==="ask")return askspot اگر آپ کے پاس کوئی سوال ہے تو اس کا جواب دیں } function main() { _.each ((manager1.subscribe ٹکر، function ((ticker) { var symb=ticker.symbol var symb1=manager1.symFuturesToSpot (symb) tbl1.rows.push (([ticker.symbol, ticker.bid1, ticker.ask1, manager1.Getfundingrate ((symb), manager1.Getrealrate ((symb, 50),GetBAspot ((symb1, SpotTickers, "ask"))))) }) }

چھوٹا سا خوابیہ خاص تحریر کام کرتی ہے ، ایک خریدار ایک بیچتا ہے ، قیمتوں میں فرق ایک دوسرے سے کم نہیں ہوتا ہے۔

جیمی سے محبتاس مضمون میں آنے والی قیمتوں میں فرق حاصل کرنے کی تصویر کا ماخذ کوڈ کیوں نہیں شائع کیا گیا؟

چھوٹا سا خوابآپ کا کیا مطلب ہے مجھے سمجھ نہیں آ رہا ہے۔

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

چھوٹا سا خوابآپ کو اس کوڈ میں خریدنے اور فروخت کرنے کے لئے اعداد و شمار دیکھ سکتے ہیں.