¿Cómo ejecutar el EA para varios pares? - página 2

 
mittalpa:

Creo que ambos enfoques son buenos.

Lo único que me gustaría añadir es que la opción #2 tiene un mérito de rendimiento debido a una menor sobrecarga. Todo estará en la memoria que, obviamente, es más rápido que la operación del archivo.

Una ventaja para la opción # 3 es si desea utilizar los datos del archivo para algo que MT4 no puede hacer.

También considere que si necesita construir un EA que pueda recuperarse de los cortes de energía, etc., sin la intervención del usuario para actualizar las condiciones del mercado, etc., se encontrará construyendo la funcionalidad de acceso al archivo de todos modos.

 
cloudbreaker wrote >>

También considere que si necesita construir un EA que pueda recuperarse de cortes de energía, etc., sin la intervención del usuario para actualizar las condiciones del mercado, etc., se encontrará construyendo una funcionalidad de acceso a archivos de todos modos.

En mi experiencia, vas a tener muchos problemas al intentar construir un EA que opere con múltiples pares.

1. Cada par necesita su propia lógica personalizada, optimización y para algunos pares tal vez incluso una estrategia de negociación diferente. He escrito EAs que fueron optimizados para un par en particular hasta el punto en que estaba operando bien. Luego, cuando traté de usarlo en otro par que tiene la mayor correlación con el primer par, me sorprendió que había que cambiar muchas cosas para que el EA funcionara y estuviera optimizado para el segundo par. He descubierto que cada par necesita su propio conjunto completo de ajustes personalizados, valores de los indicadores y muchas veces incluso cambios en la lógica básica y la estrategia. Para mí tiene mucho más sentido crear un EA muy flexible que tenga varias estrategias diferentes y ramas de lógica incorporadas. Entonces es una simple cuestión de crear un nuevo archivo .set óptimo para cada par.

2. El EA que quiere hacer no podrá ser probado y optimizado en el Probador de Estrategias. El backtesting y la optimización son esenciales en mi experiencia. Hay optimizaciones que mejoraron enormemente el rendimiento de mi EA que nunca hubiera podido descubrir si no hubiera utilizado el Probador de Estrategias. Me dio cosas como la configuración de los indicadores que estaban tan lejos de lo que es considerado por muchos como los valores más útiles y óptimos para un indicador en particular, que nunca habría pensado en probar los valores en cualquier lugar cerca de lo que los valores óptimos resultaron ser. Piense en la cantidad de parámetros que tiene en su EA. Cada uno necesita ser optimizado, y cada optimización de un parámetro puede requerir un cambio en otro parámetro. Por eso no puede optimizar cada parámetro por sí mismo. El objetivo de la optimización es conseguir que todos los parámetros estén optimizados en relación con los demás de la mejor manera posible. Eso puede llevar mucho tiempo y mucho trabajo usando el probador, pero es prácticamente imposible hacer estas optimizaciones manualmente cambiando los parámetros uno por uno.

En otra nota, cualquiera que sea la forma en que decida codificar su EA, guardar el estado de su EA u otra información en un archivo no es obligatorio en la mayoría de los casos, y no es la única opción. La mejor, más eficiente y más fácil manera de hacerlo es guardar su estado en las Variables Globales. Después de todo, esa es la razón por la que se añadió la función de Variables Globales a MT. También algunos de ustedes hablaron de tener un EA extra creado con el único propósito de intercambiar datos almacenados en el sistema de archivos permitiendo el intercambio de datos y la interacción entre los dos EA. Esto también es innecesario. El intercambio de datos e incluso la capacidad de lógica condicional entre múltiples EAs es otra característica de las Variables Globales. Esto permite que múltiples EAs en diferentes gráficos tengan acceso a los datos de cualquier EA y usen esos datos para tomar decisiones que puedan efectuar un cambio en otro EA. Esos datos están seguros y protegidos incluso en el caso de una caída de la computadora o un corte de energía. Pero, ¿qué sucede en un fallo o corte de energía cuando usted está en el proceso de guardar, leer o intercambiar datos entre EA's y tiene uno o dos archivos abiertos? Es muy probable que termine con datos perdidos, corrupción de datos y lo peor- archivos de cero bytes o ningún archivo. Con las Variables Globales ninguno de estos problemas puede ocurrir. El estado de tu EA será exactamente igual que el milisegundo anterior a la caída de tu sistema. Ahora, la desventaja de las GV's de la que todo el mundo habla es que no pueden almacenar cadenas, pero hay algunas buenas maneras de evitarlo.

En primer lugar, las GVs pueden almacenar cadenas si usas el nombre de la GV como el valor de la cadena, por ejemplo GlobalVariableSet(Symbol() + "LastUptime=" + TimeLocal(), -1); Un problema con esto es que hay un límite en la longitud de los nombres de las GVs así que no puedes usar esta forma para guardar cadenas largas. Otra gran solución que uso todo el tiempo es almacenar cadenas en los campos de texto de los objetos gráficos. Puedes trabajar con ellos de la misma manera que trabajas con órdenes y GV's. Hay funciones mql para obtener la cantidad total de ambos GV's y objetos gráficos para que usted pueda entonces hacer un bucle a través de todos ellos y encontrar el que usted está buscando, de nuevo la misma manera que el bucle a través de sus órdenes.

