Discusión sobre el artículo "Cómo construir un EA que opere automáticamente (Parte 15): Automatización (VII)"

 

Artículo publicado Cómo construir un EA que opere automáticamente (Parte 15): Automatización (VII):

Para coronar esta secuencia sobre automatización vamos a complementar lo visto en el artículo anterior. Este muestra definitivamente cómo todo encajará, haciendo que el Asesor Experto funcione como un reloj.

He identificado los principales fallos, retos y dificultades inherentes al trabajo de un programador en la creación de un EA autónomo. Además, he destacado los valiosos conocimientos y la perspectiva transformadora que obtendrá observando el mercado.

He intentado facilitarte la creación de un sistema seguro, fiable y robusto que sea modular, compacto y ligero. Este sistema debe poder funcionar en conjunción con varios otros, ya que la versatilidad es crucial para la eficacia de un EA. No basta con tener un sistema que sólo opere con un único activo, ya que esto limita sus oportunidades de beneficio.

El último artículo de esta serie, con tres ejemplos prácticos, puede despertar un interés especial. Sin embargo, es esencial absorber los conocimientos de toda la serie para sacar el máximo provecho de este artículo en concreto. He tratado de transmitir que no es necesario ser un prodigio de la programación o tener múltiples títulos, sólo una sólida comprensión de cómo funcionan la plataforma MetaTrader 5 y el lenguaje MQL5.


Además, mostré cómo crear condiciones específicas para que su sistema funcione con eficacia, incluso cuando MQL5 o MetaTrader 5 no tienen el indicador que le gustaría utilizar. Esto se mostró en el ejemplo 3, donde enseñé cómo crear internamente el indicador HILO. Sin embargo, es crucial que el sistema esté correctamente implementado y probado. Un sistema mal ejecutado, por muy bien diseñado que esté, puede provocar pérdidas en lugar de beneficios.

Autor: Daniel Jose

 

Hola Daniel, antes que nada me gustaría felicitarte por tu desempeño al colaborar con la comunidad de desarrolladores y entusiastas.

Tengo una duda sobre la ejecución del EA de esta secuencia de artículos.

Lo he probado en cuentas de Netting y Hedging cambiando la Orden OCO a Pendiente, según tu documentación. Pero las órdenes no se ejecutan.

Y tampoco hay errores en el log.

¿Qué puede ser?

Nota: No he cambiado nada del código, sólo la lógica de compra y venta... Lo probé con mi lógica (mi estrategia) y no daba ninguna entrada, pensé: he hecho algo mal, kkkk.... entonces cogí tu código sin ningún cambio, lo compilé y pasa lo mismo.

Se ejecuta manualmente (al poner la cantidad de lotes), pero no automáticamente.

 
César Augusto #:

Hola Daniel, en primer lugar me gustaría felicitarte por tu actuación colaborando con la comunidad de desarrolladores y entusiastas.

Tengo una pregunta sobre la ejecución de la EA en esta secuencia de artículos.

Lo he probado en cuentas de Netting y Hedging cambiando la Orden OCO a Pendiente, según tu documentación. Pero las órdenes no se ejecutan.

Tampoco da ningún error en el log.

¿Qué puede ser?

Nota: No he cambiado nada del código, sólo la lógica de compra y venta... Lo probé con mi lógica (mi estrategia) y no daba ninguna entrada, pensé: he hecho algo mal, kkkk.... entonces cogí tu código sin ningún cambio, lo compilé y pasa lo mismo.

Se ejecuta manualmente (al poner la cantidad de lotes), pero no automáticamente.

Las entradas automáticas sólo ocurren cuando los parámetros de entrada que estableces permiten que se active la orden. En otras palabras, si tu lógica dice que el indicador, cualquiera que sea, necesita tener un cierto valor, la entrada o salida automática sólo ocurrirá cuando se alcance ese valor. De lo contrario, nunca sucederá. Usted puede haber visto que hay 3 ejemplos de configuraciones en la secuencia. Intente estudiar cada uno de ellos para entender cómo funciona la lógica de activación. Sin entender esta lógica de disparo, no podrás hacer funcionar el mecanismo automático. Es como una trampa para ratones, si la configuras para atrapar a un elefante, no se disparará cuando el ratón la toque 😂 ... En fin, estudia los mecanismos de los ejemplos y suerte .... 😁👍

 

Daniel, gracias por tu dedicación a la enseñanza.

¿Puedes comprobar el funcionamiento del EA de esta parte 15 - versión v3 - que utiliza el C_Automaton_v3.mqh?

La definición de la lista eSelectMedia es clara. Sin embargo, creo que hay un problema con su uso a la hora de manipular los elementos de las matrices m_Op en el bucle FOR, concretamente con "sizeof(eSelectMedia)".

