Una guía paso a paso para crear un robot comercial en cualquier lenguaje de programación

No estoy calificado para asesorar sobre inversiones, leyes o similares. No estoy tratando de hacer eso. El propósito de la guía es enseñarle sobre la programación de bots comerciales con fines educativos. Debe comprender que al crear un bot, usted es responsable de las decisiones que toma, de las operaciones de inversión que realiza y de los riesgos asociados con las actividades comerciales. No puedo ser responsable de las decisiones que tomará después de leer este material. Recuerde que los bots pueden perder mucho dinero, así que utilícelos con precaución.



A menudo puede encontrar artículos que se llaman así: "10 proyectos que un programador necesita implementar". Los bots comerciales a menudo se enumeran en estos artículos. Creo que desarrollar un robot comercial es una inversión que vale la pena. Así que decidí tomarme un tiempo para escribir un tutorial sobre esto.



Pero en lugar de hacer un análisis línea por línea de algún código, decidí que sería mejor desensamblar los conceptos con los que debería estar familiarizado alguien que quiera crear su propio bot. El punto de mi material es que, después de leerlo, usted mismo escribiría el código.



Por lo tanto, hablaré sobre lo que es útil saber para desarrollar un robot comercial y lo que se necesita para esto (desde trabajar con intercambios hasta implementar una estrategia comercial simple). Aquí abordaré los problemas relacionados con la arquitectura y la estructura interna de los robots comerciales simples, con las ideas que los subyacen. Demostraré ejemplos escritos en pseudocódigo. Por lo tanto, puede leer esta guía e inmediatamente escribir su propio bot en el lenguaje de programación que elija. Como resultado, se sentirá cómodo utilizando una herramienta con la que está familiarizado. Podrá participar tranquilamente en la programación y no perder tiempo configurando el entorno de trabajo y acostumbrándose a un nuevo lenguaje. Elegirás un arma y yo te enseñaré a usarla.



















Paso 1. Elegir un arma



En el primer paso de este tutorial, elegirá el lenguaje de programación que utilizará. Debe decidir esta cuestión usted mismo.



Algunos lenguajes como Python pueden ser preferidos si planea equipar su bot con mecanismos de aprendizaje automático en el futuro. Pero mi idea principal es que puede elegir el idioma que le resulte más conveniente para trabajar.



Paso 2. Buscando el campo de batalla





Un tema importante a menudo se pasa por alto en los tutoriales sobre cómo escribir bots comerciales. Se trata de la elección del intercambio. El hecho es que para que un bot pueda hacer aquello para lo que fue creado, necesita acceso a un intercambio donde puedas intercambiar algo. Elegir un intercambio y saber cómo usarlo es tan importante como las habilidades de programación.



Entonces, su primer paso será decidir qué es exactamente lo que va a operar (acciones, divisas, criptomonedas) y decidir exactamente dónde va a operar.



Si hablamos de activos negociados en bolsa, le aconsejaría que preste atención a las criptomonedas. El motivo de esta recomendación no es que sea partidario de las tecnologías blockchain y las criptomonedas (estoy completamente abierto a este tema), sino solo que los mercados de criptomonedas están abiertos las 24 horas, los 7 días de la semana.



Los activos más “tradicionales” solo se pueden negociar en determinados intervalos de tiempo y, a menudo, solo durante la semana. Los mercados de valores, por ejemplo, suelen estar abiertos de 9 a. M. A 4 p. M. Y cierran los fines de semana. Los mercados FOREX, aunque pueden operar las 24 horas, suelen estar cerrados los fines de semana.



En este sentido, las criptomonedas son las más adecuadas para nosotros, ya que la elección de este mercado permitirá que nuestro bot funcione sin interrupciones. Además, las criptomonedas son conocidas por sus altos niveles de volatilidad. Esto significa, en primer lugar, que puede perder mucho dinero al operar con ellos y, en segundo lugar, que son una excelente herramienta para estudiar y probar estrategias comerciales.



