Indicador para contar barras de M1 Período que cruza Preço aberto do Período D1

 

Saudações! Preciso de ajuda neste indicador. Tenho tentado um método diferente para contar o número de Barras no Período M1 que se deparou com o nível de Preço Aberto no Período D1. Anexei minha tentativa de codificá-lo, mas não consegui executá-lo com sucesso. Tenho tentado muito, mas bati na parede, então agora peço a ajuda de gentis cavalheiros aqui!

Aqui está o que eu preciso para este indicador:

1. Quando o preço de uma barra no Período M1 se deparar com o preço de Aberto no Período D1, ele será contado. Há 1440 barras no Período M1 para cada Período D1, portanto, cada 1440 barras serão testadas.

2. Para cada Barra D1, a contagem total/D1 Bar será somada e calculada por um determinado valor. Digamos que a média é 30, esta 30 é o 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. Então o valor médio será traçado como o indicador.

 
POR FAVOR, AJUDE QUALQUER UM! ISTO É POSSÍVEL?
 

Não consigo descobrir a partir de seu código o que você está tentando fazer, mas em 2 lugares você não dá um valor à variável i. Você precisa tratar disso.

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);
   }
 

Desculpe ser brusco, mas seu código mostra que você está tentando alcançar algo muito além de sua capacidade

Exemplo

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 exemplo

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

Isto retornará o preço aberto de ontem

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

Estes 2 retornarão valores para a última barra fechada de 1 minuto.


Portanto, você está comparando os valores de 1 minuto atrás com os de ontem abertos.

Se i = 2, você estará comparando os valores de 2 minutos atrás com os abertos há 2 dias.

Você deve ver que isto não pode ser o que você quer.

 
GumRai:

Desculpe ser brusco, mas seu código mostra que você está tentando alcançar algo muito além de sua capacidade

Exemplo

Digamos que i = 1 por exemplo

Isto retornará o preço aberto de ontem

Estes 2 retornarão valores para a última barra fechada de 1 minuto.


Portanto, você está comparando os valores de 1 minuto atrás com os de ontem abertos.

Se i = 2, você estará comparando os valores de 2 minutos atrás com os abertos há 2 dias.

Você deve ver que isto não pode ser o que você quer.


Olá GumRai,

Obrigado por ter me ajudado. Você está certo, sou apenas um principiante e avidamente me esforço para aprender a codificar a EA. Eis o que estou tentando fazer:

1. Comparar PERÍODO_D1 Aberto a cada minuto PERÍODO_M1 barra em sua própria barra D1, então existem 1440 barras M1 para comparar com a barra D1. Então conte as barras M1 que satisfazem a condição se (O > L && O < H) .

2. Armazene as barras contadas em uma matriz e então proceda novamente para a próxima barra D1 e repita o ciclo novamente.

3. As barras contadas serão traçadas pelo indicador em um gráfico diário. Portanto, se as barras M1 que satisfazem as afirmações forem 5, estas 5 serão plotadas como o valor da barra diária1. Então diga para a próxima barra diária que a barra M1 contada é 10, então ela será plotada novamente na barra 1 conforme a barra anterior foi movida para a barra 2.

Por gentileza, mostre-me como melhor codificar esta simples afirmação com a qual eu luto. Me diga que você precisa de mais explicações. e um grande obrigado.

 
Zaldy:


Olá GumRai,

Obrigado por ter me ajudado. Você está certo, sou apenas um principiante e avidamente me esforço para aprender a codificar a EA. Eis o que estou tentando fazer:

1. Comparar PERÍODO_D1 Aberto a cada minuto PERÍODO_M1 barra em sua própria barra D1, então existem 1440 barras M1 para comparar com a barra D1. Então conte as barras M1 que satisfazem a condição se (O > L && O < H) .

2. Armazene as barras contadas em uma matriz e então proceda novamente para a próxima barra D1 e repita o ciclo novamente.

