[
উদাহরণস্বরূপ, বিন্যান্স এবং হুওবি নিন; আপনি যদি তাদের এপিআই ডকুমেন্টেশন পরীক্ষা করেন, আপনি দেখতে পাবেন যে এখানে সমষ্টিগত ইন্টারফেস রয়েছেঃ
বিন্যান্স চুক্তিঃ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
ব্যতিক্রম যেমন ইন্টারফেস রিটার্ন ব্যর্থতা মোকাবেলা করতে।
এখানে কিছু শিক্ষার্থী প্রশ্ন করতে পারেঃ bidPrice
Binance-এ, কিন্তু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)
}
}
অপারেশন টেস্টঃ
প্রথম এক্সচেঞ্জ অবজেক্ট হিসেবে বিন্যান্স ফিউচার যুক্ত করুন এবং দ্বিতীয় এক্সচেঞ্জ অবজেক্ট হিসেবে হুবি স্পট যুক্ত করুন।
আপনি দেখতে পাচ্ছেন, এখানে কলব্যাক ফাংশনটি বিভিন্ন প্ল্যাটফর্মের ক্রিয়াকলাপের উপর বিশেষীকৃত প্রসেসিং করার জন্য কল করা হয়, যেমন ইন্টারফেস দ্বারা ফেরত দেওয়া ডেটা কিভাবে পাওয়া যায়।
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
}
বাজার:
সম্পদ:
এটা দেখা যায় যে বাজারের তথ্য পাওয়ার পর, আপনি প্রতিটি প্রতীকের দামের স্প্রেড গণনা করতে এবং একাধিক ট্রেডিং জোড়ার ফিউচার-স্পট মূল্যের স্প্রেড পর্যবেক্ষণ করতে ডেটা প্রক্রিয়া করতে পারেন। এবং তারপর আপনি একটি মাল্টি-সিম্বল ফিউচার হেজিং কৌশল ডিজাইন করতে পারেন।
এই নকশা অনুযায়ী, অন্যান্য প্ল্যাটফর্মগুলিও এইভাবে প্রসারিত করা যেতে পারে এবং আগ্রহী শিক্ষার্থীরা এটি চেষ্টা করতে পারে।