Ya hemos hablado de activos cambiarios. Analicemos ahora los requisitos a tener en cuenta al elegir un intercambio para el que se creará un bot. Es decir, estoy hablando de dos requisitos básicos:



  1. Debe poder negociar legalmente en el intercambio seleccionado y trabajar con los instrumentos comerciales que ofrece. Si hablamos de criptomonedas, en algunos países está prohibido comerciar con ellas. Considere esto al elegir instrumentos y un intercambio.
  2. API, . , .


Una vez que resulta que cierto intercambio cumple con estos dos requisitos básicos, puede analizarlo con más profundidad. Por ejemplo, para estimar el tamaño de las comisiones, para evaluar su confiabilidad y popularidad, para observar la calidad de la documentación de su API.



Y, sin embargo, lo cual es tan importante como todo lo demás, recomendaría evaluar el volumen de operaciones del intercambio. Los intercambios de bajo volumen tienden a quedarse atrás de los movimientos de precios. Además, es más difícil ejecutar órdenes de límite en ellos (hablaremos más sobre esto a continuación).



Si finalmente decides elegir criptomonedas, aquí tienes una buena lista de los principales intercambios. Aquí puede encontrar diversa información sobre ellos para ayudarlo a elegir un intercambio.



Paso 3. Construyendo el campamento





Si el intercambio es un campo de batalla, ahora hablaremos del lugar desde el cual enviaremos nuestras tropas al campo de batalla. Por cierto, tal vez sea hora de que me relacione con esas analogías.



Estoy hablando del servidor aquí. El código del bot debe ejecutarse en algún servidor, lo que permitirá que el bot envíe solicitudes a la API de intercambio.



Al probar un bot, por supuesto, su computadora puede actuar como un servidor. Pero si necesita que un bot funcione todo el tiempo, una computadora normal definitivamente no es la mejor opción.



Tengo dos sugerencias aquí:



  1. La función de servidor puede ser desempeñada por Raspberry Pi (este enfoque es más interesante).
  2. El servidor puede ser algún tipo de servicio en la nube (y este enfoque es mejor).


Creo que organizar un bot sobre la base de tu propio servidor Raspberry Pi es una idea interesante y moderna, así que si también te gusta esta idea, puedes darle vida.



Pero la mayoría de los creadores de bots probablemente opten por un proveedor en la nube como AWS , Azure , GCS o Digital Ocean .



La mayoría de los principales proveedores de nube tienen buenos planes gratuitos, por lo que es posible que pueda alojar su bot con ese proveedor de forma gratuita.



Con esto concluye mi conversación sobre servidores. Debe elegir lo que funcione mejor para usted. Para un proyecto pequeño como el que estamos haciendo, lo que se elija no tendrá un gran impacto en el resultado final.



Paso 4. Crea un bot





Y ahora comienza la diversión. Pero, antes de comenzar esta parte de nuestro proyecto, verifique si se ha hecho lo siguiente:



  1. Te has registrado en el intercambio y has recibido los permisos necesarios para trabajar con él.
  2. Tiene la capacidad de trabajar con la API de intercambio, tiene una clave de API.
  3. Has elegido hosting para el bot.


Si estos problemas se resuelven, significa que podemos seguir adelante.



▍ El bot más simple



Mi objetivo es ayudar a alguien que, hasta este momento, no sabía absolutamente nada sobre bots, a elevarse al nivel de crear un bot funcional simple. Por lo tanto, te diré cómo crear un robot comercial simple que puedas expandir y mejorar según tus necesidades.



Nuestro bot tendrá algunas limitaciones:



  1. El bot solo podrá permanecer en uno de dos estados: COMPRAR (comprar) o VENDER (vender). No colocará constantemente órdenes de compra o venta a diferentes precios. Si la última operación fue una venta, la siguiente operación que el bot intentará realizar es una compra.
  2. El bot utilizará umbrales fijos para tomar decisiones de compra y venta. Un bot más inteligente puede ajustar de forma independiente dichos valores en función de varios indicadores, pero la estrategia y los límites de nuestro bot se establecerán manualmente.
  3. Solo negociará un par de divisas. Por ejemplo, BTC / USD.


