FMZ मध्यवर्ती ट्यूटोरियल

लेखक:घास, बनाया गयाः 2019-04-12 14:28:19, अद्यतनः 2024-02-05 20:07:56

[TOC]

img

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

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

1.अनेक एक्सचेंजों को जोड़ें और कई प्रतीकों का व्यापार करें

आप एक ही रोबोट के भीतर कई एक्सचेंजों और कई प्रतीकों पर आसानी से व्यापार कर सकते हैं. यह कैसे काम करता हैः

  • रोबोट को चालू करते समय एक या कई एक्सचेंजों को जोड़ें।
  • एपीआई की तरह कहा जा सकता हैexchange.GetTicker()जब एक विनिमय जोड़ा जाता है
  • जब कई एक्सचेंजों जोड़ा जाता है, एपीआई कहा जाता है जैसेexchanges[0].GetTicker(), exchanges[1].GetTicker() img
  • आप अलग-अलग प्रतीकों के साथ एक ही विनिमय जोड़ सकते हैं।img
  • आप के साथ बंधे है कि प्रतीक बदल सकते हैंexchangeप्रयोग करकेIOकार्य
var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT", "BCC_USDT"]
var buyValue = 1000
function main(){
  for(var i=0;i<symbols.length;i++){
      exchange.IO("currency", symbols[i]) // It is always valid until the next change
      var ticker = exchange.GetTicker()
      var amount = _N(buyValue/ticker.Sell, 3)
      exchange.Buy(ticker.Sell, amount)
      Sleep(1000)
  }
}

2.Tradeवायदा और स्वैप अनुबंध

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

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

यदि कोई एक्सचेंज स्पॉट और फ्यूचर्स दोनों को समर्थन देता है, तो उन्हें FMZ में अलग से जोड़ा जाना चाहिए।img

नीचे दी गई छवि में दिखाया गया है कि बॉट को शुरू करते समय वायदा प्रतीक को बीटीसी पर कैसे सेट किया जाए।img

नीचे बताया गया है कि प्रत्येक एक्सचेंज के लिए अनुबंध प्रकार कैसे सेट करें।

  • ओकेएक्स
    exchange.SetContractType("swap")        
    exchange.SetContractType("this_week")   
    exchange.SetContractType("next_week")  
    exchange.SetContractType("quarter")   
  • HuobiDM
    exchange.SetContractType("this_week")   
    exchange.SetContractType("next_week")  
    exchange.SetContractType("quarter")     
  • बिटमेक्स
    exchange.SetContractType("XBTUSD")  
    exchange.SetContractType("XBTM19") 
  • द्वार
    exchange.SetContractType("swap")    
  • डेरबिट
    exchange.SetContractType("BTC-PERPETUAL")  
    exchange.SetContractType("BTC-27APR18")

3.बैकटेस्ट के बारे में

मूल परिचय

एफएमजेड में दो बैकटेस्टिंग मोड हैंःreal tickऔरsimulate tick. वास्तविक टिक स्तर में पूरे पूर्ण ऐतिहासिक डेटा (प्रति सेकंड एक टिक) होते हैं, इसलिए बैकटेस्टिंग परिणाम अधिक विश्वसनीय होते हैं। सिमुलेट स्तर आपकी रणनीति द्वारा उपयोग किए जाने वाले अंतराल पर इतिहास क्लीन के डेटा का उपयोग करता है। एक क्लीन के भीतर टिक एक एल्गोरिथ्म द्वारा उत्पन्न होते हैं जो MT4 के समान है, आप अधिक विवरण पा सकते हैंhttps://www.mql5.com/en/articles/75इस बीच, टिक उत्पन्न करने के लिए कम अंतराल को बेस-क्लाइन के रूप में चुना जा सकता है। सिमुलेट टिक मोड वास्तविक टिक मोड की तुलना में बहुत तेज़ है लेकिन कम सटीक है। सिमुलेट टिक मोड में एक छोटा कलाई-अंतराल सटीकता और परीक्षण की गति के बीच एक समझौता है।

बैकटेस्ट कॉन्फ़िगरेशन

यहाँ डिफ़ॉल्ट सेटिंग्स हैंःimgछिपे हुए टांके:img

