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
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
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).
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).
...При работе с данными не текущего графика для исключения "освобождения" таймсерии, необходимо не реже. чем раз в две минуты обращаться к этой таймсерии. В этом случае будет происходить "удержание" таймсерии, что ускорит к ней обращение (не нужно будет каждый раз дожидаться синхронизации данных)...
¿Cómo ha obtenido ese valor de frecuencia? ¿Se determinó experimentalmente?
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...
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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