Analizar las barras hacia atrás en EA

 

Hola a todos,

Esta podría ser una pregunta muy tonta pero realmente no he podido encontrar la manera de hacerlo. Estoy tratando de crear un EA. después de analizar algunas barras, decide abrir una orden o no. Digamos que abre una orden. de alguna manera si mi EA se detiene o metatrader se apaga, cuando lo reabro, quiero encontrar las barras que causan para abrir la orden. Así que busco las órdenes y encuentro mi orden (que el EA acaba de abrir) y quiero empezar a analizar de nuevo las barras. ¿Cómo puedo hacer eso? ¿Cómo puedo encontrar la barra que abrió mi orden y empezar a retroceder en las barras?

Por ejemplo

Estoy corriendo en el periodo H1 y busco las barras a las 12:00, 13:00, 14:00 y 15:00 y luego decido abrir una orden a las 16:00. Las barras importantes son las que van de las 12:00 a las 15:00 y quiero identificar estas barras de nuevo. así que cuando vuelva a correr el EA primero encontraré la orden y encontraré su fecha de apertura, detectaré a qué barra pertenece esta fecha, y empezaré a retroceder en las barras anteriores a esa fecha.

Pensé en usar el Time array etc pero, mientras trataba de encontrar las barras, ¿qué pasaría si aparece una nueva barra? los turnos se cambiarán y mi búsqueda será ilógica.

Tampoco quiero escribir esta información en un archivo. requiere demasiado tiempo y un montón de manejo de excepciones, etc.

Gracias.

 
paranoyakX:

Pensé en usar el Time array etc. pero, mientras intentaba encontrar las barras, ¿qué pasaría si sale una nueva barra? se cambiarán los turnos y mi búsqueda será ilógica.


Una nueva barra no debería aparecer mientras un EA está ejecutando su código. Funciona con los datos cargados cuando se llama a OnTick().

Sin embargo, no estoy seguro de lo que pasaría si se utiliza RefreshRates().

 
GumRai: Sin embargo, no estoy seguro de lo que pasaría si se utiliza RefreshRates().

Aunque no ocurre a menudo (de hecho, muy raramente), al utilizar RefreshRates(), he tenido la experiencia de que los datos de la barra se desplazan debido a la formación de una nueva barra. Para evitar este problema, intento copiar todos los datos necesarios en variables, al principio, y luego no volver a confiar en las matrices de datos históricos o funciones equivalentes durante el resto de la ejecución del evento. De esta manera, aunque en mi código requiera usar la función RefreshRates(), puedo seguir haciendo referencia a las condiciones iniciales de forma segura.

@paranoyakX: Así que, independientemente del uso de la función RefreshRates( ) o no, puedes probar un enfoque similar. De hecho, en MQL5, no tienes la misma capacidad que en MQL4 y TIENES que copiar los datos a tus propios arrays para poder procesarlos. Por lo tanto, al hacerlo de esta manera, usted es, de hecho, unos pocos pasos más cerca de ser capaz de hacer su código compatible con ambos MQL4 y MQL5.

Sin embargo, la mejor solución, es no codificar todo esto en el EA, sino codificar la mayor parte de esa lógica en un Indicador, que no sufre este problema, porque el enfoque es totalmente diferente. Intente programar la mayor parte posible de la lógica de la señal en un indicador. Esto también es útil porque entonces usted puede usar y probar el indicador visualmente hasta que esté funcionando exactamente como usted quiere. Un uso más de la solución del indicador, es que proporcionará la señalización no sólo para el EA sino también para el comercio manual. Así, el EA sólo tiene que centrarse en la gestión de las operaciones y no en la señalización.

 
paranoyakX:

[...] He pensado en utilizar la matriz de tiempo, etc., pero, al tratar de encontrar las barras, ¿qué pasaría si aparece una nueva barra? se cambiarán los turnos y mi búsqueda será ilógica.

Lo que pides es potencialmente tan simple que me pregunto si no estoy entendiendo el punto. Dado un OrderSelect() anterior, puedes buscar el turno de barras asociado a su OrderOpenTime() simplemente haciendo lo siguiente:

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);

Por ejemplo:

  • Gráfico H1
  • Lahora actual es 16:32
  • La orden se abrió a las 14:23
  • El código anterior debería devolver BarShiftOfOrderOpen = 2, es decir, la barra H1 a las 14:00, y Time[BarShiftOfOrderOpen] será 14:00
 
jjc: Lo que preguntas es potencialmente tan simple que me pregunto si no estoy entendiendo el punto. Dado un OrderSelect() anterior, puedes buscar el turno de barras asociado a su OrderOpenTime() simplemente haciendo lo siguiente:

Por ejemplo:

  • Gráfico H1
  • La hora actual es 16:32
  • La orden se abrió a las 14:23
  • El código anterior debería devolver BarShiftOfOrderOpen = 2, es decir, la barra H1 a las 14:00, y Time[BarShiftOfOrderOpen] será 14:00

