4
ध्यान केंद्रित करना
1271
समर्थक

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

में बनाया: 2019-08-13 11:11:38, को अपडेट: 2023-10-20 20:06:13
comments   8
hits   4628

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

के-लाइन डेटा का उपयोग करते हुए प्रोग्रामेटिक ट्रेडिंग रणनीतियों को लिखते समय, अक्सर कुछ गैर-मानक अवधि के-लाइन डेटा का उपयोग करने की आवश्यकता होती है, जैसे कि 12-मिनट की अवधि के-लाइन डेटा, 4-घंटे की अवधि के-लाइन डेटा, आमतौर पर इस प्रकार की गैर-मानक अवधि को सीधे प्राप्त नहीं किया जा सकता है। तो फिर हम ऐसी मांगों पर कैसे प्रतिक्रिया दें? इसका उत्तर निश्चित रूप से यही है कि कोई रास्ता है। छोटे चक्रों से डेटा को मर्ज करके और संश्लेषित करके गैर-मानक चक्र प्राप्त किए जा सकते हैं। आप कल्पना कर सकते हैं कि कई चक्रों में सबसे अधिक कीमत को संश्लेषण के बाद सबसे अधिक कीमत के रूप में गिना जाता है, और सबसे कम कीमत को संश्लेषण के बाद सबसे कम कीमत के रूप में गिना जाता है। कीमत नहीं बदलेगी। , संश्लेषित K-लाइन के कच्चे माल के डेटा की पहली शुरुआती कीमत का उपयोग किया जाता है, समापन मूल्य संश्लेषित K-लाइन के कच्चे माल के डेटा के अंतिम समापन मूल्य से मेल खाता है, समय समय है प्रारंभिक मूल्य का, और ट्रेडिंग वॉल्यूम की गणना कच्चे माल के डेटा के लेनदेन वॉल्यूम को जोड़कर की जाती है। जैसा कि चित्र में दिखाया गया है:

  • ### विचारों

हम ब्लॉकचेन परिसंपत्ति बाजार BTC_USDT को एक उदाहरण के रूप में लेते हैं और 1 घंटे को 4 घंटों में संश्लेषित करते हैं।

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

|समय|उच्च|खुला|निम्न|बंद| |- |- |- |- |-| |2019.8.12 00:00|11447.07|11382.57|11367.2|11406.92| |2019.8.12 01:00|11420|11405.65|11366.6|11373.83| |2019.8.12 02:00|11419.24|11374.68|11365.51|11398.19| |2019.8.12 03:00|11407.88|11398.59|11369.7|11384.71|

इन चार 1-घंटे के चक्रों के डेटा को 4-घंटे के चक्र डेटा में संयोजित किया जाता है। शुरुआती कीमत पहले 00:00 समय की शुरुआती कीमत है: 11382.57 समापन मूल्य अंतिम है, अर्थात 03:00 बजे का समापन मूल्य: 11384.71 यहां सबसे ज्यादा कीमत सबसे ज्यादा है: 11447.07 सबसे कम कीमत यहाँ है: 11365.51 4 घंटे के चक्र का प्रारंभिक समय 00:00 है, 1 घंटे के के-लाइन का प्रारंभिक समय, यानी 2019.8.12 00:00 है ट्रेडिंग वॉल्यूम को हर 1 घंटे में सारांशित किया जा सकता है (मुख्य रूप से यह देखने के लिए कि मूल्य को कैसे संश्लेषित किया जाता है, जिसे ट्रेडिंग वॉल्यूम डेटा में नहीं दिखाया जाता है)। मैं यहाँ विवरण में नहीं जाऊँगा।

संश्लेषित 4-घंटे की K-लाइन है: उच्चतम: 11447.07 खुला: 11382.57 न्यूनतम: 11365.51 प्राप्त: 11384.71 समय: 2019.8.12 00:00

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

आप देख सकते हैं कि डेटा सुसंगत है।

  • ### कार्यान्वयन हेतु कोड लिखें

प्रारंभिक विचारों की पुष्टि करने के बाद, आप इस आवश्यकता को प्रारंभिक रूप से कार्यान्वित करने के लिए कुछ कोड लिखना शुरू कर सकते हैं।

