[TOC]

बुनियादी निर्देश

शुरू करना

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म क्या कर सकता है?

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म मात्रात्मक ट्रेडिंग के क्षेत्र में सबसे पेशेवर मात्रात्मक समुदाय है। यहां आप मात्रात्मक रणनीतियों को सीख सकते हैं, लिख सकते हैं, साझा कर सकते हैं, खरीद और बेच सकते हैं; आप ऑनलाइन बैकटेस्टिंग कर सकते हैं और सिमुलेटेड ट्रेडिंग करने के लिए सिमुलेशन बॉट का उपयोग कर सकते हैं; आप लाइव ट्रेडिंग भी चला सकते हैं, प्रचार कर सकते हैं और देख सकते हैं। हम लगभग सभी मुख्यधारा के डिजिटल मुद्रा एक्सचेंजों का समर्थन करते हैं।

ट्यूटोरियल की पूरी श्रृंखला

ग्राफिक ट्यूटोरियलः

यदि कोई समस्या है, तो आप किसी भी समय प्रश्न पोस्ट कर सकते हैं और मंच पर चर्चा कर सकते हैं, या टिकट भेज सकते हैं, या टेलीग्राम समूह में एक व्यवस्थापक से संपर्क कर सकते हैं (तार), सामान्य तौर पर, इस प्रश्न का उत्तर शीघ्र दिया जाएगा।

विकास सहायता के लिए चैटजीपीटी का समर्थन

एफएमजेड क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म ने चैटजीपीटी को एक विकास सहायता उपकरण के रूप में अपनाया है, जिसे डैशबोर्ड में शॉर्टकट बार में चैटजीपीटी पर क्लिक करके एक्सेस किया जा सकता है।चैटजीपीटी सहायक उपकरण पृष्ठ.

मेरी रणनीतियों को लागू करने के लिए कौन सी प्रोग्रामिंग भाषाएँ उपलब्ध हैं?

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म का उपयोग करने का समर्थन करता हैJavaScript, TypeScript, Python, C++, Pine MylanguageऔरBlockly Visualizationरणनीतियों को लिखने और डिजाइन करने के लिए।

यह समर्थन करता हैTypeScriptभाषा, अभी भी इसे सेट करेंJavaScriptरणनीति जब हम रणनीतियों बनाने, तो हम लिखते हैं// @ts-checkरणनीति कोड की शुरुआत में या बटन पर क्लिक करेंTypeScriptरणनीति संपादन क्षेत्र के ऊपरी दाएं कोने में स्विच करने के लिएTypeScript. प्लेटफॉर्म कोड को पहचान लेगाTypeScriptस्वचालित रूप से और आप के लिए उपयुक्त संकलन और प्रकार की जाँच के समर्थन प्रदान करने के लिएः

  • प्रकार सुरक्षाःTypeScriptके स्थिर प्रकार जाँच समारोह आप कोड लिखते समय संभावित त्रुटियों को खोजने और कोड की गुणवत्ता में सुधार करने में मदद कर सकते हैं.
  • स्वचालित कोड पूरा करना:TypeScriptके प्रकार प्रणाली यह तेजी से विशेषताएं और विधि आप कोड लिखने के लिए की जरूरत है जब खोजने के लिए बनाता है, विकास दक्षता में सुधार.
  • स्पष्ट कोड संरचनाःTypeScript, आप अपने कोड को बेहतर ढंग से व्यवस्थित और बनाए रख सकते हैं, जिससे इसे पढ़ना और समझना आसान हो जाता है।
  • शक्तिशाली ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग विशेषताएंःTypeScriptशक्तिशाली ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सुविधाएँ प्रदान करता है, जैसे कि इंटरफेस, वर्ग, जेनेरिक आदि, आपको अधिक मजबूत और पुनः प्रयोज्य रणनीति कोड लिखने में मदद करता है।

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

Blocklyविज़ुअलाइज़ेशन ट्यूटोरियलः

सेट करेंPythonदुभाषिया का प्रयोगPythonरणनीतिक कार्यक्रम

रणनीतियों में लिखाPython, जब बैकटेस्टिंग या लाइव ट्रेडिंग, अगर डॉकर सिस्टम वातावरण दोनों हैपायथन2औरपायथन3स्थापित, आप सेट कर सकते हैंPythonरणनीति की पहली पंक्ति पर रनटाइम पर लॉन्च किए जाने वाले संस्करण, जैसे#!python3और#!python2, ताकि सिस्टम स्वचालित रूप से दुभाषिया को ढूंढ लेगा. और आप एक पूर्ण पथ भी निर्दिष्ट कर सकते हैं, जैसेः#!/usr/bin/python3.

डॉकर क्या है?

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

समर्थित प्रोटोकॉल

  • ब्लॉकचेन परिसंपत्तियाँ: हमारे प्लेटफॉर्म में 50 से अधिक मुख्यधारा के ब्लॉकचेन परिसंपत्तियाँ (क्रिप्टोक्यूरेंसी) एक्सचेंज अब समर्थित हैं।
  • सामान्य प्रोटोकॉल पहुँचःसामान्य प्रोटोकॉल

रणनीतिक सुरक्षा

जब एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म पर ट्रेडिंग रणनीतियों को विकसित किया जाता है, तो रणनीति सामग्री केवल एफएमजेड खाते धारकों के लिए दिखाई देती है। और एफएमजेड मात्रात्मक ट्रेडिंग प्लेटफॉर्म पर, आप रणनीति कोड के पूर्ण स्थानीयकरण को प्राप्त कर सकते हैं। उदाहरण के लिए, एक रणनीति तर्क को एक में कैप्सूल किया जा सकता हैPythonपैकेज, जो रणनीति कोड में लोड किया जाता है, ताकि रणनीति सामग्री स्थानीयकरण को महसूस किया जा सके।

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