Sí, eso es exactamente lo que el OP está diciendo, pero lo que está cuestionando, no es cómo hacerlo, sino cómo evitar que se convierta en inválido debido a un cambio de barra causado por un nuevo tick entrante que forma una nueva barra, mientras que él está procesando los datos.

Sin embargo, eso NO debería ocurrir, excepto cuando se utiliza RefreshRates(). Para esa posibilidad (que es rara), he sugerido los métodos alternativos de la misma manera que lo hace MQL5.

 
FMIC:

pero cómo evitar que se invalide debido a un desplazamiento de barra causado por un nuevo tick entrante que forma una nueva barra

¿Dónde dice eso el OP? Esa podría ser la pregunta, pero creo que está escuchando los latidos de los cascos y pensando en cebras en lugar de caballos. La mención de la persistencia del estado de EA a un archivo a través de reinicios de MT4 me sugiere que la pregunta es en realidad mucho, mucho más simple.
 

Hola chicos,

muchas gracias por las respuestas,

@FMIC, curiosamente nunca pensé en usar indicadores y como dices esto podría ser mucho más fácil si creo y uso uno, pero por supuesto esto traerá nuevas preguntas, como la forma de encontrar el valor del indicador que se empareja con mi orden, etc. Además no voy a hacer ese proceso cada vez, sólo OnInit() una vez. así que tal vez el uso de un EA está bien para esto.

@jjc, gracias por su solución también. La verdad es que me preocupaba un poco lo de la "nueva barra" pero como decís, mientras se ejecute el EA no habrá cambio de turno (y no estoy usando la función RefreshRates()) así que puedo usar tu código también. Sólo tengo curiosidad ahora después de lo que dijo @FMIC, ¿sería mejor si creo esto como un indicador?

 
jjc:
¿Dónde dice eso el OP? Esa podría ser la pregunta, pero creo que estás oyendo los golpes de los cascos y pensando en cebras más que en caballos. La mención de la persistencia del estado de EA a un archivo a través de reinicios de MT4 me sugiere que la pregunta es en realidad mucho, mucho más simple.

Incluso GumRai se dio cuenta de ello y lo citó, cosa que volveré a hacer aquí:

paranoyakX:

Pensé en usar el Time array etc pero, mientras intentaba encontrar las barras, ¿qué pasaría si sale una nueva barra? se cambiarán los turnos y mi búsqueda será ilógica.

 
paranoyakX:

@FMIC, curiosamente nunca pensé en usar indicadores y como dices esto podría ser mucho más fácil si creo y uso uno, pero por supuesto esto traerá nuevas preguntas, como la forma de encontrar el valor del indicador que se empareja con mi orden, etc. Además no voy a hacer ese proceso cada vez, sólo OnInit() una vez. así que tal vez el uso de un EA está bien para esto.

@jjc, gracias por su solución también. La verdad es que me preocupaba un poco lo de la "nueva barra" pero como decís, mientras se ejecute el EA no habrá cambio de turno (y no estoy usando la función RefreshRates()) así que puedo usar tu código también. Sólo tengo curiosidad ahora después de lo que dijo @FMIC, ¿sería mejor si creo esto como un indicador?

No te preocupes por mi sugerencia si es demasiado complicado para ti. Hazlo de la manera que te resulte más fácil ahora y luego, cuando te sientas más cómodo, prueba la otra manera también

¡PS! No debería poner ningún código lógico en su OnInit(), que es sólo donde se inicializan las cosas y nunca nada que ver con los datos de una serie de datos de la historia matrices. Toda tu lógica y código principal debe estar en el OnTick() o en el OnCalculate().

 
FMIC:

Incluso GumRai se dio cuenta de ello y lo citó, lo que volveré a hacer aquí:

Tú y Gumrai estáis haciendo una suposición masiva sobre el significado de "si sale una nueva barra" que la evidencia aún no justifica. El OP todavía no ha dicho "si sale una nueva barra durante el OnStart".

Sospecho que paranoyakX está almacenando los detalles de la operación/señal en variables globales en el EA. El problema, sospecho, no es que se formen nuevas barras durante una llamada a OnStart(), sino que se formen nuevas barrasdurante la vida del EA.

 
jjc:

Tú y Gumrai estáis haciendo una suposición masiva sobre el significado de "si aparece una nueva barra" que la evidencia aún no justifica. El OP todavía no ha dicho "si una nueva barra aparece durante OnStart".

Sospecho que paranoyakX está almacenando los detalles de la operación/señal en variables globales en el EA. El problema, sospecho, no es que se formen nuevas barras durante una llamada a OnStart(), sino que se formen nuevas barrasdurante la vida del EA.

No hay OnStart() en los EA's pero entiendo lo que quieres decir. Sin embargo, el OP incluso en respuesta a sus comentarios dijo y cito:

En realidad estaba un poco preocupado por la "nueva barra", pero como todos ustedes dicen, mientras el EA se ejecuta no habrá cambio de turno (y no estoy usando la función RefreshRates())

Razón de la queja: