Sumber daya yang dimuat... Pemuatan...

Panduan Penggunaan WebSocket Platform Kuantitatif Cryptocurrency FMZ (Penjelasan Rinci tentang Fungsi Panggilan yang Ditingkatkan)

Penulis:FMZ~Lydia, Dibuat: 2023-07-13 14:03:32, Diperbarui: 2024-01-03 21:05:36

img

Panduan Penggunaan WebSocket Platform Kuantitatif Cryptocurrency FMZ (Penjelasan Rinci tentang Fungsi Panggilan yang Ditingkatkan)

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 Dial. Untuk mencapai berbagai fungsi, fungsi Dial telah mengalami beberapa pembaruan, yang akan dibahas dalam artikel ini. Selain itu, juga akan membahas strategi event-driven berdasarkan WebSocket Secure (wss) dan masalah koneksi ke beberapa pertukaran.

Koneksi websocket:

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. compress digunakan untuk menentukan format kompresi, dan mode mewakili bagian data mana (baik mengirim atau mengembalikan) yang perlu dikompresi.

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"]}')

2. Bacaan Websocket

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, read memiliki parameter yang berbeda, seperti yang ditunjukkan dalam tabel di bawah ini, yang terlihat rumit, tetapi membuat program lebih fleksibel.

img

3. Menghubungkan dengan beberapa platform dengan Websocket

Dalam hal ini jelas bahwa hanya menggunakan read() tidak bekerja dalam program, karena satu platform akan memblokir pesan yang menunggu, dan platform lain tidak akan menerima bahkan jika ada pesan baru.

    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
        }
    }

4. Masalah Putus & Rekoneksi

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 rest setelah periode waktu, untuk melihat apakah data akurat. Untuk kasus khusus Binance, Anda dapat langsung mengatur koneksi ulang otomatis.

5. Menggunakan General Program Framework dari Websocket

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)
        }
    }

6. Kesimpulan

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.


Lebih banyak