Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1740

 
Maxim Kuznetsov #:

no le digas a la gente lo que tiene que hacer.

Hay que recordar los datos y trabajar con ellos

Maxim, en esa situación, no necesitas recordar nada. Es mucho más seguro mirar la posición cerrada anterior.

No necesitas hacer nada con recordar los datos y restaurarlos después de una situación anormal. Si el terminal se cierra, los datos de posición se perderán. Por lo tanto, al memorizarlos, debe considerar inmediatamente la posibilidad de su restauración rápida y eficaz.

(No se puede decir que memorizar una orden en los comentarios sea una solución fiable, ya que supondría confiar en la voluntad del corredor/agente).

Y lo interesante es que, de todas formas, va a leer estos datos de alguna parte. ¿No sería más fácil leerlo directamente de la fuente?

 
Sergey Zhukov #:

¿Cómo puedo forzar al compilador a compilar para MT4 y no para MT5?

#ifdef __MQL4__

#else

#endif
 
Artyom Trishkin #:

Maxim, en esa situación, no necesitas memorizar nada en ningún sitio. Es mucho más seguro mirar la posición cerrada pasada.

No tienes que hacer nada con recordar los datos y luego restaurarlos después de una emergencia. Si el terminal se cierra, los datos de posición se perderán. Por lo tanto, al memorizarlos, debe considerar inmediatamente la posibilidad de su restauración rápida y eficaz.

(No se puede decir que memorizar una orden en los comentarios sea una solución fiable, ya que supondría confiar en la voluntad del corredor/agente).

Y lo interesante es que, de todas formas, va a leer estos datos de alguna parte. ¿No sería más fácil leerlo directamente de la fuente?

y luego sigue "por qué OnTimer no entra en un par de segundos o OnTick falla salvajemente" :-)

Para restaurar el estado una vez en la inicialización (ya sea leyendo de un archivo o del historial/entorno de navegación) y ya está... El último pedido junto con sus características se almacena en una variable y se conoce siempre

 
Maxim Kuznetsov #:

y luego sigue el tema de "por qué OnTimer no entra en un par de segundos o OnTick falla salvajemente" :-)

Al inicializar, restaura el estado una vez (ya sea leyendo de un archivo o buscando en el historial/entorno) y ya está... La última orden junto con sus características se almacena en una variable y siempre se conoce

Para saber cómo se cerró la última posición, hay que encontrarla. Al fin y al cabo, mientras esté abierta, no hay forma de registrar y recordar cómo se cerró, porque sigue abierta.

Es posible almacenar un ticket de la última posición abierta y utilizarlo para determinar cómo se cerró, pero ... Al manipular con una posición, mientras está abierta, su entrada puede cambiar. En consecuencia, debemos implementar una funcionalidad para reescribir el ticket modificado. Todo esto complica el código.

Sólo sugerí buscar la última posición cerrada. Y combina la búsqueda de todas las posiciones al reiniciar el EA y leer sólo los datos de una posición al cerrar una nueva.

Al fin y al cabo, espero que todo el mundo entienda que no es necesario hacer un bucle con todas las posiciones históricas, sino sólo con la última. Es decir, sólo recordamos una variable del índice del bucle, su valor actual, y comenzamos un nuevo bucle (cuando el número de pedidos históricos aumenta) a partir del valor de esta variable, no de cero. Y el valor de esta variable se escribe en OnInit() al inicio y reinicio del Asesor Experto, así como al cerrar una nueva posición. Es decir, de esta manera evitamos la necesidad de escribir y leer los datos de posición y trabajar con la unidad.

Creo que este enfoque es el más rentable, porque

1. Sólo hay que recordar el valor del índice del bucle
2. Obtener datos sólo en el momento necesario mediante un acceso directo a una orden cerrada utilizando su índice
3. No es necesario crear una función de lectura/escritura
4. Es más rápido tanto para trabajar como para escribir.

Y sí, estoy de acuerdo en que hay que conocer todos los datos, yo mismo lo hago. Pero es conveniente conocerlos en beneficio del programa y de uno mismo.

 
Ivan Butko #:

Gracias por la información.

