Type/to search
8
Follow
1364
Followers
বহু-পণ্য কৌশল তৈরি করতে ডিজিটাল মুদ্রা বিনিময়ের সমষ্টিগত বাজার ইন্টারফেস ব্যবহার করুন
Discussions
Created 2021-03-17 18:38:47  Updated 2024-12-05 22:00:42
 13
 2819

img

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

FMZ পরিমাণগত ট্রেডিং প্ল্যাটফর্মকৌশলগত ঘড়ি অধ্যায়কিছু বহু-পণ্য কৌশল দেখা যায় যা একই সাথে কয়েক ডজন বা এমনকি একটি এক্সচেঞ্জের পুরো বাজারের বাজার পরিস্থিতি পর্যবেক্ষণ করে। এটা কিভাবে করা হয়? এবং এটি কীভাবে ডিজাইন করা উচিত? এই প্রবন্ধে আমরা আলোচনা করব কিভাবে এক্সচেঞ্জ অ্যাগ্রিগেটেড মার্কেট ইন্টারফেস ব্যবহার করে একটি মাল্টি-প্রোডাক্ট কৌশল তৈরি করতে হয়।

Binance এবং Huobi দুটি এক্সচেঞ্জের তালিকা করুন, এক্সচেঞ্জ 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 }

FMZ API ফাংশন ব্যবহার করেHttpQueryফাংশন এক্সচেঞ্জ ইন্টারফেস অ্যাক্সেস করার জন্য একটি অনুরোধ করে। ব্যবহারHttpQueryব্যতিক্রম হ্যান্ডলিং প্রয়োজন হয় যখনtry...catchইন্টারফেস রিটার্ন ব্যর্থতার মতো অস্বাভাবিক পরিস্থিতি পরিচালনা করুন।
কিছু ছাত্র যারা এটি দেখে তারা জিজ্ঞাসা করতে পারে: "এক্সচেঞ্জ ইন্টারফেস দ্বারা প্রত্যাবর্তিত ডেটা স্ট্রাকচারগুলি আলাদা, তাদের সাথে কীভাবে মোকাবিলা করা যায়? একই প্রক্রিয়াকরণ পদ্ধতি ব্যবহার করা অবশ্যই সম্ভব নয়।"
প্রকৃতপক্ষে, শুধুমাত্র এক্সচেঞ্জ ইন্টারফেস দ্বারা প্রত্যাবর্তিত ডেটা স্ট্রাকচারগুলিই আলাদা নয়, এমনকি প্রত্যাবর্তিত ডেটা ক্ষেত্রের নামগুলিও আলাদা। একই অর্থের বিভিন্ন নাম থাকতে পারে। উদাহরণস্বরূপ, আমরা উপরে তালিকাভুক্ত ইন্টারফেস. একই অভিব্যক্তি মানে একটি মূল্য কিনুন, যাকে Binance বলা হয়:bidPrice, যাকে বলা হয়bid

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

পরীক্ষা চালান:
প্রথম বিনিময় বস্তু Binance ফিউচার যোগ করে, এবং দ্বিতীয় বিনিময় বস্তু Huobi স্পট যোগ করে।
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 }

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

Huobi Spot এবং Binance Futures উদাহরণ হিসেবে নিয়ে, আপনি কলব্যাক ফাংশনটি এভাবে লিখতে পারেন:

// 获取账户资产的回调函数 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

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

এই ডিজাইন পদ্ধতি অনুসারে, অন্যান্য এক্সচেঞ্জগুলিও প্রসারিত করা যেতে পারে আগ্রহী শিক্ষার্থীরা এটি ব্যবহার করে দেখতে পারেন

Related Recommendations
Comment
All comments (13)

    更新资产里面的callBackFuncGetAcc是个参数,还是个函数呀?另外获取资产账户的两个回调函数callBackFuncGetHuobiAcc和callBackFuncGetFutures_BinanceAcc与callBackFuncGetAcc什么关系?我感觉是函数里面套函数,这块的知识哪里学习?

    5 years ago

    百度回调函数。

    5 years ago

    请问期现差价时,如何同时提取一个交易对的现货Bid1与期货Ask1的价格?

    5 years ago

    你看代码里买一、卖一都有数据的。

    5 years ago

    我看到了,但是没有统一指定同一交易对

    5 years ago

    没明白你的意思。

    5 years ago

    文章中获取期现差价的图怎么没公布源码呀?

    5 years ago

    这个具体编写就行了,买一卖一都有了,差价不就是相互减一下。

    5 years ago

    我的思路你看对不对?假如要获取BTCUSDT现货买一价和BTCUSDT期货卖一价的差价:首先遍历期货行情数组manager1.subscribeTickers,找出BTCUSDT的卖一价manager1.subscribeTickers[i].ask1,问题是如何在期货遍历数组进行时如何提取现货BTCUSDT的bid1价格,难道再间套遍历下现货行情数组manager1.subscribeTickers?不知道老师您明白我的问题了吗?

    5 years ago

    就是两个循环套着,遍历。

    5 years ago

    我的意思是期货与现货的差价,不是期货或现货买一卖一的差价;碰到的问题是,不能同时获取同一交易对期货买一价和现货的卖一价。比如:如何获取BTCUSDT现货买一价和BTCUSDT期货卖一价的差价。我写了下,下面代码不知道问题出在哪里?
    function GetBAspot(syboml,tickerspot,BA){
    for (var i = 0; i < tickerspot.length; i++) {
    if(tickerspot[i].syboml!==syboml){
    continue
    }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.subscribeTickers, 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")])
    })
    }

    5 years ago

    我给你说的就是现货和期货的差价,文章上不是都截图了,期现差价。
    数据都有了,具体怎么算,你减一下不就有了么。

    5 years ago

    厉害

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)