के एन्क्रिप्शनPythonरणनीति कोडः डिफ़ॉल्ट रूप से,Pythonरणनीति कोड लेखक द्वारा उपयोग किए जाने पर एन्क्रिप्टेड नहीं है और दूसरों को किराए पर दिए जाने पर एन्क्रिप्टेड है। निम्नलिखित कोड को संपादित करकेPythonरणनीति, आप निर्दिष्ट कर सकते हैं कि क्या निजी उपयोग या किराए के लिए रणनीति कोड एन्क्रिप्ट करने के लिए.Pythonरणनीति कोड के एन्क्रिप्शन का समर्थन करने वाले संस्करण निम्नलिखित हैंःPython 2.7, Python 3.5औरPython 3.6.

  • रणनीति लेखक इसे स्वयं चलाते हैं और पंजीकरण कोड के माध्यम से उपयोग करने के लिए दूसरों के लिए रणनीति कोड को एन्क्रिप्ट करते हैंः निर्दिष्ट करें#!pythonपायथन दुभाषिया के संस्करण के रूप में, और फिर उपयोग,अलग रखने के लिए; एन्क्रिप्शन कमांड दर्ज करेंencryptयदि आप संस्करण निर्दिष्ट नहीं करते हैंPython, जोड़ें#!,encrypt directly.
 #!python,encrypt

या

  #!encrypt
  • यह रणनीति कोड को एन्क्रिप्ट नहीं करेगा जब रणनीति लेखक अपने स्वयं के उपयोग के लिए चलाते हैं और पंजीकरण कोड के माध्यम से दूसरों के साथ साझा करते हैंः
  #!python, not encrypted

या

  #!not encrypted

कोड का प्रयोग करेंos.getenv('__FMZ_ENV__')यह निर्धारित करने के लिए कि एन्क्रिप्शन कोड मान्य है या नहीं; स्ट्रिंग की वापसी"encrypt"यह केवल वास्तविक बॉट में मान्य है, और बैकटेस्ट एन्क्रिप्ट नहीं करेगाPythonरणनीति कोड।

#!encrypt
def main():
    ret = os.getenv('__FMZ_ENV__')
    # If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid. 
    Log(ret, ret == "encrypt")

मुख्य सुरक्षा

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

  • हमारे मंच संवेदनशील जानकारी के स्थानीय विन्यास का समर्थन करता है, जैसे कि विनिमय खाता जानकारी और गुप्त कुंजी उस पृष्ठ पर जहां प्लेटफ़ॉर्म विनिमय जानकारी को कॉन्फ़िगर करता है, मास्क वाले सभी एन्क्रिप्टेड टेक्स्ट बॉक्स कंट्रोल डॉकर की स्थानीय फ़ाइल लोड करने के लिए फ़ाइल पथ को कॉन्फ़िगर करने के तरीके का समर्थन करते हैं।RSA KEYएक्सचेंज की प्रमाणीकरण विधि एक उदाहरण के रूप में विस्तृत रूप से समझाने के लिए कि डॉकर प्रोग्राम स्थित डिवाइस पर स्थानीय रूप से संवेदनशील जानकारी को कैसे कॉन्फ़िगर किया जाए।
  1. आरएसए सार्वजनिक कुंजी और निजी कुंजी बनाएँ. उदाहरण के लिए, सार्वजनिक और निजी कुंजी के प्रारूप में बनाएँPKCS#8, सृजन के लिए कई उपकरण उपलब्ध हैं, जैसेopenssl.
  2. सृजनRSA KEYएक्सचेंज पर, और में बनाया सार्वजनिक कुंजी अपलोडचरण 1सृष्टि के दौरान।
  3. में बनाई गई निजी कुंजी सहेजेंचरण 1के प्रारूप में डॉकर की एक ही निर्देशिका मेंtxtफ़ाइल, या डॉकर कार्यक्रम की निर्देशिका में अन्य पथों में.
  4. एफएमजेड प्लेटफार्म पर विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमRSA KEYविनिमय द्वारा कॉन्फ़िगरेशन के संपादन बॉक्स में बनाया गयाAccess Key.
  5. एफएमजेड मंच पर विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमय विनिमयtxtफ़ाइल एक ही स्तर की निर्देशिका में रखा डॉकर मेंचरण 3कॉन्फ़िगरेशन के संपादन बॉक्स मेंSecret Key. उदाहरण के लिए, यदि फ़ाइल नाम रखा गया हैःrsaKey.txt, और फ़ाइल और डॉकर एक ही स्तर निर्देशिका में भरे जाते हैंःfile:///rsaKey.txt. यदि फ़ाइल डॉकर प्रोग्राम की निर्देशिका के बगल में निर्देशिका में हैrsa_key, भरेंःfile:///rsa_key//rsaKey.txt. यदि आप जगहrsaKey. txtअपने कंप्यूटर या सर्वर पर कहीं और इस निर्देश का पालन करें, यह ध्यान दिया जाना चाहिए कि यह फ़ाइल केवल या तो एक ही स्तर निर्देशिकाओं या डॉकर के संबंध में उपनिर्देशिकाओं में रखा जा सकता है।

यह स्थानीयकरण और निजी कुंजी को बचाने के लिए सुरक्षित बनाता है, आप संदर्भित कर सकते हैंवीडियो व्याख्याविस्तृत प्रक्रिया के लिए।

बैकटेस्ट प्रणाली

बैकटेस्ट प्रणाली क्या है और इसका उपयोग किस लिए किया जाता है?

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

