Como criar um buffer no meu indicador que retorne ao ea um array contendo a Maxima e Minima da vela?

 

Como criar um buffer no meu indicador que retorne ao ea um array contendo a Maxima e Minima da vela?

Para tentar resolver tive que criar 2 indicadores para guardar os valores como abaixo:

#property indicator_chart_window
#property indicator_buffers 13 // Qde total de Buffers
#property indicator_plots   13 // Qde total de Plotters


double         BUffHigh[];   
double         BUffLow[];


   SetIndexBuffer(10, BUffHigh, INDICATOR_DATA);
   SetIndexBuffer(11, BUffLow, INDICATOR_DATA);


   ArrayInitialize(BUffHigh, EMPTY_VALUE);
   ArrayInitialize(BUffLow, EMPTY_VALUE);

----------------------------------------------------------------------------------------------------------------------------

No meu EA busquei os valores de cada buffer

   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 10, 1, 1, this.m_BUffHigh) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     
   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 11, 1, 1, this.m_BUffLow) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     


Teria alguma forma mais facil de retornar um array unico contendo a maxima e minima ou deveria fazer dessa forma mesmo?

 
Romulo Alves Campos Neres:

Como criar um buffer no meu indicador que retorne ao ea um array contendo a Maxima e Minima da vela?

Para tentar resolver tive que criar 2 indicadores para guardar os valores como abaixo:

#property indicator_chart_window
#property indicator_buffers 13 // Qde total de Buffers
#property indicator_plots   13 // Qde total de Plotters


double         BUffHigh[];   
double         BUffLow[];


   SetIndexBuffer(10, BUffHigh, INDICATOR_DATA);
   SetIndexBuffer(11, BUffLow, INDICATOR_DATA);


   ArrayInitialize(BUffHigh, EMPTY_VALUE);
   ArrayInitialize(BUffLow, EMPTY_VALUE);

----------------------------------------------------------------------------------------------------------------------------

No meu EA busquei os valores de cada buffer

   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 10, 1, 1, this.m_BUffHigh) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     
   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 11, 1, 1, this.m_BUffLow) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     


Teria alguma forma mais facil de retornar um array unico contendo a maxima e minima ou deveria fazer dessa forma mesmo?

Seria CopyHigh ou CopyLow, hoje eu pensaria dessa sua forma. Cabe dizer que não sei se é isso que voce quer, voce não estaria querendo saber a maxima de X velas? Esse valor tem como sem precisar de buffer chamando iHigh e iHighest por exemplo.
 
Romulo Alves Campos Neres:

Como criar um buffer no meu indicador que retorne ao ea um array contendo a Maxima e Minima da vela?

Para tentar resolver tive que criar 2 indicadores para guardar os valores como abaixo:

#property indicator_chart_window
#property indicator_buffers 13 // Qde total de Buffers
#property indicator_plots   13 // Qde total de Plotters


double         BUffHigh[];   
double         BUffLow[];


   SetIndexBuffer(10, BUffHigh, INDICATOR_DATA);
   SetIndexBuffer(11, BUffLow, INDICATOR_DATA);


   ArrayInitialize(BUffHigh, EMPTY_VALUE);
   ArrayInitialize(BUffLow, EMPTY_VALUE);

----------------------------------------------------------------------------------------------------------------------------

No meu EA busquei os valores de cada buffer

   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 10, 1, 1, this.m_BUffHigh) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     
   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 11, 1, 1, this.m_BUffLow) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     


Teria alguma forma mais facil de retornar um array unico contendo a maxima e minima ou deveria fazer dessa forma mesmo?

Para fazer isso, você pode criar um buffer bidimensional (dois-dimensionais), onde cada linha representa uma vela e cada coluna representa a Máxima e a Mínima dessa vela.

Por exemplo:

double MyBuffer[][2];


Você pode então preencher esse buffer com os valores da Máxima e Mínima da vela a cada nova vela. Por exemplo:


