संसाधन लोड हो रहा है... लोड करना...

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

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

बैकटेस्ट सिस्टम मॉडल

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

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

बैकटेस्टिंग सिस्टम तंत्र का वर्णन

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

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

बॉट स्तर की टिकऔरसिमुलेशन स्तर की टिकमोड, बैकटेस्ट प्रणाली के लेनदेन मिलान तंत्रः ऑर्डर लेनदेन मिलान देखी गई कीमत के अनुसार किया जाता है और पूरी मात्रा में कारोबार किया जाता है। इसलिए, आंशिक लेनदेन के परिदृश्य का बैकटेस्ट प्रणाली में परीक्षण नहीं किया जा सकता है।

बैकटेस्टिंग प्रणाली कई प्रोग्रामिंग भाषाओं का समर्थन करती है

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

यह समर्थन करता हैजावास्क्रिप्टक्रोम DevTools में रणनीति बैकटेस्टिंग डिबगिंग,कृपया देखें.

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

  • क्रिप्टोकरेंसी क्रिप्टोकरेंसी के लिए प्रमुख स्पॉट और फ्यूचर्स एक्सचेंजों; सभी प्रकार के एक्सचेंजों पर डेटा का समर्थन करता है।
  • फूटू प्रतिभूतियाँ हांगकांग के शेयर, अमेरिकी शेयर और अन्य बाजार।

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

एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म के बैकटेस्ट सिस्टम का पैरामीटर अनुकूलन कार्य बैकटेस्टिंग के दौरान प्रत्येक पैरामीटर अनुकूलन विकल्प के अनुसार पैरामीटर संयोजन सेट करना है।अनुकूलनअनुकूलन सेटिंग्स प्रदर्शित करने के लिए रणनीति पैरामीटर के दाईं ओर विकल्प।

  • न्यूनतम मानः मापदंडों के प्रारंभिक मूल्य को सीमित करने के लिए।
  • अधिकतम मानः क्रमिक परिवर्तनों के बाद मापदंडों के अधिकतम मान को सीमित करने के लिए।
  • चरण का आकारः मापदंडों की वृद्धिशील चर राशि।
  • समवर्ती धागे: पैरामीटर अनुकूलन के दौरान, प्रत्येक बैकटेस्ट पैरामीटर संयोजन के समवर्ती निष्पादन के लिए धागे की संख्या सेट करें. यह विकल्प केवल में रणनीति पैरामीटर अनुकूलन का समर्थन करता हैJavaScript, PINE, औरMy Language, और टेम्पलेट्स पर पैरामीटर अनुकूलन का समर्थन नहीं करता है।