क्या बैकटेस्ट सिस्टम डेटा सटीक है और बैकटेस्ट परिणामों की सटीकता के बारे में क्या?

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

विभिन्न प्रोग्रामिंग भाषाओं की रणनीतियों का बैकटेस्ट करते समय ध्यान देने योग्य मुद्देः

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

सिस्टम में बैकटेस्ट डेटा

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म बैकटेस्ट के दो प्रकार हैंः सिमुलेशन स्तर बैकटेस्ट और वास्तविक बाजार स्तर बैकटेस्ट। सिमुलेशन स्तर बैकटेस्ट सिमुलेटेडtickप्रत्येक K-लाइन अवधि 12 बैकटेस्टिंग समय बिंदु उत्पन्न करेगा; हालांकि, वास्तविक बाजार स्तर एकत्र करता हैticksएफएमजेड के बैकटेस्ट तंत्र से ट्रेडिंग रणनीति को एक ही के-लाइन पर कई बार ट्रेड करने की अनुमति मिलती है, जिससे ऐसी स्थिति से बचा जा सकता है जहां ट्रेडिंग केवल बंद मूल्य पर निष्पादित की जा सकती है। यह बैकटेस्ट की गति को ध्यान में रखते हुए अधिक सटीक है। अधिक विस्तृत स्पष्टीकरण के लिए, कृपया देखेंलिंक.

बैकटेस्टिंग प्रणाली में रणनीति डीबीयूजी विधि

क्रोम DevTools में जावास्क्रिप्ट रणनीति बैकटेस्टिंग डिबगिंग

बैकटेस्टिंग प्रणाली में समर्थित आदान-प्रदान

  • एन्क्रिप्टेड मुद्रा (क्रिप्टोकरेंसी)

    नाम प्रकार निर्देश
    बिटकॉइन स्पॉट विनिमय वस्तु सीमित व्यापारिक जोड़े का समर्थन करना, जैसेःBTC_USD, ETH_USDऔरLTC_USD, आदि (ध्यान दें कि ट्रेडिंग जोड़े की बोली मुद्राUSDडॉलर)
    बाइनेंस स्पॉट विनिमय वस्तु सीमित व्यापारिक जोड़े का समर्थन करना, जैसेःBTC_USDT, ETH_USDT, ETH_BTCऔरLTC_BTCआदि।
    ओकेएक्स स्पॉट विनिमय वस्तु सीमित व्यापारिक जोड़े का समर्थन करना, जैसेःBTC_USDT, ETH_USDT, ETH_BTCऔरLTC_BTCआदि।
    हुओबी स्पॉट विनिमय वस्तु सीमित व्यापारिक जोड़े का समर्थन करना, जैसेःBTC_USDT, ETH_USDT, ETH_BTCऔरLTC_BTCआदि।
    ओकेएक्स वायदा वायदा विनिमय वस्तु सीमित व्यापारिक जोड़े का समर्थन करना, जैसेःBTC_USDऔरETH_USD, आदि; व्यापारिक जोड़े की बोली मुद्रा हैUSD; विशिष्ट अनुबंध कोड की स्थापना के बाद (कृपया फ़ंक्शन देखेंexchange.SetContractType), अनुबंध क्रिप्टो-मार्जिन अनुबंध है; समर्थित अनुबंध कोड में शामिल हैंःthis_week, next_week, quarterऔरswap
    HuobiDM वायदा विनिमय वस्तु HuobiDM Huobi Futures (Huobi Contract) है, जो सीमित व्यापारिक जोड़े का समर्थन करता है, जैसेःBTC_USDऔरETH_USD, आदि; व्यापारिक जोड़े की बोली मुद्रा हैUSD; विशिष्ट अनुबंध कोड की स्थापना के बाद (कृपया फ़ंक्शन देखेंexchange.SetContractType), अनुबंध क्रिप्टो-मार्जिन अनुबंध है; समर्थित अनुबंध कोड में शामिल हैंःthis_week, next_week, quarterऔरswap.
    बिटमेक्स वायदा विनिमय वस्तु व्यापारिक जोड़ी हैXBT_USD; विशिष्ट अनुबंध कोड की स्थापना के बाद (कृपया फ़ंक्शन देखेंexchange.SetContractType), अनुबंध एक क्रिप्टो-मार्जिन अनुबंध है; समर्थित अनुबंध कोड हैःXBTUSD
    बाइनेंस वायदा वायदा विनिमय वस्तु सीमित व्यापारिक जोड़े का समर्थन करना, जैसेःBTC_USDTऔरETH_USDT, आदि; व्यापारिक जोड़े की बोली मुद्रा हैUSD; विशिष्ट अनुबंध कोड की स्थापना के बाद (कृपया फ़ंक्शन देखेंexchange.SetContractType), यह अनुबंध एकUSDT- मार्जिन अनुबंध; समर्थित अनुबंध कोड हैswap
    डेरिबिट विकल्प वायदा विनिमय वस्तु व्यापारिक जोड़े हैंःBTC_USDऔरETH_USD; विशिष्ट अनुबंध कोड की स्थापना के बाद (कृपया फ़ंक्शन देखेंexchange.SetContractType), अनुबंध क्रिप्टो-मार्जिन अनुबंध है; विशिष्ट विकल्प अनुबंध कोड निर्धारित करने की आवश्यकता है

    बैकटेस्ट प्रणाली में फ्यूचर्स एक्सचेंज ऑब्जेक्ट्स के लिए, ट्रेडिंग जोड़े बदलना अस्थायी रूप से रणनीति कोड में समर्थित नहीं है।

सिमुलेशन स्तर

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

वास्तविक बाजार स्तर

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

