
پچھلے مضمون میں، ہم نے ہیجنگ کی ایک سادہ حکمت عملی کو نافذ کیا ہے، ہم اس حکمت عملی کو اپ گریڈ کرنے کا طریقہ سیکھیں گے۔ حکمت عملی میں تبدیلیاں بڑی نہیں ہوں گی لیکن تبدیلیوں کی تفصیلات پر توجہ کی ضرورت ہے۔ کوڈ میں کچھ حصوں کی تعریفیں پہلے سے بدل گئی ہیں اور انہیں سمجھنے کی ضرورت ہے۔
A交易所->B交易所,B交易所->A交易所افقی لکیر کھینچیں جو پھیلنے کو متحرک کرتی ہے۔ ہم براہ راست استعمال کرتے ہیں۔画线类库فائدہ یہ ہے کہ یہ آسان اور استعمال میں آسان ہے یہاں ہم FMZ کو استعمال کرنے کا طریقہ بھی سیکھیں گے۔模版类库فنکشناگلا، آئیے ان ڈیزائنوں کو ایک ایک کرکے لاگو کرتے ہیں۔
بائننس اسپاٹ ٹریڈنگ کو بطور مثال لیتے ہوئے، کوڈ کا استعمال کرتے ہوئے اسپاٹ لیوریج موڈ پر جائیں۔exchanges[i].IO، پیرامیٹرز میں پاس کریں۔trade_normalلیوریجڈ پوزیشن بہ پوزیشن پر سوئچ کریں، اور پاس کریں۔trade_super_marginلیوریجڈ فل پوزیشن پر سوئچ کریں، بیک ٹیسٹنگ تعاون یافتہ نہیں ہے۔ یہ صرف حقیقی تجارت میں استعمال ہوتا ہے۔
موجودmainمندرجہ ذیل تیاری کے مرحلے کو فنکشن کے آغاز میں شامل کریں:
// 切换杠杆模式
for (var i = 0 ; i < exchanges.length ; i++) { // 遍历检测所有添加的交易所对象
if (exchanges[i].GetName() == "Binance" && marginType != 0) { // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
if (marginType == 1) {
Log(exchanges[i].GetName(), "设置为杠杆逐仓")
exchanges[i].IO("trade_normal")
} else if (marginType == 2) {
Log(exchanges[i].GetName(), "设置为杠杆全仓")
exchanges[i].IO("trade_super_margin")
}
}
}
یہاں کی حکمت عملی صرف بائنانس اسپاٹ کے لیے کوائن ٹو کوائن لیوریج موڈ کو سوئچ کرنے کے لیے کوڈ کا اضافہ کرتی ہے، اس لیے حکمت عملی کے پیرامیٹرز میں سیٹ کردہ سوئچ صرف بائنانس اسپاٹ کے لیے درست ہے۔
پیکڈ ڈرائنگ ٹیمپلیٹس کو استعمال کرنا بہت آسان ہے۔ ہم جو ٹیمپلیٹ استعمال کرتے ہیں اس کا نام ہے۔画线类库. آپ اسے براہ راست FMZ پلیٹ فارم اسٹریٹجی اسکوائر پر تلاش اور حاصل کرسکتے ہیں۔

یا براہ راست لنک پر کلک کریں: https://www.fmz.com/strategy/27293 اس ٹیمپلیٹ کے کاپی پیج پر جانے کے لیے۔

اس ٹیمپلیٹ لائبریری کو اپنی حکمت عملی لائبریری میں کاپی کرنے کے لیے بٹن پر کلک کریں۔

پھر پالیسی میں ترمیم کے صفحے پر، آپ ٹیمپلیٹ لائبریری کو چیک کر سکتے ہیں جس کی آپ کو ٹیمپلیٹ کالم میں ضرورت ہے۔ باکس کو چیک کرنے اور پالیسی کو محفوظ کرنے کے بعد، یہ پالیسی اس ٹیمپلیٹ کا حوالہ دے گی۔ یہاں ہم ٹیمپلیٹ لائبریری کے استعمال کی مختصر وضاحت کرتے ہیں اس حکمت عملی نے پہلے ہی اس ٹیمپلیٹ کا حوالہ دیا ہے لہذا آپریشن کو دہرانے کی ضرورت نہیں ہے۔ اس حکمت عملی کو سٹریٹیجی اسکوائر میں کاپی کرنے کے بعد، آپ اسے حکمت عملی میں ترمیم کرنے والے صفحہ کے ٹیمپلیٹ کالم میں دیکھ سکتے ہیں۔画线类库پہلے ہی حوالہ دیا گیا ہے۔
ہم بنیادی طور پر استعمال کرنے کا طریقہ سیکھتے ہیں۔画线类库گراف کھینچنے کے لیے فنکشن۔

ہم منصوبہ بنا رہے ہیں۔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。
اس کے بعد، آپ اس ڈیٹا کو چارٹ پر کھینچنے کے لیے لائن ڈرائنگ لائبریری کے لائن ڈرائنگ فنکشن کا استعمال کر سکتے ہیں۔
// 画图
$.PlotHLine(targetDiffPriceA2B, "A->B") // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
$.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) // 画实时差价曲线
$.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price) // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
}
اس طرح، ڈرائنگ کوڈ کی صرف 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 盘口条件满足
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("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks) // 提示信息
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 盘口条件满足
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("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks) // 提示信息
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
حکمت عملی کوڈ میں تعامل کا پتہ لگانے اور پروسیسنگ کوڈ ڈیزائن کریں۔
// 交互
var cmd = GetCommand() // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
if (cmd) { // 检测到有交互指令,例如:A2B:123
Log("接收到命令:", cmd)
var arr = cmd.split(":") // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
if (arr[0] == "A2B") { // 判断触发的交互控件是不是A2B
Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageB2A = parseFloat(arr[1]) // 修改触发差价线
} else {
hedgeDiffPriceA2B = parseFloat(arr[1]) // 修改触发差价线
}
} else if (arr[0] == "B2A") { // 检测到触发的控件是B2A
Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
if (diffAsPercentage) {
hedgeDiffPercentageA2B = parseFloat(arr[1])
} else {
hedgeDiffPriceB2A = parseFloat(arr[1])
}
}
}
اسٹیٹس بار کے ڈیٹا کو مزید منظم اور مشاہدہ کرنے میں آسان بنائیں۔
var tbl = {
"type" : "table",
"title" : "数据",
"cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"],
"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