आविष्कारक डिजिटल मुद्रा क्वांटिफिकेशन प्लेटफॉर्म वेबसॉकेट का उपयोग करने के लिए गाइड ((डायल फ़ंक्शन के उन्नयन के बाद विवरण)

लेखक:घास, बनाया गयाः 2019-04-01 11:06:09, अद्यतन किया गयाः 2019-12-04 10:41:25

मूल रूप से सभी डिजिटल मुद्रा एक्सचेंजों में वेबसॉकेट भेजने का समर्थन है, और कुछ एक्सचेंजों में वेबसॉकेट खाता जानकारी अपडेट करने का समर्थन है. वेबसॉकेट में सामान्य रूप से कम देरी, उच्च आवृत्ति, प्लेटफार्म के बिना, और अन्य बाधाएं हैं।https://zhuanlan.zhihu.com/p/22693475

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

1.websocket连接:

आम तौर पर, सीधे कनेक्ट करें, जैसे कि सिक्का सुरक्षा टिकर प्राप्त करेंः

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

लौटने वाले डेटा के लिए संपीड़ित प्रारूप है, जो कनेक्शन के दौरान निर्दिष्ट किया जाना चाहिए, संपीड़ित संपीड़ित प्रारूप निर्दिष्ट करता है, मोड उस डेटा को वापस भेजने के लिए प्रतिनिधित्व करता है जिसे संपीड़ित किया जाना चाहिए, जैसे कि कनेक्शन 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")

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

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

2.websocket读取:

आम तौर पर, मृत चक्र में पढ़ना जारी है, कोड इस प्रकार हैः

function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
    while (true) {
        var msg = client.read()
        var data = JSON.parse(msg) //把json字符串解析为可引用的object
// 处理data数据
    }
}

wss डेटा बहुत तेज़ गति से पुश किया जाता है, Go के निचले स्तर में सभी डेटा को कतार में रख दिया जाता है, और जब कोई प्रोग्राम read को कॉल करता है, तो यह क्रमशः वापस आ जाता है; जबकि रोबोट के नीचे की ओर जाने जैसे ऑपरेशन में देरी होती है, जिससे डेटा का संचय हो सकता है। लेनदेन पुश, खाता पुश, गहराई से प्लग इन पुश आदि के लिए, हमें ऐतिहासिक डेटा की आवश्यकता होती है, जबकि बाजार डेटा के लिए, हम ज्यादातर मामलों में केवल नवीनतम, ऐतिहासिक डेटा की परवाह नहीं करते हैं।

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

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

3. कई एक्सचेंजों के वेबसॉकेट को कनेक्ट करेंः

इस स्थिति के लिए प्रक्रिया में स्पष्ट रूप से सरल रीड () का उपयोग नहीं किया जा सकता है, क्योंकि एक एक्सचेंज प्रतीक्षा संदेशों को अवरुद्ध कर देता है, इस समय दूसरा एक्सचेंज नए संदेशों के साथ भी प्राप्त नहीं करेगा।

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) // 参数-1代表无数据立即返回null,不会阻塞到有数据返回
        var msgCoinbase = coinbase.read(-1)
        if(msgBinance){
            // 此时币安有数据返回
        }
        if(msgCoinbase){
            // 此时coinbase有数据返回
        }
        Sleep(1) // 可以休眠1ms
    }
}

4.断线重连问题:

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

5.使用websocket的一般程序框架:

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

var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
    if(Date.now() - tradeTime > 2000){//这里即限制了2s内只交易一次
        tradeTime = Date.now()
        //交易逻辑
    }
}
function GetAccount(){
    if(Date.now() - accountTime > 5000){//这里即限制了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)
    }
}

6.总结:

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

PS. कुछ एक्सचेंजों ने वेबसॉकेट बाजार की पेशकश नहीं की है, लेकिन वे वास्तव में वेबसॉकेट पुशिंग का उपयोग करते हैं। कुछ एक्सचेंजों में सब्सक्रिप्शन प्रारूप और रिटर्न प्रारूप दिखाई देते हैं। कुछ ऐसा दिखते हैं जैसे वे एन्क्रिप्टेड हैं, जिन्हें base64 डिकोडिंग के साथ फिर से अनक्राफ्ट किया जा सकता है।


संबंधित

अधिक

xaifer48wss कनेक्शन चलाने के कुछ समय के बाद, रिपोर्ट json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) इस त्रुटि को चिह्नित करता है, कृपया पूछें कि यह कैसे करना है?

हाओहाओबिनान स्थायी अनुबंध क्यों है, कनेक्शन के बाद, खाता जानकारी बदल जाती है, एक मिनट के बाद पढ़ना खाली हो जाता है?

xaifer48प्राप्त किया, धन्यवाद।

घासत्रुटि को हल करें, संदेश को प्रिंट करें, और एक गलती स्वीकार करें।

परिश्रम करनाक्योंकि बिनान के नियम के अनुसार, केवल तब ही संदेश भेजा जाता है जब खाते की जानकारी बदल जाती है।