Python Binance API

Vamos a aprender como integrar la API de Binance con nuestra aplicación Python, para este pequeño tutorial de programación estudiaremos los pasos necesarios que nos permitirán integrar esta tecnología de manera que podamos desarrollar una app que pueda dar seguimiento a los precios de las criptomonedas y realizar operaciones con las mismas, ya sean compras o ventas desde el exchange antes mencionado.

Como integrar con Python 3

Lo primero es instalar las correspondientes librerías, lo hacemos con el siguiente comando:

pip install python-binance
pip install keyboard

Si tienes estás en Windows y tienes problemas con la instalación de la librería Twisted la cual se requiere como dependencia puedes descargarla manualmente desde el enlace asegúrate de descargar la versión que coincida con la versión de Python que tienes instalada y también el sistema operativo.

El paso siguiente consiste en generar las claves de acceso a la api que nos permitirá acceder a nuestra cuenta en dicho exchange, no si tienes una cuenta en binance puede registrarte en caso contrario solo accede a tu cuenta y ve a la siguiente sección: Gestión de API / Crear API, le damos un nombre y guardamos los dos códigos que nos proporcionan.

Image

Si tenemos activados los métodos de verificación extra debemos completar esta acción y luego pasar al siguiente paso.

Recordar no compartir la API Key y la Secret Key.

Image

Nuestro primer fragmento de código se ve de esta manera:

import keyboard

from binance.client import Client
from binance.websockets import BinanceSocketManager
from twisted.internet import reactor

api_key    = 'xxxxxxxxxxxxxxxxxx'
api_secret = 'xxxxxxxxxxxxxxxxxx'

client = Client(api_key, api_secret)
bnb_balance = client.get_asset_balance(asset='BNB')

print("Balance: {}".format(bnb_balance))
print("Press q to exit")

keyboard.on_press_key("q", lambda _: reactor.stop() )

def process_message(msg):
    print("Bid - Ask BTCUSDT price: {} - {}".format(msg['b'], msg['a']))

bm = BinanceSocketManager(client)
bm.start_symbol_ticker_socket('BTCUSDT', process_message)
bm.start()

Primer fragmento de código a analizar, aquí podemos ver como usamos las claves que obtuvimos previamente para instanciar la clase Client luego usamos el método get_asset_balance() para obtener nuestro balance total en la criptomoneda indicada, para nuestro ejemplo BNB.

client = Client(api_key, api_secret)
bnb_balance = client.get_asset_balance(asset='BNB')

Segundo fragmento de código a analizar, ahora vemos la clase BinanceSocketManager esta se encarga de conectar con el exchange mediante Sockets, en el ejemplo de abajo vemos como usamos el método start_symbol_ticker_socket para obtener los trades del par BTCUSDT.

def process_message(msg):
    print("Bid - Ask BTCUSDT price: {} - {}".format(msg['b'], msg['a']))

bm = BinanceSocketManager(client)
bm.start_symbol_ticker_socket('BTCUSDT', process_message)
bm.start()

Este fragmento de código recibirá el mensaje en formato json con la información que podemos ver en la imagen.

Image

Nosotros mostramos solo b y a para visualizar el Bid y Ask en tiempo real.

Gráfica de velas en tiempo real

Sí lo que deseamos es visualizar el gráfico de alguna criptomoneda necesitamos la ayuda de la libraría mplfinance, veremos un ejemplo en donde mostramos las velas del gráfico para el par BTCUSDT, esto es lo que pretendemos generar:

Image

Lo primero que requerimos es instalar mplfinance esta nos permite de manera sencilla crear gráficos, en especial el de velas que estamos buscando crear.

pip install --upgrade mplfinance
from binance.client import Client

import mplfinance as mpf
import pandas as pd
import numpy as np

api_key    = 'xxxxxxxxxxxxxxxxx'
api_secret = 'xxxxxxxxxxxxxxxxx'

client = Client(api_key, api_secret)
klines = client.get_historical_klines("BTCUSDT", Client.KLINE_INTERVAL_4HOUR, "15 day ago UTC")

df = pd.DataFrame(klines,  columns=['Date',
                                    'Open',
                                    'High',
                                    'Low',
                                    'Close',
                                    'Volume',
                                    'Close time',
                                    'Quote asset volume',
                                    'Number of trades',
                                    'Taker buy base asset volume',
                                    'Taker buy quote asset volume',
                                    'Ignore'])

df = df.drop(df.columns[[6, 7, 8, 9, 10, 11]], axis=1)
df['Date'] = pd.to_datetime(df['Date'], unit='ms')
df.set_index('Date', inplace=True, drop=True)

df['Open']   = df['Open'].astype(float)
df['High']   = df['High'].astype(float)
df['Low']    = df['Low'].astype(float)
df['Close']  = df['Close'].astype(float)
df['Volume'] = df['Volume'].astype(float)

mpf.plot(df, type='candle', style='binance', volume=True)

Debemos prestarle atención a get_historical_klines el cual nos devolverá el conjunto de datos que requerimos para crear las velas le indicamos el intervalo de tiempo entre cada vela y el rango de fechas para el cual deseamos obtener los datos, en nuestro ejemplo 15 días atrás desde el momento actual, necesitamos convertir estos datos a un DataFrame y solo vamos a utilizar los siguientes elementos: Date, Open, High, Low, Close, Volume, podemos descartar los demás, cuando tengamos los datos correctamente preparados usamos plot para generar y mostrar el gráfico.

Ahora hacemos una pequeña modificación al código para que nos permita actualizar los datos en tiempo real según los datos de binance, cambiaremos el intervalo de tiempo a 1 minuto para observar mejor lo que estamos haciendo.

from binance.client import Client