पैरामीटर संयोजनों के आधार पर उत्पन्न होते हैंminimum, maximum, औरstep sizeसेटिंग्स. बैकटेस्टिंग प्रणाली बैकटेस्टिंग के लिए इन पैरामीटर संयोजनों के माध्यम से पुनरावृत्ति करती है (यानी, प्रत्येक पैरामीटर संयोजन को एक बार बैकटेस्ट करना) ।संख्याप्रकार का बैकटेस्टिंग प्रणाली में अनुकूलित किया जा सकता है।

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

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

    1. आप बैकटेस्ट सेटिंग्स सहेजें बटन का उपयोग कर सकते हैंरणनीति संपादन पृष्ठसभी बैकटेस्ट कॉन्फ़िगरेशन जानकारी (बैकटेस्ट सेटिंग्स और रणनीति पैरामीटर सेटिंग्स सहित) को कोड के रूप में रणनीति स्रोत कोड में रिकॉर्ड करने के लिए।
    1. जब आप रणनीति संपादन पृष्ठ पर Save Strategy बटन पर क्लिक करके रणनीति सहेजते हैं, तो प्लेटफ़ॉर्म स्वचालित रूप से वर्तमान बैकटेस्ट सेटिंग्स, रणनीति पैरामीटर कॉन्फ़िगरेशन और अन्य जानकारी रिकॉर्ड करेगा. बैकटेस्ट कॉन्फ़िगरेशन को बैकटेस्ट सिस्टम में कैसे लोड करें?
    1. रणनीति संपादन पृष्ठ को ताज़ा करते समय या इस रणनीति संपादन पृष्ठ को फिर से खोलते समय, Save Backtest Settings बटन द्वारा दर्ज की गई बैकटेस्ट कॉन्फ़िगरेशन जानकारी स्वचालित रूप से पहले लोड की जाएगी.
    1. यदि कोई बैकटेस्ट कॉन्फ़िगरेशन जानकारी वर्तमान रणनीति कोड में टिप्पणी के रूप में दर्ज नहीं हैbacktestSave Backtest Settings बटन के माध्यम से रणनीति कोड में सहेजा जाता है), बैकटेस्ट सिस्टम स्वचालित रूप से बैकटेस्ट सेटिंग्स को बैकटेस्ट कॉन्फ़िगरेशन जानकारी के अनुसार कॉन्फ़िगर करता है जब Save Strategy बटन को वर्तमान रणनीति के लिए अंतिम बार क्लिक किया गया था।
    1. यदि रणनीति कोड की शुरुआत में टिप्पणियों के रूप में दर्ज बैकटेस्ट कॉन्फ़िगरेशन जानकारी रणनीति संपादन पृष्ठ पर संशोधित है, तो आपको वर्तमान में अद्यतन बैकटेस्ट कॉन्फ़िगरेशन जानकारी को रणनीति बैकटेस्ट इंटरफ़ेस विकल्प में सिंक्रनाइज़ करने की आवश्यकता है. आप बटन पर क्लिक कर सकते हैं Backtest Settingsbacktestरणनीति संपादन के क्षेत्र में।
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

बैकटेस्ट सेटिंग्स सहेजें पर क्लिक करें, वहाँ पर मामूली प्रारूप अंतर हैंJavaScript/Python/C++/MyLanguage/PINEरणनीति कोड में बैकटेस्ट सेटिंग्स सहेजते समय भाषाएँः MyLanguage:

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

पाइन भाषा:

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

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

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

पैरामीटर अर्थ स्पष्टीकरण
चिह्न प्रतीक का नाम स्पॉट बाजार के आंकड़े, जैसेःBTC_USDT, वायदा बाजार के आंकड़े, जैसेःBTC_USDT.swap, वायदा दीर्घकालिक अनुबंध वित्तपोषण दर डेटा, जैसेःBTC_USDT.funding, वायदा दीर्घकालिक अनुबंध मूल्य सूचकांक डेटा, जैसेःBTC_USDT.index
ईद आदान-प्रदान जैसे कि OKX, Futures_OKX
गोल डेटा की सटीकता सच का अर्थ है कि कस्टम डेटा स्रोत द्वारा वापस खिलाए गए डेटा में विशिष्ट परिशुद्धता को परिभाषित किया गया है। FMZ क्वांट ट्रेडिंग प्लेटफॉर्म बैकटेस्टिंग सिस्टम द्वारा कस्टम डेटा स्रोत को भेजे गए अनुरोध को इस प्रकार तय किया गया हैःround=true
अवधि के-लाइन डेटा अवधि (मिलीसेकंड) जैसे:60000एक मिनट की अवधि है
गहराई गहराई के स्तर 1-20
व्यापार डेटा को विभाजित करने की आवश्यकता है या नहीं true(1) / false(0)
से प्रारंभ समय यूनिक्स टाइमस्टैम्प
तक अंत का समय यूनिक्स टाइमस्टैम्प
विवरण प्रतीक विवरण के लिए अनुरोधित डेटा सच का अर्थ है कि इसे कस्टम डेटा स्रोत द्वारा प्रदान करने की आवश्यकता है. FMZ क्वांट ट्रेडिंग प्लेटफॉर्म बैकटेस्टिंग सिस्टम द्वारा कस्टम डेटा स्रोत को भेजे गए अनुरोध को इस प्रकार तय किया गया हैःdetail=true
कस्टम इस पैरामीटर को अनदेखा किया जा सकता है

