Pada asasnya semua pertukaran mata wang digital menyokong websocket untuk menghantar perdagangan, dan beberapa pertukaran menyokong websocket untuk mengemas kini maklumat akaun. Berbanding dengan rest API, websocket umumnya mempunyai kelewatan yang rendah, kekerapan yang tinggi, tidak terhad oleh batasan kekerapan platform rest API dan lain-lain. Kelemahan adalah terdapat masalah gangguan, pengendalian tidak intuitif.https://zhuanlan.zhihu.com/p/22693475
Artikel ini akan memaparkan mengenai platform kuantiti pada FMZ Inventor, menggunakan bahasa JavaScript, menggunakan fungsi Dial yang terbungkus platform untuk menyambung, penjelasan dan parameter dalam dokumen, mencari Dial, untuk mencapai pelbagai fungsi, fungsi Dial telah beberapa kali dikemas kini, yang akan diliputi oleh artikel ini dan memaparkan strategi yang didorong oleh peristiwa berdasarkan wss, dan masalah menyambung pelbagai bursa.
Secara amnya, anda boleh menyambung secara langsung, seperti untuk mendapatkan ticker keselamatan yang didorong:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Untuk data yang dikembalikan adalah format mampatan, yang diperlukan pada sambungan yang ditentukan, compress menetapkan format mampatan, mode mewakili menghantar data yang dikembalikan yang perlu dipadatkan, seperti sambungan OKEX:
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
Fungsi dial menyokong sambungan semula, yang dilakukan oleh bahasa Go yang mendasari, sambungan yang dikesan terputus akan disambung semula, sangat mudah digunakan untuk kandungan data permintaan yang sudah berada dalam url, seperti contoh yang baru-baru ini. Untuk orang yang perlu menghantar pesanan, anda boleh mengekalkan mekanisme sambungan semula sendiri.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Mesej langganan wss, permintaan dari beberapa bursa dalam url, dan beberapa saluran yang memerlukan 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 kitaran mati, anda boleh terus membaca, kodnya seperti 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 dipindahkan dengan cepat, lapisan bawah Go akan memanjakan semua data dalam antrean, sementara program memanggil read, dan kemudian kembali; sementara operasi seperti perintah bawah bot akan menyebabkan kelewatan, yang mungkin menyebabkan pengumpulan data. Untuk memajukan transaksi, memajukan akaun, memajukan nilai mendalam, dan lain-lain maklumat seperti itu, kita memerlukan data sejarah, untuk data pasaran, kebanyakan kes kita hanya berminat dengan data terkini, tidak peduli dengan data sejarah.
read ((() jika tidak ditambah parameter, akan mengembalikan data tertua, apabila tiada data disekat untuk kembali. Jika anda mahu data terkini, anda boleh menggunakan client.read (((-2) untuk mengembalikan data terkini dengan segera, tetapi apabila tiada data lagi, kembali kembali null, perlu menilai semula rujukan.
Berdasarkan cara merawat data lama yang disimpan, dan sama ada ia akan tersumbat apabila tidak ada data, read mempunyai parameter yang berbeza, seperti yang ditunjukkan di bawah, yang kelihatan rumit tetapi menjadikan program lebih fleksibel.
Dalam kes ini, prosedur jelas tidak boleh menggunakan read sederhana (), kerana satu pertukaran akan menyumbat mesej yang menunggu, di mana pertukaran lain tidak akan menerima walaupun ada 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) // 参数-1代表无数据立即返回null,不会阻塞到有数据返回
var msgCoinbase = coinbase.read(-1)
if(msgBinance){
// 此时币安有数据返回
}
if(msgCoinbase){
// 此时coinbase有数据返回
}
Sleep(1) // 可以休眠1ms
}
}
Bahagian ini agak rumit, kerana data push mungkin terganggu, atau penundaan push sangat tinggi, walaupun menerima denyutan jantung tidak menunjukkan data masih diteruskan, anda boleh menetapkan selang peristiwa, bersambung semula jika tidak menerima kemas kini melebihi selang, dan lebih baik untuk membandingkan hasil yang dikembalikan dengan masa dan rest untuk melihat sama ada data tersebut adalah tepat. Untuk kes khas seperti Bitcoin, anda boleh menetapkan sambung semula automatik secara langsung.
Oleh kerana telah menggunakan data push, program secara semula jadi juga ditulis sebagai pemacu peristiwa, berhati-hati untuk mendorong data dengan kerap, tidak menggunakan banyak permintaan yang menyebabkan penutupan, secara amnya boleh 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 sambungan websocket setiap bursa, cara menghantar data, kandungan yang boleh dilabel, format data sering berbeza, jadi platform tidak dibungkus, dan memerlukan sambungan sendiri dengan fungsi Dial. Artikel ini pada dasarnya merangkumi beberapa pertimbangan asas, jika ada soalan, selamat datang untuk bertanya.
PS. Sesetengah bursa walaupun tidak menawarkan pasaran websocket, tetapi sebenarnya menggunakan fungsi penyampaian laman web yang menggunakan fungsi penyampaian websocket, anda akan mendapati bahawa mereka menggunakan format langganan dan format pulangan. Sesetengahnya kelihatan seperti dienkripsi, yang dapat dilihat dengan base64 mengunci semula.
xaifer48wss sambungan berjalan untuk sementara waktu, melaporkan json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) menyiasat kesilapan ini, sila tanya bagaimana untuk menangani?
HaohaoJika anda mempunyai akaun yang berbayar, anda boleh membuat akaun yang berbayar, tetapi jika anda tidak mempunyai akaun yang berbayar, anda tidak boleh membuat akaun yang berbayar.
xaifer48Terima kasih.
RumputMengatasi kesilapan, cetak mesej, dan buat kesalahan.
Kekuatan KuantitiOleh kerana peraturan Binance, mesej hanya akan diteruskan apabila maklumat akaun berubah.