बैकटेस्ट का परिणाम

img

4.त्रुटि सहिष्णुता

किसी भी कार्य को कॉल करते समय जो एक्सचेंज एपीआई (जैसेGetTicker, Buy, CancelOrder, आदि...), आप एक एक्सचेंज सर्वर समस्या, गलत मापदंडों, नेटवर्क संचरण समस्या, आदि के कारण पहुँच विफलता प्राप्त कर सकते हैं। इस मामले में समारोह वापस आ जाएगाnull, जो रोबोट को रोक सकता है. तो आप की जरूरत है पता करने के लिए कैसे त्रुटियों से निपटने के लिए.

क्या गलती है?

बॉट एक त्रुटि होने पर एक त्रुटि संदेश लौटाएगा. बस एक्सचेंज नाम + त्रुटि संदेश खोज, आप समस्या क्या है पता कर सकते हैं. उदाहरण के लिए, एक त्रुटि{"result":false,"error_code":20049}कॉल करने पर लौटाया जाता हैexchange.GetAccount()ओकेएक्स पर।OKEX 20049, यहाँ परिणाम हैःimgआप भी एक्सचेंज एपीआई डॉक पर त्रुटि कोड की जाँच कर सकते हैं, जैसे किफ्यूचर्स के लिए ओकेएक्स त्रुटि कोड

सौदा त्रुटियाँ

आपको विचार करना चाहिए कि रणनीति कोड लिखते समय त्रुटियों से कैसे निपटें। यहाँ कुछ उदाहरण दिए गए हैंः

 // 1.Deal when the result is null
 var ticker = exchange.GetTicker()
 while(ticker == null){
     Log('GetTicker error')
     Sleep(100)
     ticker = exchange.GetTicker()
 }
 Log(ticker.Last);
 // 2.Refer when the result is not null
 var ticker = exchange.GetTicker()
 if(!ticker){
     Log(ticker.Last)
 }
 // 3._C() fucntion retry
 var ticker = _C(exchange.GetTicker) // can't  apply _C to CancelOrder, Why?
 Log(ticker.Last)
 // 4. try catch
 try{
     var ticker = exchange.GetTicker()
     Log(ticker.Last)
 }
 catch(err){
     Log('GetTicker error: ', err)
     Log(GetLastError()) //literal means, get last error
 } 

5.बिचारे से सीधे जुड़ें

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

GetRawJSON

मूल सामग्री (स्ट्रिंग) लौटाएं जो पिछले REST API अनुरोध द्वारा लौटाई गई थी, जिसका उपयोग कच्ची जानकारी को स्वयं पार्स करने के लिए किया जा सकता है.

function main(){
    var account = exchange.GetAccount() //the account doesn't contain all data returned by the request
    var raw = JSON.parse(exchange.GetRawJSON())//raw data returned by GetAccount()
    Log(raw)
}

HttpQuery

के बारे में सभी विवरण खोजेंHttpQueryपरhttps://fmz-docs.readthedocs.io/en/latest/code_Instruction/Global Function.html#httpquery

HttpQueryइस अनुरोध के कच्चे डेटा को लौटाता है जिसे पहले पार्स किया जाना चाहिए.

//FMZ doesn't have a standard function for exchangeInfo that return the trading-information about all symbols. 
var exchangeInfo = JSON.parse(HttpQuery('https://api.binance.com/api/v1/exchangeInfo'))
Log(exchangeInfo) // FMZ doesn't have a standard function for this API
var ticker = JSON.parse(HttpQuery('https://api.binance.com/api/v1/ticker/24hr'))
Log(ticker)

उन सार्वजनिक एपीआई के लिए,HttpQueryवास्तव में उपयोगी समारोह है. ध्यान दें किHttpQueryकेवल जावास्क्रिप्ट का समर्थन करता है, पायथन के लिए,urlib2याrequestलाइब्रेरी सीधे http अनुरोध भेजने के लिए.

आईओ

