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.

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.

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.

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:

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. Hola para cuando el próximo tutorial ? Sera posible integrar algunas emas para tener una orden de compra mas confiada?

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

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

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

    ResponderEliminar
  4. Se puede saber las ordenes de compra y venta?

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

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

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

    ResponderEliminar
  8. 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. binance.exceptions.BinanceAPIException: APIError(code=-1121): Invalid symbol.
    si le cambio el par

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

    ResponderEliminar
  11. 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. Gran información.






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

    ResponderEliminar
  13. 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

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Conectar SQL Server con Java