वास्तविक बाजार स्तर बैकटेस्ट वर्तमान में समर्थन करता है:

  • बाइनेंस
  • ओकेएक्स (ओकेएक्स स्पॉट)
  • हुओबीडीएम (हुओबी वायदा)

बैकटेस्टिंग सिस्टम पैरामीटर अनुकूलन

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म के बैकटेस्ट सिस्टम का पैरामीटर अनुकूलन कार्य बैकटेस्ट के दौरान प्रत्येक पैरामीटर अनुकूलन विकल्प के अनुसार अनुकूलन सेट करना है, और विकल्प निम्नानुसार दिखाए गए हैंः

  • न्यूनतम मानः मापदंडों के प्रारंभिक मूल्य को सीमित करने के लिए।
  • अधिकतम मानः क्रमिक परिवर्तनों के बाद मापदंडों के अधिकतम मान को सीमित करने के लिए।
  • चरण का आकारः मापदंडों की वृद्धिशील चर राशि।

पैरामीटर संयोजन उत्पन्न करें, और उन सभी संयोजनों को बैकटेस्ट करने के लिए पार करें (अर्थात प्रत्येक पैरामीटर संयोजन को एक बार बैकटेस्ट करना) ।संख्याप्रकार का बैकटेस्टिंग प्रणाली में अनुकूलित किया जा सकता है।

उदाहरण के लिए, बैकटेस्ट पृष्ठ पर पैरामीटर अनुकूलन विकल्प सेट करेंः

img

पैरामीटर अनुकूलन मोड का बैकटेस्टः

img

बैकटेस्ट सेटिंग्स सहेजें

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

img

लेनाJavaScriptउदाहरण के रूप में रणनीति, और क्लिक करें Save Backtest Settings to Source File:

img

स्रोत फ़ाइल में बैकटेस्ट सेटिंग्स सहेजें पर मामूली अंतर हैंJavaScript, Python, cppऔरMylanguage:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

माइलैंग्वेज:

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)

कस्टम डेटा स्रोत

यह प्रणालीGETबैकटेस्ट के लिए बाहरी डेटा स्रोत प्राप्त करने के लिए एक कस्टम URL (सार्वजनिक रूप से सुलभ URL) का अनुरोध करने की विधि। अतिरिक्त अनुरोध मापदंड निम्नलिखित हैं:

पैरामीटर अर्थ स्पष्टीकरण
प्रतीक प्रतीक का नाम जैसे BTC_USD_OKCoin_EN
ईद आदान-प्रदान जैसे कि OKCoin_EN
गोल मूल्य सटीकता जैसे 3, लौटाए गए डेटा में कीमत 1000 से गुणा और गोल किया जाना चाहिए
चारों ओर मात्रा सटीकता जैसे 2, लौटाए गए डेटा में राशि 100 से गुणा और गोल किया जाना चाहिए
अवधि बार अवधि (मिलीसेकंड) उदाहरण के लिए 60,000 बार एक मिनट के लिए अनुरोध का संकेत
गहराई गहराई के स्तर 1-20
व्यापार डेटा को विभाजित करने की आवश्यकता है या नहीं सच/झूठ
से प्रारंभ समय यूनिक्स टाइमस्टैम्प
करने के लिए अंत का समय यूनिक्स टाइमस्टैम्प

नोटः

Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.

सिले हुए डेटा का एक उदाहरणः

http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200

लौटाया गया प्रारूप निम्नलिखित दो प्रारूपों में से एक होना चाहिए (जो सिस्टम द्वारा स्वचालित रूप से पहचाना जाएगा):

सामान्य बार-स्तरीय बैकटेस्ट

{
    "schema":["time","open","high","low","close","vol"],
    "data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}

टिक-लेवल बैकटेस्ट डेटा (बाजार गहराई की जानकारी सहित, [मूल्य, मात्रा] के गहराई प्रारूप के साथ एक सरणी; गहराई के कई स्तर हो सकते हैं; पूछता है मूल्य वृद्धि क्रम को संदर्भित करता है, और बोली मूल्य रिवर्स क्रम को संदर्भित करता है।

{
    "schema":["time","asks", "bids","trades","close","vol"],
    "data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}

विवरण

क्षेत्र विवरण
स्कीमा यह डेटा सरणी में स्तंभों की विशेषताओं को निर्दिष्ट करता है, जो केस संवेदनशील है और केवल time, open, high, low, close, vol, asks और bids तक ही सीमित है
डेटा एक सरणी जो स्कीमा द्वारा डेटा संग्रहीत करती है

डेटा प्रारूप

क्षेत्र विवरण
पूछताछ/प्रस्ताव [मूल्य, मात्रा],...]
व्यापार [[समय, दिशा ((0:खरीद,1:बिक्री),मूल्य,मात्रा],...]

वित्तपोषण दर के आंकड़े प्रदान करना:

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

{
  "detail": {},
  "symbol": "futures_binance.eth_usdt.funding",
  "schema": ["time", "open", "high", "low", "close", "vol"],
  "data": [
    [1582876800000, 25289, 25289, 25289, 25289, 0],
    [1582905600000, 30522, 30522, 30522, 30522, 0],
    [1582934400000, 40998, 40998, 40998, 40998, 0],
        ...
    [1626652800000, 198, 198, 198, 198, 0],
    [1626681600000, 691, 691, 691, 691, 0],                  // The adjacent periodic interval is 8 hours
    [1626710400000, 310, 310, 310, 310, 0],                  // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
    [1626739200000, 310, 310, 310, 310, 0],                  // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310 
    [1626768000000, -41610, -41610, -41610, -41610, 0],      // The funding rate might be a negative value
    [1626796800000, -5125, -5125, -5125, -5125, 0],
        ...   
    [1627977600000, 10000, 10000, 10000, 10000, 0]
  ]
}

बैकटेस्ट प्रणाली से डेटा अनुरोध का एक उदाहरणः

http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400

कस्टम डेटा स्रोत का उदाहरणः

डेटा स्रोत निर्दिष्ट करें, URL:http://xxx.xx.x.xx:9090/dataगोलांग में लिखे गए डेटा सर्वर को अनुकूलित करेंः

package main 
import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
    // r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "schema":["time","open","high","low","close","vol"],
            "data":[
                [1564315200000,9531300,9531300,9497060,9497060,787],
                [1564316100000,9495160,9495160,9474260,9489460,338]
            ]
        }
        */
        ret := map[string]interface{}{
            "schema" : []string{"time","open","high","low","close","vol"},
            "data" : []interface{}{
                []int64{1564315200000,9531300,9531300,9497060,9497060,787},
                []int64{1564316100000,9495160,9495160,9474260,9489460,338},
            },
        }
        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}

func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

परीक्षण रणनीति,JavaScriptउदाहरण:

/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(ticker)
    Log(records)
}