Estas restricciones facilitan nuestra tarea. El bot será simple, lo que significa que será más fácil de construir y mantener. Esto también nos permitirá implementar muy rápidamente su código en el servidor. Básicamente, aquí estamos hablando del principio KISS.



▍Mecanismo de toma de decisiones



Aquí hay un diagrama simple que ofrece una descripción general de cómo está funcionando nuestro bot.





Ahora puede comenzar a planificar la arquitectura de su bot.



Para empezar, necesitamos una variable que almacene información sobre el estado exacto del bot en el momento actual. Esto es COMPRAR o VENDER. Una variable booleana o enumeración es una buena opción para almacenar dicha información.



Luego, debe establecer umbrales para las operaciones de compra y venta. Estos valores se expresan como un porcentaje y representan el aumento o disminución en el precio del activo desde la transacción anterior.



Por ejemplo, si compré algo a $ 100 y el precio actual es de $ 102, entonces estamos ante un aumento del precio del 2%. Si el umbral para la operación VENDER se establece en un aumento del precio del uno por ciento, entonces el bot, al ver este 2%, venderá el activo, ya que ya obtuvo una ganancia que excede el valor de umbral que establecimos.



En nuestro caso, dichos valores serán constantes. Necesitamos 4 de esos valores, 2 para cada estado de bot.



▍Valores de umbral para la operación COMPRAR (si el bot está en estado VENDER)



  • DIP_THRESHOLD: el bot realiza una operación de compra si el precio ha disminuido en un valor mayor que el valor especificado DIP_THRESHOLD. La razón detrás de esto es implementar una estrategia de compra baja y venta alta. Es decir, el bot intentará comprar un activo a un precio reducido, esperando un aumento de precio y la posibilidad de una venta rentable del activo.
  • UPWARD_TREND_THRESHOLD: el bot compra un activo si el precio ha aumentado en un valor superior al especificado por esta constante. Este movimiento contradice la filosofía de comprar bajo, vender alto. Su propósito es identificar una tendencia alcista y no perder una oportunidad de compra antes de que el precio suba aún más.


Aquí hay una ilustración que puede ayudarlo a comprender el significado de estas constantes.





Si realizamos la operación VENTA en el momento marcado en la figura con el marcador VENTA rojo, luego el bot, al decidir si realizar la operación COMPRAR, se guiará por los valores umbral DIP_THRESHOLDy UPWARD_TREND_THRESHOLD.



Si el precio cae por debajo de la línea verde inferior o por encima de la línea verde superior, realizaremos una operación de COMPRA. En la situación que se muestra en la figura, el precio superó el límite superior. Por lo tanto, guiados por el valor, realizamos UPWARD_TREND_THRESHOLDla operación COMPRAR.



▍Valores de umbral para la operación VENTA (si el bot está en estado COMPRAR)



  • PROFIT_THRESHOLD: el bot vende un activo si el precio se ha vuelto superior al precio calculado sobre la base de este valor, ya que el activo se compró anteriormente a un precio inferior. Así es como obtenemos ganancias. Vendemos el activo a un precio superior al precio en el momento de la compra.
  • STOP_LOSS_THRESHOLD: Idealmente, nos gustaría que el bot venda activos solo cuando la venta sea rentable para nosotros. Pero, quizás, hubo un fuerte movimiento a la baja del mercado. En tal situación, decidimos salir de la operación antes de incurrir en una pérdida demasiado grande y luego comprar el activo a un precio más bajo. Este umbral se utiliza para cerrar la posición con pérdidas. El propósito de esta operación es evitar mayores pérdidas.


He aquí una ilustración.





Esto muestra una situación en la que se realizó una compra donde está el marcador COMPRAR. Después de eso, el precio alcanza el límite especificado PROFIT_THRESHOLDy vendemos el activo con una ganancia. Así es como los bots ganan dinero.



Ahora que tenemos una comprensión general de cómo funciona un bot, es hora de mirar el pseudocódigo.



▍ Funciones útiles para trabajar con API



