Indicador para contar las barras del periodo M1 que se cruzan con el precio de apertura del periodo D1

 

¡Saludos! Necesito ayuda con este indicador. He intentado diferentes métodos para contar el número de barras en el período M1 que se encontró con el nivel de precio de apertura en el período D1. He adjuntado mi intento de codificación pero no he podido ejecutarlo con éxito. He estado tratando de hacer esto, pero me he topado con la pared, así que ahora pido la ayuda de los amables caballeros de aquí.

Esto es lo que necesito para este indicador:

1. 1. Cuando una barra en el período M1 se cruza con el precio de apertura en el período D1, se cuenta. Hay 1440 barras en el período M1 para cada período D1, por lo que cada 1440 barras serán probadas.

2. Para cada barra D1 el conteo total/barra D1 será sumado y promediado por un cierto valor. Digamos que el promedio es 30, este 30 es el número de barras D1.

//+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link      "XXX"
#property version   "1.00"
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;  // Bar index
extern int Aver_Bars=30;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                          // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer(0,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Line style
//--------------------------------------------------------------------
   SetIndexBuffer(1,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }

3. Entonces el valor promedio será trazado como el indicador.

 
POR FAVOR, ¡AYUDA A ALGUIEN! ¿ES ESTO POSIBLE?
 

No puedo entender de su código lo que está tratando de hacer, pero en 2 lugares que no dan la variable i un valor. Usted necesita para hacer frente a esto.

int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }
 

Lamento ser franco, pero su código muestra que está tratando de lograr algo mucho más allá de su capacidad

Ejemplo

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);

Digamos que i = 1 por ejemplo

double O=iOpen(NULL,PERIOD_D1,1);

Esto devolverá el precio de apertura de ayer

   double H=iHigh(NULL,PERIOD_M1,1);
   double L=iLow(NULL,PERIOD_M1,1);

Estos 2 devolverán los valores de la última barra cerrada de 1 minuto.


Así que está comparando los valores de hace 1 minuto con la apertura de ayer.

Si i = 2, estará comparando valores de hace 2 minutos con la apertura de hace 2 días

Debes ver que esto no puede ser lo que quieres.

 
GumRai:

Lamento ser franco, pero su código muestra que está tratando de lograr algo mucho más allá de su capacidad

Ejemplo

Digamos que i = 1 por ejemplo

Esto devolverá el precio de apertura de ayer

Estos 2 devolverán los valores de la última barra cerrada de 1 minuto.


Así que está comparando los valores de hace 1 minuto con la apertura de ayer.

Si i = 2, estará comparando valores de hace 2 minutos con la apertura de hace 2 días

Debes ver que esto no puede ser lo que quieres.


Hola GumRai,

Gracias por dedicar tu tiempo a ayudarme. Tienes razón, sólo soy un principiante y con ganas de aprender a codificar EA. Esto es lo que estoy tratando de hacer:

1. Comparar la barra PERIOD_D1 Open con cada barra PERIOD_M1 en su propia barra D1, por lo que hay 1440 barras M1 para comparar con la barra D1. Luego cuenta las barras M1 que satisfacen la condición si (O > L && O < H) .

2. Almacene las barras contadas en un array y luego proceda de nuevo a la siguiente barra D1 y repita el ciclo de nuevo.

3. Las barras contadas serán trazadas por el indicador en un gráfico diario. Así que si digamos que las barras M1 que satisfacen las declaraciones son 5, este 5 será trazado como el valor de la barra diaria Bar1. Entonces digamos que para la siguiente barra diaria la barra M1 contada es 10 entonces será trazada de nuevo en la Barra1 como la barra anterior movida a la Barra2.

Por favor, muéstreme la mejor manera de codificar esta simple declaración con la que estoy luchando. Si necesita más explicaciones, hágamelo saber y muchas gracias.

 
Zaldy:


Hola GumRai

Gracias por dedicar tiempo a ayudarme. Tienes razón, sólo soy un principiante y con ganas de aprender a codificar EA. Esto es lo que estoy tratando de hacer:

1. Comparar PERIOD_D1 Open con cada barra PERIOD_M1 en su propia barra D1, por lo que hay 1440 barras M1 para comparar con la barra D1. Luego cuenta las barras M1 que satisfacen la condición si (O > L && O < H) .

2. Almacene las barras contadas en un array y luego proceda de nuevo a la siguiente barra D1 y repita el ciclo de nuevo.

3. Las barras contadas serán trazadas por el indicador en un gráfico diario. Así que si digamos que las barras M1 que satisfacen las declaraciones son 5, este 5 será trazado como el valor de la barra diaria Bar1. Entonces digamos que para la siguiente barra diaria la barra M1 contada es 10, entonces será trazada de nuevo en la Barra1 como la barra anterior movida a la Barra2.

Por favor, muéstreme la mejor manera de codificar esta simple declaración con la que estoy luchando. Hágame saber si necesita más explicaciones y muchas gracias.


Estaré encantado de ayudarte, pero no escribiré el código, ya que esto no te ayudaría a aprender.

En primer lugar, tiene que darse cuenta de que 1440 barras M1 no siempre corresponderán a un período de 1 día. Si no hay ticks durante una barra, esa barra faltará en el historial y puede haber menos de lo que esperas.

Así que necesitas el valor de la fecha de apertura de la vela D1. ¿Puede hacer esto? Pruébalo y publica tu código

 

no tan rápido

sé lo que estás tratando de hacer y tu código(si (O > L && O < H)) no va a conseguir lo que quieres

mira el gráfico adjunto



la flecha hacia arriba es la apertura de hoy

y la fl echa que mira haciala derecha es la primera barra que coincide con su código (if( O > L && O < H)) así que cuenta = 1

pero si te fijas, la barra cerró por encima de la apertura de hoy, así que, en realidad, el recuento debería ser = 2 (al menos (podría haber algunos cruces más que no se pueden ver sólo en el gráfico de ticks))

pero en su código cuenta = sólo 1

 
qjol:

no tan rápido

sé lo que estás tratando de hacer y tu código(si (O > L && O < H)) no va a conseguir lo que quieres

mira el gráfico adjunto



la flecha hacia arriba es la apertura de hoy

y la fl echa que mira haciala derecha es la primera barra que coincide con su código (if( O > L && O < H)) así que cuenta = 1

pero si te fijas, la barra cerró por encima de la apertura de hoy, así que, en realidad, el recuento debería ser = 2 (al menos (podría haber algunos cruces más que no se pueden ver sólo en el gráfico de ticks))

pero en su código cuenta = sólo 1


Por lo que he entendido, quiere contar las barras que están a caballo entre el precio de apertura - aunque puedo estar equivocado :)
 
  1. Zaldy: POR FAVOR, ¡AYUDA A ALGUIEN! ¿ES ESTO POSIBLE EN ABSOLUTO?
    No nos grites. Por supuesto que es posible.
  2. Los enteros y los booleanos son convertibles. Falso == 0, verdadero = distinto de cero.
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. Usted también está tratando con tres marcos de tiempo, D1, gráfico, M1. Usted debe convertir.
    No está compilado ni probado.
       Counted_bars=IndicatorCounted(); // Number of counted bars
       for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
          int      iD1    = iBarShift(NULL, PERIOD_D1, Time[iCht];
          double   openD1 = iOpen(NULL, PERIOD_D1, iD1);
          int      iM1Beg = iBarShift(NULL, PERIOD_M1, Time[iCht],
                   iM1End = -1;
          if(iCht > 0) iM1End = iBarShift(NULL, PERIOD_M1, Time[iCht-1];
          for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh(NULL, PERIOD_M1, iM1Beg),
                    lM1 =  iLow(NULL, PERIOD_M1, iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    No está compilado ni probado.
 
qjol:

no tan rápido

sé lo que estás tratando de hacer y tu código(si (O > L && O < H)) no va a conseguir lo que quieres

mira el gráfico adjunto



la flecha hacia arriba es la apertura de hoy

y la fl echa que mira haciala derecha es la primera barra que coincide con su código (if( O > L && O < H)) así que cuenta = 1

pero si te fijas, la barra cerró por encima de la apertura de hoy, así que, en realidad, el recuento debería ser = 2 (al menos (podría haber algunos cruces más que no se pueden ver sólo en el gráfico de ticks))

pero en su código cuenta = sólo 1


Hola Qjol, Sí la flecha que mira a la derecha es el primer recuento que quiero. Los que se cruzan con el D1 Abierto sólo se cuentan. Gracias de nuevo por tu esfuerzo.
 
WHRoeder:
  1. Zaldy: ¡POR FAVOR, AYUDA A ALGUIEN! ¿ES ESTO POSIBLE?
    No nos grites. Por supuesto que es posible.
  2. Los enteros y los booleanos son convertibles. Falso == 0, verdadero = distinto de cero.
  3. Usted también está tratando con tres marcos de tiempo, D1, gráfico, M1. Usted debe convertir.
    No está compilado ni probado.
    No está compilado ni probado.

¡Gracias WHRoeder y lo siento por usar mayúsculas aquí! Voy a probar sus sugerencias y volver aquí para el resultado.