बैकटेस्ट प्रणाली में कस्टम डेटा द्वारा तैयार चार्टः

रणनीति मुद्रण जानकारीः

स्थानीय बैकटेस्ट इंजन

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म नेJavaScriptसंस्करण औरPythonस्थानीय बैकटेस्ट इंजन का संस्करण, समर्थन सेटिंगअंतर्निहित के लाइन अवधिबैकटेस्टिंग के दौरान।

बैकटेस्ट पेज शॉर्टकट कुंजी

  • रणनीति संपादन पृष्ठ और बैकटेस्टिंग पृष्ठ के बीच स्विच करने के लिए शॉर्टकट कुंजी

    कुंजी का प्रयोग करेंCtrl +,Backtest पेज और Edit Strategy पेज पर वापस स्विच करने के लिए.Ctrl, कुंजी दबाएँ,.

  • बचत रणनीति के लिए शॉर्टकट कुंजी

    कुंजी का प्रयोग करेंCtrl + sरणनीतियों को बचाने के लिए।

  • रणनीति बैकटेस्ट शुरू करने के लिए शॉर्टकट

    कुंजी का प्रयोग करेंCtrl + bStart Backtest सक्षम करने के लिए।

कोड विवरण

प्रवेश कार्य

फ़ंक्शन का नाम विवरण
main() यह एक प्रवेश समारोह है।
onexit() यह सामान्य रूप से बाहर निकलने पर एक सफाई कार्य है, इसका अधिकतम निष्पादन समय 5 मिनट है, जिसे अघोषित छोड़ दिया जा सकता है; यदि टाइमआउट होता है, तोबाधित करनात्रुटि की सूचना दी जाएगी।
onerror() यह एक असामान्य निकास समारोह है, इसके अधिकतम निष्पादन समय 5 मिनट है, जो अघोषित छोड़ दिया जा सकता है।Pythonऔरcppइस फ़ंक्शन का समर्थन नहीं करते.
init() यह एक आरंभिकरण समारोह है, इसकी रणनीति कार्यक्रम स्वचालित रूप से कहा जाएगा जब यह चल रहा है शुरू होता है, जो undeclared छोड़ दिया जा सकता है.
  • विवरण:
    1. बैकटेस्ट प्रणाली फ़ंक्शन का समर्थन नहीं करती हैonerror().
    1. यदि फलनonerror()बॉट में ट्रिगर किया जाता है, समारोहonexit()ट्रिगर नहीं किया जाएगा।

