Discusión sobre el artículo "Cómo construir un EA que opere automáticamente (Parte 15): Automatización (VII)"
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.
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.
- www.mql5.com
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.
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.
Utilice el botón utilice el botón CÓDIGO (Alt -S) cuando introduzca su código.
- www.mql5.com
Nuevo artículo Crear un EA que funcione automáticamente (Parte 15): Automatización (VII) ha sido publicado:
Autor: Daniel Jose
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.
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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