Analizar las barras hacia atrás en EA - página 3

 
paranoyakX:

gracias por el consejo, aquí está una versión muy simple de mi código, esto no es mi código real, pero espero que esto sea más claro.

como dije este no es el código real, encontrar el patrón etc es solo un ejemplo. la razón por la que abrí este hilo es lafunción DetectExistingPattern()

Ya te he dado un código de ejemplo sobre cómo ejecutar el código en la primera ejecución de OnTick( ), así que ahora actualiza tu post de código en consecuencia para que tu DetectExistingPattern() se ejecute en la primera llamada de OnTick() y no en el OnInit().

Además, no puede utilizar "Bars" para detectar una nueva barra. Eso es incorrecto. Debe utilizar "Time[0]" o "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Aquí tiene un ejemplo:

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

Ya te he dado un código de ejemplo sobre cómo ejecutar el código en la primera ejecución de OnTick (), así que ahora actualiza tu post de código en consecuencia para que tu DetectExistingPattern() se ejecute en la primera llamada de OnTick() y no en el OnInit().

Además, no puede utilizar "Bars" para detectar una nueva barra. Eso es incorrecto. Debe utilizar "Time[0]" o "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Aquí tienes un ejemplo:

gracias @FMIC, añadí el código simple porque @jjc lo pidió. Por cierto, aprendí a usar Bares desde que recuerdo, todo el mundo escribía de esa manera así que lo hice. ¿Por qué está mal? ¿Puede funcionar mal?

ps: Yo uso metatrader 4, por lo que es mql4 derecho?

 
paranoyakX:

gracias @FMIC, añadí el código simple porque @jjc lo pidió. Por cierto, aprendí a usar Bares desde que recuerdo, todo el mundo escribía de esa manera así que lo hice. ¿Por qué está mal? ¿Puede funcionar mal?

ps: Yo uso metatrader 4, por lo que es mql4 derecho?

No. En el foro, usted encontrará que muchos usuarios han demostrado que el método de "Bares" es muy antiguo y poco fiable porque el número de barras puede ser cambiado por las "Opciones" para los gráficos o puede ser constante cuando el número máximo de barras por gráfico se ha alcanzado. Por lo tanto, es un error utilizarlo. Utilice "Time[0]" o si quiere que sea compatible con MQL5 también, utilice "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Por favor, vea mi ejemplo.
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

wow no sabia que iba a utilizar su código muchas gracias.
 
Las barras no son fiables (un refresco/recuperación puede cambiar el número de barras en el gráfico) el volumen no es fiable (se pierden los ticks) Usa siempre el tiempo. Nueva vela - Foro MQL4
 
paranoyakX:

como he dicho esto no es el código real, encontrar el patrón etc es sólo un ejemplo. la razón por la que abrí este hilo es lafunción DetectExistingPattern()

Volviendo a tu pregunta original... En este ejemplo, una opción sería que cambiaras tu función CheckTrendPattern() para que se le pueda decir que empiece en una barra específica. En lugar de utilizar el rango fijo de las barras 1 a 10, utilice un desplazamiento de 1 a 10 desde un punto de inicio especificado.

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

Cuando no hay una orden existente, y se quiere comprobar si el patrón se cumple actualmente, se utiliza entonces CheckTrendPattern(0) en lugar de CheckTrendPattern().

Al arrancar, si tiene una orden existente, puede buscar el patrón que la desencadenó de la siguiente manera. Esta es la misma sugerencia que hice al principio: se obtiene el índice de la barra que es equivalente al tiempo de apertura de la orden existente, y se empieza a buscar hacia atrás desde allí.

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

Sin embargo, como dice FMIC, es preferible hacer esta comprobación en la primera llamada a OnTick() que en OnInit(). Mis propias razones para sugerir esto no tienen nada que ver con "retrasar la inicialización". En lugar de eso, me preocuparía que, cuando MT4 se reinicie con el EA ya unido a un gráfico, todavía no tenga una lista de órdenes del broker o un historial de barras actualizado de forma 100% fiable.

Otra consideración que puede querer tener en cuenta es el siguiente escenario, todo sucediendo durante el tiempo cubierto por una sola barra:

  • Usted encuentra un patrón y coloca una operación
  • Su operación abierta se cierra, por ejemplo, porque alcanza un stop-loss
  • MT4 se cierra (deliberadamente o no)
  • MT4 se reinicia
  • El EA vuelve a encontrar el patrón actual y realiza otra operación en la misma barra porque no hay ninguna operación abierta

Es posible que desee comprobar las órdenes cerradas, así como las órdenes abiertas, para evitar esto.

 
@jjc, tus sugerencias son muy buenas. gracias por compartir tu experiencia.
jjc:

Volviendo a su pregunta original... En este ejemplo, una opción sería que cambiara su función CheckTrendPattern() para que se le pueda decir que empiece en una barra específica. En lugar de utilizar el rango fijo de las barras 1 a 10, utilice un desplazamiento de 1 a 10 desde un punto de inicio especificado.

Cuando no hay una orden existente, y se quiere comprobar si el patrón se cumple actualmente, se utiliza entonces CheckTrendPattern(0) en lugar de CheckTrendPattern().