जब स्पॉट एक्सचेंज और फ्यूचर्स एक्सचेंज ऑब्जेक्ट्स का डेटा स्रोत एक कस्टम डेटा स्रोत (फीडर) पर सेट किया जाता है, तो बैकटेस्टिंग सिस्टम कस्टम डेटा स्रोत सेवा को अनुरोध भेजता हैः

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Bitget&from=1351641600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_OKX&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=1

डेटा प्रारूप

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

  • सिमुलेशन स्तर टिक, निम्नलिखित JSON डेटा का एक उदाहरण है:

    {
        "detail": {
            "eid": "Binance",
            "symbol": "BTC_USDT",
            "alias": "BTCUSDT",
            "baseCurrency": "BTC",
            "quoteCurrency": "USDT",
            "marginCurrency": "USDT",
            "basePrecision": 5,
            "quotePrecision": 2,
            "minQty": 0.00001,
            "maxQty": 9000,
            "minNotional": 5,
            "maxNotional": 9000000,
            "priceTick": 0.01,
            "volumeTick": 0.00001,
            "marginLevel": 10
        },
        "schema":["time", "open", "high", "low", "close", "vol"],
        "data":[
            [1564315200000, 9531300, 9531300, 9497060, 9497060, 787],
            [1564316100000, 9495160, 9495160, 9474260, 9489460, 338]
        ]
    }
    
  • बॉट स्तर टिक, निम्नलिखित JSON डेटा का एक उदाहरण है: टिक-लेवल बैकटेस्ट डेटा (बाजार की गहराई के बारे में जानकारी शामिल है, और गहराई प्रारूप एक सरणी है[price, volume]इसमें गहराई के कई स्तर हो सकते हैं,asksमूल्य वृद्धि क्रम के लिए,bidsमूल्य घटते क्रम के लिए) ।

    {
        "detail": {
            "eid": "Binance",
            "symbol": "BTC_USDT",
            "alias": "BTCUSDT",
            "baseCurrency": "BTC",
            "quoteCurrency": "USDT",
            "marginCurrency": "USDT",
            "basePrecision": 5,
            "quotePrecision": 2,
            "minQty": 0.00001,
            "maxQty": 9000,
            "minNotional": 5,
            "maxNotional": 9000000,
            "priceTick": 0.01,
            "volumeTick": 0.00001,
            "marginLevel": 10
        },
        "schema":["time", "asks", "bids", "trades", "close", "vol"],
        "data":[
            [1564315200000, [[9531300, 10]], [[9531300, 10]], [[1564315200000, 0, 9531300, 10]], 9497060, 787],
            [1564316100000, [[9531300, 10]], [[9531300, 10]], [[1564316100000, 0, 9531300, 10]], 9497060, 787]
        ]
    }
    
क्षेत्र विवरण
विवरण अनुरोधित डेटा प्रकार की विस्तृत जानकारी,

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

विवरण क्षेत्र

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

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

विशेष स्तंभ विशेषताएंasks, bids, trades:

क्षेत्र विवरण टिप्पणी
पूछता है / बोली लगाता है [मूल्य, मात्रा],...] उदाहरण के लिए,

Live Trading Level Tickडेटा उदाहरणः[[9531300, 10]]∙ ट्रेडों के लिए। उदाहरण के लिए,Live Trading Level Tickडेटा उदाहरणः[[1564315200000, 0, 9531300, 10]] |

फ्यूचर्स एक्सचेंजों पर स्थायी अनुबंधों का बैकटेस्ट करते समय, कस्टम डेटा स्रोतों को भी अतिरिक्त वित्तपोषण दर और मूल्य डेटा की आवश्यकता होती है बैकटेस्टिंग प्रणाली अनुरोधों को भेजना जारी रखेगी वित्तपोषण दरों के लिए केवल जब अनुरोधित बाजार डेटा लौटाया जाता है और लौटाया संरचना में विवरण क्षेत्र में शामिल है"contractType": "swap"कुंजी-मूल्य जोड़ी।

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

वित्तपोषण दर डेटा संरचना इस प्रकार है:

