Type/to search
3
Follow
1507
Followers
इन्वेंटर डिजिटल करेंसी क्वांटिटेटिव प्लेटफॉर्म वेबसॉकेट उपयोग गाइड (डायल फ़ंक्शन अपग्रेड के बाद विस्तृत विवरण)
FAQ
Created 2019-04-01 11:06:09  Updated 2019-12-04 10:41:25
 5
 6273

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

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

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

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

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

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

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

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

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

4. कनेक्टिविटी समस्याः

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

5. वेबसॉकेट का उपयोग करने के लिए सामान्य प्रोग्रामिंग फ्रेमवर्कः

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

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 डिकोड और डिकंप्रेस किया जा सकता है।

Related Recommendations
Comment
All comments (5)

    wss连接运行一段时间后,报“ json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)”这个错误,请问大神要如何处理?已经设置了自动重连,需要再手动写一个重连么@小草

    4 years ago

    解析错误,把消息打印出来看看,做个容错就行

    4 years ago

    收到,谢谢

    4 years ago

    币安永续合约为什么 连接完,定阅账户信息变动,一分钟后 read 就返回空了

    6 years ago

    因为币安规定,只有账号信息有变动时才会推送信息。是这样吧?

    5 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)