avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

میں تخلیق کیا: 2021-07-30 16:36:48, تازہ کاری: 2023-09-20 10:36:43
comments   5
hits   2474

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

پچھلے مضمون میں، ہم نے ہیجنگ کی ایک سادہ حکمت عملی کو نافذ کیا ہے، ہم اس حکمت عملی کو اپ گریڈ کرنے کا طریقہ سیکھیں گے۔ حکمت عملی میں تبدیلیاں بڑی نہیں ہوں گی لیکن تبدیلیوں کی تفصیلات پر توجہ کی ضرورت ہے۔ کوڈ میں کچھ حصوں کی تعریفیں پہلے سے بدل گئی ہیں اور انہیں سمجھنے کی ضرورت ہے۔

اس حکمت عملی کو اپ گریڈ کرنے کی ضرورت ہے۔

  • اسپاٹ ایکسچینج آبجیکٹ کے لیوریج موڈ کو سوئچ کریں۔ یہ تبدیلی صرف حقیقی تجارت سے متعلق ہے۔ ایکسچینج آبجیکٹ کے لیے جو براہ راست FMZ اور سپورٹ اسپاٹ لیوریج پر انکیپسلیٹ کی گئی ہیں، آپ براہ راست موڈ کو سوئچ کر سکتے ہیں۔
  • اسپریڈ چارٹ ڈسپلے شامل کیا گیا۔ اسپریڈ چارٹ ڈسپلے شامل کریں، کیونکہ صرف ڈرا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 پلیٹ فارم اسٹریٹجی اسکوائر پر تلاش اور حاصل کرسکتے ہیں۔

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

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

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

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

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

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

ہم بنیادی طور پر استعمال کرنے کا طریقہ سیکھتے ہیں۔画线类库گراف کھینچنے کے لیے فنکشن۔

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

ہم منصوبہ بنا رہے ہیں۔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。 تو یہاں ہمیں کوڈ میں ترمیم کرنے کی ضرورت ہے، پہلے پیرامیٹرز میں ترمیم کریں۔

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

پھر کوڈ میں ترمیم کریں:

        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ایک، دو ہو گئے۔targetDiffPriceA2BtargetDiffPriceB2A。 اس کے بعد، آپ اس ڈیٹا کو چارٹ پر کھینچنے کے لیے لائن ڈرائنگ لائبریری کے لائن ڈرائنگ فنکشن کا استعمال کر سکتے ہیں۔

        // 画图
        $.PlotHLine(targetDiffPriceA2B, "A->B")  // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
        $.PlotHLine(targetDiffPriceB2A, "B->A")

جب حکمت عملی چل رہی ہو گی تو اس طرح کا چارٹ ظاہر ہوگا۔

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

اگلا، اوور ڈرائنگ سے بچنے کے لیے ریئل ٹائم اسپریڈ وکر کھینچیں۔ بیلنس چیک میں ریئل ٹائم قیمت کے فرق کے اعداد و شمار کے منحنی خطوط کے لیے کوڈ ڈالیں۔

        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()
}

ان تبدیلیوں کی بنیاد پر کچھ معمولی ایڈجسٹمنٹ بھی ہیں، جن میں میں یہاں نہیں جاؤں گا آپ تفصیلات کے لیے کوڈ کو دیکھ سکتے ہیں۔

انٹرایکٹو طریقے سے پیرامیٹرز میں ترمیم کریں جیسے ہیجنگ اسپریڈ لائنز

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

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

دو کنٹرولز شامل کیے گئے ہیں، ایک کو 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) + "`")

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

بیک ٹیسٹنگ

بیک ٹیسٹنگ صرف حکمت عملی کا ایک امتحان ہے اور فنکشنز کا ابتدائی پتہ لگانا دراصل بیک ٹیسٹنگ مرحلے کے دوران جانچا جا سکتا ہے۔ پس پردہ نتائج پر زیادہ توجہ دینے کی ضرورت نہیں ہے حتمی حکمت عملی کو ابھی بھی حقیقی ماحول میں جانچنے کی ضرورت ہے۔

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

ڈیجیٹل کرنسی اسپاٹ ہیجنگ اسٹریٹجی ڈیزائن (2)

حکمت عملی کا ماخذ کوڈ: https://www.fmz.com/strategy/302834