3. As barras contadas serão traçadas pelo indicador em um gráfico diário. Portanto, se as barras M1 que satisfazem as afirmações forem 5, estas 5 serão plotadas como o valor da barra diária1. Então diga para a próxima barra diária que a barra M1 contada é 10, então ela será plotada novamente na barra 1 conforme a barra anterior foi movida para a barra 2.

Por gentileza, mostre-me como melhor codificar esta simples afirmação com a qual eu luto. Me diga que você precisa de mais explicações. e um grande obrigado.


Terei prazer em ajudá-los, mas não vou escrever o código, pois isso não os ajudaria a aprender.

Primeiro, você tem que perceber que as barras 1440 M1 nem sempre corresponderão a um período de 1 dia. Se não houver carrapatos durante uma barra, essa barra estará faltando na história e poderá haver menos do que você espera.

Portanto, você precisa do valor de data/hora para a abertura da vela D1. Você pode fazer isso? Experimente e poste seu código

 

não tão rápido

eu sei o que você está tentando fazer e seu código(se (O > L & & O < H)) não vai conseguir o que você quer

veja na tabela anexa



a seta voltada para cima é a abertura de hoje

e a seta voltada para a direita é a primeira barra que corresponde ao seu código (se (O > L && O < H)) então conte = 1

mas se você prestar atenção à barra fechada acima da abertura de hoje, então, na verdade, a contagem deve ser = 2 (pelo menos (pode ser mais alguns cruzamentos que você não pode c apenas no gráfico de tick))

mas na nossa contagem de código = apenas 1

 
qjol:

não tão rápido

eu sei o que você está tentando fazer e seu código(se (O > L & & O < H)) não vai conseguir o que você quer

veja na tabela anexa



a seta voltada para cima é a abertura de hoje

e a seta voltada para a direita é a primeira barra que corresponde ao seu código (se (O > L && O < H)) então conte = 1

mas se você prestar atenção à barra fechada acima da abertura de hoje, então, na verdade, a contagem deve ser = 2 (pelo menos (pode ser mais alguns cruzamentos que você não pode c apenas no gráfico de tick))

mas na nossa contagem de código = apenas 1


Pelo que entendi, ele quer contar as barras que se sobrepõem ao preço de abertura - posso estar errado, no entanto :)
 
  1. Zaldy: POR FAVOR, AJUDE QUALQUER UM! ISTO É POSSÍVEL?
    Não nos PERGUNTE. Claro que é possível.
  2. Inteiros e booleanos são conversíveis. Falso == 0, verdadeiro = não-zero.
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. Você também está lidando com três períodos de tempo, D1, gráfico, M1. Você deve converter.
    Não compilado ou testado.
       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]++; 
          }
       }
    
    Não compilado ou testado.
 
qjol:

não tão rápido

eu sei o que você está tentando fazer e seu código(se (O > L & & O < H)) não vai conseguir o que você quer

veja na tabela anexa



a seta voltada para cima é a abertura de hoje

e a seta virada para a direita é a primeira barra que corresponde ao seu código (se (O > L && O < H)) então conte = 1

mas se você prestar atenção à barra fechada acima da abertura de hoje, então, na verdade, a contagem deve ser = 2 (pelo menos (pode ser mais alguns cruzamentos que você não pode c apenas no gráfico de tick))

mas na nossa contagem de código = apenas 1


Oi Qjol, Sim a seta virada para a direita é a primeira contagem que eu quero. Aqueles que cruzam apenas o D1 Aberto são contados. Obrigado novamente por seus esforços.
 
WHRoeder:
  1. Zaldy: POR FAVOR, AJUDE QUALQUER UM! ISTO É POSSÍVEL?
    Não nos PERIGUE. Claro que é possível.
  2. Inteiros e booleanos são conversíveis. Falso == 0, verdadeiro = não-zero.
  3. Você também está lidando com três períodos de tempo, D1, gráfico, M1. Você deve converter.
    Não compilados ou testados.
    Não compilado ou testado.

Obrigado WHRoeder e desculpe por usar bonés aqui! Vou tentar suas sugestões e voltarei aqui para o resultado.