एफएमजेड क्वांट प्लेटफॉर्म के लिए प्राथमिक ट्यूटोरियल रणनीति लेखन

लेखक:निनाबादास, बनाया गयाः 2022-03-18 09:00:46, अद्यतन किया गयाः 2022-04-02 11:48:15

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

पुराने संस्करण ट्यूटोरियलःFMZ क्वांट (FMZ.COM) रणनीति लेखन मैनुअल 2.0 (ट्यूटोरियल)ट्यूटोरियल में कई पोस्ट इंडेक्स हैं, जिन्हें पढ़ने की सलाह दी जाती है।

रणनीति लेखन पर प्रारंभिक निर्देश

एपीआई परिचय

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

वर्तमान में, क्रिप्टोक्यूरेंसी प्लेटफार्मों के लिए दो मुख्य इंटरफ़ेस प्रोटोकॉल हैंः REST और Websocket। प्रत्येक बार जब REST प्रोटोकॉल डेटा प्राप्त करता है, तो इसे एक बार एक्सेस करने की आवश्यकता होती है। आइए एक उदाहरण के रूप में अनुकरणीय मंच Wex.app के एपीआई को लें। [लिंक] (https://api.wex.app/api/v1/public/ticker?market=BTC_USDT) को सीधे ब्राउज़र में खोलें, और आप निम्नानुसार परिणाम प्राप्त कर सकते हैंः

{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}

इस तरह, आप देख सकते हैं कि ट्रेडिंग जोड़ी BTC_USDT के नवीनतम बाजार उद्धरणों के बाद ट्रेडिंग, हर बार ताज़ा होने पर बदल जाएगी; market=" के बाद विशिष्ट ट्रेडिंग जोड़ी पैरामीटर होते हैं, जिन्हें अन्य ट्रेडिंग जोड़ी डेटा प्राप्त करने के लिए संशोधित किया जा सकता है। सार्वजनिक इंटरफेस के लिए, जैसे कि बाजार उद्धरण, हर कोई उन्हें प्राप्त कर सकता है, इसलिए कोई सत्यापन की आवश्यकता नहीं है। हालांकि, कुछ इंटरफेस को ऑर्डर देने या खाता प्राप्त करने के दौरान उपयोगकर्ता की पहचान निर्धारित करने की आवश्यकता होती है। इस मामले में, साइन अप करने के लिए API-KEY की आवश्यकता होती है। Websocket एक सदस्यता मोड है। सदस्यता लेने की आवश्यकता वाली सामग्री भेजने के बाद, मंच अद्यतन डेटा को कार्यक्रम में भेज देगा, और इसे हर बार संशोधित करने की आवश्यकता नहीं है, इसलिए यह अधिक कुशल है।

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

विभिन्न प्रोग्रामिंग भाषाएँ

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

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

#python code
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#the corresponding Js code
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

संसाधन अनुशंसाएँ

  • यह ट्यूटोरियल एफएमजेड मंच एपीआई दस्तावेज़ में प्रत्येक इंटरफ़ेस पर विस्तृत परिचय नहीं देगा, इसलिए आप बाहर की जाँच कर सकते हैंइस लेख में अधिक जानकारी के लिए.
  • यदि आप ट्रेडिंग व्यू सिग्नल प्राप्त करना चाहते हैं और एफएमजेड पर ऑर्डर करना चाहते हैं, तो आप संदर्भित कर सकते हैंयह लेख.
  • जावास्क्रिप्ट और पायथन की त्वरित शुरुआत के लिए, सरल रणनीतियों को लिखने के लिए जटिल वाक्यविन्यास की आवश्यकता नहीं है, लेकिन केवल कुछ बुनियादी अवधारणाओं की आवश्यकता है; आप ट्यूटोरियल का अध्ययन कर सकते हैं जबकि आप सीख रहे हैं कि कैसे प्रोग्राम करना है (https://www.fmz.com/bbs-topic/9123, https://www.fmz.com/bbs-topic/9124).
  • मायलैंग्वेज दस्तावेज; ट्रेंड रणनीतियों के लिए माइलैंग्वेज अभी भी बहुत सुविधाजनक है।
  • यहाँ C++ का एक उदाहरण है। जो लोग C++ में रुचि रखते हैं वे देख सकते हैं। चूंकि यह एक व्याख्यात्मक भाषा नहीं है, इसलिए डिबगिंग बहुत मुश्किल है, इसलिएउदाहरणअनुशंसित नहीं है।
  • NetEase क्लाउड क्लासरूम का क्रिप्टोक्यूरेंसी क्वांटिटेटिव ट्रेडिंग कोर्स, आधिकारिक तौर पर FMZ द्वारा निर्मित, केवल 20 युआन की आवश्यकता है, जिसमें समृद्ध विस्तृत सामग्री है, सरल से गहरी तक, शुरुआती लोगों के लिए उपयुक्त है!कोर्सलिंक
  • यहाँ हैंकुछ शिक्षण रणनीतियाँआप मूल बातें सीखने के दौरान रणनीतियों को लिखने की कोशिश कर सकते हैं।
  • रणनीति स्रोत कोड का विस्तृत विवरणःलिंक.

डिबग उपकरण

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

रणनीतिक कार्यक्रम ढांचा

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

विशेष क्रियाओं वाले अन्य कार्य निम्नानुसार दर्शाए गए हैंः

  • onexit() एक सामान्य on-exit फलन है; इसका अधिकतम निष्पादन समय 5 मिनट है; यह अनिर्दिष्ट हो सकता है; यदि समय समाप्त हो गया है, तो एक रुकावट त्रुटि की सूचना दी जाएगी।
  • onerror() एक असामान्य निकास फ़ंक्शन है; इसका अधिकतम निष्पादन समय 5 मिनट है; यह अनिर्दिष्ट हो सकता है।
  • इनेट एक आरंभिकरण फलन है; इसका रणनीति कार्यक्रम स्वचालित रूप से चलाया जाएगा जब यह चलना शुरू होता है; यह निर्दिष्ट नहीं किया जा सकता है।
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

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

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //write the strategy logic here, and it will be called ever 6 seconds
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

प्लेटफ़ॉर्म एपीआई परिचय

सेट प्लेटफ़ॉर्म और ट्रेडिंग जोड़ी

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

एफएमजेड क्वांट प्लेटफ़ॉर्म एक ही समय में कई एक्सचेंज-ट्रेडिंग जोड़ी ऑब्जेक्ट जोड़ने का समर्थन करता है। उदाहरण के लिए, आप एक ही समय में एक ही प्लेटफ़ॉर्म खाते के बीटीसी और ईटीएच का संचालन कर सकते हैं, या आप एक ही समय में एक एक्सचेंज के बीटीसी और दूसरे एक्सचेंज के ईटीएच का संचालन कर सकते हैं। ध्यान दें कि एक ही प्लेटफ़ॉर्म पर विभिन्न खाते भी एक ही समय में जोड़े जा सकते हैं, और उन्हें एफएमजेड वेबसाइट में जोड़े गए लेबल के अनुसार प्रतिष्ठित किया जाता है। जब कई एक्सचेंज-ट्रेडिंग जोड़ी ऑब्जेक्ट होते हैं, तो उपयोग करेंexchangesउन्हें प्रतिनिधित्व करने के लिए सरणी, अर्थात्exchanges[0]औरexchanges[1]... और इतने पर, जोड़ने क्रम के अनुसार जब बॉट बनाया जाता है. व्यापार जोड़ी के प्रारूप में, जैसेBTC_USDT, पूर्व BTC ट्रेडिंग मुद्रा है, और USDT बोली मुद्रा है।

img

जाहिर है, अगर हम व्यापार जोड़े की एक बहुत संचालित, इस विधि बहुत असुविधाजनक हो जाएगा। इस स्थिति में, हम सेट करेंसी का उपयोग व्यापार जोड़े स्विच करने के लिए कर सकते हैं, जैसे किexchange.SetCurrency("BTC_USDT"); तब, व्यापारिक जोड़ी के लिए बाध्य हैexchangeबन जाता हैBTC_USDT, जो ट्रेडिंग जोड़ी बदलने के लिए अगली कॉल तक वैध रहेगा।ध्यान दें कि बैकटेस्ट हाल ही में ट्रेडिंग जोड़े स्विच करने का समर्थन करता हैनीचे एक विशिष्ट उदाहरण दिया गया हैः

var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
  for(var i=0;i<symbols.length;i++){
      exchange.SetCurrency(symbols[i])
      var ticker = exchange.GetTicker()
      var amount = _N(buyValue/ticker.Sell, 3)
      exchange.Buy(ticker.Sell, amount)
      Sleep(1000)
  }
}

सार्वजनिक इंटरफेस प्राप्त करें

जैसा कि पिछले उदाहरण में उल्लेख किया गया है, बाजार इंटरफ़ेस आम तौर पर एक सार्वजनिक इंटरफ़ेस है, जिसे हर कोई एक्सेस कर सकता है। सामान्य बाजार इंटरफ़ेस हैंः GetTicker, GetDepth, GetRecords और GetTrades। बाजार उद्धरण ट्रेडिंग निर्णय लेने के लिए रणनीति का आधार है। बाद में, मैं उन्हें एक-एक करके पेश करूंगा। उन्हें Debug Tool में अपने आप से आज़माना बेहतर है। यदि आपको विस्तृत स्पष्टीकरण की आवश्यकता है, तो आप इसे एपीआई दस्तावेज़ में देख सकते हैं।

प्रत्येक इंटरफ़ेस में आम तौर पर एकInfoफ़ील्ड, जो प्लेटफ़ॉर्म द्वारा लौटाई गई मूल डेटा स्ट्रिंग का प्रतिनिधित्व करता है, और जिसका उपयोग अतिरिक्त जानकारी को पूरक करने के लिए किया जा सकता है। उपयोग से पहले इसे पार्स करने की आवश्यकता है। जावास्क्रिप्ट का उपयोग करता हैJSON.parse(), जबकि पायथन json पुस्तकालय का उपयोग करता है.Timeइस फ़ील्ड में अनुरोध का समय-स्टैम्प दिया गया है, जिसका उपयोग देरी का आकलन करने के लिए किया जा सकता है।

बॉट में किसी भी एपीआई का उपयोग करते समय, पहुँच विफल हो सकती है और वापस आ सकती हैnull, और पायथन लौटाता हैNone. इस समय, उपयोग में डेटा एक त्रुटि की रिपोर्ट करेगा और बॉट को रोकने के लिए कारण होगा, इसलिए त्रुटि सहिष्णुता बहुत महत्वपूर्ण है. यह ट्यूटोरियल विशेष रूप से त्रुटि सहिष्णुता का परिचय देगा.

GetTicker

GetTicker शायद सबसे अधिक उपयोग किया जाने वाला इंटरफ़ेस है। आप अंतिम बार निष्पादित मूल्य, buy1 मूल्य और sell1 मूल्य, और नवीनतम ट्रेडिंग वॉल्यूम पा सकते हैं। ऑर्डर देने से पहले, निष्पादित मूल्य को टिकर जानकारी के अनुसार निर्धारित किया जा सकता है। बॉट रिटर्न का एक उदाहरणः{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}.

function main() {
    var ticker = exchange.GetTicker()
    Log(ticker) //return ticker in the debugging tool, and you can see the specific result
    Log('Last time executed price:',ticker.Last, 'Buy1 price:', ticker.Buy)
}

गहराई प्राप्त करें

लंबित आदेशों की गहराई की जानकारी प्राप्त करने के लिए GetDepth। हालांकि GetTicker में buy 1 और sell1 की कीमतें शामिल हैं, यदि आप अधिक गहरे लंबित आदेशों को क्वेरी करना चाहते हैं, तो आप इस इंटरफ़ेस का उपयोग कर सकते हैं, आम तौर पर 200 लंबित आदेशों को ऊपर और नीचे की जाँच करने के लिए। इस इंटरफ़ेस का उपयोग करके सदमे की कीमतों की गणना की जा सकती है। नीचे एक वास्तविक रिटर्न परिणाम है। उनमें से, Asks लंबित बिक्री आदेश का प्रतिनिधित्व करता है, और सरणी है Sell1, Sell2... इसलिए कीमत भी बारी-बारी से बढ़ जाती है। Bids लंबित खरीद आदेश का प्रतिनिधित्व करता है, और सरणी है buy1, buy2... कीमत बारी-बारी से नीचे जाती है।

{
    "Info":null,
    "Asks":[
        {"Price":5866.38,"Amount":0.068644},
        {"Price":5866.39,"Amount":0.263985},
        ......
        ]
    "Bids":[
        {"Price":5865.13,"Amount":0.001898},
        {"Price":5865,"Amount":0.085575},
        ......
        ],
    "Time":1530241857399
}

पूछताछ और बोली के लिए GetDepth का उपयोग करने का उदाहरणः

function main() {
    var depth = exchange.GetDepth()
    Log('Buy 1 price:', depth.Bids[0].Price, 'Sell 1 price:', depth.Asks[0].Price)
}

GetRecords

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

exchange.SetMaxBarLen(Len)पहली बार प्राप्त की गई K-लाइनों की संख्या (कुछ प्लेटफार्मों द्वारा समर्थित) और अधिकतम K-लाइनों की संख्या सेट कर सकते हैं।जैसे:exchange.SetMaxBarLen(500).

GetRecords अवधि जैसे PERIOD_M1: 1 मिनट, PERIOD_M5: 5 मिनट, PERIOD_M15: 15 मिनट, PERIOD_M30: 30 मिनट, PERIOD_H1: 1 घंटे और PERIOD_D1: 1 दिन निर्दिष्ट कर सकते हैं। विशिष्ट उपयोग हैexchange.GetRecords(PERIOD_M1). नवीनतम डॉकर को अपग्रेड करने के बाद, यह अवधि अनुकूलन का समर्थन करेगा, जो केवल एक पैरामीटर के रूप में अवधि की दूसरी संख्या को पारित करता है। मिनट-स्तर अनुकूलन को 1-मिनट के-लाइन के अनुसार संश्लेषित किया जाएगा, 1 मिनट के तहत के-लाइन को GetTrades))) के माध्यम से संश्लेषित किया जाएगा, और कमोडिटी वायदा टिक के अनुसार संश्लेषित किया जाएगा।ध्यान दें कि अन्य पूर्ण बड़े अक्षर चर भी हैं जैसेPERIOD_M1ट्यूटोरियल में. वे FMZ के डिफ़ॉल्ट वैश्विक चर हैं. यदि आप रुचि रखते हैं, तो आप अपने द्वारा उनके विशिष्ट मानों को लॉग कर सकते हैं और आप उन्हें सीधे सामान्य में उपयोग कर सकते हैं.

