La mayoría de los intercambios de criptomonedas admiten el envío de datos de mercado a través de WebSocket, y algunos intercambios también admiten la actualización de la información de la cuenta a través de WebSocket.
Este artículo presentará principalmente el uso de la función Dial, que se encapsula en la plataforma FMZ Quant utilizando el lenguaje JavaScript. Las instrucciones y parámetros específicos se pueden encontrar en la documentación buscando
Una conexión directa suele ser suficiente, como obtener un ticker de seguridad de monedas:
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")
Cuando los datos devueltos están en formato comprimido, debe especificarse durante la conexión.
var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")
La función Dial admite la reconexión, que es manejada por el lenguaje Go subyacente. Se reconecta automáticamente cuando se detecta que una conexión está desconectada. Para los casos en que los datos de la solicitud ya están incluidos en la URL, como el ejemplo anterior con Binance, es muy conveniente y se recomienda usar. Sin embargo, para los casos en que se requiere enviar mensajes de suscripción, se recomienda mantener el mecanismo de reconexión manualmente.
var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")
Suscríbete a los mensajes de wss, algunos intercambios tienen solicitudes en la url, y también hay canales a los que necesitas enviar tus propias suscripciones, como coinbase:
client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
En general, se puede leer continuamente en un bucle infinito.
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
}
}
La velocidad de empuje de datos wss es muy rápida. La capa inferior de Golang almacenará en caché todos los datos en la cola, y cuando el programa lea las llamadas, los datos serán devueltos a su vez. Sin embargo, operaciones como la colocación de un pedido en el bot causarán demoras, lo que puede resultar en la acumulación de datos. Para información como el empuje de ejecución de operaciones, el empuje de cuenta e interpolación de profundidad, necesitamos los datos del historial. Para los datos del mercado de cotizaciones, en la mayoría de los casos, solo nos preocupamos por los datos más recientes, no por los datos del historial.
Si read() no agrega parámetros, devolverá los datos más antiguos y bloqueará hasta que no haya datos. Si desea los datos más recientes, puede usar client.read(-2) para devolver los datos más recientes inmediatamente, pero cuando no hay datos, devolverá null, que debe ser juzgado antes de la referencia.
Dependiendo de cómo manejar los datos almacenados en caché y si se bloquean cuando no hay datos,
En este caso, es obvio que simplemente usar
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
}
}
Esta parte del procesamiento es más problemática, ya que los datos de empuje pueden ser interrumpidos, o el retraso de empuje es extremadamente largo. Incluso si se puede recibir el latido del corazón, no significa que los datos todavía estén siendo empujados. Puede establecer un intervalo de eventos; si no se recibe ninguna actualización después del intervalo, vuelva a conectar; es mejor comparar los resultados devueltos por
Para los datos de empuje se ha utilizado, el programa se escribirá naturalmente como evento desencadenado; prestar atención a la frecuencia de datos de empuje, porque las solicitudes de alta frecuencia conducirá a ser bloqueado; en general se puede escribir:
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)
}
}
El método de conexión, el método de transmisión de datos, el contenido suscrito y el formato de datos del websocket en cada plataforma a menudo son diferentes, por lo que la plataforma no lo encapsula y necesita usar la función Dial para conectarse por sí misma.
PS: Aunque algunas plataformas no proporcionan citas de websocket, de hecho, cuando inicia sesión en el sitio web para usar la función de depuración, encontrará que todos están usando el empuje de websocket.