import matplotlib.animation as animation
import mplfinance as mpf
import pandas as pd
import numpy as np

api_key    = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
api_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxx'

crypto = 'BTCUSDT'
kline_interval = Client.KLINE_INTERVAL_1MINUTE

client = Client(api_key, api_secret)
klines = client.get_historical_klines(crypto, kline_interval, "1 hour ago UTC")

df = pd.DataFrame(klines,  columns=['Date',
                                    'Open',
                                    'High',
                                    'Low',
                                    'Close',
                                    'Volume',
                                    'Close time',
                                    'Quote asset volume',
                                    'Number of trades',
                                    'Taker buy base asset volume',
                                    'Taker buy quote asset volume',
                                    'Ignore'])

df = df.drop(df.columns[[6, 7, 8, 9, 10, 11]], axis=1)
df['Date'] = pd.to_datetime(df['Date'], unit='ms')
df.set_index('Date', inplace=True, drop=True)

df['Open']   = df['Open'].astype(float)
df['High']   = df['High'].astype(float)
df['Low']    = df['Low'].astype(float)
df['Close']  = df['Close'].astype(float)
df['Volume'] = df['Volume'].astype(float)

pkwargs=dict(type='candle', style='binance')
fig, axes = mpf.plot(df, title='Bitcoin Price in Binance', volume=True, returnfig=True, **pkwargs)

ax1 = axes[0]
ax2 = axes[2]

def animate(ival):

    candle = client.get_klines(symbol=crypto, interval=kline_interval, limit=1)

    c_open  = float(candle[0][1])
    c_high  = float(candle[0][2])
    c_low   = float(candle[0][3])
    c_close = float(candle[0][4])
    c_vol   = float(candle[0][5])
    
    df2 = pd.DataFrame({'Date':[candle[0][0]], 'Open':[c_open],'High':[c_high],'Low':[c_low],'Close':[c_close],'Volume':[c_vol]})
    df2['Date'] = pd.to_datetime(df2['Date'], unit='ms')
    df2.set_index('Date', inplace=True, drop=True)

    global df

    if df.last_valid_index() != df2.last_valid_index():
        data = pd.concat([df.iloc[1:], df2], ignore_index = False) 
        df = data
    else:
        data = df    
        data.iloc[-1, data.columns.get_loc('Open')]   = c_open
        data.iloc[-1, data.columns.get_loc('High')]   = c_high
        data.iloc[-1, data.columns.get_loc('Low')]    = c_low
        data.iloc[-1, data.columns.get_loc('Close')]  = c_close
        data.iloc[-1, data.columns.get_loc('Volume')] = c_vol
    
    ax1.clear()
    ax2.clear()

    mpf.plot(data, ax=ax1,volume=ax2,**pkwargs)

ani = animation.FuncAnimation(fig, animate, interval=250)

mpf.show()

Es todo por ahora, nos queda por ver como crear ordenes de compra o venta, en los distintos mercados spot, futuros, etc., y algunas otras cosas interesantes que podemos hacer con la api.

Comentarios

  1. Image

    Hola para cuando el próximo tutorial ? Sera posible integrar algunas emas para tener una orden de compra mas confiada?

    ResponderEliminar
    Respuestas
    1. Image

      pkwargs=dict(type='candle',mav=(3,6,9), style='binance')
      dentro de mav coloca las EMA

      Eliminar
  2. Image

    Buenísimo! Gracias por compartirlo, esperando la 2da parte! Saludos.

    ResponderEliminar
  3. Image

    Genial , con esto ya podemos empezar a armar un Bot propio

    ResponderEliminar
  4. Image

    Se puede saber las ordenes de compra y venta?

    ResponderEliminar
  5. Image

    Hola, podrias ayudarme, me gustaria saber como puedo Utilizar Indicadores tecnicos como parametros de scaneo en python, tenes algun tuto?

    ResponderEliminar
  6. Image

    Hola. A ver si para este 2022 puedes realizar la segunda parte...

    ResponderEliminar
  7. Image

    Amigo como puedo hacer un bot para binance futuros con una ema de 200 y un ssl

    ResponderEliminar
  8. Image

    Las aplicaciones de software son componentes integrales del éxito de una organización. Desafortunadamente, mientras que las aplicaciones se construyen para apoyar un crecimiento más rápido y una mejor experiencia de usuario, éstas también son propensas a incidentes de seguridad en ausencia de mecanismos de seguridad apropiados. Este artículo profundiza en la seguridad de programar una app y en por qué es vital adoptar las prácticas y herramientas adecuadas para garantizar que los vectores de ataque no exploten las vulnerabilidades inherentes a las aplicaciones. Conocer los fundamentos de la seguridad web nunca había sido tan relevante.

    ResponderEliminar
  9. Image

    binance.exceptions.BinanceAPIException: APIError(code=-1121): Invalid symbol.
    si le cambio el par

    ResponderEliminar
  10. Image

    Cómo podemos saber el balance total de nuestra cuenta? Puede ser sólo SPOT o SPOT+EARN.

    ResponderEliminar
  11. Image

    En def process_message(msg): al ejecutarlo no me da error pero no me muestra la info en tiempo real de la crypto 😔

    ResponderEliminar
  12. Image

    Gran información.






    ------------------------------------------
    Te enseñó que es PBX en la nube

    ResponderEliminar
  13. Image

    Absolutely loving the insights shared in this blog post! 💡 The Coin Cloud Wallet app seems like a game-changer in the digital currency space, providing a secure and user-friendly platform. Also know, How To Send Digital Currency with the Coin Cloud Wallet App.

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

Conectar OpenCV a cámara IP

Programación OpenCV para Android Introducción

Umbralización adaptativa con OpenCV Python