Type/to search
8
Follow
1364
Followers
डिजिटल मुद्रा स्पॉट हेजिंग रणनीति डिजाइन (2)
Original
Created 2021-07-30 16:36:48  Updated 2023-09-20 10:36:43
 5
 2731

img

डिजिटल मुद्रा स्पॉट हेजिंग रणनीति डिजाइन (2)

पिछले लेख में, हमने एक सरल हेजिंग रणनीति लागू की थी। आगे, हम सीखेंगे कि इस रणनीति को कैसे अपग्रेड किया जाए।
रणनीति में परिवर्तन बड़े नहीं होंगे, लेकिन परिवर्तनों के विवरण पर ध्यान देने की आवश्यकता है। कोड के कुछ भागों की परिभाषाएं पहले से बदल गई हैं और उन्हें समझने की आवश्यकता है।

इस रणनीति को उन्नत करने की आवश्यकता

  • स्पॉट एक्सचेंज ऑब्जेक्ट के लीवरेज मोड को स्विच करें
    यह परिवर्तन केवल वास्तविक ट्रेडिंग से संबंधित है। कुछ स्पॉट एक्सचेंजों में स्पॉट लीवरेज इंटरफेस होते हैं, जो FMZ पर भी समाहित होते हैं। एक्सचेंज ऑब्जेक्ट्स के लिए जिन्हें सीधे 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 प्लेटफ़ॉर्म रणनीति स्क्वायर पर खोज और प्राप्त कर सकते हैं।

img

या सीधे लिंक पर क्लिक करें: https://www.fmz.com/strategy/27293 इस टेम्पलेट के कॉपी पेज पर जाने के लिए।

img

इस टेम्पलेट लाइब्रेरी को अपनी रणनीति लाइब्रेरी में कॉपी करने के लिए बटन पर क्लिक करें।

img

फिर नीति संपादन पृष्ठ पर, आप टेम्पलेट कॉलम में अपनी आवश्यक टेम्पलेट लाइब्रेरी की जांच कर सकते हैं। बॉक्स को चेक करने और नीति को सहेजने के बाद, यह नीति इस टेम्पलेट को संदर्भित करेगी। यहाँ हम केवल टेम्पलेट लाइब्रेरी के उपयोग के बारे में संक्षेप में बताते हैं। इस रणनीति ने पहले ही इस टेम्पलेट को संदर्भित कर दिया है, इसलिए ऑपरेशन को दोहराने की कोई आवश्यकता नहीं है। जब आप इस रणनीति को स्ट्रेटेजी स्क्वायर में कॉपी कर लेंगे, तो आप इसे रणनीति संपादन पृष्ठ के टेम्पलेट कॉलम में देख सकते हैं।画线类库पहले ही उद्धृत किया जा चुका है।

हम मुख्य रूप से सीखते हैं कि कैसे उपयोग करें画线类库ग्राफ़ खींचने के लिए फ़ंक्शन.

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एक, दो हो गएtargetDiffPriceA2BtargetDiffPriceB2A
इसके बाद, आप चार्ट पर यह डेटा खींचने के लिए लाइन ड्राइंग लाइब्रेरी के लाइन ड्राइंग फ़ंक्शन का उपयोग कर सकते हैं।

// 画图 $.PlotHLine(targetDiffPriceA2B, "A->B") // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本 $.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) // 画实时差价曲线 $.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() }

इन बदलावों के आधार पर कुछ छोटे-मोटे समायोजन भी किए गए हैं, जिनके बारे में मैं यहाँ नहीं बताऊँगा। आप विवरण के लिए कोड देख सकते हैं।

हेजिंग स्प्रेड लाइनों जैसे मापदंडों को इंटरैक्टिव रूप से संशोधित करें

रणनीति में अन्तरक्रियाशीलता जोड़ें ताकि रणनीति वास्तविक समय में स्प्रेड ट्रिगर लाइन को संशोधित कर सके। यह अर्ध-स्वचालित रणनीति के लिए एक डिज़ाइन आवश्यकता है, जिसे यहां शिक्षण प्रदर्शन के रूप में भी लागू किया गया है।
रणनीति इंटरैक्शन डिज़ाइन भी बहुत सरल है। सबसे पहले, रणनीति संपादन पृष्ठ पर रणनीति में इंटरैक्टिव नियंत्रण जोड़ें।

img

दो नियंत्रण जोड़े गए हैं, एक को 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) + "`")

img

बैकटेस्टिंग

बैकटेस्टिंग केवल रणनीति का परीक्षण और कार्यों का प्रारंभिक पता लगाना है। बैकटेस्टिंग चरण के दौरान वास्तव में कई बगों का परीक्षण किया जा सकता है। बैकटेस्ट के नतीजों पर बहुत ज़्यादा ध्यान देने की ज़रूरत नहीं है। अंतिम रणनीति को अभी भी वास्तविक वातावरण में परखा जाना चाहिए।

img

img

रणनीति स्रोत कोड: https://www.fmz.com/strategy/302834

Related Recommendations
Comment
All comments (5)

    这个交易策略加入 合约功能 就好了 就是把永续合约 交割合约 都加进去

    4 years ago

    好的,有机会出个教程。

    4 years ago

    梦大,回测提示 main:127:9 - TypeError: Cannot read property 'SetPrecision' of undefined
    【不同计价币的现货对冲策略 Ver1.1】

    5 years ago

    要添加两个交易所对象。

    5 years ago

    明白了,谢谢梦大。

    5 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)