Panduan Penggunaan WebSocket Platform Kuantitatif FMZ Cryptocurrency (Penjelasan terperinci mengenai fungsi mengetuk yang dinaik taraf)

Penulis:Lydia, Dicipta: 2023-07-13 14:03:32, Dikemas kini: 2024-01-03 21:05:36

img

Panduan Penggunaan WebSocket Platform Kuantitatif FMZ Cryptocurrency (Penjelasan terperinci mengenai fungsi mengetuk yang dinaik taraf)

Kebanyakan pertukaran cryptocurrency menyokong menghantar data pasaran melalui WebSocket, dan beberapa pertukaran juga menyokong mengemas kini maklumat akaun melalui WebSocket. Berbanding dengan REST API, WebSocket umumnya mempunyai latensi yang lebih rendah, kekerapan yang lebih tinggi, dan tidak tertakluk kepada had kadar API rehat platform. Walau bagaimanapun, ia mempunyai kelemahan gangguan yang berpotensi dan pengendalian yang kurang intuitif.

Artikel ini terutamanya akan memperkenalkan penggunaan fungsi Dial, yang dikemas dalam Platform Kuantum FMZ menggunakan bahasa JavaScript. Arahan dan parameter khusus boleh didapati dalam dokumentasi dengan mencari Dial. Untuk mencapai pelbagai fungsi, fungsi Dial telah mengalami beberapa kemas kini, yang akan dilindungi dalam artikel ini. Selain itu, ia juga akan membincangkan strategi yang didorong peristiwa berdasarkan WebSocket Secure (wss) dan isu menyambung ke pelbagai pertukaran.

Sambungan websocket:

Sambungan langsung biasanya mencukupi, seperti mendapatkan dorongan ticker keselamatan syiling:

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")

Apabila data yang dikembalikan adalah dalam format dimampatkan, ia perlu ditentukan semasa sambungan. compress digunakan untuk menentukan format pemampatan, dan mode mewakili mana bahagian data (sama ada menghantar atau mengembalikan) yang perlu dimampatkan. Sebagai contoh, apabila menyambung ke OKEX, berikut boleh digunakan:

var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")

Fungsi Dial menyokong sambungan semula, yang ditangani oleh bahasa Go yang mendasari. Ia secara automatik menyambung semula apabila sambungan dikesan untuk dipotong. Untuk kes di mana data permintaan sudah termasuk dalam URL, seperti contoh sebelumnya dengan Binance, ia sangat mudah dan disyorkan untuk digunakan. Walau bagaimanapun, untuk kes di mana menghantar mesej langganan diperlukan, disyorkan untuk mengekalkan mekanisme sambungan semula secara manual.

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")

Langganan mesej wss, beberapa pertukaran mempunyai permintaan dalam url, dan terdapat juga saluran yang anda perlu menghantar 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. Websocket Baca

Secara amnya, ia boleh dibaca secara berterusan dalam gelung yang tidak berkesudahan.

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

kelajuan push data wss sangat cepat. lapisan bawah Golang akan cache semua data dalam antrian, dan apabila panggilan program dibaca, data akan dikembalikan. Walau bagaimanapun, operasi seperti meletakkan pesanan pada bot akan menyebabkan kelewatan, yang mungkin mengakibatkan pengumpulan data. Untuk maklumat seperti dorongan pelaksanaan perdagangan, dorongan akaun, dan dorongan interpolasi kedalaman, kita memerlukan data sejarah. Untuk data pasaran sebut harga, dalam kebanyakan kes, kita hanya peduli dengan data terkini, bukan data sejarah.

Jika read() tidak menambah parameter, ia akan mengembalikan data tertua, dan menyekat sehingga kembali apabila tidak ada data. Jika anda mahu data terkini, anda boleh menggunakan client.read(-2) untuk mengembalikan data terkini dengan segera, tetapi apabila tidak ada data, ia akan mengembalikan null, yang perlu dinilai sebelum rujukan.

Bergantung pada cara menangani data cache lama dan sama ada ia disekat apabila tidak ada data, read mempunyai parameter yang berbeza, seperti yang ditunjukkan dalam jadual di bawah, yang kelihatan rumit, tetapi menjadikan program lebih fleksibel.

img

3. Sambungan dengan pelbagai platform oleh Websocket

Dalam kes ini, adalah jelas bahawa hanya menggunakan read() tidak berfungsi dalam program, kerana satu platform akan menyekat mesej menunggu, dan platform lain tidak akan menerima walaupun terdapat mesej 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 Penghentian & Sambungan Kembali

Bahagian pemprosesan ini lebih menyusahkan, kerana data push mungkin terganggu, atau kelewatan push sangat lama. Walaupun detak jantung dapat diterima, itu tidak bermakna data masih didorong. Anda boleh menetapkan selang acara; jika tidak ada kemas kini yang diterima selepas selang waktu, sambung semula; adalah lebih baik untuk membandingkan hasil yang dikembalikan oleh rest selepas tempoh masa, untuk melihat sama ada data itu tepat. Untuk kes khas Binance, anda boleh secara langsung menetapkan sambungan semula automatik.

5. Menggunakan Bingkai Program Umum Websocket

Untuk data dorong telah digunakan, program secara semula jadi akan ditulis sebagai acara-dihidupkan; memberi perhatian kepada kekerapan data dorong, kerana permintaan frekuensi tinggi akan menyebabkan disekat; secara amnya anda boleh 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

Kaedah sambungan, kaedah penghantaran data, kandungan langganan dan format data websocket pada setiap platform sering berbeza, jadi platform tidak mengkapsulkannya dan perlu menggunakan fungsi Dial untuk menyambung sendiri.

PS: Walaupun beberapa platform tidak menyediakan petikan websocket, sebenarnya, apabila anda log masuk ke laman web untuk menggunakan fungsi debugging, anda akan mendapati bahawa mereka semua menggunakan websocket push.


Lebih lanjut