उन निजी एपीआई के लिए, उपयोगHttpQueryबहुत जटिल हो जाएगा क्योंकि आप एपीआई कुंजी, साइन, हैश, आदि से निपटने की जरूरत हैIOइस स्थिति के लिए एक आसान समारोह है, यह पर जाँच करेंhttps://fmz-docs.readthedocs.io/en/latest/code_Instruction/Extent API.html#io. IOअलग अलग उपयोग है मापदंडों पर निर्भर करता है. इस भाग में, हम केवल निजी एपीआई के लिए उपयोग पर ध्यान केंद्रित.

इस फ़ंक्शन का उपयोग करने के लिए पहले एक्सचेंज के मूल एपीआई को समझने की आवश्यकता होती है। नीचे एक स्टॉप ऑर्डर बनाने के लिए चरण दिए गए हैं जो कि बिटमेक्स पर एफएमजेड द्वारा समर्थित नहीं है।

  • सबसे पहले, BitMEX एपीआई दस्तावेज़ पृष्ठ खोजेंःhttps://www.bitmex.com/api/explorer/
  • रोक आदेश बनाने के लिए url हैhttps://www.bitmex.com/api/v1/orderविधि यह हैPOST, मापदंडों में प्रतीक,साइड, आदेशQty,stopPx,ordType शामिल हैं, जिसे "प्रतीक=XBTUSD&side=Buy&orderQty=1&stopPx=4000&ordType=Stop" की तरह व्यवस्थित किया जाना चाहिए

अंतिम जावास्क्रिप्ट कोडः

var id = exchange.IO("api", "POST", "/api/v1/order", "symbol=XBTUSD&side=Buy&orderQty=1&stopPx=4000&ordType=Stop")

6.वेबसॉकेट का प्रयोग करें

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

जावास्क्रिप्ट के लिए, आप उपयोग कर सकते हैंDialवेबसॉकेट से कनेक्ट करने के लिए कार्य, पायथन के लिए, आप उपयोग कर सकते हैंDialयाwebsocket_client libray.

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

वेबसॉकेट से जुड़ा हुआ

  • 1.ज्यादातर मामलों में, आप सीधे कनेक्ट कर सकते हैं। नीचे बिनेंस सभी टिकर से कनेक्ट करने का एक उदाहरण है।
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
    
  • 2.संकुचित प्रारूप के रिटर्न डेटा के लिए, इसे कनेक्शन के समय निर्दिष्ट करने की आवश्यकता है।compressइसका मतलब है कि डेटा संकुचित प्रारूप में है, और पैरामीटरmodeयह दर्शाता है कि प्रेषण या प्राप्त संपीड़ित है या नहीं।
    var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
    
  • 3. डायल फ़ंक्शन ऑटोमैटिक रीकनेक्शन का समर्थन करता है, जो अंतर्निहित गो भाषा द्वारा किया जाता है। अनुरोध डेटा सामग्री के लिए पहले से ही यूआरएल में है, जैसे कि बियॉन्से का उदाहरण, यह सुविधाजनक और अनुशंसित है। उन लोगों के लिए जिन्हें सदस्यता संदेश भेजने की आवश्यकता है, आप स्वयं रीकनेक्शन बनाए रख सकते हैं।
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr?reconnect=true")
    
  • 4.कुछ एक्सचेंजों सदस्यता चैनलों को यूआरएल में शामिल किया गया है, जैसे कि बिनेंस, लेकिन कुछ उपयोगकर्ताओं को सदस्यता चैनलों को भेजने की आवश्यकता होती है, जैसे कि कॉइनबेसः
    var client = Dial("wss://ws-feed.pro.coinbase.com", 60)
    client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
    

डेटा प्राप्त करें

आम तौर पर, वेबसॉकेट से डेटा को अनंत लूप में नींद के बिना लगातार पढ़ा जा सकता है। कोड निम्नानुसार हैः

function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
    while (true) {
        var msg = client.read() //receve data from client
        var data = JSON.parse(msg) //change raw string to js object
        // do something, don't need sleep. 
    }
}

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