ADVERTENCIA- Ahora estoy yendo en un poco de un camino de conejo aquí sobre otras formas interesantes objetos gráficos pueden mejorar sus funciones de negociación ... conseguir fuera de tema un poco, pero puede ser útil la información ...

Hay muchas más cosas útiles que puedes hacer con los objetos gráficos. Por ejemplo, uno de mis EAs tiene una característica opcional de cobertura. Cuando la cobertura está activada no hay, por supuesto, un stop loss real en cualquier nueva orden colocada, porque cuando la cobertura en el mismo símbolo el punto es abrir una orden opuesta si la primera orden va más allá de lo que sería el stop loss normal y la primera orden necesita permanecer abierta. Así que su código tendría que saber cuál es el stop loss y monitorear la operación para poder abrir la cobertura cuando la primera orden alcance el precio del stop loss, y en caso de que haya algún malentendido la razón por la que no podemos usar un stop loss real en la orden es porque entonces la orden se cerraría, lo que por supuesto haría que no hubiera cobertura en absoluto. Pero con los objetos gráficos se puede hacer que esto funcione mejor y que el usuario lo vea exactamente igual que un stop loss real. Lo que se hace es lo siguiente: Cuando colocas la orden, al mismo tiempo creas un objeto de línea horizontal con el parámetro de precio = al precio del stop loss. El nombre del objeto de línea es "Orden #" + orderTicket; la descripción es "StopLoss @ " + SLPrice. Establezca el estilo de la línea a STYLE_DASHDOT, el color a rojo y usted tiene una línea de stop loss que se ve exactamente como la cosa real. El código para hacer que funcione es fácil también. Toda la información que necesitas ya está almacenada en el objeto de línea: el número de la orden y el precio del SL, que es el valor del objeto de línea. Entonces haces una función que comprueba si el precio actual alcanza o supera la línea. Cuando esto sucede, se obtiene el ticket# que se guardó en el campo de nombre de la línea. Luego buscas la orden abierta que tiene el mismo ticket. Seleccione la orden para ver si es una orden de compra o de venta y también obtenga el tamaño del lote. Ahora tienes toda la información que necesitas para abrir tu orden de cobertura. Abre una nueva orden opuesta a la primera y con el mismo tamaño de lote. El último paso es eliminar la línea de stop loss. Cuando veas que funciona es muy bueno porque ahora puedes ver cuando te estás acercando a ser "Hedged".

Otra ventaja es que si crees que tu orden puede llegar a buen puerto, si el precio parece que puede volver a tu favor pero necesitas un poco más de espacio, entonces sólo tienes que arrastrar la línea de SL/Hedge un poco hacia arriba. ¿No le gustaría poder hacer eso con las líneas estándar de SL y TP? Eso sería una gran característica nueva si hicieran las líneas de stop loss y take profit movibles para que pudiéramos hacer ajustes rápidos cuando el mercado se está moviendo realmente. Por supuesto, usted puede hacer eso hoy en día en su EA utilizando los pasos anteriores y un buen beneficio es que el corredor nunca vería su SL o TP. El lado negativo es que si su ordenador se apaga, no tiene SL o TP del lado del servidor. Pero lo mismo es cierto para los robots como FapTurbo. Su método "sigiloso" es poner valores falsos de SL y TP en las órdenes y cerrar las órdenes desde el código o modificar la orden con los valores correctos de SL y TP en el último minuto cuando el precio se está acercando.

 
Jacques366:

Hola a todos,

¡Prefiero tener en cuenta que todavía estamos trabajando en el procesamiento en tiempo real, así que me olvido de usar el bucle while o la función de espera para mantener la mano en la comunicación!

Adjuntando su EA a un par como EURUSD le proporciona suficientes señales para manejar todos los otros pares, los ticks son muy frecuentes. No es una cuestión de minutos sino de segundos (ejecutar un bucle durante 2 minutos me parece una locura). Si no es una cuestión de segundo, sólo pensar por qué o ver con otro corredor.

si realmente necesitas más de lo que obtendrás al adjuntar tu EA al eurusd, piensa en ejecutar una instancia separada de tu EA adjunta a cada moneda. Lo siento pero tiendo a pensar "o repensar su sistema".

Lo siento si siento que este post es un poco brusco. Quería compartir con ustedes mi punto de vista.

Buena suerte.

Soy un programador novato, así que por favor considere esto como un escenario "what-if" para propósitos de discusión:


Me doy cuenta de que es mala programación para crear un bucle While sin fin con nada productivo en el bucle, o si le impide ejecutar el resto de su EA, pero lo que si se crea un bucle While sin fin que contiene el cuerpo de su EA. No entiendo la programación de MQL4 lo suficientemente bien como para entender plenamente su "mantener la mano en la comunicación" comentario. Si usted lanza órdenes de comercio a través de una secuencia de comandos independiente tendrá problemas de comunicación si la EA continúa ejecutando en un bucle sin fin?