कोड को सीधे जारी करें, कोड केवल संदर्भ के लिए है:

    function GetNewCycleRecords (sourceRecords, targetCycle) {    // K线合成函数
        var ret = []

        // 首先获取源K线数据的周期
        if (!sourceRecords || sourceRecords.length < 2) {
            return null
        }
        var sourceLen = sourceRecords.length
        var sourceCycle = sourceRecords[sourceLen - 1].Time - sourceRecords[sourceLen - 2].Time

        if (targetCycle % sourceCycle != 0) {
            Log("targetCycle:", targetCycle)
            Log("sourceCycle:", sourceCycle)
            throw "targetCycle is not an integral multiple of sourceCycle."
        }

        if ((1000 * 60 * 60) % targetCycle != 0 && (1000 * 60 * 60 * 24) % targetCycle != 0) {
            Log("targetCycle:", targetCycle)
            Log("sourceCycle:", sourceCycle)
            Log((1000 * 60 * 60) % targetCycle, (1000 * 60 * 60 * 24) % targetCycle)
            throw "targetCycle cannot complete the cycle."
        }

        var multiple = targetCycle / sourceCycle


        var isBegin = false 
        var count = 0
        var high = 0 
        var low = 0 
        var open = 0
        var close = 0 
        var time = 0
        var vol = 0
        for (var i = 0 ; i < sourceLen ; i++) {
            // 获取 时区偏移数值
            var d = new Date()
            var n = d.getTimezoneOffset()

            if (((1000 * 60 * 60 * 24) - sourceRecords[i].Time % (1000 * 60 * 60 * 24) + (n * 1000 * 60)) % targetCycle == 0) {
                isBegin = true
            }

            if (isBegin) {
                if (count == 0) {
                    high = sourceRecords[i].High
                    low = sourceRecords[i].Low
                    open = sourceRecords[i].Open
                    close = sourceRecords[i].Close
                    time = sourceRecords[i].Time
                    vol = sourceRecords[i].Volume

                    count++
                } else if (count < multiple) {
                    high = Math.max(high, sourceRecords[i].High)
                    low = Math.min(low, sourceRecords[i].Low)
                    close = sourceRecords[i].Close
                    vol += sourceRecords[i].Volume

                    count++
                }

                if (count == multiple || i == sourceLen - 1) {
                    ret.push({
                        High : high,
                        Low : low,
                        Open : open,
                        Close : close,
                        Time : time,
                        Volume : vol,
                    })
                    count = 0
                }
            }
        }

        return ret 
    }

    // 测试
    function main () {
        while (true) {
            var r = exchange.GetRecords()                           // 原始数据,作为合成K线的基础K线数据,例如要合成4小时K线,可以用1小时K线作为原始数据。
            var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)      // 通过 GetNewCycleRecords 函数 传入 原始K线数据 r , 和目标周期, 1000 * 60 * 60 * 4 即 目标合成的周期 是4小时K线数据。

            $.PlotRecords(r2, "r2")                                 // 策略类库栏 可以勾选画线类库,调用 $.PlotRecords 画线类库 导出函数 画图。
            Sleep(1000)                                             // 每次循环间隔 1000 毫秒,防止访问K线接口获取数据过于频繁,导致交易所限制。
        }
    }

दरअसल, के-लाइन को संश्लेषित करने के लिए दो चीजों की जरूरत होती है। पहला है कच्चे माल का डेटा, यानी छोटी अवधि का के-लाइन डेटा।var r = exchange.GetRecords() लघु अवधि के K-लाइन डेटा प्राप्त किया गया। दूसरा है संश्लेषण अवधि को स्पष्ट रूप से परिभाषित करना, अर्थात के-लाइन डेटा संश्लेषण के लिए लक्ष्य अवधि। फिर, GetNewCycleRecords फ़ंक्शन के एल्गोरिथ्म के माध्यम से, संश्लेषित K-लाइन सरणी संरचना का डेटा अंततः वापस किया जा सकता है। इस बात पे ध्यान दिया जाना चाहिए कि:

    1. लक्ष्य चक्र K-लाइन के चक्र से कम नहीं हो सकता है जिसे आप GetNewCycleRecords फ़ंक्शन में डेटा कच्चे माल के रूप में पास करते हैं। ऐसा इसलिए है क्योंकि छोटे चक्र से डेटा को संश्लेषित करने के लिए छोटे चक्र का उपयोग करना असंभव है।
    1. निर्धारित लक्ष्य अवधि एक बंद अवधि होनी चाहिए। चक्र समापन क्या है? सरल शब्दों में कहें तो, एक घंटे या एक दिन के भीतर, लक्ष्य चक्र समय सीमाओं को एक साथ मिलाकर एक बंद लूप बनाया जाता है। उदाहरण: उदाहरण के लिए, 12 मिनट के चक्र की K-लाइन प्रत्येक घंटे के 0:00 बजे शुरू होती है (उदाहरण के लिए 0:00 लें), और पहला चक्र है00:00:00 ~ 00:12:00, दूसरा चक्र है00:12:00 ~ 00:24:00, तीसरा चक्र है00:24:00 ~ 00:36:00चौथा चक्र है00:36:00 ~ 00:48:00, पांचवां चक्र है00:48:00 ~ 01:00:00 जो कि पूरा 1 घंटा होता है।

    यदि यह 13 मिनट का चक्र है, तो यह एक खुला चक्र है, और ऐसे चक्र में गणना किया गया डेटा अद्वितीय नहीं है, क्योंकि संश्लेषित डेटा, संश्लेषित डेटा के प्रारंभिक बिंदु के आधार पर भिन्न होगा।

