एफएमजेड क्रिप्टोक्यूरेंसी मात्रात्मक प्लेटफार्म वेबसॉकेट उपयोग गाइड (अपग्रेड डायल फ़ंक्शन की विस्तृत व्याख्या)

लेखक:लिडिया, बनाया गयाः 2023-07-13 14:03:32, अद्यतनः 2024-01-03 21:05:36

img

एफएमजेड क्रिप्टोक्यूरेंसी मात्रात्मक प्लेटफार्म वेबसॉकेट उपयोग गाइड (अपग्रेड डायल फ़ंक्शन की विस्तृत व्याख्या)

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

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

1. वेबसॉकेट कनेक्शनः

एक सीधा कनेक्शन आमतौर पर पर्याप्त होता है, जैसे कि सिक्का सुरक्षा टिकर पुश प्राप्त करनाः

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")

जब लौटाए गए डेटा संपीड़ित प्रारूप में होते हैं, तो इसे कनेक्शन के दौरान निर्दिष्ट करने की आवश्यकता होती है। संपीड़न प्रारूप को निर्दिष्ट करने के लिए compress का उपयोग किया जाता है, और mode डेटा के किस भाग (या तो भेजने या वापस करने) को संपीड़ित करने की आवश्यकता होती है। उदाहरण के लिए, OKEX से कनेक्ट करते समय, निम्नलिखित का उपयोग किया जा सकता हैः

var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")

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

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

wss संदेशों की सदस्यता लें, कुछ एक्सचेंजों में यूआरएल में अनुरोध हैं, और ऐसे चैनल भी हैं जिन्हें आपको अपनी सदस्यता भेजने की आवश्यकता है, जैसे कि सिक्काबेसः

client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')

2. वेबसॉकेट पढ़ें

आम तौर पर, इसे अनंत लूप में लगातार पढ़ा जा सकता है। कोड इस प्रकार है:

function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
    while (true) {
        var msg = client.read()
        var data = JSON.parse(msg) // Parse json strings into quotable objects 
// Process data 
    }
}

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

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

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

img

3. वेबसॉकेट द्वारा कई प्लेटफार्मों से कनेक्ट करना

इस मामले में यह स्पष्ट है कि read() का उपयोग करना प्रोग्राम में काम नहीं करता है, क्योंकि एक प्लेटफ़ॉर्म प्रतीक्षा संदेशों को ब्लॉक करेगा, और दूसरा प्लेटफ़ॉर्म नए संदेश होने पर भी प्राप्त नहीं करेगा। सामान्य प्रसंस्करण विधि हैः

    function main() {
        var binance = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
        var coinbase = Dial("wss://ws-feed.pro.coinbase.com", 60)
        coinbase.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
        while (true) {
            var msgBinance = binance.read(-1) // Parameter -1 represents no data and return null immediately; it will not occur that being blocked before there is data to be returned 
            var msgCoinbase = coinbase.read(-1)
            if(msgBinance){
                // at this time, Binance has data to return 
            }
            if(msgCoinbase){
                // at this time, coinbase has data to return 
            }
            Sleep(1) // Sleep for 1 millisecond
        }
    }

4. डिस्कनेक्शन और रीकनेक्शन समस्याएं

प्रसंस्करण का यह भाग अधिक कष्टप्रद है, क्योंकि पुश डेटा बाधित हो सकता है, या पुश देरी बेहद लंबी है। भले ही दिल की धड़कन प्राप्त की जा सके, इसका मतलब यह नहीं है कि डेटा अभी भी पुश किया जा रहा है। आप एक घटना अंतराल सेट कर सकते हैं; यदि अंतराल के बाद कोई अपडेट प्राप्त नहीं होता है, तो फिर से कनेक्ट करें; यह देखने के लिए कि डेटा सटीक है या नहीं, यह देखने के लिए समय की अवधि के बाद rest द्वारा लौटे परिणामों की तुलना करना सबसे अच्छा है। बिनेंस के विशेष मामलों के लिए, आप सीधे स्वचालित पुनः कनेक्ट सेट कर सकते हैं।

5. वेबसॉकेट के जनरल प्रोग्राम फ्रेम का प्रयोग करना

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

    var tradeTime = Date.now()
    var accountTime = Date.now()
    function trade(data){
        if(Date.now() - tradeTime > 2000){//Here it limits only one trade in 2 seconds 
            tradeTime = Date.now()
            // Trading logic
        }
    }
    function GetAccount(){
        if(Date.now() - accountTime > 5000){//Here it limits GetAccount only once in 5 seconds 
            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)
        }
    }

6. निष्कर्ष

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

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


अधिक