..read()function यदि कोई तर्क नहीं है तो कतार में सबसे पुराना डेटा लौटाता है, और जब कोई डेटा नहीं है तो ब्लॉक करता है (कार्यक्रम को यहां रोक दिया जाता है) । यदि आप नवीनतम डेटा चाहते हैं, तो आप उपयोग कर सकते हैंread(-2)तुरंत नवीनतम डेटा वापस करने के लिए, और वापसnullयदि कतार में कोई डेटा नहीं है ((प्रोग्राम रोक नहीं देगा) ।

कई वेबसॉकेट से कनेक्ट करें

इस मामले में यह स्पष्ट है कि कार्यक्रम सरल का उपयोग नहीं कर सकतेread()क्योंकि एक एक्सचेंज नए डेटा को ब्लॉक करेगा और नए डेटा का इंतजार करेगा, और दूसरा एक्सचेंज अपने नए डेटा को तुरंत प्राप्त नहीं करेगा।

function main() {
    var binance = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
    var coinbase = Dial("wss://ws-feed.pro.coinbase.com")
    coinbase.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
    while (true) {
        var msgBinance = binance.read(-1)
        var msgCoinbase = coinbase.read(-1)
        if(msgBinance){
            // Binance has new data
        }
        if(msgCoinbase){
            // coinbase has new data
        }
        Sleep(1) // just sleep 1ms
    }
}

वेबसॉकेट के उपयोग के लिए सामान्य ढांचा

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

var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
    if(Date.now() - tradeTime > 2000){//only trade once within 2s
        tradeTime = Date.now()
        //trading code
    }
}
function GetAccount(){
    if(Date.now() - accountTime > 5000){//only get account once within 5s
        accountTime = Date.now()
        return exchange.GetAccount()
    }
}
function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
    while (true) {
        var msg = client.read()
        var data = JSON.parse(msg)
        var account = GetAccount()
        trade(data)
    }
}

सभी प्रीमेटर

के मापदंडDial(Address, Timeout): Timeout: कनेक्शन का टाइमआउट पते के बाद अन्य पैरामीटर भी आ सकते हैं जो कि&. पता और पैरामीटर द्वारा अलग कर रहे हैं|,

पैरामीटर वर्णन
संपीड़ना संपीड़न विधि, हो सकती हैgzip_raw, gzip. ओकेएक्स उपयोग करता हैgzip_raw
मोड हो सकता हैdualइसका मतलब है कि दोनों भेजने और प्राप्त करने के लिए संपीड़ित किया जाना चाहिए,sendसंपीड़ित करने के लिए भेजने की जरूरत है औरrecvप्राप्त करना है।
प्रोक्सी एसएस5 के लिए प्रॉक्सी सेटिंग्स.socks5://name:pwd@192.168.0.1:1080
फिर से जोड़ना Reconnect=trueपुनःसंलग्न करने की अनुमति देने के लिए
अंतरंग intervalपुनः प्रयास अंतराल है, डिफ़ॉल्ट 1000ms है
पेलोड सदस्यता संदेश जो wss पुनः कनेक्ट होने पर भेजा जाना चाहिए

के मापदंडread(): जब वेबसोकेट डिस्कनेक्ट,read()रिक्त स्ट्रिंग लौटाएगा.

पैरामीटर कोई नहीं -1 -2 2000
कतार खाली नहीं है सबसे पुराना डेटा तुरंत लौटाएं सबसे पुराना डेटा तुरंत लौटाएं नवीनतम डेटा तुरंत लौटाएं सबसे पुराना डेटा तुरंत लौटाएं
कतार खाली है जब तक नए डेटा वापस नहीं आ जाते तब तक ब्लॉक करें लौटनाnullतुरंत लौटनाnullतुरंत नए डेटा वापस आने तक कम से कम 2000ms प्रतीक्षा करें, अन्यथा, वापसnull

का प्रयोगclose(): वेबसॉकेट कनेक्शन बंद करें.

function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
    client.close()
}
    

असिंक्रोनस या मल्टीथ्रेडिंग

आप ध्यान दिया है हो सकता है सभी कोड हम अब है एकल धागा, अनुक्रमिक निष्पादन कर रहे हैं। कच्चे जावास्क्रिप्ट असिंक्रोनस का समर्थन नहीं करता है, हालांकि, एफएमजेड एक समारोह प्रदान करते हैंGOऐसा करने के लिए, जो बहुत सीमित है।Goजब आप वास्तव में देरी के बारे में परवाह है और हर एपीआई अनुरोध के समय की खपत.