Lo primero que necesitará un bot es la capacidad de intercambiar datos con la API de intercambio. Implementamos estas capacidades usando varias funciones auxiliares:



FUNCTION getBalances():
    DO:  GET-  API    
      
    RETURN:   

FUNCTION getMarketPrices():
    DO:  GET-  API    
      
    RETURN:   

FUNCTION placeSellOrder():
    DO:
        1.      ( 
           , , 
        50%  )
        2.  POST-  API   
         SELL
    RETURN:   

FUNCTION placeBuyOrder():
    DO:
        1.      ( 
           , , 
        50%  )
        2.  POST-  API   
         BUY
    RETURN:   

//  ,    
//    
FUNCTION getOperationDetails():
    DO:  GET-  API   
      
    RETURN:   


El código anterior debe ser autoexplicativo sin mucha explicación. Pero, al implementar esta funcionalidad, debes saber exactamente qué datos necesitas transferir a la API cuando realizas solicitudes POST que inician la compra o venta de algo.



A menudo, por ejemplo, al operar con el par XAU / USD (oro y dólares estadounidenses), al ejecutar una solicitud, puede especificar cuánto oro necesita comprar o cuántos dólares necesita vender. Al realizar tales solicitudes, es muy importante comprender claramente el significado de las acciones que se realizan.



▍ Bucle de bot principal



Ahora que hemos preparado las funciones auxiliares, comencemos a describir las acciones del bot. Primero, necesitamos crear un bucle sin fin que se ejecute a intervalos regulares. Supongamos que queremos que un bot intente realizar una operación cada 30 segundos. Así es como se vería un bucle como este:



FUNCTION startBot():
    INFINITE LOOP:
        attemptToMakeTrade()
        sleep(30 seconds)


A continuación, configuraremos las variables y constantes de las que hablamos anteriormente, y escribiremos la lógica del bot que le permita tomar decisiones. Como resultado, además de las funciones auxiliares y el bucle principal, el código del bot principal se verá así:



bool isNextOperationBuy = True

const UPWARD_TREND_THRESHOLD = 1.50
const DIP_THRESHOLD = -2.25

const PROFIT_THRESHOLD = 1.25
const STOP_LOSS_THRESHOLD = -2.00

float lastOpPrice = 100.00

FUNCTION attemptToMakeTrade():
    float currentPrice = getMarketPrice()
    float percentageDiff = (currentPrice - lastOpPrice)/lastOpPrice*100
    IF isNextOperationBuy:
        tryToBuy(percentageDiff)
    ELSE:
        tryToSell(percentageDiff)

FUNCTION tryToBuy(float percentageDiff):
    IF percentageDiff >= UPWARD_TREND_THRESHOLD OR percentageDiff <= DIP_THRESHOLD:
        lastOpPrice = placeBuyOrder()
        isNextOperationBuy = False

FUNCTION tryToSell(float percentageDiff):
    IF percentageDiff >= PROFIT_THRESHOLD OR percentageDiff <= STOP_LOSS_THRESHOLD:
        lastOpPrice = placeSellOrder()
        isNextOperationBuy = True


Tenga en cuenta que los umbrales en este código se seleccionan al azar. Debe elegir estos valores usted mismo, de acuerdo con su estrategia comercial.



Combinando el código anterior con las funciones auxiliares y con el bucle del bot principal, que puede ser representado por algo como una función main, esto significa que ahora tenemos un bot de trabajo muy simple con las capacidades básicas típicas de los bots.



En cada iteración del ciclo, el bot verificará su estado actual (COMPRAR o VENDER) e intentará realizar una operación comercial, utilizando valores de umbral que están codificados en su código al analizar la situación actual. Luego, si se completa la operación, el bot actualizará información sobre su estado actual y datos sobre el precio al que se realizó la última operación.



Paso 5. Mejorando el bot





La arquitectura básica de nuestro bot está lista. Pero probablemente podamos mejorarlo un poco equipándolo con algunas características adicionales.



▍Revistas



Cuando comencé a crear una de las variantes de este bot, era muy importante para mí que el bot registrara constantemente información sobre sus acciones, enviándolas al terminal y a un archivo de registro separado.



Cada paso del programa debía ir acompañado de aproximadamente los siguientes registros:



[BALANCE] USD Balance = 22.15$
[BUY] Bought 0.002 BTC for 22.15 USD
[PRICE] Last Operation Price updated to 11,171.40 (BTC/USD)
[ERROR] Could not perform SELL operation - Insufficient balance


Lo que entra en el archivo de registro tiene una marca de tiempo. Como resultado, si me conecto al servidor una vez al día y veo, por ejemplo, un mensaje de error, puedo averiguar exactamente cuándo ocurrió el error y qué estuvo haciendo el bot todo este tiempo.



Equipar un bot con estas capacidades significa escribir una función que puede ser nombrada createLog. Esta función debe invocarse en cada paso del bucle principal del bot. Así es como podría verse esta función:



FUNCTION createLog(string msg):
    DO:
        1.  msg  
        2.  msg   ,   


▍Identificación de tendencias



El objetivo principal de nuestro bot es comprar activos a bajo precio y venderlos, obteniendo ganancias. Pero en su código hay dos constantes que simbolizan dos valores umbral, que contradicen en parte este objetivo. Esto UPWARD_TREND_THRESHOLDy STOP_LOSS_THRESHOLD.



Estos valores tienen como objetivo limitar las pérdidas vendiendo el activo cuando el precio baja y organizar la compra del activo cuando el precio sube. El punto aquí es que con su ayuda intentamos predecir tendencias, los precios, cuando aparecen, van más allá de los límites de la estrategia habitual, pero pueden perjudicarnos o darnos dinero. Tanto eso como otro prevén algunas acciones de nuestra parte.



La forma en que funciona el análisis de precios ahora nos limita mucho. El análisis de precios, realizado mediante la comparación de un par de indicadores, está lejos de ser un mecanismo para identificar tendencias.



Pero, afortunadamente, podemos, sin demasiados problemas, hacer que nuestro sistema de detección de tendencias sea más confiable.



Solo necesitamos organizar la observación de más valores de precios que antes. Y antes, solo almacenamos información sobre un indicador de precio, sobre el valor del activo en el momento de la última operación ( lastOpPrice). Por ejemplo, puede almacenar información sobre los precios de las últimas 10 o 20 iteraciones del ciclo del bot y compararlos con el precio actual, y no solo lastOpPrice. Es probable que esto permita una mejor identificación de las tendencias, ya que con este enfoque podemos capturar las fluctuaciones de precios a corto plazo en lugar de las fluctuaciones que ocurren durante un período prolongado.



▍Base de datos?



Un bot simple realmente no necesita una base de datos. Después de todo, opera con cantidades muy pequeñas de datos y almacena toda la información que necesita en la memoria.



Pero, ¿qué sucede si, por ejemplo, el bot se detiene de forma anormal? ¿Cómo puede saber, sin intervención humana, cuál era el significado lastOpPrice?



Para eliminar la necesidad de intervención manual en el código del bot cuando se reinicia, es posible que necesitemos una base de datos simple en la que podamos almacenar algunos indicadores como lastOpPrice.



Con este enfoque, el bot, cuando se inicia, no puede usar los valores que están codificados en el código. En su lugar, accede a los datos almacenados y continúa donde lo dejó.



Dependiendo de lo simple que crea que debe ser esta "base de datos", puede que incluso decida utilizar archivos .txt o .json normales como tales, ya que, en cualquier caso, estamos hablando de almacenar muy conjunto de datos limitado.



▍ Panel de control





Si desea organizar la visualización de la actividad del bot, así como administrarla sin editar su código, entonces es posible que desee conectar el bot a algún tipo de panel de control.



Esto requerirá que el bot tenga su propia API de servidor para administrar su funcionalidad.



Este enfoque, por ejemplo, facilita el cambio de los umbrales.



