Discusión sobre el artículo "Cómo transferir los cálculos de cualquier indicador al código de un asesor experto" - página 4

 
Aleksey Vyazmikin #:
No entendí del artículo, ¿el class-indicator tiene protección contra barras perdidas? Por ejemplo, hubo un corte de conexión de 5 barras, y luego se cargó el historial, ¿el class-indicator rellenará sólo el último valor del buffer o hará un recálculo completo?

Si te fijas en la clase-indicador estándar, utiliza la función CopyBuffer al actualizar los datos. Es decir, rellena todo el buffer del histórico del terminal, no parte de él.

bool CIndicatorBuffer::Refresh(const int handle,const int num)
  {
//--- comprobar
   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 #:

Si te fijas en la clase estándar del indicador, utiliza la función CopyBuffer cuando actualiza los datos. Es decir, rellena todo el buffer desde el histórico del terminal, no una parte.

¿Y recalcular todo el histórico en cada nueva barra?

¿No es entonces demasiado costoso? ¿Por qué no determinar la fecha del último cálculo y copiar los datos de ese momento concreto?

 
Aleksey Vyazmikin #:

¿Y recalcular toda la historia en cada nueva barra?

¿No es entonces demasiado costoso? ¿Por qué no determinar la fecha del último cálculo y copiar los datos de ese tramo de tiempo concreto?

Pido disculpas, el post anterior no se refería al artículo, sino a la biblioteca estándar.
En el artículo, el indicador se calcula en el método Calculate. Aquí determinamos primero el número de barras desde el último recálculo y sólo entonces recalculamos la parte restante.

  • cur_date - hora actual;
  • m_last_calculate - hora del ú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 #:

Pido disculpas, el post anterior no era sobre el artículo, sino sobre la biblioteca estándar.
En el artículo, el indicador se calcula en el método Calcular. Aquí primero se determina el número de barras del último recálculo y sólo entonces se recalcula la parte restante.

  • cur_date - hora actual;
  • m_last_calculate - hora del último recálculo.

¡Gracias por la aclaración!

 

Gracias

Muy buen concepto, pero si quiero escribir un indicador de acción de precios con múltiples precios (alto, bajo, cierre, apertura) que calcula el valor del indicador basado en es decir, la diferencia de alta y baja hay un problema de tener sólo una matriz de datos (m_source_data en la clase CIndicator), ¿hay una manera de trabajar en torno a esto o sugiere modificar la clase CIndicator y hacer el m_source_data una matriz de (mqlRates o CArrayBuffer ,...)?

 
Mehrdad Sarrafi calcula el valor del indicador basado en es decir, la diferencia de alta y baja hay un problema de tener sólo una matriz de datos (m_source_data en la clase CIndicator), ¿hay una manera de trabajar en torno a esto o sugiere modificar la clase CIndicator y hacer el m_source_data una matriz de (mqlRates o CArrayBuffer ,...)?

Sí, puede modificar CIndicator para crear m_source_data como una matriz de MqlRates. Recomiendo MqlRates porque de otras formas necesitarás algunas acciones para sincronizar los datos en diferentes arrays.