रिटर्न डेटा का उदाहरणः

[
    {"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
    {"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
    {"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
    ......
]

पुनरावृत्त K-लाइन का उदाहरणः

function main(){
    var close = []
    var records = exchange.GetRecords(PERIOD_H1)
    Log('total bars: ', records.length)
    for(var i=0;i<records.length;i++){
        close.push(records[i].Close)
    }
    return close
}

GetTrades

GetTrades एक निश्चित समय सीमा के भीतर ट्रेडिंग डेटा प्राप्त करता है (आपके स्वयं के ट्रेडिंग डेटा नहीं), जो कुछ प्लेटफार्मों द्वारा समर्थित नहीं है। यह आम तौर पर उपयोग नहीं किया जाता है, और आप एपीआई दस्तावेज़ में विस्तृत परिचय की जांच कर सकते हैं।

व्यापार करने के लिए खाता प्राप्त करें

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

खाता प्राप्त करें

खाता जानकारी प्राप्त करने के लिए GetAccount प्राप्त करें. सबसे अधिक उपयोग किए जाने वाले इंटरफेस में से एक के रूप में, इसे आदेश देने से पहले बुलाया जाना चाहिए, ताकि अपर्याप्त संतुलन से बचा जा सके। रिटर्न परिणाम इस तरह हैः{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}जहां Stocks ट्रेडिंग जोड़ी की ट्रेडिंग मुद्रा का उपलब्ध शेष है, FrozenStocks निष्पादित नहीं किए गए ऑर्डर का जमे हुए शेष है, Balance बोली मुद्रा की उपलब्ध राशि है, और FrozenBalance जमे हुए शेष है। यदि ट्रेडिंग जोड़ीBTC_USDT, Stocks BTC को संदर्भित करता है, और Balance USDT को संदर्भित करता है।

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

एक बॉट लगातार वर्तमान ट्रेडिंग जोड़ी के कुल मूल्य को प्रिंट करता हैः

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var account = exchange.GetAccount()
        var price = ticker.Buy
        var stocks = account.Stocks + account.FrozenStocks
        var balance = account.Balance + account.FrozenBalance
        var value = stocks*price + balance
        Log('Account value is: ', value)
        LogProfit(value)
        Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
        //when run in debug tool, add a break here
    }
}

क्रय आदेश

क्रय आदेश। आवदेन विधियों में शामिल हैंexchange.Buy(Price, Amount)औरexchange.Buy(Price, Amount, Msg), जिसमें Price कीमत को इंगित करता है, Amount राशि है, Msg एक अतिरिक्त स्ट्रिंग है जिसे बॉट लॉग में प्रदर्शित किया जा सकता है, लेकिन आवश्यक नहीं है। ये विधियां लंबित आदेश हैं। यदि आदेश को तुरंत पूरी तरह से निष्पादित नहीं किया जा सकता है, तो एक अधूरा आदेश उत्पन्न होगा; आदेश आईडी वापस आ जाता है यदि आदेश सफलतापूर्वक रखा गया है, औरnullयदि आदेश सफल नहीं होता है तो वापस कर दिया जाएगा, जिसका उपयोग आदेश की स्थिति की क्वेरी करने के लिए किया जाता है।

यदि आप बाजार मूल्य पर एक खरीद आदेश रखना चाहते हैं, Price -1 है, और Amount आदेश का मूल्य है। उदाहरण के लिए,exchange.Buy(-1, 0.5); यदि व्यापारिक जोड़ीETH_BTC, जिसका अर्थ है कि बाजार मूल्य पर 0.5BTC ईटीएच खरीदें। कुछ प्लेटफार्म बाजार आदेशों का समर्थन नहीं करते हैं, न ही वायदा बैकटेस्ट करते हैं।

कुछ प्लेटफार्मों में कीमत और राशि के लिए सटीक आवश्यकताएं हैं जिन्हें सटीक कार्य के साथ नियंत्रित किया जा सकता है_N()फ्यूचर्स ट्रेडिंग के लिए Buy और Sell के अन्य अर्थ हैं, जो विशेष रूप से पेश किए जाएंगे।

एक बार प्रासंगिक मूल्य तक पहुँचने पर खरीद का एक उदाहरणः

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Sell
        if(price >= 7000){
            exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
            break
        }
        Sleep(3000)//Sleep 3000ms
    }
    Log('done')
}

