ट्रेडिंग रणनीति विकसित करने के अनुभव

लेखक:छोटे सपने, बनाया गयाः 2019-08-06 17:15:13, अद्यतन किया गयाः 2023-10-20 20:06:49

img

ट्रेडिंग रणनीति विकसित करने के अनुभव

इस लेख का उद्देश्य रणनीतियों के विकास में कुछ अनुभवों और छोटी युक्तियों को बताना है जो पाठकों को व्यापार रणनीतियों के विकास के बारे में जल्दी से समझाने में मदद कर सकते हैं। कुछ रणनीतिक डिजाइन में इसी तरह के विस्तृत मुद्दों का सामना करते समय, एक उचित समाधान तुरंत तैयार किया जा सकता है। आविष्कारकों के लिए एक क्वांटिफाइड ट्रेडिंग प्लेटफॉर्म के रूप में व्याख्या, परीक्षण और अभ्यास के लिए मंच। रणनीति प्रोग्रामिंग भाषाः जावास्क्रिप्ट व्यापार बाजारः ब्लॉकचेन परिसंपत्ति बाजार (बीटीसी, ईटीएच आदि)

  • डेटा प्राप्त करना और संसाधित करना

    बाजार डेटा प्राप्त करने के लिए निम्नलिखित विभिन्न इंटरफेस का उपयोग करना संभव है, क्योंकि आमतौर पर रणनीति के लिए ट्रेडिंग तर्क बाजार डेटा द्वारा संचालित होते हैं।

    • GetTicker: वास्तविक समय में टिक बाजार प्राप्त करें. आम तौर पर वर्तमान नवीनतम कीमतों को जल्दी से प्राप्त करने के लिए उपयोग किया जाता है, एक मूल्य खरीदें, एक मूल्य बेचें।

    • GetDepth: ऑर्डर प्राप्त करने के लिए पतली गहराई का बाजार। आम तौर पर, यह प्रत्येक टुकड़े के लिए कीमत, आदेश मात्रा और मात्रा प्राप्त करने के लिए उपयोग किया जाता है। यह एक बहुत ही उपयोगी और उपयोगी उपकरण है।

    • GetTrade: बाजार में हालिया लेनदेन रिकॉर्ड प्राप्त करें। आम तौर पर बाजार के व्यवहार का विश्लेषण करने के लिए उपयोग किया जाता है, बाजार के सूक्ष्म परिवर्तनों का विश्लेषण करता है। आमतौर पर उच्च आवृत्ति रणनीति, एल्गोरिथ्म रणनीति के लिए उपयोग किया जाता है।

    • GetRecords: बाजार के लिए K-लाइन डेटा प्राप्त करें। आम तौर पर ट्रेंड ट्रैकिंग रणनीतियों के लिए उपयोग किया जाता है। यह सूचकांक की गणना करने के लिए प्रयोग किया जाता है।

    • गलती करना

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

      var depth = exchange.GetDepth()
      
      // depth.Asks[0].Price < depth.Bids[0].Price      卖一价格低于了买一价格,这种情况不可能存在于盘面上,
      //                                                因为卖出的价格低于买入的价格,必定已经成交了。
      // depth.Bids[n].Amount = 0                       订单薄买入列表第n档,订单量为0
      // depth.Asks[m].Price = 0                        订单薄卖出列表第m档,订单价格为0
      

      या सीधे exchange.GetDepth ((() null लौटाता है।

      इस तरह की अजीबोगरीब स्थितियां बहुत हैं। इसलिए, इन पूर्वानुमानित समस्याओं के लिए एक उचित समाधान होना चाहिए, और इस तरह के समाधान को त्रुटि-सहिष्णुता कहा जाता है।

      सामान्य रूप से, त्रुटियों का निपटान करने का तरीका डेटा को फेंकना और फिर से प्राप्त करना है।

      उदाहरण के लिएः

      function main () {
          while (true) {
              onTick()
              Sleep(500)
          }
      }
      
      function GetTicker () {
          while (true) {
              var ticker = exchange.GetTicker()
              if (ticker.Sell > ticker.Buy) {       // 以 检测卖一价格是不是小于买一价这个错误的容错处理为例,
                                                    // 排除这个错误,当前函数返回 ticker 。
                  return ticker
              }
              Sleep(500)
          }
      }
      
      function onTick () {
          var ticker = GetTicker()                  // 确保获取到的 ticker 不会存在 卖一价格小于买一价格这种数据错误的情况。
          // ...  具体的策略逻辑
      }
      

      अन्य पूर्वानुमानित त्रुटि प्रबंधन का उपयोग इसी तरह किया जा सकता है। यह डिजाइन सिद्धांत है कि गलत डेटा को रणनीतिक तर्क को चलाने के लिए बिल्कुल नहीं दिया जा सकता है।

    • के-लाइन डेटा का उपयोग

      K-लाइन डेटा प्राप्त करें, कॉल करेंः

      var r = exchange.GetRecords()
      

      K-रेखा डेटा एक सरणी है, जो इस तरह दिखती है, उदाहरण के लिएः

      [
          {"Time":1562068800000,"Open":10000.7,"High":10208.9,"Low":9942.4,"Close":10058.8,"Volume":6281.887000000001},
          {"Time":1562072400000,"Open":10058.6,"High":10154.4,"Low":9914.5,"Close":9990.7,"Volume":4322.099},
          ...
          {"Time":1562079600000,"Open":10535.1,"High":10654.6,"Low":10383.6,"Close":10630.7,"Volume":5163.484000000004}
      ]
      

      आप प्रत्येक कोष्ठक देख सकते हैं।{}मध्य में समय, खुला, उच्चतम, निम्नतम, बंद, मात्रा शामिल हैं। यह एक K-लाइन स्तंभ है। सामान्य K-लाइन डेटा का उपयोग संकेतकों को गणना करने के लिए किया जाता है, उदाहरण के लिएः MA औसत रेखा, MACD आदि। K-रेखा डेटा को पैरामीटर के रूप में इनपुट करें (कच्चे डेटा) और फिर सूचक पैरामीटर सेट करें, सूचक डेटा के लिए एक फ़ंक्शन की गणना करें जिसे हम सूचक फ़ंक्शन कहते हैं। आविष्कारकों के लिए क्वांटिफाइड ट्रेडिंग प्लेटफॉर्म पर कई सूचक फ़ंक्शन हैं।

      उदाहरण के लिए, हम समोच्च माप की गणना करते हैं, और हमारे द्वारा भेजे गए K-रेखा डेटा के चक्र के आधार पर, समोच्च के लिए समोच्च की गणना की जाती है। उदाहरण के लिए, एक K-लाइन डेटा (एक K-लाइन कॉलम एक दिन का प्रतिनिधित्व करता है) के माध्यम से, एक औसत दिन की गणना की जाती है। इसी तरह, यदि एक औसत दिन के लिए K-लाइन डेटा 1 घंटे का चक्र है, तो एक औसत दिन की गणना की जाएगी।

      सामान्य तौर पर, हम एक समस्या को अनदेखा करते हैं जब हम एक सूचक का गणना करते हैं, और अगर मैं एक 5-दिवसीय औसत रेखा सूचक का गणना करना चाहता हूं, तो हमें पहले K-दिवसीय डेटा तैयार करना चाहिएः

      var r = exchange.GetRecords(PERIOD_D1)  // 给GetRecords 函数传入参数 PERIOD_D1就是指定获取日K线,
                                              // 具体函数使用可以参看:https://www.fmz.com/api#GetRecords
      

      यदि हम दिन के रेखा के डेटा के साथ, हम समोच्च रेखा के लिए गणना कर सकते हैं, हम 5 दिन के औसत रेखा के लिए गणना करने के लिए, तो हम 5 के लिए संकेतक पैरामीटर सेट करने के लिए है।

      var ma = TA.MA(r, 5)        // TA.MA() 就是指标函数,用来计算均线指标,第一个参数设置刚才获取的日K线数据r,
                                  // 第二个参数设置5,计算出来的就是5日均线,其它指标函数同理。
      

      हमने एक संभावित समस्या को नजरअंदाज कर दिया है, अगर r दैनिक K रेखा डेटा में K रेखा के 5 से कम स्तंभ हैं, तो क्या एक प्रभावी 5-दिवसीय औसत गणना की जा सकती है? जवाब है, बिल्कुल नहीं। चूंकि समोच्च संकेतक एक निश्चित संख्या में K स्तंभों के लिए समापन मूल्य का औसत है।

      img

      इसलिए, K-लाइन डेटा का उपयोग करने से पहले, यह निर्धारित करना आवश्यक है कि क्या K-लाइन डेटा में K-लाइन स्तंभों की संख्या सूचक गणना की शर्तों (सूचक पैरामीटर) को पूरा करती है।

      इसलिए, 5 दिन की औसत रेखा की गणना करने से पहले, यह समझना महत्वपूर्ण है कि पूर्ण कोड इस प्रकार हैः

      function CalcMA () {
          var r = _C(exchange.GetRecords, PERIOD_D1)     // _C() 是容错函数,目的就是避免 r 为 null , 具体可以查询文档:https://www.fmz.com/api#_C
          if (r.length > 5) {
              return TA.MA(r, 5)                         // 用均线指标函数 TA.MA 计算出均线数据,做为函数返回值,返回。
          }
      
          return false 
      }
      
      function main () {
          var ma = CalcMA()
          Log(ma)
      }
      

      img

      एक बार फिर से परीक्षण से पता चलता हैः [null,null,null,null, 4228.7,4402.9400000000005,... ]

      जैसा कि आप देख सकते हैं कि 5 दिन के औसत रेखा के लिए गणना की गई है, पहले 4 शून्य हैं, क्योंकि K रेखा के स्तंभों की संख्या 5 से कम है, औसत गणना नहीं की जा सकती है। 5 वीं K रेखा स्तंभ तक, गणना की जा सकती है।

    • K-लाइन अपडेट का पता लगाने के लिए एक छोटी सी चाल

      अक्सर ऐसा होता है कि जब हम कुछ रणनीतियाँ लिखते हैं, तो हम प्रत्येक K-लाइन चक्र के दौरान कुछ ऑपरेशनों को संभालते हैं, या कुछ लॉग प्रिंट करते हैं। हम इस तरह के कार्य को कैसे प्राप्त करते हैं? बिना प्रोग्रामिंग अनुभव वाले शुरुआती लोगों के लिए, शायद यह समझ में नहीं आता है कि किस तंत्र का उपयोग करना है, यहां हम सीधे टिप्स देते हैं।

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

      तो हम एक चर है कि K-लाइन डेटा के अंतिम K-लाइन स्तंभ का समय रिकॉर्ड करने के लिए इस्तेमाल किया जाना चाहिए।

      var r = exchange.GetRecords()
      var lastTime = r[r.length - 1].Time       // lastTime 用来记录最后一根K线柱的时间。
      

      वास्तविक अनुप्रयोगों में, यह आमतौर पर इस तरह से बनाया जाता हैः

      function main () {
          var lastTime = 0
          while (true) {
              var r = _C(exchange.GetRecords)
              if (r[r.length - 1].Time != lastTime) {
                  Log("新K线柱产生")
                  lastTime = r[r.length - 1].Time      // 一定要更新 lastTime ,这个至关重要。
      
                  // ... 其它处理逻辑
                  // ...
              }
      
              Sleep(500)
          }
      }
      

      img

      जैसा कि आप देख सकते हैं कि पुनरीक्षण में, K-लाइन चक्र के लिए सेट किया गया है दिन (exchange.GetRecords फ़ंक्शन कॉल पर कोई पैरामीटर निर्दिष्ट नहीं किया गया है, जो कि पूर्वनिर्धारित पैरामीटर है) जब भी एक नया K-लाइन स्तंभ दिखाई देता है, तो एक लॉग मुद्रित किया जाता है।

  • संख्यात्मक गणना

    • एक्सचेंज पर जाने के लिए समय की गणना

      यदि आप एक रणनीतिक एक्सचेंज तक पहुँचने के लिए इंटरफ़ेस के समय पर एक निश्चित प्रदर्शन या नियंत्रण चाहते हैं, तो आप निम्न कोड का उपयोग कर सकते हैंः

      function main () {
          while (true) {
              var beginTime = new Date().getTime()
              var ticker = exchange.GetTicker()
              var endTime = new Date().getTime()
      
              LogStatus(_D(), "GetTicker() 函数耗时:", endTime - beginTime, "毫秒")
              Sleep(1000)
          } 
      }
      

      सरल शब्दों में, GetTicker फ़ंक्शन को कॉल करने के बाद दर्ज किए गए समय को घटाकर कॉल करने से पहले के समय को घटाकर, अनुभव की मिलीसेकंड की गणना की जाती है, जो कि GetTicker फ़ंक्शन को निष्पादित करने से परिणाम वापस करने में लगने वाला समय है।

    • Math.min / Math.max का उपयोग करके संख्याओं के ऊपर और नीचे की सीमा को सीमित करें

      यदि आप चाहते हैं कि संख्याओं का कोई सीमा हो, तो आमतौर पर Math.min सीमा का उपयोग करें

      उदाहरण के लिए, बिक्री के आदेश के दौरान, बिक्री का एक टुकड़ा खाते में सिक्कों की संख्या से अधिक नहीं होना चाहिए। इस तरह के मामलों में, आप अपने खाते में उपलब्ध सिक्कों की संख्या से अधिक का भुगतान कर सकते हैं, क्योंकि यदि आप खाते में उपलब्ध सिक्कों की संख्या से अधिक हैं, तो आपका भुगतान गलत होगा।

      आम तौर पर इस तरह से नियंत्रित किया जाता हैः उदाहरण के लिए, 0.2 सिक्के की बिक्री की योजना है।

      var planAmount = 0.2
      var account = _C(exchange.GetAccount)
      var amount = Math.min(account.Stocks, planAmount)
      

      इस प्रकार यह सुनिश्चित किया जाता है कि राशि के रूप में आने वाले आदेशों की संख्या खाते में उपलब्ध सिक्कों की संख्या से अधिक नहीं है।

      इसी तरह, Math.max का उपयोग एक संख्यात्मक मान के निचले सीमा को सुनिश्चित करने के लिए किया जाता है। यह आमतौर पर किस परिदृश्य के लिए लागू होता है? सामान्य रूप से, एक्सचेंजों में कुछ व्यापारिक जोड़े के लिए न्यूनतम ऑर्डर मात्रा की सीमा होती है, और यदि यह न्यूनतम ऑर्डर मात्रा से कम है, तो वे ऑर्डर को अस्वीकार कर देंगे। मान लीजिए कि BTC की न्यूनतम मात्रा आमतौर पर 0.01 है। लेन-देन की रणनीति कभी-कभी गणना के माध्यम से 0.01 से कम घटकों का उत्पादन करना संभव है, इसलिए हम न्यूनतम घटकों को सुनिश्चित करने के लिए Math.max का उपयोग कर सकते हैं।

    • आदेश मात्रा, कीमत, सटीक नियंत्रण

      _N() फ़ंक्शन या SetPrecision फ़ंक्शन का उपयोग करके सटीकता नियंत्रण किया जा सकता है।

      SetPrecision () फ़ंक्शन को एक बार सेट करने के बाद, सिस्टम में स्वचालित रूप से एकमुश्त मात्रा और मूल्य संख्याओं के अतिरिक्त छोटे अंकों को काट देता है।

      _N() फ़ंक्शन किसी एक संख्या के लिए अल्पविराम काटने के लिए सटीक नियंत्रण है

      उदाहरण के लिएः

      var pi = _N(3.141592653, 2)
      Log(pi)
      

      पीआई का मान दो अंकों के साथ घटता है, अर्थात्ः 3.14

      अधिक जानकारी के लिए एपीआई दस्तावेज़ देखें।

  • कुछ तर्क सेटिंग्स

    • समयबद्ध, कुछ क्रियाओं को एक निश्चित समय चक्र पर निष्पादित करना

      इस तरह के तंत्र का उपयोग करके, समय-सीमा का पता लगाने के तरीकों का उपयोग करके, वर्तमान समय-सीमा को पिछले समयबद्ध कार्य को पूरा करने के समय के समय-सीमा से घटाकर निर्धारित किया जा सकता है, वास्तविक समय में गणना की जा सकती है, जब यह समय किसी निर्धारित समय की लंबाई से अधिक हो जाता है, यानी एक नया ऑपरेशन किया जाता है।

      उदाहरण के लिए, निवेश रणनीतियों में।

      var lastActTime = 0
      var waitTime = 1000 * 60 * 60 * 12   // 一天的毫秒数
      function main () {
          while (true) {
              var nowTime = new Date().getTime()
              if (nowTime - lastActTime > waitTime) {
                  Log("执行定投")
                  // ... 具体的定投操作,买入操作。
      
      
                  lastActTime = nowTime
              }
      
              Sleep(500)
          }
      }
      

      यह एक सरल उदाहरण है।

    • रणनीति के लिए स्वचालित पुनर्प्राप्ति तंत्र डिजाइन करें

      आविष्कारक द्वारा क्वांटिफाइड _G))) फ़ंक्शन का उपयोग करके, और बचत फ़ंक्शन से बाहर निकलने के लिए, बचत प्रगति से बाहर निकलने और स्वचालित रूप से पुनर्प्राप्त स्थिति को फिर से शुरू करने के लिए एक नीति डिजाइन करना सुविधाजनक है।

      var hold = {
          price : 0, 
          amount : 0,
      }
      
      function main () {
          if (_G("hold")) {
              var ret = _G("hold")
              hold.price = ret.price
              hold.amount = ret.amount
              Log("恢复 hold:", hold)
          }
      
          var count = 1
          while (true) {
              // ... 策略逻辑
              // ... 策略运行中,可能开仓,交易,把开仓的持仓价格赋值给 hold.price ,开仓的数量赋值给 hold.amount,用以记录持仓信息。
      
              hold.price = count++     // 模拟一些数值
              hold.amount = count/10   // 模拟一些数值
      
              Sleep(500)
          }
      }
      
      function onexit () {    // 点击机器人上的停止按钮,会触发执行这个函数,执行完毕机器人停止。
          _G("hold", hold)
          Log("保存 hold:", JSON.stringify(hold))
      }
      

      img

      जैसा कि आप देख सकते हैं, जब भी रोबोट बंद होता है, तो वह hold ऑब्जेक्ट में डेटा सहेजता है, और जब भी इसे पुनरारंभ किया जाता है, तो वह डेटा पढ़ता है, जो hold के मान को पहले की स्थिति में वापस लाता है। बेशक, यह एक सरल उदाहरण है, यदि इसे वास्तविक रणनीतियों में उपयोग किया जाता है, तो रणनीति में पुनर्प्राप्त किए जाने वाले महत्वपूर्ण डेटा के आधार पर डिजाइन किया जाना चाहिए (आमतौर पर खाता जानकारी, होल्डिंग, लाभ संख्या, लेनदेन की दिशा आदि) । हालांकि, कुछ शर्तें भी तय की जा सकती हैं कि क्या इसे बहाल किया जाएगा या नहीं।

ये कुछ छोटी-छोटी रणनीति बनाने की युक्तियाँ हैं, जो उम्मीद है कि शुरुआती और रणनीति बनाने वालों के लिए उपयोगी होंगी! आप सभी के लिए शुभ कामनाएं 🙏🙏


संबंधित

अधिक

विक्स1aoधन्यवाद ड्रीम के लिए, यह उन लोगों के लिए बहुत अच्छा है जो एपीआई लिखने के लिए नए हैं, और यह भी पूछें कि क्या हमारा प्लेटफॉर्म उच्चतर संस्करणों का समर्थन करता है, जैसे कि क्या आप इसे इस्तेमाल करते हैं?

मैकेओशुक्रिया सपना भगवान! सपना भगवान शिक्षक, वास्तव में वान वू डबल पूर्ण है, प्रोग्रामिंग तकनीक उच्च है, लेख वान वत्से अच्छा है, प्रशंसा करने के लिए अच्छा है!

छोटे सपनेनमस्कार, वर्तमान में यह ES8 मानक का समर्थन करता है।

छोटे सपनेजी हां, FMZ को क्वांटिफाइड करने के लिए धन्यवाद!