onexit ((()

onexit(), प्रसंस्करण सफाई कार्य, अधिकतम 5 मिनट के निष्पादन समय के साथ, जो उपयोगकर्ता द्वारा महसूस किया जाता है।

function main(){
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)
}

// onexit function implementation
function onexit(){
    var beginTime = new Date().getTime()
    while(true){
        var nowTime = new Date().getTime()
        Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
        Sleep(1000)
    }
}
import time 
def main():
    Log("Start running, stop after 5 seconds, and execute onexit function!")
    Sleep(1000 * 5)

def onexit():
    beginTime = time.time() * 1000
    while True:
        ts = time.time() * 1000
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
        Sleep(1000)
void main() {
    Log("Start running, stop after 5 seconds, and execute onexit function!");
    Sleep(1000 * 5);
}

void onexit() {
    auto beginTime = Unix() * 1000;
    while(true) {
        auto ts = Unix() * 1000;
        Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
        Sleep(1000);
    }
}

आरंभ करना

उपयोगकर्ता आरंभिकरण फ़ंक्शन को लागू करता हैinit(), जो स्वचालित रूप से कार्य निष्पादित करेगाinit()प्रारंभ कार्य को पूरा करने के लिए रणनीति की शुरुआत में।

function main(){
    Log("The first line of the code executed in the program!", "#FF0000")
    Log("Exit!")
}

// Initialization Function
function init(){     
    Log("Initialization!")
}
def main():
    Log("The first line of the code is executed!", "#FF0000")
    Log("Exit!")

def init():
    Log("Initialization!")
void main() {
    Log("The first line of the code is executed!", "#FF0000");
    Log("Exit!");
}

void init() {
    Log("Initialization!");
}

त्रुटि()

कार्य का निष्पादनonerror()जब कोई अपवाद होता है, तो ट्रिगर किया जाएगा। यह फ़ंक्शन में लिखी गई रणनीतियों का समर्थन नहीं करता हैPythonऔरcpp.

function main() {
    var arr = []
    Log(arr[6].Close)
}

function onerror() {
    Log("error")
}
# not supported by python 
// not supported by C++ 

क्लासिक रणनीतिक ढांचा

में लिखी गई रणनीतियों मेंJavaScript, Pythonऔरcpp,Sleep()function को उन रणनीतियों के मुख्य लूप में बुलाया जाना चाहिए। इसका उपयोग बैकट्रैकिंग गति को नियंत्रित करने के लिए किया जाएगा। बॉट में, इसका उपयोग रणनीति पोलिंग अंतराल को नियंत्रित करने के लिए किया जाता है, और एक्सचेंज के एपीआई इंटरफ़ेस तक पहुंचने की अनुरोध आवृत्ति को भी नियंत्रित करता है।

  • क्रिप्टोक्यूरेंसी रणनीतियों के बुनियादी ढांचे के उदाहरणः

    function onTick(){
        //Write strategy logic here, and it will be called constantly, such as printing market information
        Log(exchange.GetTicker())
    }
    
    function main(){
        while(true){
            onTick()
            //The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently 
            Sleep(60000)
        }
    }
    
    def onTick():
        Log(exchange.GetTicker())
    
    def main():
        while True:
            onTick()
            Sleep(60000)
    
    void onTick() {
        Log(exchange.GetTicker());
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(60000);
        }
    }
    

    सबसे सरल उदाहरण ले लो, अगर मैं एक खरीद आदेश 100 की कीमत के साथ और एक्सचेंज पर 1 की मात्रा में हर दूसरे जगह करना चाहते हैं, मैं इसे इस तरह लिख सकते हैंः

    function onTick(){
        // It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
        exchange. Buy(100, 1)
    }
    
    function main(){
        while(true){
            onTick()
            // The pause period can be customized in millisecond (1 second = 1000 milliseconds)
            Sleep(1000)
        }
    }
    
    def onTick():
        exchange.Buy(100, 1)
    
    def main():
        while True:
            onTick()
            Sleep(1000)
    
    void onTick() {
        exchange.Buy(100, 1);
    }
    
    void main() {
        while(true) {
            onTick();
            Sleep(1000);
        }
    }
    

टेम्पलेट लाइब्रेरी

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

टेम्पलेट लाइब्रेरी मेंJavaScript:

img

टेम्पलेट लाइब्रेरी मेंPython:

img

टेम्पलेट लाइब्रेरी मेंcpp:

img

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

    /*
    -- This method is called directly with $.Test() after the strategy refers to the template
    -- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
    */
    $.Test = function() {
        Log('Test')
    }
    
    function main() {
        $.Test()
    }
    
    def Test():
        Log("template call")
    
    # Export "Test" function; the main strategy can be called by ext.Test()
    ext.Test = Test 
    
    // The strategy refers to the template and calls this method directly with ext::Test()
    void Test() {
        Log("template call");
    }
    
  • टेम्पलेट लाइब्रेरी पैरामीटर टेम्पलेट लाइब्रेरी अपने स्वयं के इंटरफ़ेस पैरामीटर भी सेट कर सकती है, जिनका उपयोग टेम्पलेट लाइब्रेरी के कोड में वैश्विक चर के रूप में किया जाता है।

    टेम्पलेट लाइब्रेरी पैरामीटर सेटिंग्सः

    img

    टेम्पलेट लाइब्रेरी कोडः

    $.SetParam1 = function(p1) {
        param1 = p1
    }
    
    $.GetParam1 = function() {
        Log("param1:", param1)
        return param1
    }
    
    def SetParam1(p1):
        global param1
        param1 = p1
    
    def GetParam1():
        Log("param1:", param1)
        return param1
    
    ext.SetParam1 = SetParam1
    ext.GetParam1 = GetParam1
    
    void SetParam1(float p1) {
        param1 = p1;
    }
    
    float GetParam1() {
        Log("param1:", param1);
        return param1;
    }
    

    संदर्भ में रणनीति कोड देखेंटेम्पलेट लाइब्रेरीउपरोक्त उदाहरण:

    function main () {
        Log("call $.GetParam1:", $.GetParam1())
        Log("call $.SetParam1:", "#FF0000")
        $.SetParam1(20)
        Log("call $.GetParam1:", $.GetParam1())
    }
    
    def main():
        Log("call ext.GetParam1:", ext.GetParam1())
        Log("call ext.SetParam1:", "#FF0000")
        ext.SetParam1(20)
        Log("call ext.GetParam1:", ext.GetParam1())
    
    void main() {
        Log("call ext::GetParam1:", ext::GetParam1());
        Log("call ext::SetParam1:", "#FF0000");
        ext::SetParam1(20);
        Log("call ext::GetParam1:", ext::GetParam1());
    }
    

    img

  • उद्धरण टेम्पलेट लाइब्रेरी

    रणनीति संपादन पृष्ठ के टेम्पलेट स्तंभ में संदर्भ की जाँच करने के बाद, रणनीति को सहेजें.

    img

अंतर्निहित संरचना

वैश्विक चर

विनिमय

Exchangeएक्सचेंज ऑब्जेक्ट के रूप में माना जा सकता है। डिफ़ॉल्ट रूप से, इसे रणनीति मापदंडों में जोड़ा गया पहला एक्सचेंज ऑब्जेक्ट माना जाता है। एक्सचेंज के साथ सभी डेटा बातचीत इस ऑब्जेक्ट में कार्यों के माध्यम से महसूस की जाती है।

  • Backtest में एक्सचेंज ऑब्जेक्ट जोड़ना

  • Bot पृष्ठ पर एक्सचेंज ऑब्जेक्ट जोड़ना