बेचने का आदेश

बिक्री आदेश. पैरामीटर Buy के समान हैं. बाजार आदेश के मापदंडों का अलग अर्थ है. एक बाजार बिक्री आदेश, जैसे किexchange.Sell(-1, 0.2), का अर्थ है बाजार मूल्य पर 0.2ETH बेचना।

प्राप्त करेंआदेश

GetOrder आदेश आईडी के आधार पर आदेश जानकारी प्राप्त करता है. जब यह आम इंटरफ़ेस विधि को कॉल करता हैexchange.GetOrder(OrderId), OrderId आदेश आईडी है, जो एक आदेश रखने पर लौटाया जाएगा। ध्यान दें कि आदेश की स्ट्रिंगTypeऔर आदेश का वास्तविक मूल्यStatusFMZ इन मूल्यों का प्रतिनिधित्व करने के लिए वैश्विक स्थिरांक का उपयोग करता है। उदाहरण के लिए,Statusएक अधूरे आदेश का मान 0 है, जो कि के बराबर हैORDER_STATE_PENDING. इन सभी वैश्विक स्थिरांक दस्तावेज में देखा जा सकता है... रिटर्न परिणामः

{
    "Id":125723661, //Order id
    "Amount":0.01, //Order ammount 
    "Price":7000, //Order price 
    "DealAmount":0, //Executed amount 
    "AvgPrice":0, //executed average price
    "Status":0, //0: not completely executed; 1: executed; 2: canceled 
    "Type":1,//Order type; 0: buy order; 1: sell order 
    "ContractType":"",//contract type, used in futures trading
    "Info":{} //the platform returns the raw information
    }
}

मुद्रा की एक निर्दिष्ट राशि खरीदने की रणनीतिः

function main(){
    while(true){
        var amount = exchange.GetAccount().Stocks
        var ticker = exchange.GetTicker()
        var id = null
        if(5-amount>0.01){
            id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
        }else{
            Log('Job completed')
            return //return the main function, bot will stop
        }
        Sleep(3000) //Sleep 3000ms
        if(id){
            var status = exchange.GetOrder(id).Status
            if(status == 0){ //Here you can aslo use "status == ORDER_STATE_PENDING" to judge 
                exchange.CancelOrder(id)
            }
        }
    }
}

