Discusión sobre el artículo "Preparación de indicadores de símbolo/periodo múltiple"

 

Artículo publicado Preparación de indicadores de símbolo/periodo múltiple:

En este artículo analizaremos los principios de la creación de los indicadores de símbolo/periodo múltiple y la obtención de datos de ellos en asesores e indicadores. Asimismo, veremos los principales matices de uso de los indicadores múltiples en asesores e indicadores, y su representación a través de los búferes del indicador personalizado.

Después de compilar el indicador de prueba, lo ejecutaremos en un gráfico con el periodo M1, en los ajustes, seleccionaremos el símbolo actual y un periodo de cálculo del indicador M5. En este caso, se crearán los dos indicadores de media móvil seleccionados en los ajustes. Uno se calculará a partir de los datos del gráfico actual y el otro a partir de los datos del periodo de cinco minutos del gráfico. Cambiando el marco temporal del gráfico podremos ver cómo se dibujan las dos líneas en M1: una se corresponderá con la media móvil calculada en M1, mientras que la segunda se corresponderá con la media móvil calculada en M5. Si cambiamos el gráfico a M5, solo se creará un indicador, ya que el segundo será idéntico al primero y no se creará. Si cambiamos el gráfico a M15, un indicador se calculará para M15 y el segundo indicador se calculará para M5, y también se mostrará en el gráfico.


Como podemos ver, la funcionalidad declarada funciona cuando los indicadores con un búfer se muestran en la ventana principal del gráfico.

Autor: Artyom Trishkin

 

Gracias al autor. Hay algo en lo que pensar...

Imho, si la clase es básica, entonces su nombre debe ser CBaseIndMSTF. O incluso CBaseIndMSMTF. MSMTF - multi-símbolo multi-marco de tiempo.

Por nombre.

ENUM_IND_CATEGORY es bueno.

Los siguientes no son tan buenos.

ENUM_COMPARE_MODE --> ENUM_IND_COMPARE_MODE

ENUM_LINE_STATE --> ENUM_IND_LINE_STATE

ENUM_ERR_TYPE --> ENUM_IND_CALC_ERR_TYPE


enum ENUM_ERR_TYPE            // Tipo de error en los cálculos de los indicadores
  {
   ERR_TYPE_NO_ERROR,         // No hay error
   ERR_TYPE_NO_CYNC,          // Datos no sincronizados
   ERR_TYPE_NO_DATA,          // Datos no cargados
   ERR_TYPE_NO_CALC,          // Cálculo no realizado
  };

ERR_TYPE_NO_CYNC --> ERR_TYPE_NO_SYNC

 
Denis Kirichenko multi-símbolo multi-marco de tiempo.

Por nombres.

ENUM_IND_CATEGORY está bien.

Los siguientes no son buenos.

ENUM_COMPARE_MODE --> ENUM_IND_COMPARE_MODE

ENUM_LINE_STATE --> ENUM_IND_LINE_STATE

ENUM_ERR_TYPE --> ENUM_IND_CALC_ERR_TYPE


ERR_TYPE_NO_CYNC --> ERR_TYPE_NO_SYNC

Estoy de acuerdo conéste. Los otros son específicos

 
sincronizar
 
Denis Kirichenko #:
sincronizar

No le encuentro sentido. Se resaltan dos eses, ¿y qué?

"No Sync" - no sincronizado. ¿Cuál es el error? "Error: No Sincronizado"

¡Aaah!

Vi C en lugar de S en el último minuto... Ok. Gracias. Lo arreglaré.

 

Artem, ejecutó el indicador TestMSTFMovingAverages en el gráfico EURUSD. Día libre. Tf1 = M15, Tf2 = H1.

Parámetros de entrada:

InpIndicator=26
InpSymbol=
InpTimeframe=16385
InpPrice=1
InpMethod=0
InpShift=0
InpAsSeries=true

Esto es lo que salió:

Registros:

HD      0       20:22:12.149    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
PJ      0       20:22:12.150    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
CG      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Start downloading data by EURUSD/H1. Waiting for the next tick...
OG      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data not loaded
HQ      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
QH      0       20:22:12.224    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(EURUSD,H1:10) First start, or historical data has been changed. Initialize Buffer(0)


Resaltada la vela a las 23:00 con una cruz. Se puede ver que la línea roja SMA10 cambia su valor sólo en la siguiente vela después de las 23:00. Es decir, tenemos una transición de valores a las 23:00 y 23:15.

A mi entender, la transición del valor actual al siguiente en Tf2 debería tener lugar alas 22:45 y 23:00.


Entonces esto es lo que tengo. Ejecuto el indicador SMA10 con offset = 1 en un gráfico EURUSD-H1 separado.