जोड़े गए विनिमय वस्तुएंexchangeकोड में वस्तुएंः

function main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
    Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
आदान-प्रदान

यह एक सरणी के रूप में समझा जा सकता है जो सभी विनिमय वस्तुओं को संग्रहीत करता है जैसेexchangeएक्सचेंज ऑब्जेक्ट, जिसमें कई एक्सचेंज ऑब्जेक्ट हो सकते हैं;exchanges[0]हैexchange.

जोड़े गए विनिमय वस्तुओं के अनुरूपexchanges[0], exchanges[1], exchanges[2]... और इसी तरह रणनीति कोड में।

function main() {
    for(var i = 0; i < exchanges.length; i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
    }
}
def main():
    for i in range(len(exchanges)):
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
    for(int i = 0; i < exchanges.size(); i++) {
        Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
    }
}
आदेश की स्थिति

विशेषताStatusमेंOrder structure.

निरंतर नाम परिभाषा मूल्य
ORDER_STATE_PENDING अधूरा 0
ORDER_STATE_CLOSED समाप्त 1
ORDER_STATE_CANCELED निरस्त 2
ORDER_STATE_UNKNOWN अज्ञात अवस्था (अन्य अवस्थाएं) 3

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

ऑर्डर लेनदेन का प्रकार

विशेषताTypeमेंOrder structure.

निरंतर नाम परिभाषा मूल्य
ORDER_TYPE_BUY क्रय आदेश 0
ORDER_TYPE_SELL बेचने का आदेश 1
स्थिति का प्रकार

विशेषताTypeमेंPosition structure.

निरंतर नाम परिभाषा विवरण लागू मूल्य
PD_LONG लंबी स्थिति क्रिप्टोकरेंसी वायदा उपयोगexchange.SetDirection("closebuy")बंद स्थिति दिशा सेट करने के लिए, और पदों के इस प्रकार को बंद क्रिप्टोकरेंसी वायदा 0
पीडी_शॉर्ट लघु स्थिति क्रिप्टोकरेंसी वायदा उपयोगexchange.SetDirection("closesell")बंद स्थिति दिशा सेट करने के लिए, और पदों के इस प्रकार को बंद क्रिप्टोकरेंसी वायदा 1
फ्यूचर्स खुलने और बंद होने की स्थिति की दिशाएं

विशेषताOffsetमेंOrder structure.

निरंतर नाम परिभाषा मूल्य
ORDER_OFFSET_OPEN खुले पद के आदेश 0
ORDER_OFFSET_CLOSE क्लोज पोजीशन ऑर्डर 1
रणनीति पैरामीटर

ट्रेडिंग रणनीति कोड में, रणनीति इंटरफेस पर निर्धारित रणनीति मापदंडों को वैश्विक चर के रूप में दर्शाया गया है।JavaScriptभाषा सीधे रणनीति इंटरफ़ेस पर सेट या संशोधित पैरामीटर मूल्यों का उपयोग कर सकते हैं; जबकि मेंPythonरणनीतियों, कीवर्डglobalरणनीति में समग्र चर को संशोधित करने के लिए आवश्यक है।

पैरामीटर प्रकारः

img

चर विवरण टिप्पणी प्रकार डिफ़ॉल्ट मान विवरण
संख्या संख्यात्मक प्रकार टिप्पणी संख्या (संख्या) 1 C++ रणनीति एक फ्लोटिंग-पॉइंट प्रकार है
स्ट्रिंग स्ट्रिंग टिप्पणी स्ट्रिंग (स्ट्रिंग) हैलो एफएमजेड डिफ़ॉल्ट मान को उद्धृत करने की आवश्यकता नहीं है. इनपुट को स्ट्रिंग के रूप में माना जाता है
कंबाक्स कॉम्बोबॉक्स टिप्पणी ComboBox (चयनित) 1|2|3 कॉम्बोबॉक्स चर स्वयं एक संख्यात्मक मान है, जो कॉम्बोबॉक्स नियंत्रण द्वारा चयनित स्तंभ के सूचकांक का प्रतिनिधित्व करता है। पहला कॉम्बोबॉक्स का मान 1 है, और अन्य 0 है, और इसी तरह
बोल जाँच विकल्प टिप्पणी बुलियन (सही/गलत) सच यदि जाँच की जाती है, तो चर bool सही है; यदि जाँच नहीं की जाती है, तो चर bool गलत है
गुप्त स्ट्रिंग एन्क्रिप्टेड स्ट्रिंग टिप्पणी एन्क्रिप्टेड स्ट्रिंग (स्ट्रिंग) पासवर्ड एक स्ट्रिंग के समान उपयोग के साथ, एन्क्रिप्टेड स्ट्रिंग एन्क्रिप्शन द्वारा भेजी जाएगी और सादे पाठ में प्रेषित नहीं की जाएगी
  • इंटरफेस पैरामीटर रणनीति संपादन पृष्ठ के कोड संपादन अनुभाग के नीचे रणनीति पैरामीटर अनुभाग में सेट किए जाते हैं।
  • इंटरफेस पैरामीटर रणनीति कोड में वैश्विक चर के रूप में मौजूद हैं, अर्थात, इंटरफ़ेस पैरामीटर को कोड में संशोधित किया जा सकता है।
  • रणनीति कोड में इंटरफ़ेस मापदंडों के चर नाम (ऊपर दिए गए रूप में देखे गए):number, string, combox, bool, secretString.
  • वर्णन विकल्पः रणनीति इंटरफ़ेस पर इंटरफ़ेस मापदंडों के नाम।
  • टिप्पणी विकल्पः इंटरफ़ेस पैरामीटर का विस्तृत विवरण; जब माउस इंटरफ़ेस पैरामीटर पर होवर करता है तो विवरण प्रदर्शित किया जाएगा।
  • प्रकार विकल्पः इंटरफ़ेस पैरामीटर का प्रकार।
  • डिफ़ॉल्ट मान विकल्पः इंटरफ़ेस पैरामीटर के डिफ़ॉल्ट मान।

