کریپٹوکرنسی اسپاٹ ہیجنگ حکمت عملی (2)

مصنف:نینا باداس, تخلیق: 2022-04-14 16:17:46, تازہ کاری: 2022-04-15 14:16:23

کریپٹوکرنسی اسپاٹ ہیجنگ حکمت عملی (2)

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

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

  • اسپاٹ ایکسچینج آبجیکٹ مارجن موڈ سوئچ کریں یہ ترمیم صرف بوٹ سے متعلق ہے۔ کچھ اسپاٹ پلیٹ فارمز میں اسپاٹ مارجن انٹرفیس ہوتے ہیں ، جو ایف ایم زیڈ پر بھی احاطہ کیے جاتے ہیں۔ ایکسچینج اشیاء کے لئے جو براہ راست ایف ایم زیڈ پر احاطہ کیے جاتے ہیں اور اسپاٹ مارجن کی حمایت کرتے ہیں ، آپ براہ راست موڈ کو سوئچ کرسکتے ہیں۔
  • مزید اسپریڈ چارٹ ڈسپلے شامل کریں مزید پھیلاؤ چارٹ ڈسپلے کا اضافہ کرنے کے لئے، اور ہم صرف پھیلاؤ منحنی خطوط کے پلاٹA->BاورB->A، کے ساتھ ساتھ افقی پھیلاؤ ٹرگر لائنوں، ہم براہ راست استعمال کر سکتے ہیںchart plot library; فائدہ سادگی اور استعمال میں آسانی ہے۔ یہاں سے ، ہم یہ بھی سیکھتے ہیں کہ ایف ایم زیڈ کی تقریب کا استعمال کیسے کریںtemplate library together.
  • ایک طرفہ ہیج کا فنکشن یہ ترمیم نسبتا large بڑی ہے ، کیونکہ مخصوص ہیج ٹریڈنگ کے دوران دونوں پلیٹ فارمز کے مابین قیمت کے پھیلاؤ کو مکمل طور پر الٹ کرنا مشکل ہے۔ زیادہ تر وقت ، ایک پلیٹ فارم پر قیمت مستقل طور پر دوسرے پلیٹ فارم کی قیمت سے زیادہ ہوتی ہے۔ اس وقت ، اگر ہمارے اثاثوں کو مکمل طور پر ہیج کیا گیا ہے (یعنی ، تمام کرنسی کی علامتیں کم قیمتوں والے پلیٹ فارم میں ہیں ، اور اثاثے سب سے زیادہ قیمتوں والے پلیٹ فارم میں ہیں۔ ہیج جم جاتا ہے ، اور منافع کمانے کے لئے پھیلاؤ کی اتار چڑھاؤ پر انحصار کرنا اب ممکن نہیں ہے۔ اس وقت ، آپ کو صرف تھوڑی مقدار میں اثاثوں کو کھونے کے ذریعہ ہیج کرنے اور کرنسی کی علامتوں کو واپس لانے کی حکمت عملی بنانے کی ضرورت ہے (کرنسی کی علامتوں کو دوبارہ اعلی قیمتوں کے ساتھ پلیٹ فارم میں واپس آنے دیں) ۔ جب قیمت پھیلاؤ دوبارہ بڑا ہوجاتا ہے تو ، آپ ہیجنگ جاری رکھ سکتے ہیں اور منافع حاصل کرسکتے ہیں۔
  • انٹرایکٹو طور پر ہیج پھیلاؤ لائن کی طرح پیرامیٹرز کو تبدیل
    حکمت عملی میں انٹرایکٹو فنکشن شامل کریں تاکہ ریئل ٹائم میں پھیلاؤ ٹرگر لائن کو تبدیل کیا جاسکے۔
  • اسٹیٹس بار کی معلومات کا انتظام کریں اور اسے ٹیبل فارمیٹ میں دکھائیں آسان مشاہدے کے لئے، ظاہر کرنے کی ضرورت ہے کہ اعداد و شمار کو منظم اور منظم کریں.

اگلا، آئیے ان ڈیزائننگ آئیڈیوں کو ایک ایک کرکے عملی جامہ پہنانا۔

اسپاٹ ایکسچینج آبجیکٹ مارجن موڈ سوئچ کریں

مثال کے طور پر بائننس اسپاٹ بوٹ لے لو۔ اسپاٹ مارجن موڈ میں سوئچ کرنے کے لئے ، کوڈ کا استعمال کریںexchanges[i].IO، پیرامیٹر درآمد کریںtrade_normalالگ تھلگ مارجن پر سوئچ کرنے اور درآمدtrade_super_marginto کو کراس مارجن میں تبدیل کر دیا گیا ہے، جو بیک ٹسٹ میں معاون نہیں ہے۔ جو صرف بوٹس میں استعمال کیا جا سکتا ہے۔

کے آغاز میں تیاری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 پلیٹ فارم کے میدان میں اس کی تلاش کر سکتے ہیں.

img

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

img

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

img

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

یہاں ہم بنیادی طور پر سیکھتے ہیں کہ کس طرح افعال کو استعمال کرنا ہےchart plot libraryمنصوبہ بندی کرنا۔

img

ہم کے پھیلاؤ کا نقشہ بنانے کا ارادہ رکھتے ہیں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. لہذا، یہاں ہم کوڈ کو تبدیل کرنے کی ضرورت ہے، اور ہم پہلے پیرامیٹرز کو تبدیل کرنے کی ضرورت ہے.

img

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

        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")

جب حکمت عملی چلتی ہے، چارٹ اس طرح دکھایا جائے گا.

img

اگلا، حقیقی وقت میں پھیلاؤ وکر ڈرائنگ؛ زیادہ سے زیادہ ڈرائنگ سے بچنے کے لئے، توازن کا پتہ لگانے میں حقیقی وقت میں پھیلاؤ وکر کی گرافنگ کوڈ ڈالیں. 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()
}

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

انٹرایکٹو طور پر ہیج پھیلاؤ لائن کی طرح پیرامیٹرز کو تبدیل

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

img

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

img

بیک ٹیسٹ

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

img

img

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


مزید