GetOrders प्राप्त करें

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

वर्तमान ट्रेडिंग जोड़ी के सभी ऑर्डर रद्द करने का उदाहरणः

function CancelAll(){
    var orders = exchange.GetOrders()
    for(var i=0;i<orders.length;i++){
        exchange.CancelOrder(orders[i].Id) // cancel order by orderID
    }
}
function main(){
    CancelAll()
    while(true){
        //do something
        Sleep(10000)
    }
}

आदेश रद्द करें

आदेश आईडी के अनुसार, आदेश रद्द करें।exchange.CancelOrder(OrderId). यदि रद्द करना सफल है, तो true लौटाएं; यदि नहीं, तो false लौटाएं.

वायदा और स्थायी अनुबंध

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

स्थायी अनुबंध वायदा अनुबंधों के समान हैं, लेकिन अंतर यह है कि एक ही समय में लंबी और छोटी स्थिति रखने की ऐसी अवधारणा नहीं है।

यदि प्लेटफ़ॉर्म फ्यूचर्स और स्पॉट दोनों का समर्थन करता है, जैसे कि ओकेएक्स और हुओबी के फ्यूचर्स, तो आपको जोड़ने के लिए प्लेटफ़ॉर्म इंटरफ़ेस पर अलग से ओकेएक्स फ्यूचर्स और हुओबी फ्यूचर्स का चयन करना होगा, क्योंकि उन फ्यूचर्स प्लेटफार्मों को एफएमजेड पर स्पॉट से अलग प्लेटफॉर्म माना जाता है।

SetContractType

फ्यूचर्स ट्रेडिंग में पहला कदम ट्रेड करने के लिए अनुबंध सेट करना है। उदाहरण के रूप में ओकेएक्स फ्यूचर्स लेते हुए, बॉट या बैकटेस्टिंग बनाते समय बीटीसी ट्रेडिंग जोड़ी का चयन करें, और आपको कोड में साप्ताहिक, अगले सप्ताह या त्रैमासिक अनुबंध सेट करने की भी आवश्यकता है। यदि यह सेट नहीं है, तो यह संकेत देगाinvalid contract type. स्पॉट ट्रेडिंग जोड़े के विपरीत, वायदा अनुबंध अक्सर BTC जैसी ट्रेडिंग मुद्रा का उपयोग मार्जिन के रूप में करते हैं। एक ट्रेडिंग जोड़ी में BTC जोड़ना आमतौर पर BTC_USD ट्रेडिंग जोड़ी का प्रतिनिधित्व करता है जो BTC को मार्जिन के रूप में उपयोग करता है। यदि USDT के साथ वायदा अनुबंध है, तो मार्जिन के रूप में BTC_USDT ट्रेडिंग जोड़ी जोड़ने के लिए एक बॉट बनाने की आवश्यकता होती है। उदाहरण के लिए, बिनेंस ओकेएक्स फ्यूचर्स जैसे स्थायी अनुबंध, क्रिप्टो-मार्जिन और USDT-मार्जिन दोनों अनुबंधों के साथ।ट्रेडिंग जोड़ी सेट करने के बाद, आपको विशिष्ट अनुबंध प्रकार भी सेट करना होगा, जैसे कि स्थायी, साप्ताहिक, अगले सप्ताह, आदि। अनुबंध सेट करने के बाद, आप बाजार उद्धरण प्राप्त करने, खरीदने और बेचने जैसे संचालन कर सकते हैं।

Binance, OKEX, HuobiDM, आदि में क्रिप्टो-मार्जिन और USDT-मार्जिन दोनों अनुबंध हैं, जिन्हें बॉट जोड़ने और अनुबंध सेट करने पर अलग करने की आवश्यकता होती है। विशिष्ट सेटिंग्स निम्नानुसार हैंः

//OKEX Futures
exchange.SetContractType("swap")        // set to perpetual contract
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract 
exchange.SetContractType("quarter")     // set to quarterly contract

//HuobiDM
exchange.SetContractType("this_week")   // set to weekly contract 
exchange.SetContractType("next_week")   // set to next week contract
exchange.SetContractType("quarter")     // set to quarterly contract 
exchange.SetContractType("swap")        // set to perpetual contract

//Binance Futures
exchange.SetContractType("swap")   // set to perpetual contract, and notice that crypto-margined and USDT-margined contracts are all in the perpetual contract
exchange.SetContractType("quarter")   // set to quarterly contract
exchange.SetContractType("next_quarter")  // set to next quarter contract

//BitMEX
exchange.SetContractType("XBTUSD")    // set to perpetual contract
exchange.SetContractType("XBTM19")  // the contract settled at a specific time; for more details, please log in BitMEX to check each contract code

//GateIO
exchange.SetContractType("swap")      // set to perpetual contract, and do not set the default as swap perpetual contract 
//Deribit
exchange.SetContractType("BTC-27APR18")  // the contract settled at a specific time; for more details, please log in Deribit to check out 

स्थिति प्राप्त करें

वर्तमान स्थिति सूचना सूची प्राप्त करने के लिए, OKEX (OKCOIN) वायदा प्राप्त करने के लिए अनुबंध प्रकार निर्दिष्ट करने के लिए एक पैरामीटर में पारित कर सकते हैं। एक खाली सूची लौटाएँ[], यदि कोई स्थिति नहीं है। स्थिति की जानकारी निम्नानुसार लौटाई जाती है। बहुत सी विशिष्ट जानकारी है, जिसका विश्लेषण ट्रेडिंग जोड़ी के साथ संयोजन में करने की आवश्यकता है।

डेटा प्रकार चर का नाम विवरण
वस्तु जानकारी कच्ची संरचना जो मंच लौटाता है
संख्या मार्जिन लेवल लीवरेज आकार; OKCoin 10 या 20 है, और OK वायदा के पार पद 10 (फिक्स्ड) देता है, कच्चे एपीआई के लिए समर्थन नहीं करता
संख्या राशि स्थिति राशि; OKCoin अनुबंध मात्रा (पूर्णांक 1 से अधिक) दर्शाता है
संख्या जमे हुए राशि जमे हुए पद की राशि
संख्या मूल्य स्थिति की औसत कीमत
संख्या मार्जिन जमे हुए मार्जिन
संख्या लाभ कमोडिटी फ्यूचर्सः बाजार के लिए स्थिति का लाभ और हानि चिह्न; क्रिप्टोक्यूरेंसीः क्रिप्टोक्यूरेंसी इकाईः बीटीसी / एलटीसी, पारंपरिक वायदा इकाईः आरएमबी (नोटःओकेकोइन वायदा की क्रॉसिंग स्थिति के मामले में, यह स्थिति के लाभ और हानि को नहीं, बल्कि प्राप्त लाभ और हानि को संदर्भित करता है। अलग स्थिति के तहत, यह स्थिति के लाभ और हानि को संदर्भित करता है।)
कंस्ट प्रकार PD_LONG लंबी स्थिति है (CTP एक स्थिति को बंद करने के लिए closebuy_today का उपयोग करता है); PD_SHORT छोटी स्थिति है (CTP एक स्थिति को बंद करने के लिए closesell_today का उपयोग करता है); CTP वायदा में, PD_LONG_YD कल की लंबी स्थिति को इंगित करता है (जो स्थिति को बंद करने के लिए closebuy का उपयोग करता है); PD_SHORT_YD कल की छोटी स्थिति है (जो स्थिति को बंद करने के लिए closesell का उपयोग करता है)
स्ट्रिंग अनुबंध प्रकार कमोडिटी वायदा अनुबंध कोड हैं, और स्टॉक हैं प्लेटफ़ॉर्म कोड_स्टॉक कोड; सेटContractType के विशिष्ट मापदंडों का पारित प्रकार
function main(){
    exchange.SetContractType("this_week");
    var position = exchange.GetPosition();
    if(position.length>0){ //especially pay attention to judging the length of position before call, or an error will occur
        Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
            position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
    }
}

