Pada dasarnya semua pertukaran mata uang digital mendukung websocket pengiriman pasar, beberapa pertukaran mendukung websocket memperbarui informasi akun. Dibandingkan dengan rest API, websocket umumnya memiliki keterlambatan rendah, frekuensi tinggi, tidak dibatasi oleh platform rest API frekuensi dll.https://zhuanlan.zhihu.com/p/22693475
Artikel ini akan membahas tentang platform kuantitatif FMZ Inventor, penggunaan bahasa JavaScript, koneksi menggunakan fungsi Dial yang dikemas dalam platform, penjelasan dan parameter dalam dokumentasi, pencarian Dial, beberapa pembaruan fungsi Dial untuk mewujudkan berbagai fungsi, yang akan dibahas dalam artikel ini, dan strategi yang didorong oleh acara berbasis wss, serta masalah menghubungkan beberapa bursa.
Pada umumnya, Anda dapat langsung terhubung, seperti mendapatkan ticker keamanan yang didorong:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Untuk data yang dikembalikan adalah format yang dikompresi, yang diperlukan pada koneksi yang ditentukan, compress menetapkan format yang dikompresi, mode mewakili pengiriman 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 penyambungan ulang, yang dilakukan oleh bahasa Go yang mendasarinya, penyambungan yang terdeteksi terputus akan dihubungkan kembali, sangat mudah digunakan untuk konten data permintaan yang sudah ada di url, seperti contoh Binance yang baru-baru ini, sangat mudah digunakan. Untuk orang yang perlu mengirim pesan, Anda dapat mempertahankan mekanisme penyambungan ulang sendiri.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Subscribe to news.wss, beberapa permintaan dari bursa di url, dan beberapa saluran yang membutuhkan Anda untuk mengirim langganan sendiri, seperti Coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
Pada umumnya, dalam siklus kematian, kode yang dapat dibaca terus menerus 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, lapisan bawah Go akan menunda semua data yang ada di antrean, sementara program memanggil read, dan kemudian kembali; sementara operasi seperti daftar bawah robot akan menyebabkan penundaan, yang dapat menyebabkan akumulasi data. Untuk push transaksi, push akun, deep value push, dan lain-lain informasi seperti itu, kita membutuhkan data historis, untuk data pasar, sebagian besar kasus kita hanya peduli dengan data terbaru, tidak peduli dengan data historis.
Jika tidak menambahkan parameter, read ((() akan mengembalikan data tertua, dan jika tidak ada data, akan diblokir untuk kembali. Jika Anda ingin data terbaru, Anda dapat menggunakan client.read (((-2) untuk mengembalikan data terbaru segera, tetapi jika tidak ada data lagi, kembali ke null, Anda harus memutuskan untuk mengutip kembali.
Berdasarkan bagaimana data lama yang di-cache diperlakukan, dan apakah tidak ada data, read memiliki parameter yang berbeda, seperti yang ditunjukkan di bawah ini, yang terlihat rumit tetapi membuat program lebih fleksibel.
Untuk situasi ini, prosedur jelas tidak dapat menggunakan read sederhana (), karena satu pertukaran akan memblokir pesan yang menunggu, di mana pertukaran 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) // 参数-1代表无数据立即返回null,不会阻塞到有数据返回
var msgCoinbase = coinbase.read(-1)
if(msgBinance){
// 此时币安有数据返回
}
if(msgCoinbase){
// 此时coinbase有数据返回
}
Sleep(1) // 可以休眠1ms
}
}
Bagian ini lebih rumit karena data push dapat terganggu, atau waktu push sangat tinggi, bahkan jika menerima detak jantung tidak berarti data masih sedang dipindahkan, Anda dapat mengatur interval acara, jika melewati interval tidak menerima pembaruan, sambung kembali, dan sebaiknya perbandingan antara waktu dan hasil rest kembali untuk melihat apakah data tersebut akurat. Untuk kasus khusus seperti Bitcoin, Anda dapat langsung mengatur ulang otomatis.
Karena sudah menggunakan data push, program secara alami juga harus ditulis sebagai event driver, berhati-hatilah untuk mendorong data sering, agar tidak terlalu banyak permintaan menyebabkan tertutup, 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, format data dari masing-masing bursa sering berbeda, sehingga platform tidak terbungkus, dan perlu terhubung sendiri dengan fungsi Dial. Artikel ini pada dasarnya mencakup beberapa pertimbangan dasar, dan jika ada pertanyaan, silakan bertanya.
PS. Beberapa bursa meskipun tidak menawarkan pasar websocket, tetapi sebenarnya menggunakan fitur penyampaian situs yang menggunakan fitur penyampaian websocket.
xaifer48Setelah koneksi wss berjalan untuk sementara waktu, laporan json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) muncul.
HaohaoSetelah terhubung, membaca informasi akun berubah, dan satu menit kemudian membaca kembali kosong.
xaifer48Terima kasih.
RumputPeriksa kesalahan, cetak pesan, dan lakukan kesalahan.
Kekuatan KuantitasKarena menurut peraturan Binance, pesan hanya akan diteruskan jika ada perubahan informasi akun.