Mi patrón real no es este, por lo que no hay números fijos (como 10 ejemplo) es dinámico, pero mi método de comprobación de patrón es diferente por lo que no podía recordarlo y esto es realmente me molesta porque escribí un código similar para encontrar el patrón de nuevo. problema es que mientras EA se está ejecutando, acabo de comprobar la última barra si mi patrón todavía continúa y si es entonces no hago nada, cuando el patrón se rompe entonces abro una orden. Así que no puedo usar ese código mientras encuentro el patrón de nuevo porque esta vez, tengo que ir hacia atrás en las barras no hacia adelante. Tampoco quiero buscar el patrón hacia atrás porque, en este caso, estaré comprobando las mismas barras una y otra vez. Sólo me preocupaba el tema del rendimiento, pero como veo que no será un problema, así que estoy pensando en cambiar mi método de búsqueda de patrones para que pueda utilizarlo tanto en el arranque como mientras se ejecuta como dijiste. esto también evitará posibles problemas como si cambio mi patrón, tendría que cambiar el procedimiento de re-búsqueda de patrones que puedo olvidar.gracias por eso. También como @FMIC dijo, tal vez debería hacer esta parte como un indicador (que no escribí mucho) por lo que no será un problema encontrar y encontrar de nuevo.
jjc:

Al arrancar, si tiene una orden existente, puede buscar el patrón que la desencadenó de la siguiente manera. Esta es la misma sugerencia que hice al principio: se obtiene el índice de barra que equivale al tiempo de apertura de la orden existente, y se empieza a buscar hacia atrás desde ahí. Sin embargo, como dice FMIC, es preferible hacer esta comprobación en la primera llamada a OnTick() en lugar de en OnInit(). Mis propias razones para sugerir esto no tienen nada que ver con "retrasar la inicialización". En lugar de eso, me preocuparía que, cuando MT4 se reinicie con el EA ya unido a un gráfico, todavía no tenga una lista de órdenes del broker o un historial de barras actualizado de forma 100% fiable.

Otra consideración que puede querer tener en cuenta es el siguiente escenario, todo sucediendo durante el tiempo cubierto por una sola barra:

  • Usted encuentra un patrón y coloca una operación
  • Su operación abierta se cierra, por ejemplo, porque alcanza un stop-loss
  • MT4 se cierra (deliberadamente o no)
  • MT4 se reinicia
  • El EA vuelve a encontrar el patrón actual, y toma otra operación en la misma barra porque no hay ninguna operación abierta

Ahora está más claro por qué debo hacerlo en OnInit, la fiabilidad es el punto más importante, por supuesto, y no pensé en su advertencia de consideración. esta parte es realmente importante, podría abrir órdenes redundantes, tal vez raro pero posible. Tengo que manejar esto de alguna manera. realmente muchas gracias.

@WHRoeder su nuevo control de la barra es tan simple y hermoso. He añadido su método a mi código, gracias.

 

Hola a todos,

como @FMIC aconsejado, escribo y el indicador que encuentra mi patrón, dar una señal y algunos datos más que va a utilizar para mis órdenes (podría abrir más de una orden en los precios de diferencia). Ahora quiero usarlo en mi EA pero tengo una pregunta, necesito su experiencia en realidad. Cuando obtengo una señal de mi indicador, abro una orden o pongo una orden (límite de venta o límite de compra, etc.) si mi mt4 se bloquea por cualquier razón cuando lo vuelvo a abrir, ¿cómo puedo encontrar que la orden abierta pertenece a qué señal en mi indicador, está bien usar el desplazamiento de la barra para eso? como hablamos antes, puedo encontrar el tiempo de creación de la orden, luego encontrar ese desplazamiento de la barra y debo tratar de obtener el valor del indicador mediante el uso de este desplazamiento? ¿Cómo puedo hacer coincidir esta orden con el desplazamiento del indicador?

Gracias.

 
paranoyakX: Hola a todos, como @FMIC aconsejado, escribo y el indicador que encuentra mi patrón, dar una señal y algunos datos más que va a utilizar para mis órdenes (podría abrir más de una orden en los precios de diferencia). Ahora quiero usarlo en mi EA pero tengo una pregunta, necesito su experiencia en realidad. Cuando obtengo una señal de mi indicador, abro una orden o pongo una orden (límite de venta o límite de compra, etc.) si mi mt4 se bloquea por cualquier razón cuando lo vuelvo a abrir, ¿cómo puedo encontrar que la orden abierta pertenece a qué señal en mi indicador, está bien usar el desplazamiento de la barra para eso? como hablamos antes, puedo encontrar el tiempo de creación de la orden, luego encontrar ese desplazamiento de la barra y debo tratar de obtener el valor del indicador mediante el uso de este desplazamiento? ¿Cómo puedo hacer coincidir esta orden con el desplazamiento del indicador?
Si, puedes usar iBarShift(), tal como jjc te ha explicado en un post anterior para luego referenciar los datos de tu indicador a través de la función iCustom().
 
FMIC:
Sí, puedes utilizar iBarShift(), tal y como te ha explicadojjc en un post anterior para luego referenciar los datos de tu indicador a través de la función iCustom().
Muchas gracias @FMIC, así que usar shift es una buena solución entonces. Hacer mi patrón como indicador fue un muy buen consejo. Cambiaré todo mi código por supuesto pero será más consistente.