फ्यूचर्स ओपन और क्लोज पोजीशन

सबसे पहले, आप लीवरेज आकार सेट करने की जरूरत है; आह्वान विधिःexchange.SetMarginLevel(10), जहां 10 का अर्थ है लीवरेज का 10 गुना, और संबंधित प्लेटफार्मों में विशिष्ट समर्थित लीवरेज आकार की जांच की जा सकती है,ध्यान दें कि लीवरेज को प्लेटफ़ॉर्म में सेट किया जाना चाहिए और कोड प्लेटफ़ॉर्म पर सेट की गई सेटिंग्स के अनुरूप होना चाहिए, अन्यथा त्रुटि होगी. आप इसे अनसेट भी छोड़ सकते हैं और डिफ़ॉल्ट लीवरेज का उपयोग कर सकते हैं. फिर, ट्रेडिंग दिशा सेट करें; आह्वान विधिःexchange.SetDirection(Direction), जो खुली और बंद पोजीशनों से मेल खाती है।वायदा के विपरीत, यदि एक स्थायी अनुबंध एक ही समय में लंबे और छोटे की अवधारणाओं को नहीं रखता है, यानी एक एकल स्थिति की अनुमति नहीं है। जब आप एक लंबी स्थिति पर खुले शॉर्ट संचालित करते हैं, तो लंबी स्थिति स्वचालित रूप से बंद हो जाएगी, इसलिए आपको केवल सेट करने की आवश्यकता हैbuyऔरsell. यह दो तरफा पदों का समर्थन करता है, तो आप सेट करने की जरूरत हैclosebuy, closesell.विशिष्ट संबंध:

