Pada dasarnya semua bursa mata uang digital mendukung pengiriman websocket, beberapa bursa mendukung informasi pembaruan akun websocket. Dibandingkan dengan rest API, websocket umumnya memiliki latensi rendah, frekuensi tinggi, tidak dibatasi oleh frekuensi rest API platform, dan sebagainya. Kelemahannya adalah ada masalah gangguan, penanganan tidak intuitif. https://zhuanlan.zhihu.com/p/22693475
Artikel ini akan membahas tentang Inventor Quantification Platform di FMZ, menggunakan bahasa JavaScript, menggunakan fungsi Dial yang terbungkus dalam platform untuk melakukan koneksi, spesifikasi dan parameter dalam dokumentasi, mencari Dial, fungsi Dial telah diperbarui beberapa kali untuk melakukan berbagai fungsi, artikel ini akan membahas ini, dan memperkenalkan strategi event-driven berbasis wss, serta masalah koneksi multi-exchange.
Biasanya koneksi langsung tersedia, seperti mendapatkan ticker keamanan mata uang:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Untuk data yang dikembalikan adalah format kompresi, perlu dihubungkan adalah ditentukan, compress menentukan format kompresi, modus mewakili mengirim data yang dikembalikan yang perlu dikompresi, seperti koneksi OKEX:
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
Fungsi dial mendukung koneksi ulang, yang dilakukan oleh bahasa Go yang mendasari, mendeteksi koneksi yang terputus dan melakukan koneksi ulang, sangat nyaman dan direkomendasikan untuk penggunaan untuk konten data yang telah diminta di url, seperti contoh Binance yang baru saja dilakukan. Untuk yang perlu mengirim pesan terdaftar, Anda dapat memelihara mekanisme koneksi ulang sendiri.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Untuk berlangganan berita wss, beberapa bursa meminta di url, dan ada juga saluran yang perlu berlangganan sendiri, seperti coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
Kode yang dapat dibaca secara terus menerus dalam loop mati adalah sebagai berikut:
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 dasar akan menyimpan semua data dalam antrian, seperti program yang dipanggil read, kemudian kembali secara berturut-turut. dan robot perintah operasi akan membawa penundaan, dapat menyebabkan akumulasi data. untuk transaksi push, push akun, depth insert push dan lain-lain, kita perlu data historis, untuk data situasi, kita hanya peduli dengan yang terbaru, tidak peduli tentang data historis.
read() jika tidak menambahkan parameter, akan mengembalikan data tertua, jika tidak ada data diblokir untuk dikembalikan. Jika ingin data terbaru, Anda dapat menggunakan client.read(-2) untuk segera mengembalikan data terbaru, tetapi jika tidak ada data kembali kembali null, perlu untuk menilai dan referensi.
Read memiliki parameter yang berbeda, tergantung pada bagaimana data lama yang di-cache diperlakukan, dan apakah data yang tidak terblokir, seperti gambar di bawah ini, terlihat rumit, tetapi membuat program lebih fleksibel.

Untuk situasi seperti ini jelas tidak dapat digunakan read () sederhana, karena satu bursa akan memblokir pesan yang sedang menunggu, sementara bursa lain tidak akan menerima pesan baru meskipun ada. Proses 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
}
}
Bagian pengolahan ini agak merepotkan, karena data push mungkin terganggu, atau penundaan push sangat tinggi, bahkan jika dapat menerima heartbeat tidak berarti data masih di-push, Anda dapat mengatur interval peristiwa, jika melebihi interval tidak menerima pembaruan akan terhubung kembali, dan yang terbaik adalah membandingkan hasil dengan rest kembali setelah beberapa waktu, untuk melihat apakah data akurat. Untuk situasi khusus ini, Anda dapat langsung mengatur koneksi ulang otomatis.
Karena telah menggunakan data push, program secara alami juga harus ditulis sebagai event drive, perhatikan bahwa data push sering, tanpa terlalu banyak permintaan menyebabkan pemblokiran, umumnya 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 koneksi websocket, cara pengiriman data, konten yang dapat berlangganan, dan format data seringkali berbeda di setiap bursa, sehingga platform tidak terbungkus dan perlu terhubung sendiri dengan fungsi Dial. Artikel ini mencakup beberapa hal dasar yang perlu diperhatikan, dan jika ada pertanyaan, silakan bertanya.
PS. Meskipun beberapa exchange tidak menyediakan websocket, namun sebenarnya ketika Anda masuk ke situs menggunakan fitur modding, Anda akan menemukan bahwa semua yang digunakan adalah websocket push, dan jika Anda meneliti, Anda akan menemukan format berlangganan dan format pengembalian. Beberapa terlihat seperti telah dienkripsi dan dapat didekripsi dengan base64 decoding.