यह एक वेबसोकेट बाजार टेम्पलेट आधिकारिक तौर पर एफएमजेड द्वारा विकसित किया गया है. सभी उपयोगकर्ताओं को कॉपी करने और इसका उपयोग करने के लिए आपका स्वागत हैःhttps://www.fmz.com/strategy/470349
वर्तमान में, एफएमजेड रणनीति मुख्य रूप से पारंपरिक आरईएसटी एपीआई कैप्सुलेशन पर आधारित है। एपीआई एक्सेस के प्रत्येक चरण के लिए एक नेटवर्क कनेक्शन स्थापित करने की आवश्यकता होती है, और बाजार डेटा पोलिंग के माध्यम से प्राप्त किया जाता है। यह विधि सरल और उपयोग में आसान है, और यह अधिकांश जरूरतों के लिए पूरी तरह से पर्याप्त है।
हालांकि, REST प्रोटोकॉल में एक अंतर्निहित देरी की समस्या है। जब कई ट्रेडिंग जोड़े और कई एक्सचेंज रणनीतियों की आवश्यकता होती है, तो देरी की समस्या बढ़ जाएगी। हालांकि प्लेटफ़ॉर्म का गो फ़ंक्शन एक साथ निष्पादित किया जा सकता है, देरी की समस्या अभी भी मौजूद है, जिससे अपेक्षाकृत उच्च आवृत्ति वाली रणनीति व्यापार की जरूरतों को पूरा करना मुश्किल हो जाता है। इसके अलावा, यदि बहुत सारे ट्रेडिंग जोड़े हैं और पोलिंग आवृत्ति बहुत तेज है, तो यह ट्रेडिंग प्लेटफ़ॉर्म की एक्सेस आवृत्ति सीमा का सामना करेगी।
वर्तमान में, एक्सचेंजों के सर्वर भी भारी बोझ के तहत हैं। वे सभी एक पूर्ण वेबसॉकेट प्रोटोकॉल प्रदान करते हैं और इसे एपीआई उपयोगकर्ताओं को अनुशंसा करते हैं। REST प्रोटोकॉल की तुलना में, वेबसॉकेट एक स्थायी दो-तरफा कनेक्शन विधि प्रदान करता है, जो एक्सचेंजों को वास्तविक समय में क्लाइंट को डेटा पुश करने में सक्षम बनाता है, लगातार अनुरोधों और प्रतिक्रियाओं से बचता है, इस प्रकार विलंबता को बहुत कम करता है। आम तौर पर, यदि REST एपीआई तक पहुंचने में देरी लगभग 20ms है, तो वेबसॉकेट के माध्यम से डेटा पुश करने में देरी लगभग 2ms है। इसके अलावा, वेबसॉकेट प्रोटोकॉल के लिंक को प्लेटफ़ॉर्म एक्सेस आवृत्ति द्वारा सीमित नहीं किया जाता है, और एक समय में दर्जनों ट्रेडिंग जोड़े की सदस्यता लेना संभव है।
एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म ने लंबे समय से वेबसॉकेट प्रोटोकॉल का समर्थन किया है, और कॉल करना अपेक्षाकृत सुविधाजनक है, लेकिन नौसिखिया उपयोगकर्ताओं के लिए, कई सदस्यताओं को संभालना, कई एक्सचेंज टिकरों की सदस्यता लेना और उन्हें कुशलतापूर्वक और सुविधाजनक रूप से एम्बेड करना अभी भी बहुत जटिल है। पूरी रणनीति प्रक्रिया में। यह सार्वजनिक वेबसॉकेट वास्तविक समय टिकर डेटा त्वरण टेम्पलेट इस समस्या को हल करता है। यह उपयोग करने में बहुत आसान है और वर्तमान कैप्सुलेट एपीआई कॉल के साथ पूरी तरह से संगत है। अधिकांश मूल आरईएसटी रणनीतियों के लिए, आप बस उन्हें संशोधित कर सकते हैं और अपनी रणनीति को तेज करने के लिए सीधे उनका उपयोग कर सकते हैं।
प्रमुख विशेषताएं:
ध्यान दें कि यह रणनीति टाइपस्क्रिप्ट का उपयोग करती है। यदि आप केवल जावास्क्रिप्ट से परिचित हैं, तो यह थोड़ा अजीब लग सकता है। टाइपस्क्रिप्ट जावास्क्रिप्ट पर आधारित एक टाइप सिस्टम और समृद्ध भाषा सुविधाओं को पेश करता है। मात्रात्मक व्यापार जैसे अनुप्रयोगों के लिए जिन्हें जटिल तर्क को संभालने की आवश्यकता होती है, टाइपस्क्रिप्ट का उपयोग करने से संभावित त्रुटियों को कम किया जा सकता है और कोड की पठनीयता और रखरखाव में सुधार हो सकता है। इसलिए, इसे संक्षेप में सीखने की सिफारिश की जाती है।
इसके अतिरिक्त, रणनीति FMZ प्लेटफॉर्म के असिंक्रोनस तंत्र का उपयोग करती है। चाइल्ड थ्रेड __threadPostMessage फ़ंक्शन के माध्यम से मुख्य थ्रेड को संदेश भेज सकता है। यह विधि असिंक्रोनस है और चाइल्ड थ्रेड में उत्पन्न डेटा अपडेट के मुख्य थ्रेड को सूचित करने के लिए उपयुक्त है। मुख्य थ्रेड और चाइल्ड थ्रेड __threadGetData और __threadSetData फ़ंक्शंस के माध्यम से डेटा साझा कर सकते हैं। यह विधि थ्रेडों को साझा राज्यों तक पहुंचने और संशोधित करने की अनुमति देती है। यदि आप प्लेटफॉर्म प्रलेखन के साथ संयुक्त मल्टीथ्रेडिंग के बारे में सीखना चाहते हैं, तो यह रणनीति भी एक अच्छा सीखने का उदाहरण है।
इस रणनीति का मुख्य सिद्धांत वेबसॉकेट के माध्यम से मुख्यधारा के डिजिटल मुद्रा एक्सचेंजों से जुड़ना और मात्रात्मक व्यापारिक निर्णयों के लिए डेटा समर्थन प्रदान करने के लिए वास्तविक समय में बाजार डेटा (जैसे गहराई की जानकारी और लेनदेन की जानकारी) प्राप्त करना है। विशिष्ट कार्यान्वयन प्रक्रिया निम्नानुसार हैः
1. वेबसॉकेट कनेक्शन सेटिंग्सकार्यsetupWebsocket
एक वेबसॉकेट कनेक्शन आरंभ करने और बाजार डेटा प्राप्त करने के लिए प्रयोग किया जाता है. यह एक पैरामीटर प्राप्त करता हैmain_exchanges
, जो कि कनेक्ट करने के लिए एक्सचेंज को इंगित करता है।
MyDial
कार्य: एक वेबसॉकेट कनेक्शन बनाएँ, कनेक्शन समय रिकॉर्ड करें, और कनेक्शन बंद होने पर बंद समय आउटपुट करें.updateSymbols
कार्य: नियमित रूप से जांचें कि क्या कोई नया सदस्यता अनुरोध है और यदि आवश्यक हो तो वर्तमान ट्रेडिंग जोड़ी सूची को अपडेट करें।2. डाटा प्रोसेसिंगवस्तुsupports
समर्थित एक्सचेंजों और उनके प्रसंस्करण कार्य (जैसेBinance
) प्रत्येक विनिमय के लिए प्रसंस्करण कार्य प्राप्त संदेश को पार्स करने और प्रासंगिक डेटा निकालने के लिए जिम्मेदार है।
processMsg
कार्य: एक्सचेंजों से संदेशों को प्रोसेस करें, विभिन्न प्रकार के डेटा (जैसे गहराई अपडेट, लेनदेन, आदि) की पहचान करें, और उन्हें एक एकीकृत घटना ऑब्जेक्ट में स्वरूपित करें।3. सब्सक्रिप्शन डेटाप्रत्येक कनेक्शन पर, प्रणाली वर्तमान ट्रेडिंग जोड़ी के आधार पर प्रासंगिक बाजार डेटा चैनलों की सदस्यता लेगी।
getFunction
कार्य: विनिमय नाम के अनुसार संबंधित प्रसंस्करण कार्य प्राप्त करें.this.wssPublic
कार्य: वेबसॉकेट कनेक्शन आरंभ करें और डेटा प्राप्त करना शुरू करें.4. थ्रेड प्रबंधनप्रत्येक एक्सचेंज के लिए एक थ्रेड शुरू करें, वास्तविक समय में डेटा प्राप्त करें और कॉलबैक कार्यों के माध्यम से डेटा संसाधित करें।
threadMarket
कार्य: एक बच्चे के धागे में डेटा प्राप्त करें, नवीनतम गहराई और लेनदेन की जानकारी को पार्स और स्टोर करें.5. डेटा अधिग्रहण विधि को फिर से लिखेंप्रत्येक एक्सचेंज के लिए गहराई और व्यापार जानकारी प्राप्त करने के तरीकों को फिर से लिखें, वास्तविक समय में अद्यतन किए गए डेटा को वापस करने को प्राथमिकता दें।
$.setupWebsocket()
लक्ष्य विनिमय के वेबसॉकेट कनेक्शन को आरंभ करने के लिए.GetDepth()
औरGetTrades()
कार्य, बाजार गहराई और लेनदेन रिकॉर्ड स्वचालित रूप से वेबसॉकेट वास्तविक समय डेटा का उपयोग करके लौटाए जाते हैं।यदि EventLoop() फ़ंक्शन को रणनीति में जोड़ा जाता है, तो इसे ट्रिगर तंत्र में बदल दिया जाएगा। जब wss डेटा अपडेट होता है, तो यह स्वचालित रूप से इसे तुरंत प्राप्त करेगा, और यदि कोई नवीनतम डेटा नहीं है तो प्रतीक्षा करें। यह एक बुद्धिमान स्लीप फ़ंक्शन के बराबर है। बेशक, आप सीधे स्लीप का भी उपयोग कर सकते हैं।
function main() {
$.setupWebsocket()
while (true) {
exchanges.map(e=>{
Log(e.GetName(), e.GetDepth())
Log(e.GetName(), e.GetTrades())
})
EventLoop(100) // trigger by websocket
}
}
मेरी पिछली बहु-मुद्रा व्यापार रणनीति गाइड देखेंःhttps://www.fmz.com/bbs-topic/10508, जिसे वेबसॉकेट का समर्थन करने के लिए आसानी से संशोधित किया जा सकता हैः
function MakeOrder() {
for (let i in Info.trade_symbols) {
let symbol = Info.trade_symbols[i];
let buy_price = exchange.GetDepth(symbol + '_USDT').Asks[0].Price;
let buy_amount = 50 / buy_price;
if (Info.position[symbol].value < 2000){
Trade(symbol, "buy", buy_price, buy_amount, symbol);
}
}
}
function OnTick() {
try {
UpdatePosition();
MakeOrder();
UpdateStatus();
} catch (error) {
Log("loop error: " + error);
}
}
function main() {
$.setupWebsocket()
InitInfo();
while (true) {
let loop_start_time = Date.now();
if (Date.now() - Info.time.last_loop_time > Info.interval * 1000) {
OnTick();
Info.time.last_loop_time = Date.now();
Info.time.loop_delay = Date.now() - loop_start_time;
}
Sleep(5);
}
}