মাল্টি-সিম্বল কৌশল তৈরির জন্য ক্রিপ্টোকারেন্সি প্ল্যাটফর্ম সমষ্টিগত বাজার ইন্টারফেস ব্যবহার করুন

লেখক:নিনাবাদাস, সৃষ্টিঃ ২০২২-০৪-২৪ ১৭ঃ৩৪ঃ০৩, আপডেটঃ

মাল্টি-সিম্বল কৌশল তৈরির জন্য ক্রিপ্টোকারেন্সি প্ল্যাটফর্ম সমষ্টিগত বাজার ইন্টারফেস ব্যবহার করুন

[লাইভ বিভাগে] (https://www.fmz.com/live) এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মের, মাল্টি-সিম্বল কৌশলগুলি প্রায়শই দেখা যায়, যা একসাথে কয়েক ডজন প্রতীক বা এমনকি একটি সম্পূর্ণ প্ল্যাটফর্মের বাজার পরিস্থিতি সনাক্ত করতে পারে। এটি কীভাবে করা হয়? এবং এটি কীভাবে ডিজাইন করা উচিত? এই নিবন্ধটি আপনাকে মাল্টি-সিম্বল কৌশল তৈরির জন্য প্ল্যাটফর্ম সমষ্টিগত বাজার ইন্টারফেসটি কীভাবে ব্যবহার করবেন তা নিয়ে যায়।

উদাহরণস্বরূপ, বিন্যান্স এবং হুওবি নিন; আপনি যদি তাদের এপিআই ডকুমেন্টেশন পরীক্ষা করেন, আপনি দেখতে পাবেন যে এখানে সমষ্টিগত ইন্টারফেস রয়েছেঃ

মার্কেট ইন্টারফেস

  • বিন্যান্স চুক্তিঃ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 
        }
        ...
    ]
    
  • হুবি স্পট: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
        }, ...]
    }
    

    ইন্টারফেস দ্বারা ফেরত দেওয়া ডেটা প্রক্রিয়াকরণের সময় মনোযোগ দেওয়া উচিত।

কৌশল প্রোগ্রাম কাঠামো নির্মাণ

কিভাবে কৌশল দুটি ইন্টারফেস encapsulate, এবং কিভাবে তথ্য প্রক্রিয়াকরণ? আসুন এক নজরে দেখি।

প্রথমে, একটি কনস্ট্রাক্টর লিখুন, নিয়ন্ত্রণ বস্তু নির্মাণ করতে

// 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 মূল্য, যা বলা হয়ঃbidPriceBinance-এ, কিন্তুbidহুওবিতে।

আমরা এখানে কলব্যাক ফাংশন ব্যবহার করি এবং এই অংশগুলোকে আলাদা করি যেগুলোকে স্বতন্ত্রভাবে বিশেষীকৃত প্রক্রিয়াকরণের প্রয়োজন হয়। সুতরাং উপরের বস্তুটি শুরু করার পরে, এটি নির্দিষ্ট ব্যবহারে এইরকম হয়ে যায়ঃ (নিম্নলিখিত কোডটি কনস্ট্রাক্টরকে বাদ দেয়)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 
    }

একইভাবে, বিভিন্ন প্ল্যাটফর্ম ইন্টারফেস দ্বারা ফেরত ফরম্যাটের জন্য এবং ক্ষেত্রের নাম ভিন্ন, এখানে আমরা বিশেষীকরণ প্রক্রিয়াকরণ করতে কলব্যাক ফাংশন ব্যবহার করতে হবে।

উদাহরণস্বরূপ হুইবি স্পট এবং বিন্যান্স ফিউচার নিন, এবং কলব্যাক ফাংশনটি এভাবে লেখা যেতে পারেঃ

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

এটা দেখা যায় যে বাজারের তথ্য পাওয়ার পর, আপনি প্রতিটি প্রতীকের দামের স্প্রেড গণনা করতে এবং একাধিক ট্রেডিং জোড়ার ফিউচার-স্পট মূল্যের স্প্রেড পর্যবেক্ষণ করতে ডেটা প্রক্রিয়া করতে পারেন। এবং তারপর আপনি একটি মাল্টি-সিম্বল ফিউচার হেজিং কৌশল ডিজাইন করতে পারেন।

এই নকশা অনুযায়ী, অন্যান্য প্ল্যাটফর্মগুলিও এইভাবে প্রসারিত করা যেতে পারে এবং আগ্রহী শিক্ষার্থীরা এটি চেষ্টা করতে পারে।


আরো