मूल रूप से सभी डिजिटल मुद्रा एक्सचेंज वेबसॉकेट भेजने की स्थिति का समर्थन करते हैं, कुछ एक्सचेंज वेबसॉकेट अपडेट खाता जानकारी का समर्थन करते हैं। Rest API की तुलना में, वेबसॉकेट में आमतौर पर कम विलंबता, उच्च आवृत्ति होती है, प्लेटफ़ॉर्म Rest API आवृत्ति प्रतिबंधों से मुक्त होती है, इसके साथ-साथ, नुकसान यह है कि इसमें रुकावट की समस्या होती है, और इसे संभालना सहज नहीं होता है। https://zhuanlan.zhihu.com/p/22693475
इस लेख में मुख्य रूप से एफएमजेड के आविष्कारक की संख्यात्मक प्लेटफ़ॉर्म के बारे में बताया जाएगा, जो जावास्क्रिप्ट भाषा का उपयोग करता है, जो प्लेटफ़ॉर्म के साथ संलग्न डायल फ़ंक्शन का उपयोग करता है, और दस्तावेज़ में विवरण और पैरामीटर, डायल खोजें, विभिन्न प्रकार की सुविधाओं को लागू करने के लिए डायल फ़ंक्शन को कई बार अपडेट किया गया है। इस लेख में इसे कवर किया जाएगा, और डब्ल्यूएसएस-आधारित घटना-संचालित रणनीतियों के बारे में बताया जाएगा, साथ ही साथ कई एक्सचेंजों को जोड़ने की समस्या।
आम तौर पर, यह सीधे कनेक्ट करने के लिए होता है, जैसे कि सिक्का सुरक्षा टिकर भेजने के लिएः
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"]}')
सामान्यतः मृत चक्र में लगातार पढ़ा जा सकता है, कोड इस प्रकार है:
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 में विभिन्न पैरामीटर होते हैं, जो कैश किए गए पुराने डेटा के साथ कैसे व्यवहार करते हैं, और क्या यह बिना डेटा के अवरुद्ध हो जाता है, जैसा कि नीचे दिखाया गया है, जो जटिल दिखता है, लेकिन प्रोग्राम को अधिक लचीला बनाता है।

इस स्थिति के लिए प्रक्रिया में स्पष्ट रूप से सरल 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
}
}
इस भाग को संभालना थोड़ा मुश्किल है, क्योंकि डेटा को आगे बढ़ाया जा सकता है, या देरी बहुत अधिक है, भले ही दिल की धड़कन प्राप्त करने का मतलब यह नहीं है कि डेटा अभी भी आगे बढ़ रहा है, एक घटना अंतराल सेट किया जा सकता है, यदि अंतराल से अधिक अपडेट प्राप्त नहीं किया गया है, तो फिर से कनेक्ट करें, और यह देखने के लिए कि क्या डेटा सटीक है या नहीं, यह देखने के लिए कि कुछ समय के बाद और बाकी के परिणामों की तुलना करना सबसे अच्छा है। इस विशेष स्थिति के लिए, सीधे स्वचालित रूप से फिर से कनेक्ट करें।
चूंकि पुश डेटा का उपयोग किया गया है, इसलिए प्रोग्राम को स्वाभाविक रूप से इवेंट ड्राइव के रूप में लिखा जाना चाहिए, ध्यान दें कि पुश डेटा अक्सर होता है, बहुत अधिक अनुरोधों के बिना बंद हो जाता है, आमतौर पर इसे लिखा जा सकता हैः
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)
}
}
विभिन्न एक्सचेंजों के वेबसॉकेट का कनेक्शन तरीका, डेटा भेजने का तरीका, सदस्यता योग्य सामग्री, डेटा प्रारूप अक्सर अलग-अलग होते हैं, इसलिए प्लेटफ़ॉर्म को पैकेज नहीं किया जाता है, डायल फ़ंक्शन का उपयोग करके स्वचालित रूप से कनेक्ट करने की आवश्यकता होती है। यह लेख कुछ बुनियादी सावधानियों को कवर करता है, यदि कोई प्रश्न है, तो पूछने के लिए आपका स्वागत है।
PS. कुछ एक्सचेंजों ने वेबसॉकेट ट्रेडिंग की पेशकश नहीं की है, लेकिन वास्तव में वेबसॉकेट पुशिंग का उपयोग करके साइट पर लॉग इन किया गया है, जो सब्सक्रिप्शन प्रारूप और रिटर्न प्रारूप का उपयोग करता है। कुछ ऐसा लगता है कि यह एन्क्रिप्टेड है और इसे base64 डिकोड और डिकंप्रेस किया जा सकता है।