{
    "detail": {
        "eid": "Futures_Binance",
        "symbol": "BTC_USDT.funding",
        "alias": "BTC_USDT.funding",
        "baseCurrency": "BTC",
        "quoteCurrency": "USDT",
        "marginCurrency": "",
        "basePrecision": 8,
        "quotePrecision": 8,
        "minQty": 1,
        "maxQty": 10000,
        "minNotional": 1,
        "maxNotional": 100000000,
        "priceTick": 1e-8,
        "volumeTick": 1e-8,
        "marginLevel": 10
    },
    "schema": [
        "time",
        "open",
        "high",
        "low",
        "close",
        "vol"
    ],
    "data": [
        [
            1584921600000,
            -16795,
            -16795,
            -16795,
            -16795,
            0
        ],
        [
            1584950400000,
            -16294,
            -16294,
            -16294,
            -16294,
            0
        ]
        // ...
    ]
}
  • समीपवर्ती अवधियों के बीच का अंतराल 8 घंटे है
  • उदाहरण के लिए, बिनेंस की फंडिंग दर हर 8 घंटे में अपडेट की जाती है। क्या वित्तपोषण दर का आंकड़ा -16795 है? क्योंकि के-लाइन डेटा की तरह, नेटवर्क ट्रांसमिशन के दौरान फ्लोटिंग पॉइंट सटीकता के नुकसान से बचने के लिए, डेटा पूर्णांक प्रकार का उपयोग करता है; वित्तपोषण दर डेटा भी नकारात्मक हो सकता है।

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

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.funding&to=1611244800&trades=0

मूल्य सूचकांक डेटा संरचना इस प्रकार है:


{
    "detail": {
        "eid": "Futures_Binance",
        "symbol": "BTC_USDT.index",
        "alias": "BTCUSDT",
        "baseCurrency": "BTC",
        "quoteCurrency": "USDT",
        "contractType": "index",
        "marginCurrency": "USDT",
        "basePrecision": 3,
        "quotePrecision": 1,
        "minQty": 0.001,
        "maxQty": 1000,
        "minNotional": 0,
        "maxNotional": 1.7976931348623157e+308,
        "priceTick": 0.1,
        "volumeTick": 0.001,
        "marginLevel": 10,
        "volumeMultiple": 1
    },
    "schema": [
        "time",
        "open",
        "high",
        "low",
        "close",
        "vol"
    ],
    "data": [
        [1584921600000, 58172, 59167, 56902, 58962, 0],
        [1584922500000, 58975, 59428, 58581, 59154, 0],
        // ...
    ]
}

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

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.index&to=1611244800&trades=0

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

डेटा स्रोत पता निर्दिष्ट करें, उदाहरण के लिए,http://120.24.2.20:9090/data. कस्टम डेटा स्रोत सेवा कार्यक्रम का उपयोग कर लिखा गया हैGolang:

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

    // request: GET http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=OKX&from=1584921600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
    //              http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1599958800&period=3600000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=0
    fmt.Println("request:", r)

    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "detail": {
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10
            },
            "schema": [
                "time",
                "open",
                "high",
                "low",
                "close",
                "vol"
            ],
            "data": [
                [1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151],
                [1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738],
                [1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875],
                [1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777],
                [1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292],
                [1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666],
                [1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405],
                [1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768],
                [1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797],
                [1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692]
            ]
        }
        */
        
        // /* Simulation level Tick
        ret := map[string]interface{}{
            "detail": map[string]interface{}{
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10,
            },
            "schema": []string{"time","open","high","low","close","vol"},
            "data": []interface{}{
                []int64{1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151},  // 1610755200000 : 2021-01-16 08:00:00
                []int64{1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738},  // 1610841600000 : 2021-01-17 08:00:00
                []int64{1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875},
                []int64{1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777},
                []int64{1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292},
                []int64{1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666},
                []int64{1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405},
                []int64{1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768},
                []int64{1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797},
                []int64{1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692},
            },
        }
        // */

        /* Bot level Tick
        ret := map[string]interface{}{
            "detail": map[string]interface{}{
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10,
            },
            "schema": []string{"time", "asks", "bids", "trades", "close", "vol"},
            "data": []interface{}{
                []interface{}{1610755200000, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{1610755200000, 0, 9531300, 10}}, 9497060, 787},
                []interface{}{1610841600000, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{1610841600000, 0, 9531300, 11}}, 9497061, 789},                
            },
        }
        */

        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: 2021-01-16 08:00:00
