Curso de programación de criptomonedas con Python - 14. Cómo crear un bot de arbitraje. Diagramas de flujo (parte 2)
El curso ha sido detenido en este capítulo, lo siento pero no explicaré (por ahora) como hacer el bot de arbitraje. Te será fácil entenderlo si estudias los proyectos open source mencionados en el capítulo anterior. Perdona por las molestias.
En la lección anterior vimos una introducción sobre cómo enfocaremos la construcción del bot de arbitraje entre pares de criptomonedas. En este nuevo capítulo vamos a empezar a construirlo, pero primero veremos el funcionamiento general del bot por módulos a través de un diagrama. Con ello aprenderemos lo que es un flujo de ejecución.
Creamos nuestro proyecto
Para empezar vamos a crear un archivo .py en una carpeta. En esa misma carpeta vamos a introducir las envolturas bittrex.py y poloniex.py, como hicimos en proyectos anteriores.
Importamos las librerías que necesitaremos
import ast, json, datetime, time
from bittrex import bittrex
from poloniex import poloniex
from btce import btce
Establecemos nuestras API Keys y API Secret
Para que funcionen las envolturas de bittrex y poloniex debemos añadir nuestra información de cuenta, la clave y contraseña para operar desde las APIs. Ya tratamos esto en una lección anterior.
bittrex = bittrex('Tu APIKEY', 'Tu APISECRET')
poloniex = poloniex('Tu APIKEY', tu APISECRET')
Flujo de ejecución
El flujo de ejecución el camino que sigue nuestro programa a la hora de ejecutarse. Suele representarse gráficamente a través de diagramas de flujo para que sea fácil de comunicar y de leer a simple vista. Para representar el flujo de ejecución se suele seguir unas convenciones, como que las elipses representan módulos o los rectángulos procesos.
En el siguiente esquema vamos a comprender la primera parte del bot de arbitraje. Como es bastante simple, he seguido mi propio sistema de símbolos:
Los cuadrados son las funciones que vamos a crear y las elipses son listas con elementos que van a necesitar nuestras funciones. Resumo cómo funciona, pero quedará más claro a medida que vayamos construyéndolo:
El comparador es la función principal que siempre se irá ejecutando. Lo constituirán 3 bucles for anidados que irán recogiendo la información de la moneda con la que operará en ese ciclo, el precio y cantidad al que se oferta (que será nuestra función compra) y el precio y cantidad al que se demanda en la otra (la función venta).
Configuramos las listas
Vamos a meternos de lleno con el código. Primero vamos a definir las listas de exchanges y criptomonedas con las que vamos a trabajar. Nosotros trabajaremos en este bot para dos exchanges (bittrex y poloniex) y tres mercados (Ethereum, Maidsafe y Steem). Cuando entiendas cómo se construye podrás ampliar monedas y mercados a tu interés.
El código para crearlas será el siguiente:
exc = ["bittrex", "poloniex"]
mon = ['ETH', 'MAID', 'STEEM']
Definiendo las funciones de compra y venta
Nosotros compraremos en un mercado al precio en el que se oferta, es decir, al precio en el que se vende en ese mercado. El arbitraje se basa en esto: vendo y compro a los precios del mercado en diferentes casas de cambio.
Entonces definimos la función de compra y la explico abajo:
def compra(exchange, mercado):
if exchange == "bittrex":
precio_compra = bittrex.getorderbook('BTC-' + mercado, 'sell')[0]['Rate']
cantidad_compra = bittrex.getorderbook('BTC-' + mercado, 'sell')[0]['Quantity']
elif exchange == "poloniex":
precio_compra = poloniex.returnOrderBook('BTC_' + mercado)['asks'][0][0]
cantidad_compra = poloniex.returnOrderBook('BTC_' + mercado)['asks'][0][1]
compra = {'precio_compra': precio_compra, 'cantidad_compra': cantidad_compra}
return compra
La función de compra será una función con dos parámetros. Desde el módulo principal consultaremos los parámetros de las listas antes de ejecutarla.
Estableceremos condicionales para ejecutarla para las diferentes exchanges, ya que cada uno tiene una forma de obtener los datos en sus APIs. Para la exchange @bittrex el precio de compra será un dato del libro de órdenes: el precio de la primera venta, la que se vende a menor precio. También extraeremos la cantidad que se está ofertando, pues si es muy baja seguramente no nos conviene operar.Hacemos lo mismo para @poloniex.
Guardamos los datos en un diccionario llamado compra
y lo devolvemos.
Hacemos lo mismo para la función de venta, pero a la inversa:
def venta(exchange, mercado):
if exchange == "bittrex":
precio_venta = bittrex.getorderbook('BTC-' + mercado, 'buy')[0]['Rate']
cantidad_venta = bittrex.getorderbook('BTC-' + mercado, 'buy')[0]['Quantity']
elif exchange == "poloniex":
precio_venta = poloniex.returnOrderBook('BTC_' + mercado)['bids'][0][0]
cantidad_venta = poloniex.returnOrderBook('BTC_' + mercado)['bids'][0][1]
venta = {'precio_venta': precio_venta, 'cantidad_venta': cantidad_venta}
return venta
Si no entiendes a qué estamos llamando con las variables, vuelve a las lecciones anteriores del curso (están todas al final del post). Si lo has seguido capítulo a capítulo no deberías tener muchos problemas comprendiendo el código.
Y ya tenemos definidos nuestros primeros módulos, los que nos proveerán la información de los mercados. No te preocupes si aún no entiendes al 100% qué estamos haciendo exactamente, en las siguientes partes iremos encajando otras piezas del rompecabezas y todo quedará mucho más claro.
Esto es todo por ahora, nos vemos en la siguiente lección, ¡hasta la próxima!
Hola que tal?
Estuve siguiendo este curso.
Llega hasta aquí? o puedo terminarlo en algún otro lado?