MyBuffer[0][0] = High[0]; // Máxima da primeira vela
MyBuffer[0][1] = Low[0]; // Mínima da primeira vela
MyBuffer[1][0] = High[1]; // Máxima da segunda vela
MyBuffer[1][1] = Low[1]; // Mínima da segunda vela


Para retornar os valores da Máxima e Mínima para o EA, você pode usar a função CopyBuffer(), assim como você está fazendo atualmente. Mas em vez de copiar para dois buffers separados, você pode copiar para um buffer bidimensional:


double MyBuffer[][2];
int copied = CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 0, 0, n, MyBuffer);


Onde "n" é o número de velas para copiar.

Dessa forma, você terá um único buffer que armazena os valores da Máxima e Mínima de cada vela.

 
void OnStart()
  {
   MqlRates rates[];
   int copied=CopyRates(NULL,0,0,100,rates);
   if(copied<=0)
      Print("Erro ao copiar dados de preços ",GetLastError());
   else Print("Copied ",ArraySize(rates)," bars");
  }

Pesquise o comando copyrates e a estrutura Mqlrates, contem as maximas, minimas e varias outras cotações da vela. Acho que resolve o problema.

 
Romulo Alves Campos Neres:

Como criar um buffer no meu indicador que retorne ao ea um array contendo a Maxima e Minima da vela?

Para tentar resolver tive que criar 2 indicadores para guardar os valores como abaixo:

#property indicator_chart_window
#property indicator_buffers 13 // Qde total de Buffers
#property indicator_plots   13 // Qde total de Plotters


double         BUffHigh[];   
double         BUffLow[];


   SetIndexBuffer(10, BUffHigh, INDICATOR_DATA);
   SetIndexBuffer(11, BUffLow, INDICATOR_DATA);


   ArrayInitialize(BUffHigh, EMPTY_VALUE);
   ArrayInitialize(BUffLow, EMPTY_VALUE);

----------------------------------------------------------------------------------------------------------------------------

No meu EA busquei os valores de cada buffer

   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 10, 1, 1, this.m_BUffHigh) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     
   if(CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 11, 1, 1, this.m_BUffLow) <= 0)
     {
      //--- Return Failed
      return(false);
     }
     


Teria alguma forma mais facil de retornar um array unico contendo a maxima e minima ou deveria fazer dessa forma mesmo?

Lembrei o que tinha visto, tem tambem uma opcao de usar uma estrutura de matrix. Mas acredito que tu nao conseguiria colocar ela no plot (posso estar errado). Isso é interessante porque permite copiar de uma vez so alguns campos especificos e ignorar outros. Ve o exemplo que tem aqui: https://www.mql5.com/pt/docs/matrix/matrix_initialization/matrix_copyrates

 
Thiago Lopes #:
Para fazer isso, você pode criar um buffer bidimensional (dois-dimensionais), onde cada linha representa uma vela e cada coluna representa a Máxima e a Mínima dessa vela.

Por exemplo:

double MyBuffer[][2];


Você pode então preencher esse buffer com os valores da Máxima e Mínima da vela a cada nova vela. Por exemplo:


MyBuffer[0][0] = High[0]; // Máxima da primeira vela
MyBuffer[0][1] = Low[0]; // Mínima da primeira vela
MyBuffer[1][0] = High[1]; // Máxima da segunda vela
MyBuffer[1][1] = Low[1]; // Mínima da segunda vela


Para retornar os valores da Máxima e Mínima para o EA, você pode usar a função CopyBuffer(), assim como você está fazendo atualmente. Mas em vez de copiar para dois buffers separados, você pode copiar para um buffer bidimensional:


double MyBuffer[][2];
int copied = CopyBuffer(this.m_hnd_IndicatorPlaninvestFx, 0, 0, n, MyBuffer);


Onde "n" é o número de velas para copiar.

Dessa forma, você terá um único buffer que armazena os valores da Máxima e Mínima de cada vela.

Perfeito, era isso mesmo que eu precisava, obrigado Thiago
Razão: