A partir de aquí, podemos empezar a determinar cómo será nuestra arquitectura.
Primero, necesitamos una variable que indique el estado en el que se encuentra actualmente el bot. Esto es ya sea COMPRAR o VENDER. Un booleano o enum debería encajar bien este propósito.
A continuación, tenemos que establecer nuestros umbrales para la compra y la venta. Estos indican el porcentaje de disminución o aumento del precio desde la última vez que hicimos una operación.
Por ejemplo, si compré el activo a 100$, y su precio está ahora a 102$, tenemos un aumento del 2%. Si tenemos un umbral de VENTA fijado en una subida del 1%, nuestro bot venderá entonces, porque ha obtenido un beneficio por encima de nuestro umbral.
En nuestro caso, estos umbrales serán constantes. Necesitamos 4 de ellos, dos para cada estado:
Umbral de compra (Si el bot está en estado de venta)
-
DIP_THRESHOLD
: Compra el activo si su precio disminuyó más que el umbral. La idea de esto es seguir la estrategia de «comprar bajo, vender alto», donde se intenta comprar un activo cuando está infravalorado, esperando que su valor suba para poder vender. -
UPWARD_TREND_THRESHOLD
: Compra el activo si su precio aumentó más que el umbral. Esto va en contra de la filosofía «comprar bajo, vender alto», pero tiene como objetivo identificar cuando el precio está subiendo y no queremos perder la oportunidad de comprar antes de que suba aún más.
Aquí hay una ilustración que puede ayudar:
Si realizamos una operación de VENTA en el punto marcado como «SELL» en la imagen anterior, ahora tenemos nuestros umbrales establecidos para la operación de compra.
Si el precio llega a estar por debajo de la línea verde inferior o por encima de la línea verde superior realizaremos una operación de COMPRA. En este caso, superamos primero el umbral superior, por lo que compramos basándonos en el BUY_DIP_THRESHOLD
.
Umbral de VENTA (Si el Bot está en estado de COMPRA)
-
PROFIT_THRESHOLD
: Vende el activo si su precio ha subido por encima del umbral desde que lo compramos. Así es como nos beneficiamos. Vendemos a un precio superior al que compramos. -
STOP_LOSS_THRESHOLD
: Idealmente, sólo querríamos que nuestro bot vendiera cuando obtuviera beneficios. Sin embargo, tal vez el mercado está bajando significativamente y queremos salir antes de que sea demasiado tarde y luego comprar a un precio más bajo. Por lo tanto, este umbral se utiliza para vender con pérdidas, pero con el objetivo de evitar que se produzca una pérdida mayor.
Aquí hay una ilustración:
Aquí, compramos en el punto marcado con «BUY». Entonces, alcanzamos nuestro umbral superior antes que el inferior, lo que significa que vendimos nuestro activo para obtener un beneficio. Así es como los bots de trading ganan dinero.
Ahora ya tenemos una idea básica de cómo funciona el bot, así que vamos a entrar en algo de (pseudo)código.
Funciones de ayuda de la API
Lo primero que necesita nuestro bot son algunas funciones de ayuda para obtener datos de la API de la bolsa. Necesitamos:
Lo anterior debería explicarse por sí mismo, pero tienes que asegurarte de saber qué monedas pide la API POST
cuando se hace una operación de compra o venta.
A menudo, cuando usted está negociando USD para el oro, por ejemplo, puede especificar la cantidad de oro para comprar, o la cantidad de USD para vender. Conseguir las monedas correctas es muy importante.
Ciclo de bucle del bot
Ahora que tenemos nuestras funciones de ayuda, vamos a empezar a definir el flujo de trabajo del bot. Lo primero que necesitamos es un bucle infinito con algún tiempo de reposo. Digamos que queremos que el bot intente hacer una operación cada 30 segundos. Esto es lo que podría parecer:
Nota: Los valores para los umbrales aquí son sólo valores arbitrarios. Usted debe escoger los suyos de acuerdo con su propia estrategia.
Si lo anterior se empareja con las funciones de ayuda y la función de bucle, que también podría ser main
, ahora deberíamos tener nosotros mismos los pilares básicos de un bot de trabajo.
En cada iteración, nuestro bot comprobará su estado actual (COMPRA o VENTA) y tratará de hacer un comercio basado en los umbrales hardcoded en. A continuación, actualizará el estado de COMPRA/VENTA y el último precio de una operación.
Entonces lo hace todo de nuevo.
Paso 5: Pulir el Bot
La arquitectura básica de nuestro bot está lista, pero probablemente haya algunas cosas que todavía queramos considerar añadir.
Logs
Cuando construí por primera vez una variación de este bot, una cosa que era esencial para mí era tener un registro constante de las acciones del bot tanto en el terminal como en un archivo de registro separado.
En cada paso, crearía registros como:
USD Balance = 22.15$
Bought 0.002 BTC for 22.15 USD
Last Operation Price updated to 11,171.40 (BTC/USD)
Could not perform SELL operation - Insufficient balance
Los registros que iban al archivo también obtendrían una marca de tiempo añadida a ellos, así que cuando accedí al servidor después de todo un día y encontré un error, por ejemplo, podría rastrearlo exactamente hasta donde ocurrió, así como averiguar todo lo demás que el bot hizo a lo largo del camino.
Esto debería ser una cuestión de configurar una función createLog
que se llama en cada paso. Algo así:
Identificar tendencias
El objetivo principal de nuestro bot debe ser comprar a un precio bajo y vender con beneficio. Sin embargo, tenemos dos umbrales que en cierto modo contradicen esta idea:UPWARD_TREND_THRESHOLD
y STOP_LOSS_THRESHOLD
.
Estos umbrales supuestamente nos indican cuándo debemos vender con pérdidas o comprar con una subida de precios. La idea es que tratemos de identificar tendencias que se salgan de la estrategia general pero que puedan ser perjudiciales o beneficiosas para nosotros por lo que deberíamos actuar.
Sin embargo, la forma en que lo estructuré arriba es bastante limitada. Una instantánea estática de un precio está lejos de ser una indicación de una tendencia.
Por suerte, sin mucha complicación, puedes hacer esto un poco más fiable.
Todo lo que tienes que hacer es también llevar un seguimiento de más precios que sólo lastOpPrice
. Usted podría, por ejemplo, hacer un seguimiento del precio 10 o 20 iteraciones atrás, y comparar eso con el precio actual en lugar de lastOpPrice
. Esto probablemente sería mejor en la identificación de una tendencia, ya que comprueba los cambios rápidos en el precio en lugar de un cambio que se produjo durante un largo período de tiempo.
Base de datos?
Mientras se está ejecutando, este simple bot realmente no necesita una base de datos, ya que está manejando muy pocos datos y puede mantener toda la información en la memoria.
Sin embargo, ¿qué sucede cuando el bot falla, por ejemplo? ¿Cómo podría determinar el lastOpPrice
sin que usted lo compruebe manualmente?
Para evitar el trabajo manual por su parte, es posible que desee mantener algún tipo de base de datos ligera para realizar un seguimiento de algunas cosas, como lastOpPrice
.
De esta manera, cuando el bot se inicia, en lugar de utilizar los valores por defecto, realmente comprobará sus valores almacenados y continuará a partir de ahí.
Dependiendo de lo simple que quieras hacer esto, puedes incluso considerar una «base de datos» de archivos .txt
o json
, ya que podrías estar almacenando sólo unos pocos valores de todos modos.
Tablero
Si quieres facilitar la visualización de las operaciones de tu bot, así como gestionarlo sin tener que entrar a juguetear manualmente con el código, puedes considerar la posibilidad de conectar tu bot a un panel de control.
Esto requeriría que tu bot estuviera conectado a un servidor web/API propio que te permitiera controlar su funcionalidad.
De esta manera, podrías cambiar los umbrales más fácilmente, por ejemplo.
Hay muchas plantillas gratuitas de tableros de control disponibles, por lo que ni siquiera tienes que hacer el tuyo propio. Echa un vistazo a Start Bootstrap y a Creative Tim para ver algunos ejemplos.
Testing Strategies on Past Data
Muchos intercambios te ofrecerán acceso a datos de precios pasados, así como normalmente puedes conseguir fácilmente esos datos en otro lugar si lo necesitas.
Esto es muy útil si quieres probar tu estrategia antes de ponerla en acción. Puede ejecutar una simulación de su bot con datos pasados y «dinero falso» para ver qué tan bien habrían funcionado sus umbrales definidos y ajustarlos para el negocio real.
Puntos adicionales sobre los umbrales y las órdenes
Hay algunas cosas que debe tener en cuenta al colocar órdenes.
En primer lugar, debe entender que hay dos tipos de órdenes: órdenes limitadas y órdenes de mercado. Si no está familiarizado con los conceptos, debería leer un poco al respecto, pero aquí le daré una visión general básica.
Las órdenes de mercado son órdenes que se ejecutan al precio actual del mercado, ejecutándose efectivamente de forma inmediata en la mayoría de los casos.
Las órdenes limitadas, por otro lado, ocurren cuando usted coloca una orden por un precio inferior al del mercado (en el caso de una orden de COMPRA) o superior al precio del mercado (en el caso de una orden de VENTA). No está garantizado que se ejecuten, ya que el precio podría no alcanzar el umbral que usted estableció.
La ventaja de las órdenes limitadas es que usted puede anticiparse a los movimientos del mercado y colocar una orden en relación con el lugar al que espera que se dirija el mercado antes de que se produzca dicho movimiento.
Además, las órdenes limitadas suelen estar sujetas a comisiones más bajas que las órdenes de mercado. Esto se debe a que las órdenes de mercado están sujetas a lo que comúnmente se denomina «tarifa de tomador», mientras que las órdenes limitadas están sujetas a «tarifas de creador».
La razón de los nombres y sus respectivas tarifas es que las órdenes de mercado sólo están aceptando («tomando») el precio actual del mercado, mientras que las órdenes limitadas fuera del precio del mercado están añadiendo liquidez y, por lo tanto, «creando un mercado», por lo que son «recompensadas» con tarifas más bajas.
Nótese que el bot de este artículo es el más adecuado para las órdenes de mercado.
Por último, sobre el tema de las comisiones, cuando configure su PROFIT_THRESHOLD
, recuerde tener en cuenta las comisiones.
Para obtener un beneficio, necesita realizar una operación de COMPRA y luego una de VENTA, lo que le deja sujeto a 2 comisiones.
Como tal, necesita asegurarse de que sólo vende para obtener un beneficio una vez que es capaz de cubrir al menos sus comisiones, de lo contrario, en realidad estará haciendo una pérdida.
Piensa en ello, suponiendo que las comisiones fueran planas, si compras un activo por 100,00$, incurriendo en una comisión de 0,50$, y luego lo vendes por 100,75$, de nuevo con una comisión de 0,50$, habrías obtenido un beneficio bruto del 0,75%, pero, en realidad, tendrías una pérdida neta del 0,25%.
Ahora imagina que tu bot siempre vendiera por una pérdida neta. Perderías mucho dinero bastante rápido…
Observaciones finales
Eso es todo para nuestro bot. Espero que este tutorial haya sido útil.
La idea era centrarse en todos los conceptos que necesitas saber para construir un bot de trading incluso si nunca has operado antes, no enseñarte a programar.
Se supone que todos los lectores son capaces de hacer peticiones HTTP en su lenguaje de elección, por lo que sería mejor centrarse en otros aspectos.
Es el primer tutorial que escribo así (basado en pseudocódigo), así que por favor hazme saber qué te ha parecido el concepto.
¡Gracias por leer! Y si crees que este artículo ha sido útil, no dudes en apoyarme con algunos aplausos 👏👏.