Guía de uso de la plataforma de cuantificación de moneda digital websocket (más detalles después de la actualización de la función Dial)

El autor:Las hierbas, Creado: 2019-04-01 11:06:09, Actualizado: 2019-12-04 10:41:25

Básicamente, todos los intercambios de moneda digital apoyan el envío de websocket, y algunos intercambios apoyan el websocket para actualizar la información de la cuenta. Comparado con rest API, el websocket generalmente tiene una baja latencia, una alta frecuencia y no tiene límites de frecuencia de rest API.https://zhuanlan.zhihu.com/p/22693475

Este artículo se centrará principalmente en la plataforma de cuantificación de inventores de FMZ, el uso del lenguaje JavaScript, la conexión con la función Dial envuelta en la plataforma, las especificaciones y los parámetros en la documentación, la búsqueda de Dial, la función Dial ha sido actualizada varias veces para implementar varias funciones, y este artículo cubrirá esto, y presentará las estrategias impulsadas por eventos basadas en wss, así como los problemas de conexión de múltiples intercambios.

1.websocket连接:

En general, se puede conectar directamente para obtener el ticker de seguridad de la moneda:

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

Para que los datos devueltos sean de formato comprimido, lo que se necesita en la conexión es lo que se especifica, compress especifica el formato de compresión, el modo representa el envío de los datos devueltos que se necesitan comprimir, como en la conexión OKEX:

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

La función Dial admite la reconexión, realizada por el lenguaje Go subyacente, la conexión de detección se desconecta y se vuelve a conectar, muy conveniente para el contenido de los datos solicitados que ya están en la url, como el ejemplo de Binance, que se recomienda usar.

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

Los mensajes de suscripción a WSS, las solicitudes de algunos intercambios están en la url, también hay algunos canales que requieren enviar sus propios mensajes de suscripción, como Coinbase:

client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')

2.websocket读取:

En general, en el ciclo de la muerte se puede leer continuamente, el código es el siguiente:

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

La velocidad de transferencia de datos de wss es muy rápida, la parte inferior de Go retrasa todos los datos en la cola, para que el programa llame read, y luego regresa; mientras que las operaciones de orden de abajo del robot pueden causar un retraso, lo que puede causar acumulación de datos. Para la transferencia de transacciones, la transferencia de cuentas, la transferencia de inserciones de profundidad, etc., necesitamos datos históricos.

read ((() devuelve los datos más antiguos si no se agregan parámetros, y bloquea la devolución cuando no hay datos. Si desea datos más recientes, puede usar el cliente.read (((-2) para devolver los datos más recientes de inmediato, pero devuelve null cuando ya no hay datos, y debe decidir si se vuelve a referir.

Dependiendo de cómo se trate los datos viejos almacenados en el caché y si se bloquean cuando no hay datos, read tiene diferentes parámetros, como se muestra a continuación, que parecen complicados, pero que hacen que el programa sea más flexible.img

3. Conectar el websocket de varias bolsas:

Para este caso, el procedimiento no puede utilizarse con un simple read (), ya que un intercambio bloqueará el mensaje en espera, en este caso, otro intercambio no recibirá el mensaje aunque haya un nuevo mensaje. El procedimiento general es:

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

4.断线重连问题:

Esta parte de la gestión es más problemática, ya que los datos de impulso pueden ser interrumpidos, o el tiempo de impulso es extremadamente alto, incluso si se puede recibir un latido cardíaco, no significa que los datos estén siendo impulsados, se puede establecer un intervalo de eventos, se vuelve a conectar si no se recibe ninguna actualización si se supera el intervalo, y lo mejor es que se comparen los resultados de retorno de un tiempo y rest para ver si los datos son exactos.

5.使用websocket的一般程序框架:

Debido a que ya se han utilizado los datos de empuje, los programas también se escriben como event drivers, teniendo en cuenta que se empujan datos con frecuencia, sin que se produzcan demasiadas solicitudes que provoquen el cierre, generalmente se puede escribir:

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

6.总结:

El modo de conexión del websocket, el modo de envío de datos, el contenido suscriptible y el formato de datos de los diferentes intercambios suelen ser diferentes, por lo que la plataforma no se envuelve y se requiere una conexión automática con la función Dial.

PS. Algunos intercambios, aunque no ofrecen el mercado de websocket, en realidad utilizan la función de tono para acceder a su sitio web.


Relacionados

Más.

- ¿ Qué es eso?wss conexión después de un tiempo de funcionamiento, el reporte de json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) El reporte de este error, por favor, pregunte a Dios qué hacer con él?

- ¿ Qué?¿Por qué el contrato permanente de Binance? Después de conectarse, la información de la cuenta cambia, y después de un minuto read vuelve a estar vacía.

- ¿ Qué es eso?Recibido, gracias.

Las hierbasEn la actualidad, la mayoría de los usuarios de Facebook están usando el sistema de mensajería móvil para resolver errores, imprimir mensajes y hacer un error.

El esfuerzo por cuantificarEn el caso de los usuarios de Bitcoin, la información de la cuenta se emite sólo cuando hay un cambio en la información.