पुराने लोगों के साथ जावास्क्रिप्ट खेलते हैं - एक खरीदार-बिक्रेता साथी बनाते हैं

लेखक:छोटे सपने, बनाया गयाः 2017-03-13 12:53:50, अद्यतनः 2017-10-11 10:37:32

पुराने लोगों के साथ जावास्क्रिप्ट के साथ खेलने के लिए एक छोटा सा साथी बनाने के लिए जो खरीद और बिक्री करता है)))

एक ट्यूटोरियल जो कि जेएस का उपयोग करके क्वांटिफाइड रोबोट को लिखने के लिए किया गया हैःhttps://www.fmz.com/bbs-topic/705(पहले मार्क के नीचे) ।
  • 1, K-लाइन के डेटा के बुनियादी ढांचे, परिमाणात्मक लेनदेन में इन आंकड़ों का उपयोग करने के मुद्दे ।

    • K-लाइन डेटा क्या है:

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

      एक विशिष्ट आरेख नहीं बताता है, आइए एक नज़र डालते हैं K-string के डेटा संरचना पर जो कि JS भाषा का उपयोग करके परिभाषित किया गया हैः

      {
          Time    :   1487034000000, // 一个时间戳, 精确到毫秒,与Javascript的 new Date().getTime() 得到的结果格式一样
          Open    :   3425,          // 开盘价
          High    :   3446,          // 最高价
          Low     :   3423,          // 最低价
          Close   :   3438,          // 收盘价
          Volume  :   177657.99,     // 交易量
      }
      

      अब हम GetRecords फ़ंक्शन को कॉल करने के बाद प्राप्त डेटा को देखते हैंः (याद रखें कि पहले exchange.SetContractType ((rb1705)) को कॉल करें; स्पष्ट रूप से संविदा का प्रकार जो संचालित किया जाना है)

      [
          {"Time":1487034000000,"Open":3425,"High":3446,"Low":3423,"Close":3438,"Volume":177657.9999999999},
          {"Time":1487035800000,"Open":3438,"High":3448,"Low":3382,"Close":3385,"Volume":494882},
          {"Time":1487037600000,"Open":3385,"High":3398,"Low":3383,"Close":3394,"Volume":83656.00000000015}
      ]
      

      दृश्य K-लाइन डेटा एक वस्तु सरणी है, प्रत्येक वस्तु एक K-लाइन बार है, जिसमें इस बार चक्र के भीतर उच्चतम मूल्य, निम्नतम मूल्य, शुरुआती मूल्य (जैसा कि यह K-लाइन समय चक्र शुरू होता है), समापन मूल्य (जैसा कि यह K-लाइन चक्र समाप्त होता है), लेनदेन (जैसे कि चक्र में लेनदेन) शामिल हैं। और यह चक्र K-लाइन चक्र है। उदाहरण के लिए, उपरोक्त सरणी में डेटा यह कैसे निर्धारित करता है कि चक्र के लिए K रेखा कितनी बड़ी है? यह केवल 2 बार के समय के साथ गलत है: 1487035800000 - 1487034000000 तो 1800000 / 1000 / 60 = 30 (मिनट), यह K लाइन चक्र 30 मिनट है।

      एक सवाल जो आसानी से सामने आता हैः K-लाइन डेटा का उपयोग करते समय, सरणी की लंबाई को नजरअंदाज कर दिया जाता है. इस प्रकार के बग पहले C प्रोग्राम लिखने के दौरान आम थे. इसलिए हमें K-लाइन का उपयोग करने से पहले इसके बारे में निर्णय लेने की आवश्यकता है. उदाहरण के लिए, K लाइन प्राप्त करेंः exchange.SetContractType ((rb1705); // स्विच सेटिंग्स को स्क्रू स्टील 1705 अनुबंध के लिए सेट किया गया है。 var records = exchange.GetRecords ((); // rb1705 स्क्रूड स्टील अनुबंध के लिए डिफ़ॉल्ट K लाइन चक्र डेटा प्राप्त करता है । एक्सचेंज के एपीआई द्वारा कितने रूट बार तक प्राप्त किए जा सकते हैं, यह एक्सचेंज के एपीआई के आधार पर निर्धारित किया जाता है। इसलिए, यदि शुरुआत में अपेक्षाकृत अधिक के-लाइन बार की आवश्यकता होती है, तो प्रोग्राम को कुछ समय के लिए एकत्रित करना होगा। और कार्यक्रम में यह निर्णय करना है कि पर्याप्त एकत्रित किया गया है या नहीं, यह इस तरह लिखा जा सकता हैः

      if(records.length < n){    // n 就是我们限定的 n线数量。
          return;                // 当前函数返回。
      }
      

      दूसरी समस्या जो आसानी से सामने आती हैः K लाइन के अंतिम बार के डेटा में Time, Open और Close गुणों के अलावा अन्य गुणों में परिवर्तन हो सकता है, जो वास्तविक समय में बदल रहे हैं। उदाहरण के लिए, पिछले अध्याय में, औसत रेखा क्रॉसिंग के बारे में बताया गया था। पहले बार का उपयोग करना या दूसरे बार का उपयोग करना?

      तीसरा सवालः के लाइन का चक्र, समय का पट्टा इस चक्र के आरंभ का समय है, समय का पट्टा एक मिलीसेकंड है, जिसका मान 0 है। समय का पट्टा 1 जनवरी 1970 को दर्शाता है (विशिष्ट प्रोग्राम लिखने के समय यह निर्धारित करना भी आवश्यक है कि कौन सा समय क्षेत्र है) । आप इस वाक्य का उपयोग कर सकते हैंw3schoolया BotVS Sandbox System में परीक्षण करेंः

      var arr = new Date(0);
      

      यह दिखाता हैः

      Thu Jan 01 1970 08:00:00 GMT+0800 (CST) // दिखाया गया पूर्वी आठ समय क्षेत्र यह मान 1970 से अब तक अपने आप में जमा हुआ है (हर 1 सेकंड में 1000 से अधिक, क्योंकि 1 सेकंड 1000 मिलीसेकंड है), इसलिए यह संख्या काफी बड़ी है। यहाँ एक छोटी सी चाल हैः समय रेखा के प्रत्येक बार के लिए अद्वितीय है क्योंकि यह निर्धारित करता है कि के लाइन चक्र के लिए के लाइन में क्या है, इसलिए एक बार जब समय रेखा बदल जाती है, तो यह सुनिश्चित किया जा सकता है कि नवीनतम के लाइन डेटा प्राप्त किया गया है। यह वास्तव में के लाइन डेटा को संसाधित करने में भी उपयोगी है।

  • 2, संकेतक कॉल विवरण, अक्सर पूछे जाने वाले प्रश्न संतुष्ट चक्र, रिटर्न मान, पैरामीटर

    प्रोग्रामिंग या क्वांटिफाइंग रणनीतियों को लिखने के लिए, कई संकेतक फ़ंक्शन भी उपयोग किए जाते हैं। तुलनात्मक रूप से उपयोगी संकेतक संग्रह में तालिब पुस्तकालय है, जिसका विभिन्न संस्करण हैं, हम यहां जेएस संस्करण का उपयोग करते हैं।

    जब वे पहली बार सूचकांक भंडार के कार्यों का उपयोग करते थे, तो कई त्रुटियां हुईंः

    • पहला, पैरामीटर चक्र (सूचक पैरामीटर, K लाइन चक्र से अलग, K लाइन चक्र कितना है, गणना की गई सूचक K लाइन चक्र या कितना है, उदाहरण के लिए 30 मिनट की K लाइन गणना की गई 30 मिनट की अवधि का MACD संकेतक है, पैरामीटर पैरामीटर चक्र के लिए है) बहुत बड़ा सेट किया गया है, K लाइन डेटा की लंबाई अपर्याप्त हैः उदाहरण के लिए, MACD सूचकांक का वर्णन करता हैः

      MACD(Records[Close],Fast Period = 12,Slow Period = 26,Signal Period = 9) = [Array(outMACD),Array(outMACDSignal),Array(outMACDHist)]
      

      यदि उपयोग के दौरान पैरामीटर अवधि 12,26,9 पर सेट है, तो हम K-लाइन डेटा रिकॉर्ड्स को इनपुट करते हैं जो कि मानकों की गणना के लिए हैं, कोड इस तरह लिखता हैः

      var macd = talib.MACD(records, 12, 26, 9);
      

      यदि इनपुट किए गए रिकॉर्ड बहुत छोटे हैं, तो यह गणना की जाती हैः

      [
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null],
        [null,null,null,null,null,null,null,null,null,null,null,null,null]
      ]
      

      यह K-लाइन डेटा की कमी के कारण है, और गणना किए गए संकेतक का उपयोग करने पर एक BUG पैदा करेगा, इसलिए हमने प्रोग्राम से पहले एक सीमित शर्त जोड़ीः

      while(!records || records.length < 50){
          records = exchange.GetRecords();
          Sleep(1000);
      }
      

      जब तक आप 50 K स्ट्रिंग प्राप्त नहीं करते, तब तक लूप से बाहर न निकलें; निम्नानुसार करेंःimg

      ध्यान से पढ़ने वाले लोग देख सकते हैं कि इस संकेतक का डेटा एक दो आयामी सरणी है (यानी एक सरणी का प्रत्येक तत्व एक सरणी है) क्योंकि MACD संकेतक एक पंक्ति नहीं बल्कि तीन पंक्तियों का गणना करता हैः dif,dea,macd मात्रा स्तंभ। इसलिए प्रत्येक संकेतक का रिटर्न अलग-अलग हो सकता है, या आपको संकेतक के विवरण को देखने की आवश्यकता है।

      [
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...],
        [null,null,null,null,null,null,null,null,数据...]
      ]
      

      कई बार यह भी एक बग के रूप में देखा जाता है, क्योंकि संकेतकों की वापसी संरचना पर ध्यान नहीं दिया जाता है।

    • दूसरा, एक सूचक फ़ंक्शन का गणना करने के लिए उपयोग की जाने वाली औसत रेखा अलग है या एक सूचक एल्गोरिथ्म अलग परिणाम देता है।

      स्टोच आरएसआई के बारे में अधिक स्पष्ट है, जो इस प्रकार हैः

      STOCHRSI(Records[Close],Time Period = 14,Fast-K Period = 5,Fast-D Period = 3,Fast-D MA = 0) = [Array(outFastK),Array(outFastD)]
      

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

  • 3। एपीआई त्रुटि स्वीकार करता है

    • Cannot read property length of null यह बग सबसे अधिक बार दिखाई देता है, इनमें से कोई भी नहीं है।

      इसका कारण यह है कि एपीआई में कभी-कभी विभिन्न कारणों से डेटा प्राप्त करने में त्रुटि होती है, या डेटा प्राप्त नहीं होता है। इस समय कुछ एपीआई जो डेटा प्राप्त करते हैं वे शून्य मान प्राप्त करते हैं। ये डेटा आमतौर पर एक सरणी संरचना होते हैं और अक्सर सरणी की लंबाई तक पहुंच की आवश्यकता होती है।

      सभी एपीआई कॉल के लिए त्रुटि-प्रतिक्रिया की आवश्यकता होती है, और कभी-कभी यह जांचने की भी आवश्यकता होती है कि क्या डेटा ठीक है (कभी-कभी असामान्य डेटा दिखाई देता है) । हमारे प्रोग्राम केवल अपने कोड के भीतर सटीकता की गारंटी दे सकते हैं, लेकिन नेटवर्क पर चलने वाली डेटा जानकारी के लिए 100% सटीकता की गारंटी नहीं दी जा सकती है (किसी भी चीज को खोना अपरिहार्य है), इसलिए प्राप्त किए गए डेटा पर त्रुटि-प्रतिक्रिया की आवश्यकता होती है और सभी असामान्य डेटा को फ़िल्टर करना पड़ता है।

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

पहले यह लिखें, पाठकों का स्वागत है मुझे एक टिप्पणी छोड़ने के लिए! सुझाव और टिप्पणियों के लिए, अगर आप मजा महसूस कर रहे हैं और अधिक कार्यक्रम प्रेमी व्यापार प्रेमी दोस्तों के लिए साझा कर सकते हैं

https://www.fmz.com/bbs-topic/728

प्रोग्रामर littleDream मूल रूप से


अधिक