پچھلے مضمون میں، ہم نے ایک ساتھ مل کر ایک سادہ ہیجنگ کی حکمت عملی کو لاگو کیا، اور پھر ہم سیکھیں گے کہ کس طرح حکمت عملی کو اپ گریڈ کرنا ہے. حکمت عملی میں بہت سی تبدیلیاں نہیں ہیں ، لیکن تبدیلیوں کی تفصیلات پر توجہ دینے کی ضرورت ہے۔ کوڈ میں کچھ جگہوں کی تعریفوں میں ، پچھلے لوگوں کے مقابلے میں ، ترمیم کی گئی ہے ، جن کو خاص طور پر سمجھنے کی ضرورت ہے۔
A->B
اورB->A
، کے ساتھ ساتھ افقی پھیلاؤ ٹرگر لائنوں، ہم براہ راست استعمال کر سکتے ہیںchart plot library
; فائدہ سادگی اور استعمال میں آسانی ہے۔ یہاں سے ، ہم یہ بھی سیکھتے ہیں کہ ایف ایم زیڈ کی تقریب کا استعمال کیسے کریںtemplate library
together.اگلا، آئیے ان ڈیزائننگ آئیڈیوں کو ایک ایک کرکے عملی جامہ پہنانا۔
مثال کے طور پر بائننس اسپاٹ بوٹ لے لو۔ اسپاٹ مارجن موڈ میں سوئچ کرنے کے لئے ، کوڈ کا استعمال کریںexchanges[i].IO
، پیرامیٹر درآمد کریںtrade_normal
الگ تھلگ مارجن پر سوئچ کرنے اور درآمدtrade_super_margin
to کو کراس مارجن میں تبدیل کر دیا گیا ہے، جو بیک ٹسٹ میں معاون نہیں ہے۔ جو صرف بوٹس میں استعمال کیا جا سکتا ہے۔
کے آغاز میں تیاریmain
فنکشن، شامل کریں:
// switch the margin mode
for (var i = 0 ; i < exchanges.length ; i++) { // traverse and detect all exchange objects added
if (exchanges[i].GetName() == "Binance" && marginType != 0) { // if the exchange object represented by the current index i is Binance Spot, and the parameter marginType on the strategy interface is not selected as the "common spot" option, execute the switch
if (marginType == 1) {
Log(exchanges[i].GetName(), "set to isolated margin")
exchanges[i].IO("trade_normal")
} else if (marginType == 2) {
Log(exchanges[i].GetName(), "set to cross margin")
exchanges[i].IO("trade_super_margin")
}
}
}
یہاں حکمت عملی صرف بائننس اسپاٹ کے اسپاٹ مارجن موڈ کو سوئچ کرنے کے لئے کوڈ شامل کرتی ہے ، لہذا حکمت عملی کے پیرامیٹرز میں سوئچ کی ترتیب صرف بائننس اسپاٹ کے لئے کام کرتی ہے۔
کیپسول شدہ پلاٹنگ ٹیمپلیٹس کا استعمال بہت آسان ہے۔ یہاں ہم استعمال کرتے ہیں ٹیمپلیٹ کا نام ہےchart plot Library
. آپ براہ راست FMZ پلیٹ فارم کے میدان میں اس کی تلاش کر سکتے ہیں.
یا آپ براہ راست اس لنک پر کلک کر سکتے ہیں:https://www.fmz.com/strategy/27293ٹیمپلیٹ کے کاپی صفحے پر جانے کے لئے.
بٹن پر کلک کریں اور آپ کو آسانی سے آپ کی اپنی حکمت عملی لائبریری میں ٹیمپلیٹ کاپی کر سکتے ہیں.
پھر ، حکمت عملی میں ترمیم کے صفحے پر ، آپ ٹیمپلیٹ کالم میں استعمال ہونے والی ٹیمپلیٹ لائبریری کو چیک کرسکتے ہیں۔ اس کی جانچ پڑتال کے بعد حکمت عملی کو محفوظ کریں ، اور حکمت عملی اس ٹیمپلیٹ کو استعمال کرے گی۔ یہ صرف ٹیمپلیٹ لائبریری کے استعمال کی ایک مختصر وضاحت ہے۔ چونکہ حکمت عملی نے پہلے ہی اس ٹیمپلیٹ کا حوالہ دیا ہے ، لہذا آپریشن کو دہرانے کی ضرورت نہیں ہے۔ جب آپ اسکوائر میں حکمت عملی کا کوڈ کاپی کرتے ہیں تو ، آپ دیکھ سکتے ہیں کہchart plot Library
حکمت عملی میں ترمیم کے صفحے کے ٹیمپلیٹ بار میں حوالہ دیا گیا ہے۔
یہاں ہم بنیادی طور پر سیکھتے ہیں کہ کس طرح افعال کو استعمال کرنا ہےchart plot library
منصوبہ بندی کرنا۔
ہم کے پھیلاؤ کا نقشہ بنانے کا ارادہ رکھتے ہیںA->B
اورB->A
، اور پھیلاؤ کی ٹرگر لائن۔ ہمیں دو منحنی خطوط (فی الحال ، A سے B اور B سے A تک پھیلاؤ) ، اور دو افقی لائنیں (پھیلاؤ ٹرگر لائنیں) ، جیسا کہ اوپر کی شکل میں دکھایا گیا ہے ، کو پلاٹ کرنے کی ضرورت ہے۔
کیونکہ ہم ایک رخا ہیج ڈیزائن کرنا چاہتے ہیں، ٹرگر لائنوں کےA->B
اورB->A
مختلف ہو جائے گا، اور ہم پچھلے مضمون میں ڈیزائن استعمال نہیں کر سکتے ہیں.
پچھلے مضمون میں:
var targetDiffPrice = hedgeDiffPrice
if (diffAsPercentage) {
targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
}
صرف ایک ٹرگر پھیلاؤ ہےtargetDiffPrice
.
لہذا، یہاں ہم کوڈ کو تبدیل کرنے کی ضرورت ہے، اور ہم پہلے پیرامیٹرز کو تبدیل کرنے کی ضرورت ہے.
پھر، کوڈ میں ترمیم کریں:
var targetDiffPriceA2B = hedgeDiffPriceA2B
var targetDiffPriceB2A = hedgeDiffPriceB2A
if (diffAsPercentage) {
targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
}
اس طرح، پھیلاؤ ٹرگر لائن پچھلے ایک سے تبدیل کر دیا گیا ہےtargetDiffPrice
دو، یعنیtargetDiffPriceA2B
اورtargetDiffPriceB2A
.
اگلا، آپ چارٹ چارٹ لائبریری کے چارٹ پلاٹنگ فنکشن کا استعمال کر سکتے ہیں چارٹ پر ڈیٹا ڈرائنگ کرنے کے لئے.
// plot
$.PlotHLine(targetDiffPriceA2B, "A->B") // the first parameter of the function is the value of the horizontal line in the Y-axis direction, and the second parameter is the display text
$.PlotHLine(targetDiffPriceB2A, "B->A")
جب حکمت عملی چلتی ہے، چارٹ اس طرح دکھایا جائے گا.
اگلا، حقیقی وقت میں پھیلاؤ وکر ڈرائنگ؛ زیادہ سے زیادہ ڈرائنگ سے بچنے کے لئے، توازن کا پتہ لگانے میں حقیقی وقت میں پھیلاؤ وکر کی گرافنگ کوڈ ڈالیں. s
if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
nowAccs = _C(updateAccs, exchanges)
var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
cancelAll()
if (isBalance) {
lastKeepBalanceTS = ts
if (isTrade) {
var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
isTrade = false
}
}
$.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price) // plot real-time spread curves
$.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price) // the first parameter is the curve name, and the second parameter is the curve value at the current moment, that is, the value in the Y-axis direction at the current moment
}
پلاٹنگ کوڈ کو صرف 4 لائنوں کی ضرورت ہوتی ہے تاکہ چلانے کے دوران چارٹ ڈسپلے کے ساتھ حکمت عملی کی اجازت دی جاسکے۔
جیسا کہ اوپر ذکر کیا گیا ہے، پھیلاؤ ٹرگر لائن کی تعداد کو دو میں تبدیل کر دیا گیا ہے، جو بالترتیب ہیج ٹرگر کو کنٹرول کرتے ہیںA->B
اورB->A
اس طرح، پچھلے آرڈر کی قیمت الگورتھم استعمال نہیں کیا جا سکتا، اور اس کی بجائے مارکیٹ کی قیمت میں سلائڈ قیمت شامل کرنے کا طریقہ استعمال کیا جاتا ہے.
if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) { // A->B market condition satisfied
var priceSell = depthA.Bids[0].Price - slidePrice
var priceBuy = depthB.Asks[0].Price + slidePrice
var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
Log("triggerA->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks) // prompt message
hedge(exB, exA, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
} else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) { // B->A market condition satisfied
var priceBuy = depthA.Asks[0].Price + slidePrice
var priceSell = depthB.Bids[0].Price - slidePrice
var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
Log("triggerB->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks) // prompt message
hedge(exA, exB, priceBuy, priceSell, amount)
cancelAll()
lastKeepBalanceTS = 0
isTrade = true
}
}
چونکہ خرید اور فروخت کی قیمتیں دو اعداد و شمار میں تقسیم کی جاتی ہیں،hedge
فنکشن کو بھی تبدیل کرنے کی ضرورت ہے۔
function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
var sellRoutine = sellEx.Go("Sell", priceSell, amount)
Sleep(500)
buyRoutine.wait()
sellRoutine.wait()
}
ان ترامیم کی بنیاد پر کچھ معمولی ایڈجسٹمنٹ بھی ہیں ، جن کا یہاں بیان نہیں کیا جائے گا۔ تفصیلات کے لئے آپ کوڈ کو دیکھ سکتے ہیں۔
حکمت عملی میں تعامل شامل کریں ، تاکہ حکمت عملی ریئل ٹائم میں پھیلاؤ ٹرگر لائن کو تبدیل کرسکے۔ یہ بھی ایک نیم خودکار حکمت عملی کی ڈیزائن کی ضرورت ہے ، جسے یہاں ایک تدریسی ڈیمو کے طور پر بھی نافذ کیا جائے گا۔ حکمت عملی کے تعامل کا ڈیزائن بھی بہت آسان ہے۔ سب سے پہلے ، حکمت عملی میں انٹرایکٹو کنٹرولز شامل کریں حکمت عملی میں ترمیم کے صفحے پر.
دو کنٹرولز شامل کیے گئے تھے ، ایک کو A2B اور دوسرے کو B2A کہا جاتا ہے۔ کنٹرول ان پٹ باکس میں قدر داخل کرنے کے بعد ، ان پٹ باکس کے دائیں طرف والے بٹن پر کلک کریں۔ ایک کمانڈ فوری طور پر حکمت عملی میں بھیجی جائے گی ، مثال کے طور پر: قدر درج کریں123
ان پٹ باکس میں، کلک کریںA2B
بٹن، اور ایک کمانڈ فوری طور پر حکمت عملی کو بھیجا جائے گا.
A2B:123
ڈیزائن انٹرایکٹو کا پتہ لگانے اور پروسیسنگ کوڈ میں حکمت عملی کوڈ.
// interaction
var cmd = GetCommand() // every time when the loop is operated here, it will detect whether an interactive command is sent; if no, return null string
if (cmd) { // interactive command detected, such as A2B:123
Log("received command:", cmd)
var arr = cmd.split(":") // split out the interactive control name and the value in the input box; arr[0] means A2B, and arr[1] means 123
if (arr[0] == "A2B") { // judge whether the triggered interactive control is A2B
Log("modify parameterA2B,", diffAsPercentage ? "parameter of spread ratio:" : "parameter of spread:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageB2A = parseFloat(arr[1]) // modify the spread trigger line
} else {
hedgeDiffPriceA2B = parseFloat(arr[1]) // modify the spread trigger line
}
} else if (arr[0] == "B2A") { // detected the triggered control is B2A
Log("modify parameterB2A,", diffAsPercentage ? "parameter of spread ratio:" : "parameter of spread:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageA2B = parseFloat(arr[1])
} else {
hedgeDiffPriceB2A = parseFloat(arr[1])
}
}
}
اسٹیٹس بار ڈیٹا ڈسپلے کو زیادہ منظم اور مشاہدہ کرنے میں آسان بنائیں۔
var tbl = {
"type" : "table",
"title" : "data",
"cols" : ["platform", "Currency", "frozenCurrrency", "quoteCurrency", "frozenQuoteCurrency", "triggerSpread", "currentSpread"],
"rows" : [],
}
tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])
LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
بیک ٹسٹ صرف حکمت عملی کا ایک ٹیسٹ ہے ، جو ابتدائی پتہ لگانے کا کام ہے۔ بہت سے کیڑے اصل میں بیک ٹسٹ مرحلے میں ٹیسٹ کیے جاسکتے ہیں۔ بیک ٹسٹ کے نتائج کے بارے میں زیادہ فکر کرنے کی ضرورت نہیں ہے۔ آخر کار ، حکمت عملی کو ابھی بھی حقیقی بوٹس کے ساتھ اصل ماحول میں جانچنے کی ضرورت ہے۔
حکمت عملی کا ماخذ کوڈ:https://www.fmz.com/strategy/302834