end: 2021-01-22 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
args: [["number",2]]
*/

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

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

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

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

  • रणनीति संपादन पृष्ठ और बैकटेस्टिंग पृष्ठ के बीच स्विच करने के लिए शॉर्टकट कुंजी कुंजी का प्रयोग करेंCtrl +,Backtest पेज और Edit Strategy पेज पर वापस स्विच करने के लिए. कुंजी के बादCtrl, कुंजी दबाएँ,.

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

  • रणनीति बैकटेस्ट शुरू करने के लिए शॉर्टकट कुंजी का प्रयोग करेंCtrl + bStart Backtest सक्षम करने के लिए।

बैकटेस्ट डेटा डाउनलोड करें

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

बैकटेस्टिंग प्रणाली में शार्प एल्गोरिथ्म

बैकटेस्टिंग प्रणाली में शार्प एल्गोरिथ्म का स्रोत कोडः

function returnAnalyze(totalAssets, profits, ts, te, period, yearDays) {
    // force by days
    period = 86400000
    if (profits.length == 0) {
        return null
    }
    var freeProfit = 0.03 // 0.04
    var yearRange = yearDays * 86400000
    var totalReturns = profits[profits.length - 1][1] / totalAssets
    var annualizedReturns = (totalReturns * yearRange) / (te - ts)

    // MaxDrawDown
    var maxDrawdown = 0
    var maxAssets = totalAssets
    var maxAssetsTime = 0
    var maxDrawdownTime = 0
    var maxDrawdownStartTime = 0
    var winningRate = 0
    var winningResult = 0
    for (var i = 0; i < profits.length; i++) {
        if (i == 0) {
            if (profits[i][1] > 0) {
                winningResult++
            }
        } else {
            if (profits[i][1] > profits[i - 1][1]) {
                winningResult++
            }
        }
        if ((profits[i][1] + totalAssets) > maxAssets) {
            maxAssets = profits[i][1] + totalAssets
            maxAssetsTime = profits[i][0]
        }
        if (maxAssets > 0) {
            var drawDown = 1 - (profits[i][1] + totalAssets) / maxAssets
            if (drawDown > maxDrawdown) {
                maxDrawdown = drawDown
                maxDrawdownTime = profits[i][0]
                maxDrawdownStartTime = maxAssetsTime
            }
        }
    }
    if (profits.length > 0) {
        winningRate = winningResult / profits.length
    }
    // trim profits
    var i = 0
    var datas = []
    var sum = 0
    var preProfit = 0
    var perRatio = 0
    var rangeEnd = te
    if ((te - ts) % period > 0) {
        rangeEnd = (parseInt(te / period) + 1) * period
    }
    for (var n = ts; n < rangeEnd; n += period) {
        var dayProfit = 0.0
        var cut = n + period
        while (i < profits.length && profits[i][0] < cut) {
            dayProfit += (profits[i][1] - preProfit)
            preProfit = profits[i][1]
            i++
        }
        perRatio = ((dayProfit / totalAssets) * yearRange) / period
        sum += perRatio
        datas.push(perRatio)
    }

    var sharpeRatio = 0
    var volatility = 0
    if (datas.length > 0) {
        var avg = sum / datas.length;
        var std = 0;
        for (i = 0; i < datas.length; i++) {
            std += Math.pow(datas[i] - avg, 2);
        }
        volatility = Math.sqrt(std / datas.length);
        if (volatility !== 0) {
            sharpeRatio = (annualizedReturns - freeProfit) / volatility
        }
    }

    return {
        totalAssets: totalAssets,
        yearDays: yearDays,
        totalReturns: totalReturns,
        annualizedReturns: annualizedReturns,
        sharpeRatio: sharpeRatio,
        volatility: volatility,
        maxDrawdown: maxDrawdown,
        maxDrawdownTime: maxDrawdownTime,
        maxAssetsTime: maxAssetsTime,
        maxDrawdownStartTime: maxDrawdownStartTime,
        winningRate: winningRate
    }
}
रणनीति संपादक रणनीति प्रविष्टि कार्य