ایف ایم زیڈ کوالٹی ٹریڈنگ پلیٹ فارماسٹریٹجک آؤٹ لکاس میں متعدد حکمت عملیوں کو اکثر دیکھا جاتا ہے ، جبکہ درجنوں یا ایک ہی تبادلے کے پورے بازاروں کی مارکیٹوں کا پتہ لگایا جاتا ہے۔ یہ کیسے کیا جاتا ہے؟ اور اسے کس طرح ڈیزائن کرنے کی ضرورت ہے؟ یہ مضمون آپ کو اس بات کا جائزہ لینے کے لئے لے جاتا ہے کہ کس طرح تبادلوں کے مجموعی مارکیٹ انٹرفیس کا استعمال کرتے ہوئے متعدد حکمت عملیوں کی تعمیر کی جاسکتی ہے۔
ایک بار جب ہم ان دونوں تبادلے کی فہرست بنان اور ٹوکن پر لگاتے ہیں تو ، تبادلے کے 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)
}
}
ٹیسٹ چلائیں: پہلی تبادلے کی اشیاء نے ٹوکن فیوچر شامل کیے ، دوسری تبادلے کی اشیاء نے ٹوکن کی نقد رقم شامل کی
جیسا کہ آپ دیکھ سکتے ہیں ، یہاں مختلف تبادلے کے لئے خصوصی پروسیسنگ کے لئے واپسی کے افعال کا استعمال کرتے ہوئے انٹرفیس کو واپس آنے والے ڈیٹا کو کس طرح حاصل کرنے کے بارے میں کارروائی کی جاتی ہے۔
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.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"))))) }) }
ایجاد کاروں کی مقدار - خوابیہ خاص تحریر کام کرتی ہے ، ایک خریدار ایک بیچتا ہے ، قیمتوں میں فرق ایک دوسرے سے کم نہیں ہوتا ہے۔
جیمی سے محبتاس مضمون میں آنے والی قیمتوں میں فرق حاصل کرنے کی تصویر کا ماخذ کوڈ کیوں نہیں شائع کیا گیا؟
ایجاد کاروں کی مقدار - خوابآپ کا کیا مطلب ہے مجھے سمجھ نہیں آ رہا ہے۔
جیمی سے محبتمیں نے دیکھا ہے، لیکن ایک ہی ٹرانزیکشن کے لئے کوئی یونیفارم مخصوص جوڑی نہیں ہے.
ایجاد کاروں کی مقدار - خوابآپ کو اس کوڈ میں خریدنے اور فروخت کرنے کے لئے اعداد و شمار دیکھ سکتے ہیں.