जब एक शुरुआती क्रिप्टोक्यूरेंसी मात्रात्मक ट्रेडिंग रणनीति डिजाइन करता है, तो अक्सर विभिन्न कार्य आवश्यकताएं होती हैं। प्रोग्रामिंग भाषाओं और प्लेटफार्मों की परवाह किए बिना, वे सभी विभिन्न डिजाइन आवश्यकताओं का सामना करेंगे। उदाहरण के लिए, कभी-कभी रोटेशन की कई ट्रेडिंग किस्मों की आवश्यकता होती है, कभी-कभी मल्टी-प्लेटफॉर्म हेजिंग की आवश्यकता होती है, और कभी-कभी विभिन्न ट्रेडिंग किस्मों को समवर्ती होने की आवश्यकता होती है। आइए रणनीति घुमावदार आवश्यकताओं को लागू करते समय कुछ डिजाइन अनुभव साझा करें।
सीखने का मंच अभी भी FMZ क्वांट ट्रेडिंग प्लेटफॉर्म का उपयोग करता है (https://www.fmz.com), और बाजार को क्रिप्टोक्यूरेंसी बाजार के रूप में चुना जाता है।
इनमें से अधिकांश मांग स्थितियां बहु-क्रिप्टोक्यूरेंसी प्रवृत्ति और ग्रिड रणनीतियों के लिए तैयार हैं, जिन्हें विभिन्न ट्रेडिंग पुनरावृत्ति विधियों के साथ बाजार पर निष्पादित करने की आवश्यकता है।
आमतौर पर इस तरह से डिजाइन किया जाता हैः
function Process (symbol) {
exchange.IO("currency", symbol)
var ticker = _C(exchange.GetTicker)
Log("has switched trading pairs, processing trading pairs according to strategy logic:", symbol, "quotes: ", ticker)
// ...
// ..
// .
}
function main(){
var symbols = ["BTC_USDT", "LTC_USDT", "ETH_USDT"]
while (true) {
for (var i = 0 ; i < symbols.length; i++) {
Process(symbols[i])
Sleep(500)
}
}
}
हम रोबोट को कॉन्फ़िगर करते हैंः
यह देखा जा सकता है कि यह महसूस करता है कि रोबोट पर एक विनिमय वस्तु को कॉन्फ़िगर किया जाता है, और ट्रेडिंग जोड़ी स्विच की जाती है; विभिन्न ट्रेडिंग जोड़े का बाजार प्राप्त किया जाता है, और बहु-ट्रेडिंग विविधता बाजार निष्पादित किया जाता है; और यह एक रणनीति तर्क के तहत निष्पादित किया जाता है।
यह देखा जा सकता है कि तीन व्यापारिक जोड़े हम परिभाषित करते हैंः BTC_USDT, LTC_USDT, ETH_USDT, लूप में, पुनरावृत्ति बाजार उद्धरण प्राप्त करते हैं, और जानकारी प्राप्त करने के बाद, यह विशेष रूप से बाजार का पता लगा सकता है और रणनीति द्वारा डिज़ाइन किए गए ट्रेडिंग तर्क को ट्रिगर कर सकता है।
कुछ पाठक पूछ सकते हैं:
वास्तव में अन्य डिजाइन विकल्प हैं, जिन्हें हम नीचे प्रस्तुत करेंगे।
विभिन्न व्यापारिक जोड़े के बाजार डेटा को कई विनिमय वस्तुओं के माध्यम से प्राप्त किया जाता है, और पुनरावर्ती रणनीति तर्क में निष्पादित किया जाता है।
उदाहरण के लिए, रोबोट के लिए तीन विनिमय वस्तुओं को कॉन्फ़िगर करके रोबोट को कॉन्फ़िगर करें। ट्रेडिंग जोड़े क्रमशः BTC_USDT, LTC_USDT, और ETH_USDT पर सेट हैं।
नाम
सब किया।
हमने इन कोड को थोड़ा बदल दिया है, क्योंकि इस बार हमने रोबोट में कई एक्सचेंज ऑब्जेक्ट जोड़े हैं, जो कि BTC_USDT, LTC_USDT, ETH_USDT ट्रेडिंग जोड़ी के एक्सचेंज ऑब्जेक्ट हैं।
function Process (e) {
var ticker = _C(e.GetTicker)
Log("exchange", e.GetName(), "Process trading pairs according to strategy logic:", e.GetCurrency(), "Quotes:", ticker)
// ...
// ..
// .
}
function main(){
while (true) {
for (var i = 0 ; i < exchanges.length; i++) {
Process(exchanges[i])
Sleep(500)
}
}
}
रोबोट चलाएँ:
उदाहरण हम ऊपर वर्णित है, चाहे व्यापार जोड़े स्विच या एक विन्यास खाते के कई अलग-अलग व्यापार जोड़े के लिए एक व्यापार वस्तु जोड़ने. ये सभी सिर्फ एक विनिमय खाता विन्यास का उपयोग कर रहे हैं (एक विनिमय विनिमय का उपयोग कर).
तो आप एक रणनीति में कई विनिमय खातों का उपयोग कैसे करते हैं?
कुछ रणनीतियाँ जैसे बहु-विनिमय क्रॉस-मार्केट हेजिंग, एक ही विनिमय के भीतर बहु-खाता रणनीतियाँ।
उदाहरण के लिए, हमने डैशबोर्ड -> एक्सचेंज -> एक्सचेंज पेज जोड़ने पर 2 एक्सचेंजों को कॉन्फ़िगर किया है.
हम रणनीति में इन दो एक्सचेंजों द्वारा कॉन्फ़िगर किए गए खातों की परिसंपत्ति जानकारी तक पहुंच सकते हैं।
function main(){
Log(exchanges[0].GetAccount()) // Print the account asset information of the first exchange object.
Log(exchanges[1].GetAccount()) // ... Print the asset information of the Bit-Z exchange
}
बेशक, मैं भी एक विनिमय के लिए एक दूसरे और तीसरे खाते विनिमय विन्यास जोड़ सकते हैं।
उदाहरण के लिए, हम Huobi वायदा के लिए एक और खाता जोड़ते हैं।
जैसा कि आप देख सकते हैं, यह दो
जब रणनीति बनाई जाती है, तो चयन के लिए Robot
उदाहरण के लिए, यह दो खातों को पहले बेचने और फिर विशिष्ट ग्रिड रणनीति (ऊपर) या पहले खरीदने और फिर बेचने (नीचे) के साथ खरीदने की अनुमति देता है।
उपरोक्त दो उदाहरणों के माध्यम से
यहाँ रोबोट पर कई विनिमय वस्तुओं को कॉन्फ़िगर करने और रोबोट के लिए एक ही विनिमय खाते के लिए कई विनिमय वस्तुओं को कॉन्फ़िगर करने के बीच अंतर हैः
अंतर यह है कि उपरोक्त उदाहरण एक विनिमय विन्यास है, अर्थातः
जब रोबोट एक्सचेंज ऑब्जेक्ट को कॉन्फ़िगर करता है, तो वह हमेशा उपयोग करता हैः
यह विन्यास।
यह सिर्फ है कि जब आप एक विनिमय वस्तु जोड़ने, व्यापार जोड़ी सेटिंग अलग हैं।
यदि GetAccount फ़ंक्शन को बुलाया जाता है, तो उसी खाते की संपत्ति जानकारी हमेशा एक्सेस की जाती है.
तथापि:
इस प्रकार कॉन्फ़िगर किए गए दो हुओबी फ्यूचर्स एक्सचेंज ऑब्जेक्ट, हालांकि वे सभी हुओबी फ्यूचर्स हैं, विभिन्न एक्सचेंज खातों का प्रतिनिधित्व करते हैं।
कभी-कभी क्रिप्टोक्यूरेंसी अनुबंध हेजिंग की रणनीति में, क्षणिक व्यापारिक अवसरों को जब्त करने के लिए, कई परिदृश्यों को एक साथ रखने की आवश्यकता होती है। हालांकि, क्योंकि अनुबंध अलग है, जब आप बाजार उद्धरण प्राप्त करते हैं और ऑर्डर देते हैं तो आपको संबंधित अनुबंध पर स्विच करने की आवश्यकता होती है।exchange.Go
और स्विच अनुबंध के डिजाइन भी तर्क इतना सरल नहीं बनाता है. वहाँ एक बेहतर तरीका है?
बेशक वहाँ कर रहे हैं, हम दो विनिमय रोबोट के लिए वस्तुओं जोड़ सकते हैं
फिर एक और विनिमय वस्तु जोड़ने के लिए इस विनिमय विन्यास का उपयोग करें.
एक संकेत बॉक्स पॉप अप होगा!
एक विनिमय खाता विन्यास, आप एक ही मुद्रा या व्यापार जोड़ी के विनिमय वस्तुओं को जोड़ नहीं सकते।
मुझे क्या करना चाहिए? ऐसा लगता है कि रणनीति रोबोट दो एक्सचेंज ऑब्जेक्ट का उपयोग नहीं कर सकता है, और एक्सचेंज ऑब्जेक्ट एक एक्सचेंज खाता नंबर से जुड़ा हुआ है?
अभी भी एक रास्ता है!
चलो
कॉन्फ़िगर होने पर सहेजें पर क्लिक करें.
इस तरह हम दो विनिमय विन्यास है, लेकिन एक ही एपीआई कुंजी विन्यास जानकारी का उपयोग किया जाता है.
इसका क्या लाभ है?
एक रणनीति लिखते समय, डिजाइन बहुत सरल होगा!
function main(){
exchanges[0].SetContractType("quarter") // Set the first added exchange object. The current contract is a quarterly contract.
exchanges[1].SetContractType("this_week") // Set the second added exchange object, the current contract is the current week contract
while (true) {
var beginTime = new Date().getTime() // Record the timestamp from which this time the market quote was taken.
var rA = exchanges[0].Go("GetTicker") // Create a concurrent thread to get the first exchange object, which is the market data for the quarterly contract.
var rB = exchanges[1].Go("GetTicker") // Create a concurrent thread to get the second exchange object, which is the market data for the weekly contract.
var tickerA = rA.wait() // The two threads executing each other perform their own tasks, waiting to get the data. When A waits, the B task is also executing.
var tickerB = rB.wait() // So it seems to be sequential execution, actually at the bottom of the concurrency. Only when you get the order is to get A first, and get B.
var endTime = new Date().getTime() // Record the timestamp at the end of the two contract quotes.
if (tickerA && tickerB) { // If there is no problem with the data obtained, execute the following logic.
var diff = tickerA.Last - tickerB.Last // calculate the difference
$.PlotLine("diff", diff) // Use the line drawing library to plot the difference on the chart.
if (diff > 500) { // If the spread is greater than 500, hedge arbitrage (of course, the difference of 500 is relatively large, rarely seen.)
// Hedging
rA = exchanges[0].Go("Sell", tickerA.Buy, 1) // Concurrent threads create a selling order under the quarterly contract
rB = exchanges[1].Go("Buy", tickerB.Sell, 1) // Concurrent thread create a buying order under the weekly contract
var idA = rA.wait() // Waiting for the return of placing order results, returning the order ID
var idB = rB.wait() // ...
}
// ...
}
LogStatus(_D(), "Concurrently get two contract quotes taking time:", endTime - beginTime, "millisecond.") // Shows the time on the status bar to know that the program is executing.
Sleep(500)
}
क्या यह डिजाइन रणनीति बहुत सरल और स्पष्ट है?
वास्तविक बाजार संचालन:
जैसा कि आप देख सकते हैं, प्रत्येक बार दो अनुबंधों की कीमत प्राप्त करने में केवल 50 मिलीसेकंड लगते हैं।