Sigo jugando con la idea de utilizar un bucle interminable y emitir órdenes de comercio a través de scripts independientes, porque confiar en las garrapatas entrantes del EURUSD para ejecutar el EA puede conducir a algunos retrasos prolongados. Por ejemplo, entre las 0700 y las 0800 GMT de hoy, la espera más larga habría sido de 31 segundos, pero más tarde en el día cerca del final de la sesión de Nueva York la espera puede tomar hasta 2 minutos para una garrapata entrante --- No he comprobado la sesión asiática todavía, pero sospecho que también tiene algunos largos intervalos entre garrapatas.


Si pones el cuerpo de tu EA en un bucle sin fin podrías controlar fácilmente la frecuencia de actualización de todas las divisas que estés negociando y no sacrificar ningún retraso. De hecho, es posible que tenga que poner una declaración de sueño 100-250 milisegundos en el bucle para reducir la velocidad un poco si 50 pasa a través de la EA en 1 segundo es adormecer la mente.


Agradezco todos los comentarios.

 
vangrosh wrote >>

ADVERTENCIA- Ahora me voy a ir por las ramas sobre otras formas geniales en las que los objetos gráficos pueden mejorar sus funciones comerciales... me estoy saliendo un poco del tema pero puede ser información útil...

¡brillante!

 
vangrosh:

Según mi experiencia, vas a tener muchos problemas si intentas crear un EA que opere con varios pares.

Esto es realmente genial y seguramente voy a introducir la mayor parte de ella a mi EA.

Un par de cosas que ya he decidido -
1. Sólo un par por EA.
2. Sólo una orden por par. (Esto puede cambiar más tarde, pero voy a seguir con esto hasta que llegue a ser lo suficientemente competente).

Muchas gracias por compartir sus experiencias de oro.

Pankaj
 

Este gráfico muestra el intervalo de tiempo entre ticks para el EURUSD el 29 de abril de 2009. No sé qué zona horaria representan estos datos. Los datos de los ticks fueron descargados de Gain Capital.

Como se puede ver, hay algunos periodos durante el día en los que el intervalo entre ticks supera frecuentemente un minuto y ocasionalmente dos minutos.



 
vangrosh:

Entonces, sólo es cuestión de crear un nuevo archivo .set óptimo para cada par.

vangrosh: ¿Cómo se crea y utiliza un archivo .set? No he podido encontrar ninguna referencia para ese tipo de archivo.

 
cloudbreaker wrote >>

También considere que si necesita construir un EA que pueda recuperarse de cortes de energía, etc., sin la intervención del usuario para actualizar las condiciones del mercado, etc., se encontrará construyendo una funcionalidad de acceso a archivos de todos modos.

Por favor, eche un vistazo aquí: https://book.mql4.com/special/index

Características generales de los programas complejos


El camino a seguir si desea crear EAs multidivisa.

 
StraightTrader:

Consulte aquí: https://book.mql4.com/special/index

Características generales de los programas complejos


El camino a seguir si desea crear EAs multidivisa.

Gracias por la referencia.

 
FXtrader2008 wrote >>

Este gráfico muestra el intervalo de tiempo entre ticks para el EURUSD el 29 de abril de 2009. No sé qué zona horaria representan estos datos. Los datos de los ticks fueron descargados de Gain Capital.

Como se puede ver, hay algunos periodos durante el día en los que el intervalo entre ticks supera frecuentemente un minuto y ocasionalmente dos minutos.

Gracias por el gráfico. Estaría bien cotejarlo con el de algunas otras divisas, sólo para asegurarnos de que no se producen los mismos retrasos. (Apreciaré si usted podría fácilmente presentar gráficos para digamos 4 pares)

Acabo de notar, cuando empecé a construir mi EA, que cuando no tengo ticks durante 1 o 2 minutos en el eurusd, entonces es lo mismo para otras monedas. Tal vez fue sólo un riesgo en ese momento o un assomption mal que hice, pero me quedé con esta idea y mi EA está funcionando desde hace meses sin ningún problema. La experiencia fáctica compensa la falta de lógica y mantuve mi EA funcionando así. Si hubiera tenido problemas habría implantado tu solución, me refiero a tu idea de mantener tu EA despierto con sólo un retraso entre 2 ejecuciones. Lógicamente es así como debería hacerse, hasta donde yo sé : pero no sé cómo se generan los ticks por los brokers, así que es difícil ir más allá.

También es "normal" o "mejor" codificar de acuerdo con el sistema dentro de su programa se está ejecutando.

Así que permitiendo el tratamiento de múltiples monedas, normalmente deberíamos ser capaces de adjuntar nuestro EA a un canal que proporciona todos los ticks. Eso es una falta en la lógica del sistema que tenemos que tratar de una manera u otra.

Saludos