Pada dasarnya semua bursa mata wang digital menyokong keadaan penghantaran websocket, beberapa bursa menyokong maklumat kemas kini akaun websocket. Berbanding dengan Rest API, websocket umumnya mempunyai kelewatan yang rendah, frekuensi tinggi, tidak terhad kepada frekuensi Rest API platform, dan sebagainya. Kelemahannya adalah masalah gangguan, pengendalian tidak intuitif. https://zhuanlan.zhihu.com/p/22693475
Artikel ini akan memberi tumpuan kepada platform kuantitatif pencipta FMZ, menggunakan bahasa JavaScript, menggunakan fungsi dial yang terbungkus dalam platform untuk menyambung, spesifikasi dan parameter dalam dokumentasi, mencari dial, fungsi dial telah diperbaharui beberapa kali untuk melaksanakan pelbagai fungsi, artikel ini akan merangkumi ini, dan memperkenalkan strategi yang didorong oleh peristiwa berdasarkan wss, dan masalah menyambung pelbagai bursa.
Secara amnya, ia boleh disambungkan secara langsung, seperti menghantar ticker keselamatan mata wang:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Untuk data yang dikembalikan adalah format mampatan, anda perlu menentukan format mampatan pada sambungan, compress menentukan format mampatan, mod mewakili menghantar data yang dikembalikan yang memerlukan mampatan, seperti sambungan OKEx:
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
Fungsi dial menyokong penyambungan semula, dilakukan oleh bahasa Go yang mendasar, penyambungan semula penyambungan penyambungan yang terdeteksi, sangat mudah dan disyorkan untuk kandungan data permintaan yang sudah ada di url, seperti contoh Binance baru-baru ini. Untuk yang perlu menghantar pesanan pesanan, anda boleh mengekalkan mekanisme penyambungan semula.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Untuk mendapatkan maklumat lanjut, anda perlu mendaftar ke saluran yang anda ingin langgan, seperti Coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
Kod yang boleh dibaca secara berterusan dalam kitaran mati ialah:
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 data push sangat cepat, Go lapisan bawah akan menyimpan semua data dalam barisan, seperti program panggilan read, dan kemudian kembali. Dan robot perintah operasi akan membawa kelewatan, yang boleh menyebabkan pengumpulan data. Untuk transaksi push, push akaun, push nilai mendalam dan lain-lain, kita memerlukan data sejarah, untuk data keadaan, kita kebanyakannya hanya peduli dengan yang terkini, tidak peduli dengan data sejarah.
read() jika tidak ditambah parameter, akan mengembalikan data tertua, jika tiada data diblokir untuk dikembalikan. Jika ingin data terkini, anda boleh menggunakan client.read(-2) segera mengembalikan data terkini, tetapi apabila tiada data kembali null, perlu menilai dan merujuk.
Read mempunyai parameter yang berbeza bergantung pada bagaimana ia menangani data lama yang disimpan dalam cache, dan sama ada ia tersumbat apabila tiada data, seperti gambar di bawah, yang kelihatan rumit, tetapi menjadikan program lebih fleksibel.

Dalam kes ini, prosedur jelas tidak dapat digunakan dengan read () mudah, kerana satu bursa akan menyekat mesej yang sedang menunggu, sementara bursa lain tidak akan menerima mesej baru walaupun ada. Kaedah rawatan umum adalah:
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
}
}
Bahagian ini agak rumit, kerana data push mungkin terputus, atau penundaan push sangat tinggi, walaupun dapat menerima heartbeat tidak bermakna data masih diarahkan, anda boleh menetapkan selang peristiwa, jika melebihi selang tidak menerima kemas kini, sambung semula, dan sebaiknya perbandingan dengan hasil yang dikembalikan oleh rest untuk melihat apakah data itu tepat. Untuk keadaan khusus seperti ini, anda boleh menetapkan sambungan semula secara automatik secara langsung.
Oleh kerana data push telah digunakan, program secara semula jadi juga harus ditulis sebagai pemandu peristiwa, perhatikan bahawa data push sering, tanpa terlalu banyak permintaan yang menyebabkan penutupan, biasanya dapat ditulis sebagai:
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)
}
}
Cara sambungan websocket, cara menghantar data, kandungan yang boleh melanggan, dan format data sering berbeza di setiap bursa, jadi platform tidak dibungkus dan perlu disambungkan sendiri dengan fungsi dial. Artikel ini meliputi beberapa perkara asas yang perlu diperhatikan, dan jika ada soalan, sila tanyakan.
PS. Sesetengah bursa walaupun tidak menyediakan websocket, tetapi sebenarnya menggunakan fungsi modem untuk masuk ke laman web, anda akan dapati bahawa mereka menggunakan push websocket, dan jika anda mengkaji, anda akan mendapati format langganan dan format pulangan.