Si tiene tiempo, por favor, responda cómo arreglar:

En un historial de N velas se establecen dos objetivos dirigidos de forma diferente: Close[N]+50*Point y Close[N]-50*Point.
Entonces hay una condición de que el precio debe alcanzar uno de los objetivos (si (High[i]> Close[N]+50*Point) o (si (Low[i]<Close[N]-50*Point)
Cuando la condición se cumple, la distancia desde Close[N] a High[i] se escribe en el array x[high]=High[i].
Entonces se lanza al azar en cualquiera de los gráficos en cualquier momento.

Y al comprobarlo mediante Print(x[high]), ¡1 de cada diez valores muestran menos de 50! Uno tiene 12, el otro 49. Aunque, está estrictamente establecido+50*Punto. 8-9 son correctos (más de 50) y 1-2 son anormales. No es a través del probador, pero con un gráfico real coloco un Asesor Experto (sin ninguna función de trading), pero con los anteriores funciona con el historial y muestra resultados incorrectos.

Cuanto más grande es el valor, menos se producen estos errores. Pensé que podría ser la propagación lo que interfiere, pero... No creo que haya un spread en la historia en MT4

Resuelto.

 
¿Tengo que añadir RefreshRates() a OnTimer(), o el temporizador se actualiza solo por defecto?
 
Ivan Butko #:
¿Tengo que añadir RefreshRates() a OnTimer(), o el temporizador se actualiza solo por defecto?
No lo hace
 
Aliaksandr Hryshyn #:
No se actualiza

Gracias

 
Artyom Trishkin #:

Para saber cómo se cerró la última posición, hay que encontrarla. Mientras esté abierta, no hay forma de registrar y recordar cómo se cerró: sigue abierta.

Es posible almacenar un ticket de la última posición abierta y utilizarlo para determinar cómo se cerró, pero ... Al manipular con una posición, mientras está abierta, su entrada puede cambiar. En consecuencia, debemos implementar una funcionalidad para reescribir el ticket modificado. Todo esto complica el código.

Sólo sugerí buscar la última posición cerrada. Y combina la búsqueda de todas las posiciones al reiniciar el EA y leer sólo los datos de una posición al cerrar una nueva.

Al fin y al cabo, espero que todo el mundo entienda que no es necesario hacer un bucle con todas las posiciones históricas, sino sólo con la última. Es decir, sólo recordamos una variable del índice del bucle, su valor actual, y empezamos un nuevo bucle (cuando el número de pedidos históricos aumenta) a partir del valor de esta variable, no de cero. Y el valor de esta variable se escribe en OnInit() al inicio y reinicio del Asesor Experto, así como al cerrar una nueva posición. Es decir, de esta manera evitamos la necesidad de escribir y leer los datos de posición y trabajar con la unidad.

Creo que este enfoque es el más rentable, porque

1. Sólo hay que recordar el valor del índice del bucle
2. Obtener datos sólo en el momento necesario mediante un acceso directo a una orden cerrada utilizando su índice
3. No es necesario crear una función de lectura/escritura
4. Es más rápido tanto para trabajar como para escribir.

Y sí, estoy de acuerdo en que hay que conocer todos los datos, yo mismo lo hago. Pero conocerlos es deseable en beneficio del programa y de uno mismo.

No he notado que el ticket de una posición cambie, mientras está abierta. Suele ser igual al ticket de la primera orden, que abrió esta posición.

La última se cerró: ¿qué pasa si hay más de un EA operando en el símbolo, además de la operación manual?
 
JRandomTrader #:

No he notado que el ticket de una posición cambie mientras está abierta. Suele ser el mismo que el ticket de la primera orden que abrió la posición.

Último cierre - ¿pero qué pasa si hay más de un EA operando en el símbolo, además de la operación manual?

Un cierre total o parcial, y el billete es diferente. Tenemos que determinar qué billete se originó a partir de cuál, y reescribir el recordado. Sin embargo, no está claro de qué plataforma estamos hablando: ambas son ligeramente diferentes, pero hay que seguirlas.

Lo que se quiere decir es "el último cerrado que pertenece a este EA".