Según la documentación(https://www.mql5.com/en/docs/basis/types/integer/enumeration), sizeof siempre devuelve 4, incluso para enumeraciones con más elementos.

Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
Documentation on MQL5: Language Basics / Data Types / Integer Types / Enumerations
  • www.mql5.com
Enumerations - Integer Types - Data Types - Language Basics - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
FernandoN23 #:

Daniel, gracias por tu dedicación a la enseñanza.

Por favor, ¿puedes comprobar el funcionamiento del EA de esta parte 15 - versión v3 - que utiliza el C_Automaton_v3.mqh?

La definición de la lista eSelectMedia es clara. Sin embargo, creo que su uso tiene algún problema, en cuanto a la manipulación de los elementos de las matrices m_Op en el bucle FOR, concretamente con "sizeof(eSelectMedia)".

Según la documentación(https://www.mql5.com/en/docs/basis/types/integer/enumeration), sizeof siempre devuelve 4, incluso para enumeraciones con más elementos.

Estás confundiendo las cosas. El 4 que dice la documentación es el tamaño, en términos de bytes, utilizado para devolver sizeof y no el número de elementos máximos que se devolverán.

 
Daniel Jose #:

Estás confundiendo las cosas. El 4 que dice la documentación es el tamaño, en términos de bytes, utilizado en la devolución de sizeof y no el número de elementos máximos que se devolverán.

Daniel, gracias por la rápida respuesta.

Siguiendo con el tema de FOR con sizeof(enum), añado a continuación un script de prueba, el resultado obtenido y una pregunta más.

Gracias por tu orientación.

script test.mq5

//+------------------------------------------------------------------+
void OnStart()
  {
      enum eSelectMedia {MEDIA_FAST, MEDIA_SLOW};
      enum eSelectMeses {JANEIRO, FEVEREIRO, MARCO, ABRIL, MAIO, JUNHO, JULHO, AGOSTO, SETEMBRO, OUTUBRO, NOVEMBRO, DEZEMBRO};
   
      struct st01
         {
               double  Buff[];
               int     Handle;
         }m_Op[sizeof(eSelectMedia) + 1];
                   
      Print("Tamanho do eSelectMedia = ", sizeof(eSelectMedia));
      Print("Tamanho do eSelectMeses = ", sizeof(eSelectMeses));
      Print("Tamanho do m_Op = ", ArraySize(m_Op));
      
      Print("========= Mostrar enum eSelectMedia =========");
      for (int i = sizeof(eSelectMedia); i >= 0; i--)
        {
            Print("eSelectMedia - idx = ", i);
        }
   
      Print("========= Mostrar enum eSelectMeses =========");
      for (int i = sizeof(eSelectMeses); i >= 0; i--)
        {
            Print("eSelectMeses - idx = ", i);
        }
   
      Print("========= Mostrar enum m_Op =========");
      for (int i = ArraySize(m_Op); i >= 0; i--)
        {
            Print("m_Op - idx = ", i);
        }     
  }
// Fin OnStart() 
//+------------------------------------------------------------------+


Resultado:

2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do eSelectMedia = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do eSelectMeses = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    Tamanho do m_Op = 5
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum eSelectMedia =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMedia - idx = 0
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum eSelectMeses =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    eSelectMeses - idx = 0
2023.06.07 09:09:10.415    teste (EURUSD,M1)    ========= Mostrar enum m_Op =========
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 5
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 4
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 3
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 2
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 1
2023.06.07 09:09:10.415    teste (EURUSD,M1)    m_Op - idx = 0


El enum eSelectMedia tiene 2 elementos.
El enum eSelectMonths tiene 12 elementos.
El retorno de sizeof() es 4, para cualquiera de ellos, según la documentación.

El m_Op tiene ArraySize() = 5, porque se definió en base a sizeof(eSelectMedia) + 1, según el fichero C_Automaton_v3.mqh.

Cuando usé sizeof(enum) en el bucle FOR, no se tuvo en cuenta el número de elementos del enum correspondiente. La interacción consideraba 4, que es el retorno de sizeof(enum), tanto para el enum con 2 elementos como para el enum con 12 elementos.

Con esto, ¿cómo debo crear un bucle que considere el número exacto de elementos de una enumeración?

Código con formato incorrecto editado por el moderador.

 
@FernandoN23 #: script test.mq5

Utilice el botón utilice el botón CÓDIGO (Alt -S) cuando introduzca su código.

Botón de código en el editor

Nota de usuário - MQL5.community
Nota de usuário - MQL5.community
  • www.mql5.com
Você acabou de registrar e, provavelmente, você tem perguntas como: "Como faço para inserir uma imagem na minha mensagem?", "Como faço para formatar meu código fonte MQL5?", "Onde são mantidas minhas mensagens pessoais?". Você pode ter muitas outras perguntas. Neste artigo, nós preparamos algumas dicas práticas que ajudarão você a se acostumar com o MQL5.community e tirar o máximo proveito de seus recursos disponíveis.
 
Buenos días Sr. Daniel por favor puede compartir el
EA_v1.mq5, EA_v2.mq5 y EA_v3.mq5. O me pregunto donde puedo ver el archivo adjunto.
 

Hola, estoy usando el EA que proporcionaste en el gráfico EURUSD 1M y durante el proceso, estoy experimentando que la función ClosePosition no está cerrando la posición con éxito.

Supongo que es porque el tipo de cuenta es de cobertura y la posición debe ser cerrada mediante el establecimiento de la acción a TRADE_ACTION_CLOSE_BY en lugar de TRADE_ACTION_DEAL.

 
Estimado Daniel. Enhorabuena por tus artículos. Por favor, ayúdame con una duda: cuando reemplazo el bloque de código del método "inline virtual void Triggers(void) final" para enviar una orden pendiente en el máximo o mínimo de la barra que disparó la señal de media móvil, el EA ya compra 2 volúmenes de contratos, aunque está configurado para comprar 1 volumen. Si vuelvo al código original, vuelve a funcionar perfectamente. ¡¡¡Si me podéis ayudar, gracias!!!