Abro un nuevo gráfico y ejecuto TestMSTFMovingAverages. Y milagro, veo que el gráfico parece corregirse.


Registros:

2023.10.29 20:38:42.583 TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
2023.10.29 20:38:42.584 TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
2023.10.29 20:38:42.622 TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(10) First start, or historical data has been changed. Initialize Buffer(0)
2023.10.29 20:38:42.654 TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(EURUSD,H1:10) First start, or historical data has been changed. Initialize Buffer(0)


Y tanto en el primer caso como en el segundo en el panel a las 23:00 el valor de MA(EURUSD,H1:10) = 1,056959. Que, en mi opinión, es correcto. Aparentemente, en el primer caso algo está mal con el relleno del buffer para MA(EURUSD,H1:10).

 
Denis Kirichenko gráfico EURUSD-H1 separado.

Abro un nuevo gráfico y ejecuto TestMSTFMovingAverages. Y milagro, veo que el cuadro parece corregido.


Registros:


Además, tanto en el primer caso como en el segundo en el panel a las 23:00 el valor de MA(EURUSD,H1:10) = 1.056959. Que, en mi opinión, es correcto. Aparentemente, en el primer caso algo está mal con el relleno del buffer para MA(EURUSD,H1:10).

Gracias, Denis. Voy a echar un vistazo más tarde - Estoy ocupado continuando este tema y no tengo tiempo todavía, por desgracia.
 

...При работе с данными не текущего графика для исключения "освобождения" таймсерии, необходимо не реже. чем раз в две минуты обращаться к этой таймсерии. В этом случае будет происходить "удержание" таймсерии, что ускорит к ней обращение (не нужно будет каждый раз дожидаться синхронизации данных)...

¿Cómo ha obtenido ese valor de frecuencia? ¿Se determinó experimentalmente?

 
Denis Kirichenko #:

¿Cómo ha obtenido ese valor de frecuencia? ¿Se determinó experimentalmente?

Mensaje de los desarrolladores en el foro.

 

Existe tal estructura:

//--- struct
struct SBuffer                // Estructura de la memoria intermedia del indicador
  {
   double            array[];    // Búfer de matriz de indicadores
   double            init_value; // Inicialización del valor
   int               shift;      // Desplazar el búfer horizontalmente
   string            descript;   // Descripción del búfer
   //--- (1) Establece, (2) devuelve el valor de inicialización,
   void              SetInitValue(const double value) { init_value=value;                             }
   double            InitValue(void)                  { return init_value;                            }
   //--- (1) Establece, (2) Devuelve el desplazamiento del búfer
   void              SetShift(const int value)        { shift=value;                                  }
   int               Shift(void)                      { return shift;                                 }
//--- (1) Cambia el tamaño del array del buffer, (2) devuelve el tamaño del array del buffer,
//--- (3) inicializa el array con el valor "vacío" establecido
   bool              BuffResize(const int new_size)   { return(ArrayResize(array,new_size)==new_size);}
   uint              BufferSize(void)                 { return array.Size();                          }
   int               InitBuffer(void)                 { return ArrayInitialize(array,init_value);     }
  };

Dado que hay set\get-methods, entonces imho el especificador de accesoprivado falta:

//--- struct
struct SBuffer                // Estructura de la memoria intermedia del indicador
   {
   private:
      double            array[];    // Búfer de matriz de indicadores
      double            init_value; // Inicialización del valor
      int               shift;      // Desplazar el búfer horizontalmente
      string            descript;   // Descripción del búfer
   public:
      //--- (1) Establece, (2) devuelve el valor de inicialización,
      void              SetInitValue(const double value)
         {
         init_value = value;
         }
      double            InitValue(void)
         {
         return init_value;
         }
      //--- (1) Establece, (2) Devuelve el desplazamiento del búfer
      void              SetShift(const int value)
         {
         shift = value;
         }
      int               Shift(void)
         {
         return shift;
         }
//--- (1) Cambia el tamaño del array del buffer, (2) devuelve el tamaño del array del buffer,
//--- (3) inicializa el array con el valor "vacío" establecido
      bool              BuffResize(const int new_size)
         {
         return(ArrayResize(array, new_size) == new_size);
         }
      uint              BufferSize(void)
         {
         return array.Size();
         }
      int               InitBuffer(void)
         {
         return ArrayInitialize(array, init_value);
         }
   };


Y también necesitamos métodos para trabajar con el buffer...

 
Denis Kirichenko #:

Existe tal estructura:

Puesto que hay set\get-methods, entonces imho el especificador de accesoprivado falta:


Y también necesitamos métodos para trabajar con el buffer...

Inicialmente traté de no complicar las cosas.