এফএমজেড পরিমাণগত লেনদেনের প্ল্যাটফর্মকৌশলগত আউটপুটএটি প্রায়শই কয়েক ডজন বা এমনকি একটি এক্সচেঞ্জের পুরো বাজার জুড়ে বিভিন্ন কৌশলগুলি সনাক্ত করে। এটি কীভাবে করা যায়? এবং এটি কীভাবে ডিজাইন করা দরকার? এই নিবন্ধটি আপনাকে এক্সচেঞ্জের সমন্বিত বাজারের ইন্টারফেসগুলি ব্যবহার করে কীভাবে একটি বহুবিধ কৌশল তৈরি করা যায় তা নিয়ে যায়।
বিএনএন এবং টোকেন উভয় এক্সচেঞ্জের নাম তালিকাভুক্ত করুন এবং এক্সচেঞ্জের এপিআই ডকুমেন্টেশনটি দেখুন এবং আপনি দেখতে পাবেন যে উভয়ই সমষ্টিগত মার্কেট ইন্টারফেস রয়েছেঃ
বিএনএ চুক্তিঃ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
ইন্টারফেস রিটার্ন ব্যর্থতার মতো ব্যতিক্রমগুলি পরিচালনা করুন।
এখানে কিছু শিক্ষার্থী হয়তো প্রশ্ন করবে যে, 'কোনও এক্সচেঞ্জের ইন্টারফেস থেকে ফিরে আসা তথ্যের বিভিন্ন কাঠামো কীভাবে পরিচালনা করা যায়?
এটি সত্য যে, কেবল এক্সচেঞ্জ ইন্টারফেসের ফিরে আসা ডেটা কাঠামোই নয়, এমনকি ফিরে আসা ডেটা ক্ষেত্রের নামও আলাদা। একই অর্থের অর্থ হতে পারে বিভিন্ন নামকরণ। উদাহরণস্বরূপ, আমরা উপরে তালিকাভুক্ত ইন্টারফেসটি। একই অর্থের অর্থ একটি মূল্য কিনতে, বিয়ানামে বলা হয়ঃ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)
}
}
পরীক্ষা চালানঃ প্রথম এক্সচেঞ্জ অবজেক্টের সাথে কয়েন এন ফিউচার যুক্ত করা হয়েছে, দ্বিতীয় এক্সচেঞ্জ অবজেক্টের সাথে টোকন ক্যাশ যুক্ত করা হয়েছে
আপনি দেখতে পাচ্ছেন যে এখানে কীভাবে ইন্টারফেস থেকে ফিরে আসা ডেটা সংগ্রহ করা যায় সে সম্পর্কে অপারেশনগুলি পুনরুদ্ধার ফাংশন ব্যবহার করে বিভিন্ন এক্সচেঞ্জের জন্য বিশেষীকরণ করা হয়।
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
}
মামলাঃ
সম্পদঃ
আপনি দেখতে পাচ্ছেন যে বাজারের ডেটা পাওয়ার পরে, ডেটাটি বিভিন্ন জাতের পার্থক্য গণনা করতে পারে এবং একাধিক লেনদেনের জোড়ার বিমূর্ত পার্থক্য পর্যবেক্ষণ করতে পারে। এটি একটি বৈচিত্র্যময় ফরেক্স হেজিং কৌশল তৈরি করতে পারে।
এই ডিজাইনের ভিত্তিতে, অন্যান্য এক্সচেঞ্জগুলিও প্রসারিত করা যেতে পারে, এবং আগ্রহী শিক্ষার্থীরা এটি চেষ্টা করতে পারে।
জিমিকে ভালোবাসি।callBackFuncGetAcc একটি ফাংশন বা একটি প্যারামিটার? এবং সম্পদ অ্যাকাউন্টের জন্য দুটি রিটার্ন ফাংশন callBackFuncGetHuobiAcc এবং callBackFuncGetFutures_BinanceAcc এর সাথে কি সম্পর্ক আছে? আমি মনে করি এটি একটি ফাংশনের মধ্যে একটি সেট ফাংশন, এই জ্ঞানটি কোথায় শিখতে হবে?
জিমিকে ভালোবাসি।প্রশ্নঃ ফরেক্স ফরেক্সে, কিভাবে একটি ট্রেডিং জোড়ার জন্য একই সময়ে বর্তমান Bid1 এবং ফরেক্স Ask1 এর দাম বের করা যায়?
জিএলটিআইএমদুর্দান্ত
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নবাইডো কল ফাংশন ।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএই দুইটি চক্র একে অপরের সাথে মিলিত হয় এবং একে অপরকে অতিক্রম করে।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নআমি আপনাকে বলছি যে, বর্তমান ও ভবিষ্যৎ মূল্যের পার্থক্য, যা নিবন্ধে স্ক্রিনশট নয়, বর্তমান মূল্যের পার্থক্য। আপনি যদি এই সংখ্যাটি হ্রাস করতে চান তবে আপনি কী করতে পারেন?
জিমিকে ভালোবাসি।আমার মনে হয় আপনি ঠিক আছেন? যদি বিটিসি ইউএসডিটি এক্সচেঞ্জ ক্রয় মূল্য এবং বিটিসি ইউএসডিটি এক্সচেঞ্জ বিক্রয় মূল্যের পার্থক্য পেতে চানঃ প্রথমে এক্সচেঞ্জ মার্কেট ম্যাট্রিক্স ম্যানেজার 1. সাবস্ক্রাইব টিকারগুলি ঘুরে দেখুন, বিটিসি ইউএসডিটি এক্সচেঞ্জ মার্কেট ম্যাট্রিক্স ম্যানেজার 1. সাবস্ক্রাইব টিকারগুলি [i].ask1 খুঁজে বের করুন, প্রশ্নটি হ'ল কীভাবে এক্সচেঞ্জ মার্কেটস ম্যানেজার 1. সাবস্ক্রাইব টিকারগুলির মধ্যে এক্সচেঞ্জ বিটিসি ইউএসডিটি এক্সচেঞ্জের বিড 1 দাম বের করা যায়, আবার কি এক্সচেঞ্জ মার্কেট ম্যাট্রিক্স ম্যানেজার 1. সাবস্ক্রাইব টিকারগুলি ঘুরে দেখুন?
জিমিকে ভালোবাসি।আমি বলতে চাচ্ছি, ফরোয়ার্ড ও অবকাঠামোর মধ্যে পার্থক্য, ফরোয়ার্ড বা অবকাঠামোর মধ্যে কেনার ও বিক্রির পার্থক্য নয়; সমস্যাটি হ'ল একই লেনদেনের জন্য ফরোয়ার্ডের কেনার এবং অবকাঠামোর বিক্রয়ের দাম একসাথে পাওয়া যায় না। উদাহরণস্বরূপঃ কিভাবে বিটিসি ইউএসডিটি অবকাঠামোর মধ্যে কেনার এবং বিটিসি ইউএসডিটি অবকাঠামোর মধ্যে বিক্রয়ের দামের পার্থক্য পাওয়া যায়? আমি লিখেছি, নীচের কোড সমস্যাটি কোথায় আসে তা জানি না। 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=টিকার্সপট[i].bid1 var askspot=টিকার্সপট[i].ask1 } } if ((BA==="bid") return bidspot if ((BA==="ask") return askspot যদি আপনি চান তবে আপনি এটি পেতে পারেন } function main (() { _.each ((manager1.subscribe টিকার, ফাংশন ((টিকার) { 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")]))) }) }
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএই নির্দিষ্ট লেখার কাজ হয়েছে, একের পর এক কেনা বেচা হচ্ছে, দামের পার্থক্য একে অপরের থেকে কমিয়ে আনা হচ্ছে না।
জিমিকে ভালোবাসি।এই নিবন্ধে ফরেক্সের দামের ছবির উৎস কোড প্রকাশ করা হয়নি কেন?
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নআপনি কি বলতে চাচ্ছেন তা বুঝতে পারছি না।
জিমিকে ভালোবাসি।আমি দেখেছি, কিন্তু একই লেনদেনের জন্য কোন একক নির্দিষ্ট
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নআপনি কোডটি দেখেন এবং এটিতে একটি কেনা, একটি বিক্রি এবং সমস্ত ডেটা রয়েছে।