domingo, 30 de enero de 2022

Creando un WebSocket en la API de Binance con Python - Día 2

En esta segundo articulo del blog, vamos a crear un WebSocket que conecte con la API de Binance. 

Seguramente tú ya lo sabes, pero en el momento de realizar este ejercicio no tenia claro lo que era un WebSocket, así que si tú ya lo sabes, puedes saltarte este apartado. 

Qué es un WebSocket? 

Un WebSockets es una sesión de comunicación interactiva entre el navegador del usuario y un servidor. Usando esta sesión con la API de Binance, puedo enviar mensajes a un servidor y  recibir respuestas controladas por eventos.

Antes de empezar

Antes de empezar a jugar con el código, recuerda que tienes que importar las librerias de Binance, cargar las claves de la API e iniciar el Cliente. 

# Importar librerias
import binance 
from binance.client import Client

# Cargar claves de variables de OS y crear objeto Cliente
import os
api_key = os.environ.get('binance_api')
api_secret = os.environ.get('binance_secret')
client = Client(api_key, api_secret)
# si quieres usar la API de TESTNET en vez de la del entorno real
client.API_URL = 'https://testnet.binance.vision/api'

En la última línea se usa para acceder a la API de Testnet de Binance en vez de la del entorno real.


Crear un WebSocket para obtener el último precio


El websocket de Binance permite que solo con enviar un comando se cree un canal que reciba el último precio de un token.

Primero vamos a necesitar importar la clase ThreadedSocketManager y la función sleep del modulo de time . 

from time import sleep from binance import ThreadedWebsocketManager
El siguiente paso es crear un diccionario que alojara los datos del último precio e indicará si existe algun problema con el websocket. 
btc_price = {'error':False}
def btc_trade_history(msg):
    ''' define how to process incoming WebSocket messages '''
    if msg['e'] != 'error':
	print(msg['c'])
	btc_price['last'] = msg['c']
	btc_price['bid'] = msg['b']
	btc_price['last'] = msg['a']
	btc_price['error'] = False
    else:
        btc_price['error'] = True

Estamos almacenando algunos elementos en el diccionario para poder acceder a los datos fuera de la funcion btc_trade_history y esta es la manera en que accederermos a los datos del websocket. 

El último paso es crear una función que le indique al socket que hacer cuando reciba la información, para este primer ejemplo tan solo imprimeros el último precio de Bitcoin en pantalla. 

bsm = ThreadedWebsocketManager()
bsm.start()
bsm.start_symbol_ticker_socket(callback=btc_trade_history, symbol='BTCUSDT')

Estamos llamando a la función start_symbol_ticker que tiene una salida similar a la función get_symbol_ticker que vimos en la entrada anterior , pero esta vez recibiremos un flujo de datos del último precio del ticker que hemos escogido (BTCUSDT).



Para parar el canal tienes que usar la función stop().

bsm.stop()

Si quieres escoger otro ticker tan solo tienes que cambiar el parametro symbol . Por ejemplo, si quieres ver el precio de Ethereum en Dolares $ :

bsm.start_symbol_ticker_socket(callback=btc_trade_history, symbol='ETHUSDT')



El WebSocket puede proporcionar multiples datos, si quieres ver el detalle de las opciones y parametros disponibles puedes verlos usando el comando help() o bien consultar la documentación. 

help(ThreadedWebsocketManager)




Y si has seguido leyendo hasta aquí, muchas gracias!


Links:

http://acodigo.blogspot.com/2021/01/python-binance-api.html

https://algotrading101.com/learn/binance-python-api-guide/

https://python-binance.readthedocs.io/en/latest/websockets.html




Instalar Cristal Azul en Raspberry 3

Después de rebuscar por Internet he encontrado varios tutoriales con instrucciones para instalar Kodi con Cristal Azul en una Raspberry Pi 3...