वास्तविक डिस्क चलाया गया: प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

एक्सचेंज चार्ट की तुलना करें प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

  • ## आवश्यक डेटा संरचना के निर्माण के लिए K-लाइन डेटा का उपयोग करें

समूह के सदस्य अक्सर प्रश्न पूछते हैं: मैं प्रत्येक K-लाइन के उच्चतम मूल्य के मूविंग औसत की गणना करना चाहता हूं, मुझे क्या करना चाहिए?

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

उदाहरण के लिए: talib.MA मूविंग एवरेज इंडिकेटर कैलकुलेशन फ़ंक्शन में दो पैरामीटर हैं। पहला पैरामीटर वह डेटा है जिसे पास किया जाना चाहिए, और दूसरा पैरामीटर इंडिकेटर अवधि पैरामीटर है। उदाहरण के लिए, हम निम्नलिखित संकेतकों की गणना करना चाहते हैं प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

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

आइए हम स्वयं कुछ डेटा तैयार करें और देखें कि क्या यह एक्सचेंज के चार्ट द्वारा गणना किए गए डेटा के समान है।

  var highs = []
  for (var i = 0 ; i < r2.length ; i++) {
      highs.push(r2[i].High)
  }

चूंकि हमें चलती औसत सूचक प्राप्त करने के लिए प्रत्येक बार की उच्चतम कीमतों के औसत की गणना करने की आवश्यकता है। फिर आपको पहले एक सारणी बनानी होगी, जिसमें प्रत्येक डेटा तत्व प्रत्येक बार के उच्चतम मूल्य से मेल खाता हो। आप देख सकते हैं कि highs चर शुरू में एक खाली सरणी है, और फिर हम r2 कैंडलस्टिक डेटा चर को पार करते हैं (r2 याद नहीं है? ऊपर 4-घंटे की कैंडलस्टिक को संश्लेषित करने के मुख्य फ़ंक्शन में कोड देखें)। r2 के प्रत्येक बार का उच्चतम मूल्य पढ़ें (अर्थात r2[i].उच्च, i 0 से r2.length - 1 तक होता है), और फिर इसे उच्च में धकेलता है। इस तरह, एक डेटा संरचना का निर्माण किया जाता है जो K-लाइन डेटा बार के साथ एक-से-एक मेल खाता है।

इस बिंदु पर, चलती औसत की गणना करने के लिए उच्चतम मान को talib.MA फ़ंक्शन में भेजा जा सकता है।

पूर्ण उदाहरण:

  function main () {
      while (true) {
          var r = exchange.GetRecords()
          var r2 = GetNewCycleRecords(r, 1000 * 60 * 60 * 4)
          if (!r2) {
              continue
          }

          $.PlotRecords(r2, "r2")                                               // 画出K线

          var highs = []
          for (var i = 0 ; i < r2.length ; i++) {
              highs.push(r2[i].High)
          }

          var ma = talib.MA(highs, 9)                                           // 用均线指标函数 talib.MA 计算 均线指标
          $.PlotLine("high_MA9", ma[ma.length - 2], r2[r2.length - 2].Time)     // 使用画线类库把均线指标画在图表上

          Sleep(1000)
      }
  }

बैकटेस्ट रन:

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

आप देख सकते हैं कि चित्र में माउस की स्थिति पर चलती औसत सूचक मान हैं11466.9289

उपरोक्त कोड को परीक्षण चलाने के लिए रणनीति में कॉपी किया जा सकता है। “लाइन ड्रॉइंग लाइब्रेरी” को चेक करना और उसे सेव करना याद रखें!

  • ## डिजिटल मुद्रा बाज़ार में K-लाइन डेटा कैसे प्राप्त करें

इन्वेंटर क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म में पहले से ही एक पैकेज्ड इंटरफ़ेस है, जिसका नाम एक्सचेंज.गेटरिकॉर्ड्स फ़ंक्शन है, जो के-लाइन डेटा प्राप्त कर सकता है। निम्नलिखित डेटा प्राप्त करने के लिए एक्सचेंज K-लाइन डेटा इंटरफ़ेस तक सीधे पहुंचने पर ध्यान केंद्रित करता है, क्योंकि कभी-कभी आपको अधिक K-लाइनें प्राप्त करने के लिए पैरामीटर निर्दिष्ट करने की आवश्यकता होती है, इनकैप्सुलेटेड GetRecords इंटरफ़ेस आमतौर पर 100 लौटा दिए जाते हैं। यदि रणनीति में शुरू में 100 से अधिक K-लाइनों की आवश्यकता होती है, तो आपको उन्हें इकट्ठा करके प्रतीक्षा करनी होगी। रणनीति को यथाशीघ्र चलाने के लिए, आप स्वयं एक फ़ंक्शन को एनकैप्सुलेट कर सकते हैं, सीधे एक्सचेंज K-लाइन इंटरफ़ेस तक पहुंच सकते हैं, और अधिक K-लाइन डेटा प्राप्त करने के लिए पैरामीटर निर्दिष्ट कर सकते हैं।

