Discussão do artigo "Como transferir a parte de cálculo de qualquer indicador para o código do EA" - página 4

 
Aleksey Vyazmikin #:
Não entendi no artigo se o indicador de classe tem proteção contra barras perdidas. Por exemplo, houve uma interrupção de conexão por 5 barras e, em seguida, o histórico foi carregado. O indicador de classe preencherá novamente apenas o último valor no buffer ou fará um recálculo completo?

Se você observar a classe do indicador padrão, ela usa a função CopyBuffer ao atualizar os dados. Ou seja, ele preenche todo o buffer a partir do histórico do terminal, e não uma parte dele.

bool CIndicatorBuffer::Refresh(const int handle,const int num)
  {
//--- verificação
   if(handle==INVALID_HANDLE)
     {
      SetUserError(ERR_USER_INVALID_HANDLE);
      return(false);
     }
//---
   m_data_total=CopyBuffer(handle,num,-m_offset,m_size,m_data);
//---
   return(m_data_total>0);
  }
 
Dmitriy Gizlyk #:

Se você observar a classe do indicador padrão, ela usa a função CopyBuffer ao atualizar os dados. Ou seja, ele preenche todo o buffer a partir do histórico do terminal, e não uma parte dele.

E o recálculo de todo o histórico a cada nova barra?

Isso não é muito caro? Por que não determinar a data do último cálculo e copiar os dados para esse período de tempo específico?

 
Aleksey Vyazmikin #:

E recalcular toda a história a cada nova barra?

Isso não é muito caro? Por que não determinar a data do último cálculo e copiar os dados para essa fatia específica de tempo?

Peço desculpas, a postagem anterior não era sobre o artigo, mas sobre a biblioteca padrão.
No artigo, o indicador é calculado no método Calculate (Calcular). Aqui, primeiro determinamos o número de barras do último recálculo e só então recalculamos a parte restante.

  • cur_date - hora atual;
  • m_last_calculate - hora do último recálculo.

bool CMA::Calculate(void)
  {
   datetime cur_date=(datetime)SeriesInfoInteger(m_Symbol,m_Timeframe,SERIES_LASTBAR_DATE);
   if(m_last_calculate==cur_date && ArraySize(m_source_data)==m_history_len)
      return true;
//---
   if(!LoadHistory())
      return false;
//---
   int shift=Bars(m_Symbol,m_Timeframe,m_last_calculate,cur_date)-1;
 
Dmitriy Gizlyk #:

Peço desculpas, a postagem anterior não era sobre o artigo, mas sobre a biblioteca padrão.
No artigo, o indicador é calculado no método Calculate. Aqui, primeiro determinamos o número de barras do último recálculo e só então recalculamos a parte restante.

  • cur_date - hora atual;
  • m_last_calculate - hora do último recálculo.

Obrigado pelo esclarecimento!

 

Muito obrigado

O conceito é muito bom, mas se eu quiser escrever um indicador de ação de preço com vários preços (alto, baixo, fechado, aberto) que calcula o valor do indicador com base na diferença entre o alto e o baixo, há um problema de ter apenas uma matriz de dados (m_source_data na classe CIndicator), existe uma maneira de contornar isso ou você sugere modificar a classe CIndicator e tornar o m_source_data uma matriz de (mqlRates ou CArrayBuffer ,...)?

 
Mehrdad Sarrafi calcula o valor do indicador com base na diferença entre o alto e o baixo, há um problema de ter apenas uma matriz de dados (m_source_data na classe CIndicator), existe uma maneira de contornar isso ou você sugere modificar a classe CIndicator e tornar o m_source_data uma matriz de (mqlRates ou CArrayBuffer ,...)?

Sim, você pode modificar o CIndicator para criar m_source_data como uma matriz de MqlRates. Recomendo MqlRates porque, de outras formas, você precisará de algumas ações para sincronizar os dados em diferentes matrizes.