आदान-प्रदान.जाओ (प्रणाली, Args)

विधि: एक फ़ंक्शन का नाम। तर्क: विधि के तर्क।

समर्थित कार्यों की सूचीःGetTicker, GetDepth, GetTrades, GetRecords, GetAccount, GetOrders, GetOrder, CancelOrder, Buy, Sell, GetPosition.

जावास्क्रिप्ट उदाहरणः

function main(){
    var a = exchange.Go("GetTicker"); //GetTicker Asynchronous multithreaded execution
    var b = exchange.Go("GetDepth");
    var c = exchange.Go("Buy", 1000, 0.1);
    var d = exchange.Go("GetRecords", PERIOD_H1);
    // The above four operations are concurrent multi-threaded asynchronous execution, will not block and immediately return
    var ticker = a.wait(); // Call wait method wait for return to asynchronous get ticker result
    var depth = b.wait(); // Return depth, it is also possible to return null if it fails
    var orderId = c.wait(1000); // Return the order number, 1 second timeout, timeout returns undefined, this object can continue to call wait until the last wait timeout
    var records = d.wait(); // Wait for K-line result
    var ret = d.wait();  // Here waits for an asynchronous operation that has waited and ended, returns null, and logs an error message.
}

wait()फ़ंक्शन के बाद बुलाया जाना चाहिएGoफ़ंक्शन, अन्यथा,थ्रेड संसाधन 2000 तक जमा होगा और एक त्रुटि लौटाएगा.

8.तालिकाएं और चार्ट

LogStatusऔर तालिकाएँ

लॉगस्टेटस एक संदेश या तालिकाओं को लॉग करेगा बॉट की स्थिति पट्टी पर, हर बार ताज़ा होगा.

//Normal uses of LogStatus
LogStatus(" This is a normal status prompt")
LogStatus(" This is a red font status prompt #ff0000")
LogStatus(" This is a multi-line status message\n I'm the second line")

लॉगस्टेटस आपके रोबोट पृष्ठ पर तालिकाओं को लॉग कर सकता है. जोड़ें`दोनों पक्षों के लिए वर्ण और इसे एक जटिल संदेश प्रारूप के रूप में इलाज (वर्तमान में समर्थित तालिका) ।

var table = {type: 'table', title: ' Account information support color #ff0000', cols: ['BTC', 'ETH', 'USDT'], rows: [ ['free', 1, 2000], ['frozen', 0, 3000]]}
LogStatus('`' + JSON.stringify(table)+'`')
//Another example, information can also appear in multiple lines:
LogStatus("First line message\n" + JSON.stringify(table)+"`\n third line message")
//Log multiple tables in a group, switching by TAB:
var table1 = {type: 'table', title: ' Account information 1', cols: ['BTC', 'ETH', 'USDT'], rows: [ ['free', 1, 2000], ['frozen', 0, 3000]]}
var table2 = {type: 'table', title: ' Account information 2', cols: ['BTC', 'ETH', 'USDT'], rows: [ ['free', 1, 2000], ['frozen', 0, 3000]]}
LogStatus('`' + JSON.stringify([table1, table2])+'`')

चार्ट

रोबोट प्रबंधन पृष्ठ पर आंकड़े खींचें। चार्ट समर्थन HighStocks और HighCharts, चेकhttps://www.highcharts.com/demoऔरhttps://www.highcharts.com/stock/demoअधिक उदाहरणों के लिए। चार्ट ऑब्जेक्ट में एक__isStockविशेषता है कि मूल में मौजूद नहीं है.__isStockगलत है, चार्ट उच्च चार्ट के रूप में प्रदर्शित किया जाएगा.__isStockसही है, चार्ट उच्च स्टॉक के रूप में प्रदर्शित किया जाएगा. कॉलreset()चार्ट डेटा को साफ़ करने के लिए।

दो प्रतीकों की कीमतों को आकर्षित करने के लिए चार्ट का उपयोग करने का एक जावास्क्रिप्ट उदाहरणः