हुओबी के BTC_USDT ट्रेडिंग जोड़े को एक उदाहरण के रूप में लेते हुए, हम इस आवश्यकता को लागू करते हैं:

एक्सचेंज का API दस्तावेज़ ढूंढें और K-लाइन इंटरफ़ेस का विवरण देखें: प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

  https://api.huobi.pro/market/history/kline?period=1day&size=200&symbol=btcusdt

पैरामीटर: |पैरामीटर नाम|प्रकार|आवश्यक|विवरण|मूल्य| |-|-|-|-|-| |प्रतीक|स्ट्रिंग|सत्य|ट्रेडिंग जोड़ी|btcusdt, ethbtc…| |अवधि|स्ट्रिंग|सत्य|डेटा समय ग्रैन्युलैरिटी लौटाता है, अर्थात प्रत्येक मोमबत्ती का समय अंतराल|1मिनट, 5मिनट, 15मिनट, 30मिनट, 60मिनट, 1दिन, 1सोम, 1सप्ताह, 1वर्ष| |size|integer|false|K-लाइन डेटा की संख्या लौटाएँ|[1, 2000]|

परीक्षण कोड:

  function GetRecords_Huobi (period, size, symbol) {
      var url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
      var ret = HttpQuery(url)

      try {
          var jsonData = JSON.parse(ret)
          var records = []
          for (var i = jsonData.data.length - 1; i >= 0 ; i--) {
              records.push({
                  Time : jsonData.data[i].id * 1000,
                  High : jsonData.data[i].high,
                  Open : jsonData.data[i].open,
                  Low : jsonData.data[i].low,
                  Close : jsonData.data[i].close,
                  Volume : jsonData.data[i].vol,
              })
          }
          return records
      } catch (e) {
          Log(e)
      }
  }  


  function main() {
      var records = GetRecords_Huobi("1day", "300", "btcusdt")
      Log(records.length)
      $.PlotRecords(records, "K")
  }

पायथन संस्करण, हुओबी एक्सचेंज इंटरफ़ेस तक पहुंचने का उदाहरण:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.huobi.pro/market/history/kline?" + "period=" + period + "&size=" + size + "&symbol=" + symbol
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData["data"]) - 1, -1, -1):
            records.append({
                "Time" : jsonData["data"][i]["id"] * 1000, 
                "High" : jsonData["data"][i]["high"], 
                "Open" : jsonData["data"][i]["open"], 
                "Low" : jsonData["data"][i]["low"], 
                "Close" : jsonData["data"][i]["close"], 
                "Volume" : jsonData["data"][i]["vol"], 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1day", "300", "btcusdt")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


पायथन संस्करण, बिनेंस एक्सचेंज के K-लाइन इंटरफ़ेस तक पहुँचने का एक उदाहरण:

#!python3
import json
import urllib2

def GetRecords_Huobi(period, size, symbol):
    headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
    url = "https://api.binance.com/api/v3/klines?symbol=" + symbol + "&interval=" + period
    request = urllib2.Request(url)  
    request.add_header('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6')  
    opener = urllib2.build_opener()  
    f= opener.open(request)  
    ret = f.read().decode('utf-8')  
    try :
        jsonData = json.loads(ret)
        
        records = []
        for i in range(len(jsonData)):
            records.append({
                "Time" : float(jsonData[i][0]),
                "High" : float(jsonData[i][2]), 
                "Open" : float(jsonData[i][1]), 
                "Low" : float(jsonData[i][3]), 
                "Close" : float(jsonData[i][4]), 
                "Volume" : float(jsonData[i][5]), 
            })
        return records
    except Exception as e:
        Log(e)
        
def main():
    r = GetRecords_Huobi("1m", "300", "BTCUSDT")
    Log(len(r))
    ext.PlotRecords(r, "K")   # 需要引用Python画线类库


प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा

हम लॉग में देख सकते हैं कि records.length 300 है, जिसका अर्थ है कि रिकॉर्ड्स K-लाइन डेटा के 300 बार हैं। प्रोग्राम्ड ट्रेडिंग में K-लाइन डेटा प्रोसेसिंग पर संक्षिप्त चर्चा