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
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.
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"]}')
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,
Dalam kes ini, adalah jelas bahawa 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
}
}
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
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)
}
}
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.