Hay muchas plantillas de tablero disponibles, lo que significa que si decide hacer algo como esto, ni siquiera tiene que crear una desde cero. Eche un vistazo a Start Bootstrap y Creative Tim , por ejemplo .



▍ Estrategias de prueba sobre datos históricos



Muchos intercambios brindan a los clientes acceso a datos históricos de precios. Además, si necesita dichos datos, suele ser fácil de obtener.



Su uso es muy útil para probar estrategias comerciales antes de aplicarlas. Esto permite que se ejecute una simulación utilizando datos históricos y dinero falso. Esto le permite saber qué tan bien se comportarían los umbrales y, si es necesario, cambiar estos valores.



▍Información adicional sobre umbrales y reclamaciones



Hay algunas cosas a tener en cuenta al realizar pedidos.



Primero, debe saber que existen dos tipos de órdenes: órdenes de límite y órdenes de mercado. Si no sabe nada sobre esto, definitivamente debería leer literatura especial. Explicaré estas ideas en unas pocas palabras.



Las órdenes de mercado son órdenes que se ejecutan al precio de mercado actual. En la mayoría de los casos, esto significa su implementación inmediata.



Las órdenes limitadas, por otro lado, son órdenes que se colocan indicando un precio que está por debajo del mercado (en el caso de órdenes de compra), o por encima del mercado (en el caso de órdenes de venta). Al mismo tiempo, no hay garantía de que estas órdenes se ejecuten, ya que el precio puede no alcanzar el valor especificado.



La fortaleza de las órdenes limitadas es que permiten, anticipando los movimientos del mercado, colocar órdenes donde, en opinión del comerciante, puede estar el precio.



Además, se suelen aplicar comisiones más bajas a estos pedidos que a los de mercado. Esto se debe al hecho de que lo que se denomina "tarifa de tomador" se aplica generalmente a las órdenes de mercado, y lo que generalmente se denomina "tarifa de fabricante" se aplica a las órdenes limitadas.



Las razones por las que estas comisiones se denominan de esta manera son porque quien coloca una orden de mercado simplemente está "tomando" el precio de mercado actual. Y las órdenes límite están fuera de los precios de mercado, agregan liquidez al mercado y, como resultado, “crean un mercado”, por lo que sus creadores son recompensados ​​con comisiones más bajas.



Tenga en cuenta que el bot que estamos considerando aquí es el más adecuado para trabajar con órdenes de mercado.



Y, concluyendo la conversación sobre comisiones, quiero señalar que al establecer el valor PROFIT_THRESHOLD, también se deben tener en cuenta las comisiones.



Para obtener ganancias, un bot debe realizar primero una operación de COMPRA y luego una operación de VENTA. Esto significa que la comisión se cobrará dos veces.



Como resultado, el bot debe configurarse para que las ganancias recibidas de las ventas cubran al menos las comisiones. De lo contrario, el bot comerciará con pérdidas.



Pensemos en ello, partiendo del supuesto del uso de comisiones que no dependen del monto de la aplicación y del tipo de operación. Entonces, la comisión por comprar un activo por $ 100.00 es $ 0.50. Si este activo se vende por $ 100,75 y se cobra la misma comisión, resulta que la ganancia bruta es del 0,75%. Pero, de hecho, aquí estamos ante una pérdida neta del 0,25%.



Ahora imagine que su bot siempre cierra operaciones con una pérdida neta. En tal situación, puede perder rápidamente mucho dinero.



Salir



Mi objetivo principal era revelar los conceptos que necesita conocer al desarrollar bots comerciales. Traté de describir todo de tal manera que fuera comprensible incluso para aquellos que nunca antes habían negociado en el intercambio. Al mismo tiempo, no vinculé la narración a ningún lenguaje de programación específico.



Supuse que los lectores de este material saben cómo realizar solicitudes HTTP utilizando el lenguaje de programación que elijan. Por lo tanto, no entré en detalles de programación, centrándome en otras cosas.



Te dije todo lo que quería sobre el desarrollo de robots comerciales. Con suerte, ahora puedes crear tu propio bot.



¿Utiliza bots comerciales?






All Articles