پچھلے مضمون میں، ہم نے ایک سادہ ہیجنگ کی حکمت عملی کو ایک ساتھ لاگو کیا، اور پھر ہم سیکھیں گے کہ اس حکمت عملی کو اپ گریڈ کیسے کریں. حکمت عملی میں تبدیلیاں بڑی نہیں ہیں ، لیکن تبدیلیوں کی تفصیلات پر توجہ دینے کی ضرورت ہے۔ کوڈ میں کچھ جگہوں کی تعریفیں پچھلی جگہوں سے بدل گئی ہیں ، جن کو سمجھنے کی ضرورت ہے۔
A exchange -> B exchange
, B exchange -> A exchange
، اور افقی لائن ہے کہ پھیلاؤ کو متحرک کرتا ہے ڈرائنگ.line drawing class library
براہ راست نمٹنے کے لئے، فائدہ یہ ہے کہ یہ استعمال کرنے کے لئے آسان ہے، یہاں ہم بھی کس طرح استعمال کرنے کے لئے سیکھنےtemplate class library
ایف ایم زیڈ کا کام۔اگلا، آئیے ان ڈیزائنوں کو ایک ایک کرکے نافذ کریں۔
مثال کے طور پر Binance جگہ حقیقی بوٹ لے لو، جگہ لیورجڈ موڈ پر سوئچ، کوڈ کا استعمال کریںexchanges[i].IO
، پیرامیٹر درج کریںtrade_normal
لیوریج پوزیشن پر پوزیشن کے مطابق سوئچ کرنے کے لئے، اور ان پٹtrade_super_margin
مکمل پوزیشن لیورج پر سوئچ کرنے کے لئے ، بیک ٹسٹنگ کی حمایت نہیں کی جاتی ہے۔ یہ صرف حقیقی بوٹ میں استعمال ہوتا ہے۔
کے آغاز میں تیاری کے مرحلے میں شاملmain
فنکشن:
// Switch leverage mode
for (var i = 0 ; i < exchanges.length ; i++) { // Traverse and detect all added exchange objects
if (exchanges[i].GetName() == "Binance" && marginType != 0) { //If the exchange object represented by the current i-index is Binance spot, and the parameter marginType of the strategy interface is not the option of "common currency", execute the switch operation
if (marginType == 1) {
Log(exchanges[i].GetName(), "Set to leveraged position-by-position")
exchanges[i].IO("trade_normal")
} else if (marginType == 2) {
Log(exchanges[i].GetName(), "Set to leveraged full position")
exchanges[i].IO("trade_super_margin")
}
}
}
یہاں کی حکمت عملی میں صرف بائننس اسپاٹ کے سکے سے سکے تک لیوریج موڈ کو سوئچ کرنے کا کوڈ شامل کیا گیا ہے ، لہذا حکمت عملی کے پیرامیٹرز پر سوئچ کی ترتیب صرف بائننس اسپاٹ کے لئے موزوں ہے۔
یہ پہلے سے ہی لپیٹ ڈرائنگ ٹیمپلیٹ کا استعمال کرنے کے لئے بہت آسان ہے. ہم استعمال کرتے ہیں ٹیمپلیٹ کا نام ہےLine Drawing Library
یہ ایف ایم زیڈ پلیٹ فارم حکمت عملی مربع پر براہ راست تلاش کرکے حاصل کیا جا سکتا ہے.
یا براہ راست لنک پر کلک کریں:https://www.fmz.com/strategy/27293اس ٹیمپلیٹ کے لئے کاپی کے صفحے پر کودنے کے لئے.
اس ٹیمپلیٹ کلاس لائبریری کو اپنی حکمت عملی لائبریری میں کاپی کرنے کے لئے بٹن پر کلک کریں.
اس کے بعد آپ حکمت عملی میں ترمیم کے صفحے پر ٹیمپلیٹ کالم میں استعمال ہونے والی ٹیمپلیٹ کلاس لائبریری چیک کرسکتے ہیں۔ اس کی جانچ پڑتال کے بعد حکمت عملی کو محفوظ کریں ، اور حکمت عملی اس ٹیمپلیٹ کا حوالہ دے گی۔ یہ صرف ٹیمپلیٹ کلاس لائبریری کے استعمال کی ایک مختصر تفصیل ہے۔ اس حکمت عملی نے پہلے ہی اس ٹیمپلیٹ کا حوالہ دیا ہے ، لہذا آپریشن کو دہرانے کی ضرورت نہیں ہے۔ جب آپ اس حکمت عملی کو حکمت عملی کے مربع میں کاپی کرتے ہیں تو ، آپ دیکھ سکتے ہیں کہLine Drawing Library
حکمت عملی میں ترمیم کے صفحے پر ٹیمپلیٹ بار میں حوالہ دیا گیا ہے.
ہم بنیادی طور پر سیکھیں گے کہLine Drawing 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
.
اگلا مرحلہ لائن ڈرائنگ لائبریری کے ڈرائنگ لائن فنکشن کا استعمال کرتے ہوئے چارٹ پر یہ ڈیٹا ڈرائنگ کرنا ہے.
// drawing
$.PlotHLine(targetDiffPriceA2B, "A->B") // The first parameter of this 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")
جب حکمت عملی چل رہی ہے، اس طرح ایک چارٹ ہے.
اس کے بعد ریئل ٹائم اسپریڈ وکر ڈرائنگ کریں، تاکہ لائن کو زیادہ سے زیادہ ڈرائنگ سے بچنے کے لئے۔ اس کوڈ کو ڈالیں جو ریئل ٹائم اسپریڈ ڈیٹا کے وکر کو ڈرائنگ کرتا ہے توازن چیک میں۔
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) // Draw real-time spread curves
$.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price) // The first parameter is the name of the curve, and the second parameter is the value of the curve 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 conditions are met
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("trigger A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks) // Tips
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 conditions are met
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("trigger B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks) //Tips
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
ڈیزائن انٹرایکٹو کا پتہ لگانے اور پروسیسنگ کوڈ میں حکمت عملی کوڈ.
// interact
var cmd = GetCommand() // Every time the loop is executed here, it checks whether there is an interactive command, and returns to an empty string if not.
if (cmd) { // An interactive command was detected, such as A2B:123
Log("command received:", cmd)
var arr = cmd.split(":") // Split out the interactive control name and the value in the input box, arr[0] is A2B, arr[1] is 123
if (arr[0] == "A2B") { // Determine whether the triggered interactive control is A2B
Log("Modify the parameters of A2B, ", diffAsPercentage ? "The parameter is the difference percentage" : "The parameter is the difference:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageB2A = parseFloat(arr[1]) // Modify the trigger spread line
} else {
hedgeDiffPriceA2B = parseFloat(arr[1]) // Modify the trigger spread line
}
} else if (arr[0] == "B2A") { // Triggered control detected is B2A
Log("Modify the parameters of B2A, ", diffAsPercentage ? "The parameter is the difference percentage" : "The parameter is the difference:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageA2B = parseFloat(arr[1])
} else {
hedgeDiffPriceB2A = parseFloat(arr[1])
}
}
}
اسٹیٹس بار کے اعداد و شمار کو زیادہ منظم اور مشاہدہ کرنے میں آسان بنائیں۔
var tbl = {
"type" : "table",
"title" : "data",
"cols" : ["exchange", "coin", "freeze coin", "denominated currency", "freeze denominated currency", "trigger spread", "current spread"],
"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