// This chart is an object in the JS language. Before using the Chart function, we need to declare an object variable chart that configures the chart.
var chart = {
    // Whether the mark is a general chart, if you are interested, you can change it to false and run it.
    __isStock: true,
    tooltip: {xDateFormat: '%Y-%m-%d %H:%M:%S, %A'},    // Zoom tool
    title : { text : 'Spread Analysis Chart'},          // title
    rangeSelector: {                                    // Selection range
        buttons:  [{type: 'hour',count: 1, text: '1h'}, {type: 'hour',count: 3, text: '3h'}, {type: 'hour', count: 8, text: '8h'}, {type: 'all',text: 'All'}],
        selected: 0,
        inputEnabled: false
    },
    xAxis: { type: 'datetime'},                         // The horizontal axis of the coordinate axis is the x axis and the current setting type is :time
    yAxis : {                                           // The vertical axis of the axis is the y axis, and the default value is adjusted with the data size.
        title: {text: 'Spread'},                        // title
        opposite: false,                                // Whether to enable the right vertical axis
    },
    series : [                                          // Data series, this attribute is saved for each data series (line, K-line graph, label, etc...)
        {name : "line1", id : "Line 1,buy1Price", data : []},  // The index is 0, the data array is stored in the index series of data
        {name : "line2", id : "Line 2,lastPrice", dashStyle : 'shortdash', data : []},
        // The index is 1, dashStyle is set: 'shortdash' ie: Set the dotted line.
    ]
};
function main(){
    var ObjChart = Chart(chart);                      // Call the Chart function to initialize the chart.
    ObjChart.reset();                                 // Empty the chart
    while(true){
        var nowTime = new Date().getTime();           // Get the timestamp of this poll, which is a millisecond timestamp. Used to determine the position of the X axis written to the chart.
        var tickerOne = _C(exchanges[0].GetTicker);   // Get market data
        var tickerTwo = _C(exchanges[1].GetTicker);
        ObjChart.add([0, [nowTime, tickerOne.Last]]); // Use the timestamp as the X value and buy the price as the Y value to pass the index 0 data sequence.
        ObjChart.add([1, [nowTime, tickerTwo.Last]]); // Same as above
        ObjChart.update(chart);                       // Update the chart to show it.
        Sleep(2000);
    }
}

कई आकृतियों के प्रदर्शन का समर्थन करता है, एक पूर्ण उदाहरणःhttps://www.fmz.com/strategy/136056 img

9.रणनीति टेम्पलेट

टेम्पलेट एक लाइब्रेरी है जो कई उन्नत सुविधाओं को शामिल करती है, जो आपकी रणनीति को लिखना आसान बनाती है। टेम्पलेट का उपयोग करने के लिए, आपको पहले आवश्यक टेम्पलेट की प्रतिलिपि बनाना चाहिए। उदाहरण के लिए जावास्क्रिप्ट प्लॉट लाइब्रेरी लें, इसे कॉपी करेंhttps://www.fmz.com/strategy/27293और सहेजें. फिर इसे रणनीति संपादन पृष्ठ पर चुनें.imgकार्यों के बाद कहा जाता है$.जावास्क्रिप्ट टेम्पलेट में और उसके बादext.पायथन टेम्पलेट में.

function main() {
    var isFirst = true
    while (true) {
        var records = exchange.GetRecords();
        if (records && records.length > 0) {
            $.PlotRecords(records, 'BTC')
            if (isFirst) {
                $.PlotFlag(records[records.length - 1].Time, 'Start', 'S')
                isFirst = false
                $.PlotHLine(records[records.length - 1].Close, 'Close')
            }
        }
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last)
            $.PlotTitle('Last ' + ticker.Last)
        }
        Sleep(60000)
    }
}

यहाँ एक और सरल उदाहरण है जो प्लॉट टेम्पलेट का उपयोग करता हैःhttps://www.fmz.com/strategy/121917


अधिक

q25459768धन्यवाद

घासमैं इस ट्यूटोरियल पर काम कर रहा हूँ. इसे पूरा करने में कुछ दिन लगेंगे. कोई भी सवाल पूछने के लिए स्वतंत्र महसूस करें.