पैरामीटर निर्भरता सेटिंग्सः एक पैरामीटर सेट किया जा सकता है एक और पैरामीटर प्रदर्शित करने और पैरामीटर के चयन के आधार पर छिपा दिया जा करने के लिए अनुमति देने के लिए. उदाहरण के लिए, हम पैरामीटर सेटnumberA, जो एक संख्यात्मक प्रकार है। हम चलोnumberAप्रदर्शित या छिपाया जा सकता है पर निर्भर करता है कि पैरामीटरisShowA(बुलियन प्रकार) सच या गलत है. हम चर सेट करने की जरूरत हैnumberAइंटरफेस पैरामीटर परःnumberA@isShowA.

img

इस तरह, यदि पैरामीटरisShowAजाँच नहीं की जाती है, पैरामीटरnumberAComboBox नियंत्रण प्रकार के मापदंडों के लिए के रूप में, मापदंडों के आश्रित भाग का न्याय करने के लिए है कि क्या मापदंड मूल्य के बराबर हैसूचकांक मूल्यकॉम्बोबॉक्स में कुछ विकल्प का. उसी तरह, पैरामीटर लेisShowAएक उदाहरण के रूप में. जब पैरामीटर में चर सेट, लिखेंःnumberA@combox==2. पैरामीटरnumberAप्रदर्शित करेगा या छिपा, पर निर्भर करता है कि पैरामीटरcomboxतीसरे विकल्प के रूप में जाँच की जाएगी (जहां सूचकांक 0 पहले विकल्प के अनुरूप है, सूचकांक 1 दूसरे के अनुरूप है, और सूचकांक 2 तीसरे के अनुरूप है) ।

टेम्पलेट पर रणनीति इंटरफ़ेस पैरामीटर, इंटरैक्टिव नियंत्रण, और पैरामीटर समूहीकरण फ़ंक्शनः बस जोड़ें(?First group)निम्नलिखित चित्र में दिखाए गए अनुसार, समूह को शुरू करने वाले पैरामीटर के वर्णन की शुरुआत मेंः

img

जब आप रणनीति का उपयोग कर रहे हैं, तो पैरामीटर समूहों में प्रदर्शित होते हैंः

img

पैरामीटर डिफ़ॉल्ट मान सहेजेंः रणनीति पैरामीटर चित्र में दिखाए गए हैं। बैकटेस्ट के दौरान, यदि आप रणनीति पैरामीटर के डिफ़ॉल्ट मानों को सहेजना चाहते हैं, तो आप क्लिक कर सकते हैंSave settingsरणनीति मापदंडों को संशोधित करने के बाद बटन.

img

img

आप रणनीति पैरामीटर सेटिंग्स को कोड के रूप में सहेज सकते हैंः

/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/

डेटा संरचना

कुछ कार्यों के साथ मूलJSONकॉल के दौरान अनुरोधित डेटा।JSONडेटा विशेषता में संग्रहीत हैInfoवापस आइटम के बाद से बैकटेस्ट एक मंच इंटरफ़ेस का उपयोग करने के लिए नहीं है, बैकटेस्ट के दौरान लौटाया डेटा कोई विशेषता हैInfoनिम्नलिखित प्रत्येक डेटा संरचना के मुख्य गुणों का वर्णन है।

व्यापार

फ़ंक्शन द्वारा लौटाए गए सभी ट्रेडिंग इतिहास (स्वयं नहीं) प्राप्त करेंexchange.GetTrades().

{
    Id      : 9585306,          // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in 
    Time    : 1567736576000,    // Time (Unix timestamp milliseconds)
    Price   : 1000,             // Price
    Amount  : 1,                // Volume
    Type    : 0                 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
टिकर

बाजार उद्धरण फ़ंक्शन द्वारा लौटाए जाते हैंexchange.GetTicker().

{
    Info    : {...},             // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    High    : 1000,              // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in 
    Low     : 500,               // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in 
    Sell    : 900,               // Sell price 1
    Buy     : 899,               // Buy price 1 
    Last    : 900,               // Last executed price
    Volume  : 10000000,          // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency  
    Time    : 1567736576000      // Millisecond-level timestamp
}
रिकॉर्ड

मानकOHLCसंरचना का उपयोग के-लाइन और प्रक्रिया संकेतक गणना और विश्लेषण को आकर्षित करने के लिए किया जाता है।exchange.GetRecords()संरचना सरणी लौटाता है. प्रत्येकRecordसंरचना एक k-लाइन बार का प्रतिनिधित्व करती है, अर्थात् एक k-लाइनBAR.TimeमेंRecordके-लाइन बार अवधि का आरंभ समय है।

{
    Time    : 1567736576000,     // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
    Open    : 1000,              // Open price
    High    : 1500,              // Highest price
    Low     : 900,               // Lowest price
    Close   : 1200,              // Close price 
    Volume  : 1000000            // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
आदेश

आदेश संरचना सहित कार्यों द्वारा लौटाया जा सकता है,exchange.GetOrder()औरexchange.GetOrders(). कार्यexchange.GetOrders()परत सरणी या संरचना की एक खाली सरणी (यदि कोई नहीं हैवर्तमान अधूरा आदेश, लौटाना[], अर्थात्, एक खाली सरणी) ।

{
    Info        : {...},         // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
    Id          : 123456,        // Unique ide