Sebagian besar pertukaran cryptocurrency mendukung pengiriman data pasar melalui WebSocket, dan beberapa pertukaran juga mendukung pembaruan informasi akun melalui WebSocket. Dibandingkan dengan REST API, WebSocket umumnya memiliki latensi yang lebih rendah, frekuensi yang lebih tinggi, dan tidak tunduk pada batas tingkat API istirahat platform. Namun, ia memiliki kelemahan gangguan potensial dan penanganan yang kurang intuitif.
Artikel ini terutama akan memperkenalkan penggunaan fungsi Dial, yang dikelompokan dalam Platform FMZ Quant menggunakan bahasa JavaScript. Instruksi dan parameter spesifik dapat ditemukan dalam dokumentasi dengan mencari
Koneksi langsung biasanya cukup, seperti mendapatkan penekan keamanan koin:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Ketika data yang dikembalikan dalam format terkompresi, data tersebut perlu ditentukan selama koneksi.
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
Fungsi Dial mendukung reconnection, yang ditangani oleh bahasa Go yang mendasarinya. Fungsi ini secara otomatis terhubung kembali ketika koneksi terdeteksi terputus. Untuk kasus di mana data permintaan sudah termasuk dalam URL, seperti contoh sebelumnya dengan Binance, sangat nyaman dan disarankan untuk digunakan. Namun, untuk kasus di mana perlu mengirim pesan langganan, disarankan untuk mempertahankan mekanisme reconnection secara manual.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Langganan pesan wss, beberapa bursa memiliki permintaan di url, dan ada juga saluran yang Anda butuhkan untuk mengirim langganan Anda sendiri, seperti coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
Secara umum, dapat dibaca terus menerus dalam loop tak terbatas.
function main() {
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
while (true) {
var msg = client.read()
var data = JSON.parse(msg) // Parse json strings into quotable objects
// Process data
}
}
Kecepatan push data wss sangat cepat. Lapisan bawah Golang akan cache semua data dalam antrian, dan ketika panggilan program dibaca, data akan dikembalikan secara bergantian. Namun, operasi seperti menempatkan pesanan pada bot akan menyebabkan keterlambatan, yang dapat mengakibatkan akumulasi data. Untuk informasi seperti push eksekusi perdagangan, push akun, dan push interpolasi kedalaman, kita membutuhkan data riwayat. Untuk data pasar kutipan, dalam kebanyakan kasus, kita hanya peduli dengan data terbaru, bukan data riwayat.
Jika read() tidak menambahkan parameter, itu akan mengembalikan data tertua, dan memblokir sampai kembali ketika tidak ada data. Jika Anda ingin data terbaru, Anda dapat menggunakan client.read(-2) untuk mengembalikan data terbaru segera, tetapi ketika tidak ada data, itu akan mengembalikan null, yang perlu dinilai sebelum referensi.
Tergantung pada cara menangani data cache lama dan apakah itu diblokir ketika tidak ada data,
Dalam hal ini jelas bahwa hanya menggunakan
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) // Parameter -1 represents no data and return null immediately; it will not occur that being blocked before there is data to be returned
var msgCoinbase = coinbase.read(-1)
if(msgBinance){
// at this time, Binance has data to return
}
if(msgCoinbase){
// at this time, coinbase has data to return
}
Sleep(1) // Sleep for 1 millisecond
}
}
Bagian pemrosesan ini lebih merepotkan, karena data push dapat terganggu, atau penundaan push sangat lama. Bahkan jika detak jantung dapat diterima, itu tidak berarti data masih didorong. Anda dapat mengatur interval acara; jika tidak ada pembaruan yang diterima setelah interval, sambung kembali; yang terbaik adalah membandingkan hasil yang dikembalikan oleh
Untuk data push telah digunakan, program secara alami akan ditulis sebagai event-triggered; perhatikan frekuensi data push, karena permintaan frekuensi tinggi akan menyebabkan diblokir; umumnya Anda dapat menulis:
var tradeTime = Date.now()
var accountTime = Date.now()
function trade(data){
if(Date.now() - tradeTime > 2000){//Here it limits only one trade in 2 seconds
tradeTime = Date.now()
// Trading logic
}
}
function GetAccount(){
if(Date.now() - accountTime > 5000){//Here it limits GetAccount only once in 5 seconds
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)
}
}
Metode koneksi, metode transmisi data, konten langganan dan format data websocket pada setiap platform sering berbeda, sehingga platform tidak mengkapsulkannya dan perlu menggunakan fungsi Dial untuk terhubung sendiri.
PS: Meskipun beberapa platform tidak menyediakan kutipan websocket, pada kenyataannya, ketika Anda masuk ke situs web untuk menggunakan fungsi debugging, Anda akan menemukan bahwa mereka semua menggunakan websocket push.