ऑपरेशन SetDirection पैरामीटर आदेश देने का कार्य
खुली लंबी स्थिति exchange.SetDirection ((buy) विनिमय.खरीदें()
लंबी स्थिति बंद करें exchange.SetDirection ((closebuy) विनिमय.बिक्री()
खुली छोटी स्थिति exchange.SetDirection ((sell) विनिमय.बिक्री()
लघु स्थिति बंद करें exchange.SetDirection ((closesell) विनिमय.खरीदें()

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

function main(){
    exchange.SetContractType("this_week")    // for example, set OKEX futures to weekly contract 
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) // set to 10 times of leverage  
    exchange.SetDirection("buy") // set the order type as buy long 
    exchange.Buy(price+10, 20) // set contract quantity as 20 orders
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) // check out if there is any unfinished order 
    exchange.SetDirection("closebuy"); // if it is a perpetual contract, directly set exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

पूर्ण बंद पदों का एक विशिष्ट रणनीतिक उदाहरण निम्नानुसार दें:

function main(){
    while(true){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){
            Log('not able to obtain ticker')
            return
        }
        if(!pos || pos.length == 0 ){
            Log('no position')
            return
        }
        for(var i=0;i<pos.length;i++){
            if(pos[i].Type == PD_LONG){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closebuy')
                exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
            }
            if(pos[i].Type == PD_SHORT){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closesell')
                exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
            }
        }
        var orders = exchange.Getorders()
        Sleep(500)
        for(var j=0;j<orders.length;j++){
            if(orders[i].Status == ORDER_STATE_PENDING){
                exchange.CancelOrder(orders[i].Id)
            }
        }
    }
}

क्रिप्टोकरेंसी लीवरेज ट्रेडिंग

क्रिप्टोकरेंसी लीवरेज ट्रेडिंग को कोड में लीवरेज खाते में स्विच करने की आवश्यकता है, और अन्य भाग स्पॉट ट्रेडिंग के समान हैं।

प्रयोगexchange.IO("trade_margin") लीवरेज खाता मोड पर स्विच करने के लिए; ऑर्डर देने और खाता संपत्ति प्राप्त करने से प्लेटफॉर्म लीवरेज के इंटरफ़ेस तक पहुंच होगी। प्रयोगexchange.IO("trade_normal") सामान्य खाता मोड पर वापस स्विच करने के लिए।

समर्थित प्लेटफ़ॉर्मः

  • OKEX V3: लीवरेज खाता मोड के ट्रेडिंग जोड़े सामान्य से भिन्न होते हैं, और कुछ ट्रेडिंग जोड़े मौजूद नहीं हो सकते हैं।
  • Huobi: लीवरेज अकाउंट मोड के ट्रेडिंग जोड़े सामान्य से भिन्न होते हैं, और कुछ ट्रेडिंग जोड़े मौजूद नहीं हो सकते हैं।
  • ZB: परिसंपत्तियों को केवल QC में ही स्थानांतरित किया जा सकता है। लीवरेज ट्रेडिंग क्षेत्र में, विभिन्न ट्रेडिंग जोड़े के बीच की संपत्ति स्वतंत्र होती है, यानी ETH_QC ट्रेडिंग जोड़ी के तहत QC सिक्कों की संख्या BTC_QC में दिखाई नहीं देती है।
  • FCoin
  • बाइनेंस

कमोडिटी वायदा व्यापार

कमोडिटी फ्यूचर्स ट्रेडिंग और क्रिप्टोक्यूरेंसी फ्यूचर्स ट्रेडिंग काफी अलग हैं। सबसे पहले, कमोडिटी फ्यूचर्स का ट्रेडिंग समय बहुत कम है, लेकिन क्रिप्टोक्यूरेंसी का व्यापार 24 घंटे के लिए किया जाता है; कमोडिटी फ्यूचर्स का प्रोटोकॉल एक आम तौर पर उपयोग किया जाने वाला REST एपीआई नहीं है; कमोडिटी फ्यूचर्स की ट्रेडिंग आवृत्ति और लंबित ऑर्डर राशि सीमित हैं, लेकिन क्रिप्टोक्यूरेंसी के बहुत ढीले हैं, और इसी तरह। इसलिए, कमोडिटी फ्यूचर्स ट्रेडिंग करते समय कई बिंदुओं पर विशेष ध्यान देने की आवश्यकता होती है, और यह उन लोगों के लिए अनुशंसित है जिनके पास मैनुअल संचालन में समृद्ध अनुभव है। एफएमजेड अब कमोडिटी फ्यूचर्स सिमुलेटेड बॉट का समर्थन करता है, और आप संदर्भित कर सकते हैंःhttps://www.fmz.com/bbs-topic/325कमोडिटी वायदा कंपनियों को जोड़ने के लिएःhttps://www.fmz.com/bbs-topic/371

कमोडिटी फ्यूचर्स ने जून 2019 में पारदर्शी पर्यवेक्षण लागू किया है; व्यक्तिगत कार्यक्रम के लिए, व्यक्तिगत उपयोगकर्ताओं को वायदा दलालों के लिए प्राधिकरण कोड के लिए आवेदन करने के लिए एक खाता खोलने की आवश्यकता होती है (विशिष्ट आवेदन सूचना टेम्पलेट को वीचैट समूह या क्यूक्यू समूह में भेजा जा सकता है), जिसमें आम तौर पर 4-5 दिन लगते हैं; प्रक्रियाएं काफी जटिल होती हैं। एक प्रोग्रामेटिक ट्रेडिंग प्रदाता के रूप में, एफएमजेड प्लेटफॉर्म ने विभिन्न वायदा सेवा प्रदाताओं से सॉफ्टवेयर प्राधिकरण कोड के लिए आवेदन किया है। उपयोगकर्ता आवेदन किए बिना सीधे उनका उपयोग कर सकते हैं। वायदा दलाल जोड़ते समय, एफएमजेड ने आवेदन की सूची देखने के लिए क्वांट के माध्यम से देखें खोजें। विशिष्ट संदर्भ पोस्टःhttps://www.fmz.com/bbs-topic/3860. यदि आपका फ्यूचर्स ब्रोकर अब सूची में नहीं है, तो आप केवल स्वयं आवेदन कर सकते हैं, या एक समर्थित ब्रोकर का नया खाता खोल सकते हैं, जिसमें आम तौर पर 2 दिन लगते हैं। एफएमजेड के कुछ सेवा प्रदाताओं के साथ गहन सहकारी संबंध हैं; उदाहरण के लिए, गुओटाई जूनान हांगयुआन फ्यूचर्स ने एफएमजेड प्लेटफॉर्म का संस्थागत संस्करण खरीदा है, जिसका उपयोग इसके उपयोगकर्ताओं द्वारा किया जा सकता है, और उपयोगकर्ता स्वचालित रूप से एक खाता खोलने पर वीआईपी बन जाते हैं, और सेवा शुल्क कम हो जाता है। खाता खोलने का संदर्भःhttps://www.fmz.com/bbs-topic/506.

एफएमजेड क्वांट प्लेटफॉर्म संरचना के फायदे के कारण, उपयोगकर्ता कई वायदा ब्रोकर खातों को भी जोड़ सकते हैं, और कुछ कार्यों को लागू कर सकते हैं जो अन्य कमोडिटी वायदा कार्यक्रम ट्रेडिंग सॉफ्टवेयर पूरा नहीं कर सकते हैं, जैसे कि उच्च आवृत्ति टिक का संश्लेषण; आप संदर्भित कर सकते हैंःhttps://www.fmz.com/bbs-topic/1184

रणनीतिक ढांचा

सबसे पहले, चूंकि यह 24 घंटे का ट्रेडिंग नहीं है और लॉगिन ऑपरेशन की आवश्यकता है, इसलिए ट्रेडिंग से पहले लिंक की स्थिति का न्याय करना आवश्यक है।exchange.IO("status")हैtrue, जो मंच के लिए सफल कनेक्शन को इंगित करता है। यदि लॉगिन सफल नहीं होने पर एपीआई को बुलाया जाता है, तो नॉट लॉगिन को संकेत नहीं दिया जाता है। आप रणनीति शुरू होने के बाद स्लीप (2000) जोड़ सकते हैं, जिससे लॉगिन करने के लिए एक निश्चित समय मिलता है। आप सदस्यता लेने का पुनः प्रयास भी कर सकते हैं_C(exchange.SetContractType,"MA888"), जो सफल लॉगिन सुनिश्चित करेगा।

कमोडिटी फ्यूचर्स के मार्केट कोटेशन अधिग्रहण और ट्रेडिंग कोड क्रिप्टोक्यूरेंसी फ्यूचर्स के समान हैं। यहां हम अंतर और बिंदुओं को पेश करेंगे जिन पर ध्यान देने की आवश्यकता है।

function main(){
    _C(exchange.SetContractType,"MA888") //If you do not log in successfully, you cannot subscribe to the contract, so better to try again
    while(true){
        if(exchange.IO("status")){
            var ticker = exchange.GetTicker()
            Log("MA888 ticker:", ticker)
            LogStatus(_D(), "Already connected with CTP !")//_D obtain event
        } else {
            LogStatus(_D(), "Not connected with CTP !")
            Sleep(1000)
        }
    }
}

ट्रेडिंग के लिए कमोडिटी फ्यूचर्स लाइब्रेरी (जो बाद में वर्णित की जाएगी) का उपयोग करने की सिफारिश की जाती है, कोड इस समय बहुत सरल होगा, और थकाऊ विवरणों से निपटने की आवश्यकता नहीं है। स्रोत कोड कॉपी पताःhttps://www.fmz.com/strategy/57029

function main() {
    // Use the CTA strategy framework of commodity futures library 
    $.CTA(Symbols, function(st) {
        var r = st.records
        var mp = st.position.amount
        var symbol = st.symbol
        /*
        "r" represents K-line, "mp" indicates the position amount of the current variety; positive number means long position, negative number means short position, and 0 means no position; "symbol" is the variety name
        if the return value is n: 
            n = 0 : full close positions (no matter now they are long or short)
            n > 0 : if right now long positions are held, add n long positions; if now they are short positions, close n short posiitons; if n is over the position amount right now, reverse to open long positions 
            n < 0 : if right now short positions are held, add n short positions; if now they are long positions, close n long posiitons; if -n is over the position amount right now, reverse to open short positions 
        */
        if (r.length < SlowPeriod) {
            return
        }
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        if (mp <= 0 && cross > ConfirmPeriod) {
            Log(symbol, "Golden Cross Period", cross, "the moment position", mp);
            return Lots * (mp < 0 ? 2 : 1)
        } else if (mp >= 0 && cross < -ConfirmPeriod) {
            Log(symbol, "Death Cross Period", cross, "the moment position", mp);
            return -Lots * (mp > 0 ? 2 : 1)
        }
    });
}

सीटीपी डेटा प्राप्त करने के तरीके

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

यदि आप डेटा हर बार जब आप बाजार उद्धरण मिलता है प्राप्त करना चाहते हैं, भले ही यह पुराने डेटा है, आप बाजार उद्धरण के तत्काल अद्यतन मोड पर स्विच कर सकते हैंexchange.IO("mode", 0). इस समय, रणनीति को घटना-संचालित के रूप में नहीं लिखा जा सकता है, और तेजी से अनंत लूप से बचने के लिए एक SLeep घटना को जोड़ने की आवश्यकता है। कुछ दुर्लभ रणनीतियाँ इस मोड का उपयोग कर सकती हैं, और रणनीति डिजाइन सरल है। उपयोगexchange.IO("mode", 1)डिफ़ॉल्ट कैश मोड पर वापस स्विच करने के लिए.

एक एकल अनुबंध संचालित करते समय, डिफ़ॉल्ट मोड का उपयोग करें। हालांकि, यदि कई अनुबंध हैं, तो यह संभव है कि अनुबंधों में से एक बाजार उद्धरणों को अपडेट नहीं करता है, जिसके परिणामस्वरूप बाजार उद्धरण प्राप्त करने के लिए इंटरफ़ेस अवरोध होता है, और अन्य अनुबंधों के उद्धरण अद्यतन भी प्राप्त नहीं किए जा सकते हैं। इस समस्या को हल करने के लिए, तत्काल अद्यतन मोड का उपयोग किया जा सकता है, लेकिन उच्च आवृत्ति रणनीतियों को लिखना असुविधाजनक है। इस समय आप आदेशों और उद्धरणों के धक्का प्राप्त करने के लिए घटना पुश मोड का उपयोग कर सकते हैं। सेटिंग विधि हैexchange.IO("wait"). यदि कई विनिमय वस्तुओं को जोड़ा जाता है, जो कमोडिटी वायदा में दुर्लभ है, तो आप उपयोग कर सकते हैंexchange.IO("wait_any"), और लौटाया गया Index लौटाया गया प्लेटफार्म सूचकांक दर्शाएगा।

बाजार के टिक परिवर्तनों का धक्काः{Event:"tick", Index: platform index (in the order of the platforms added in the bot), Nano: event of nanosecond-level time, Symbol: contract name}आदेश पुश करेंः{Event:"order", Index:Exchange index, Nano:Event of nanosecond-level time, Order:Order information (same as GetOrder)}

इस समय तक, रणनीति संरचना को इस प्रकार लिखा जा सकता हैः

function on_tick(symbol){
    Log("symbol update")
    exchange.SetContractType(symbol)
    Log(exchange.GetTicker())
}

function on_order(order){
    Log("order update", order)
}

function main(){
    while(true){
        if(exchange.IO("status")){ //Judge the link status 
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//Subscribe to MA; only the subscription request for the first time is ture, and the later ones are program switches, which do not consume time
            _C(exchange.SetContractType, "rb888")//Subscribe to rb
            while(true){
                var e = exchange.IO("wait")
                if(e){
                    if(e.event == "tick"){
                        on_tick(e.Symbol)
                    }else if(e.event == "order"){
                        on_order(e.Order)
                    }
                }
           }
        }else{
            Sleep(10*1000)
        }
    }
}

कमोडिटी फ्यूचर्स और क्रिप्टोकरेंसी के बीच अंतर

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

सेट अनुबंध

exchange.IO("इंस्ट्रूमेंट्स"): यह प्लैटफॉर्म पर सभी अनुबंधों की सूची {अनुबंध नामः विवरण} शब्दकोश के रूप में लौटाता है, और केवल बॉट्स का समर्थन करता है।exchange.IO("उत्पाद"): यह शब्दकोश के रूप में प्लेटफ़ॉर्म {अनुबंध नामः विवरण} पर सभी वस्तुओं की सूची लौटाता है, और केवल बॉट्स का समर्थन करता है।exchange.IO("सब्सक्राइब किया गया"): यह प्लेटफॉर्म पर डिक्शनरी के रूप में सब्सक्राइब किए गए मार्केट कोट्स को रिटर्न करता है, और केवल बॉट्स को सपोर्ट करता है।

..ContractTypeपारंपरिक सीटीपी वायदा का संदर्भ अनुबंध आईडी, जो केस-संवेदनशील है।exchange.SetContractType("au1506"). अनुबंध को सफलतापूर्वक सेट करने के बाद, यह अनुबंध की विस्तृत जानकारी लौटाएगा, जैसे कि न्यूनतम खरीद राशि, सेवा शुल्क, वितरण समय, आदि। जब कई अनुबंधों की सदस्यता लेते हैं, तो केवल पहली बार सदस्यता अनुरोध वास्तव में भेजा जाता है, और फिर ट्रेडिंग जोड़ी को कोड स्तर पर स्विच किया जाता है, जिसमें समय नहीं लगता है। मुख्य निरंतर अनुबंध कोड 888 है, जैसे MA888, निरंतर दर अनुबंध 000, जैसे MA000; 888 और 000 आभासी अनुबंध ट्रेड हैं जो केवल बैकटेस्ट का समर्थन करते हैं, और वास्तविक बॉट केवल बाजार उद्धरण का समर्थन करते हैं।हालांकि, माइलैंग्वेज मुख्य अनुबंध का संचालन कर सकता है, और कार्यक्रम स्वचालित रूप से पदों को बदल देगा, अर्थात गैर-मुख्य पदों को बंद कर देगा और मुख्य पदों पर नई स्थिति खोलेगा।

असफल लॉगिन अनुबंध सेट नहीं कर सकता है, लेकिन तुरंत वापस आ जाएगा, इसलिए आप _c द्वारा फिर से कोशिश कर सकते हैं, यह जानने के लिए कि सीटीपी लॉगिन पूरा हो गया है। सफल लॉगिन के बाद, अनुबंध सेट करने के लिए कोई समय नहीं लगता है, और कोई वास्तविक नेटवर्क एक्सेस नहीं होगा।

खुली स्थिति और बंद स्थिति

निर्देशनSetDirectionचार मापदंड प्राप्त कर सकते हैंःbuy, closebuy, sell, closesellकमोडिटी वायदा अधिक हैclosebuy_todayऔरclosesell_today, वर्तमान पदों को बंद करने का संकेत देता है; डिफ़ॉल्ट हैclosebuy/ closesell, जो कल की स्थिति को बंद करने का संकेत देता है; केवल शंघाई फ्यूचर्स एक्सचेंज की किस्मों को आज और कल बंद करने में विभाजित किया गया है, जो सेवा शुल्क को प्रभावित कर सकता है, इसलिए कल की स्थिति को बंद करने को प्राथमिकता देना आवश्यक है। सीटीपी पारंपरिक वायदा के लिए, आप दूसरा पैरामीटर 1 या 2 या 3 के रूप में सेट कर सकते हैं, जो क्रमशः अटकलें, मध्यस्थता और हेजिंग को संदर्भित करता है। यदि सेट नहीं किया गया है, तो डिफ़ॉल्ट अटकलें है।खरीद और बिक्री, पद प्राप्त करने, आदेश प्राप्त करने, आदेश रद्द करने और खातों को प्राप्त करने जैसे विशिष्ट संचालन क्रिप्टोक्यूरेंसी वायदा व्यापार के समान हैं, इसलिए कृपया पिछले खंड को देखें।

ऑपरेशन SetDirection पैरामीटर आदेश देने का कार्य
खुली लंबी स्थिति exchange.SetDirection ((buy) विनिमय.खरीदें()
लंबी स्थिति बंद करें exchange.SetDirection ((closebuy) विनिमय.बिक्री()
खुली छोटी स्थिति exchange.SetDirection ((sell) विनिमय.बिक्री()
लघु स्थिति बंद करें exchange.SetDirection ((closesell) विनिमय.खरीदें()

निम्नलिखित उदाहरण एक विशिष्ट समापन स्थिति फ़ंक्शन है। ध्यान दें कि यह उदाहरण बहुत सरल है। आपको यह भी विचार करना चाहिए कि क्या यह ट्रेडिंग समय के भीतर है, यदि यह पूरी तरह से भरा नहीं है तो लंबित ऑर्डर को फिर से कैसे आज़माएं, अधिकतम ऑर्डर वॉल्यूम क्या है, क्या आवृत्ति बहुत अधिक है, और क्या यह स्लाइडिंग मूल्य या बाजार मूल्य है और इसी तरह। केवल संदर्भ के लिए,यह वास्तविक बॉट्स में पदों को खोलने और बंद करने के लिए सुझाए गए प्लेटफार्मों का एक पुस्तकालय पैकेज हैःhttps://www.fmz.com/strategy/12961पुस्तकालय अनुभाग में एक विशिष्ट परिचय है, और पुस्तकालय के स्रोत कोड का अध्ययन करने की भी सिफारिश की जाती है।

function Cover(contractType, amount, slide) {
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].ContractType != contractType) {
            continue;
        }
        var depth = _C(e.GetDepth);
        if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
            exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
            exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "Close today" : "Close yesterday", 'Bid', depth.Bids[0]);
        } else {
            exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
            exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "Close today" : "Close yesterday", 'Ask', depth.Asks[0]);
        }
    }
}

