وسائل لوڈ ہو رہے ہیں... لوڈنگ...

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

مصنف:FMZ~Lydia, تخلیق: 2022-07-19 15:19:52, تازہ کاری: 2023-09-24 19:34:38

img

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

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

اس حکمت عملی کو بہتر بنانے کی ضرورت

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

img

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

img

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

img

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

ہم بنیادی طور پر سیکھیں گے کہLine Drawing 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. اگلا مرحلہ لائن ڈرائنگ لائبریری کے ڈرائنگ لائن فنکشن کا استعمال کرتے ہوئے چارٹ پر یہ ڈیٹا ڈرائنگ کرنا ہے.

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

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

img

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

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

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

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

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

img

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

img

بیک ٹسٹنگ

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

img

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


متعلقہ

مزید