क्रिप्टोकरेंसी स्पॉट हेजिंग रणनीति का डिजाइन (२)

लेखक:लिडिया, बनाया गयाः 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")
            }
        }
    }

यहाँ की रणनीति केवल Binance स्पॉट के सिक्का-से-सिक्का लीवरेज मोड को स्विच करने के लिए कोड जोड़ती है, इसलिए रणनीति मापदंडों पर स्विच सेटिंग केवल Binance स्पॉट के लिए मान्य है।

स्प्रेड चार्ट प्रदर्शन जोड़ा गया

यह पहले से ही लिपटे ड्राइंग टेम्पलेट का उपयोग करने के लिए बहुत आसान है. टेम्पलेट का नाम हम उपयोग कर रहे हैं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


संबंधित

अधिक