कमोडिटी फ्यूचर्स कस्टम ऑर्डर प्रकारों (बॉट के लिए समर्थन, लेकिन बैकटेस्ट के लिए नहीं) का समर्थन करते हैं, जो प्रत्यय द्वारा निर्दिष्ट होते हैं, जो _ से जोड़ा जाता है, जैसेः

exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")

विशिष्ट प्रत्यय:

  • ioc तुरंत पूरा, या THOST_FTDC_TC_IOC रद्द
  • नोड THOST_FTDC_TC_GFS में मान्य gfs
  • दिन में मान्य gfd THOST_FTDC_TC_GFD
  • निर्दिष्ट तिथि से पहले मान्य gtd THOST_FTDC_TC_GTD
  • रद्द किए जाने से पहले मान्य gtc THOST_FTDC_TC_GTC
  • gfa नीलामी बोली में मान्य THOST_FTDC_TC_GFA

Esunny इंटरफेस

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

एसुनी प्रोटोकॉल कस्टम ऑर्डर प्रकार हैंः

  • दिन में मान्य gfd TAPI_ORDER_TIMEINFORCE_GFD
  • रद्द TAPI_ORDER_TIMEINFORCE_GTC से पहले मान्य gtc
  • निर्दिष्ट तिथि से पहले मान्य gtd TAPI_ORDER_TIMEINFORCE_GTD
  • fak आंशिक रूप से निष्पादित, शेष रद्द TAPI_ORDER_TIMEINFORCE_FAK
  • ioc तुरंत निष्पादित करें, या रद्द TAPI_ORDER_TIMEINFORCE_FAK
  • fok पूरी तरह से निष्पादित नहीं है, सभी TAPI_ORDER_TIMEINFORCE_FOK रद्द

आम तौर पर प्रयोग किए जाने वाले वैश्विक कार्य

लॉग - लॉग और वीचैट पुश

जब बॉट इंटरफेस पर लॉग रिकॉर्ड लॉग करते हैं, और स्ट्रिंग के बाद वर्ण @ जोड़ते हैं, तो संदेश पुश कतार में प्रवेश करेगा, और इसे सीधे वीचैट या टेलीग्राम से बंधने के बाद पुश किया जाएगा, जैसे किLog('Push to WeChat@').

लॉग रंग भी अनुकूलित किया जा सकता है, जैसे किLog('this is a log in red font #ff0000'). #ff0000आरजीबी रंग का हेक्साडेसिमल है, यह दर्शाता है कि सभी लॉग फ़ाइलें उस निर्देशिका में बॉट के एसक्यूएलआईटी डेटाबेस में संग्रहीत हैं जहां डॉकर स्थित है, जिसे डेटाबेस सॉफ़्टवेयर के साथ डाउनलोड और खोला जा सकता है, या बैकअप कॉपी करने और पुनर्स्थापित करने के लिए इस्तेमाल किया जा सकता है (डेटाबेस नाम और बॉट आईडी समान हैं) ।

लॉगप्रॉफिट - प्रिंट मुनाफा

यह लाभों को रिकॉर्ड करता है, और बॉट इंटरफ़ेस पर लाभ वक्र खींचता है, जिसे बॉट को पुनरारंभ करने के बाद बरकरार रखा जा सकता है।LogProfit(1000). ध्यान दें कि पैरामीटरLogProfitलाभ नहीं है, और यह कोई भी संख्या हो सकती है और इसे स्वयं भरने की आवश्यकता है।

लॉगस्टेटस - स्टेटस डिस्प्ले (तालिकाओं सहित)

यदि बॉट स्थिति, चूंकि लॉग पहले सहेजा जाएगा और लगातार ताज़ा किया जाएगा, केवल प्रदर्शन के लिए जानकारी की जरूरत है नहीं सहेजने के लिए, आप उपयोग कर सकते हैंLogStatusकार्य के पैरामीटरLogStatusस्ट्रिंग हैं, जिनका उपयोग तालिका की जानकारी का प्रतिनिधित्व करने के लिए भी किया जा सकता है।

एक विशिष्ट वास्तविक बॉट स्थिति प्रदर्शन तालिका का एक उदाहरणः

var table = {type: 'table', title: 'position information', cols: ['Column1', 'Column2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; 
LogStatus('`' + JSON.stringify(table) + '`'); // After serialization, JSON will be added the character "'" on both sides, which is regarded as a comlpex messag format (now supporting tables)
LogStatus('The first line information\n`' + JSON.stringify(table) + '`\nthe third line information'); // the table information can be displayed in multiple lines
LogStatus('`' + JSON.stringify([table, table]) + '`'); // Multiple tables are supported to be displayed at the same time, which will be displayed in one group by TAB  
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // Multiple tables are displayed up and down by arrangement 

नींद

इसका पैरामीटर मिलीसेकंड की संख्या है, जैसे किSleep(1000)सभी प्लेटफार्मों की सीमित पहुंच आवृत्ति के कारण, सामान्य रणनीतियों में अनंत लूप में नींद का समय जोड़ा जाना चाहिए।

_G

बोट फिर से शुरू होने के बाद, कार्यक्रम फिर से शुरू हो जाएगा. यदि आप कुछ स्थायी जानकारी सहेजना चाहते हैं,_Gबहुत सुविधाजनक और व्यावहारिक है, और यह JSON सीरियल सामग्री को बचा सकता है।_Gफ़ंक्शन में लिखा गया हैonexit(), ताकि हर बार जब रणनीति रोक दी जाती है, तो आवश्यक जानकारी स्वचालित रूप से सहेजी जाएगी। यदि आप अधिक स्वरूपित डेटा सहेजना चाहते हैं, तो _G फ़ंक्शन उपयुक्त नहीं है, लेकिन


अधिक