El indicador se corrompe - página 6

 
Rosh:
Ok, voy a esperar

Después de más de 20 horas el indicador funciona correctamente. No sé qué decir.


 

Rosh, Zoom in/Out, desplazarse a la izquierda/derecha. ¿En qué plataforma estás probando en 64/32 bits?

 
AnkaSoftware:

Rosh, Zoom in/Out, desplazarse a la izquierda/derecha. ¿En qué plataforma estás probando en 64/32 bits?

Puedo replicar el problema general en 32 bits. La única forma en que el sistema operativo parece ser relevante es la cuestión de por qué tu sistema de 64 bits parece estar recibiendo periódicamente nuevos datos al principio o en medio de su historial de barras, mientras que tu sistema de 32 bits (y el sistema de 64 bits de RaptorUK) no. En cualquier caso, parece que tienes la intención de dar tu indicador a otras personas, y los cambios en el historial de barras son problemas con los que sin duda te encontrarás en la vida real, aunque sólo sea porque tus usuarios sufren desconexiones del broker que hacen que se inserten barras perdidas en medio del historial al volver a conectarse.

Como ya he intentado explicar, es discutible si este "bug" está en su código o en MT4. Hay una expectativa de cómo se comportan los indicadores en MT4, y tu indicador no se comporta así. Por ejemplo, cuando creas un nuevo indicador usando el MetaEditor, te inserta la línea "int counted_bars=IndicatorCounted();". Estás eliminando esto e ignorando IndicatorCounted().

Puedo replicar el problema general utilizando el siguiente indicador que simplemente dibuja una línea entre los últimos 10 máximos de barra cuando se inicia por primera vez:

#property indicator_chart_window
#property indicator_color1 Red
#property indicator_buffers 1

double indicatorvalues[];

void init()
{
   SetIndexBuffer(0, indicatorvalues);
}

void start()
{
   static bool IsFirstCall = true;
   if (IsFirstCall) {
      IsFirstCall = false;
      for (int i = 0; i < 10; i++) {
         indicatorvalues[i] = High[i];      
      }
   }
}

Puede replicar el mismo tipo de problema haciendo lo siguiente:

* Abrir un gráfico para cualquier símbolo

* Añadir el indicador al gráfico

* Desactivar el "Chart autoscroll" (sólo para facilitar los siguientes pasos; no porque tenga algún impacto en el problema)

* Ir al inicio del gráfico, pulsando Inicio

* Pulse Avance de página para forzar la descarga de datos adicionales. (N.B. No hay ningún problema a menos que se añadan datos extra al gráfico en este punto).

* Vaya al final del gráfico, pulsando Fin. La línea roja entre los máximos estará ahora fuera de posición. Se habrá movido hacia atrás en el tiempo.

[Todo esto es sólo para completar lo que RaptorUK ya ha identificado].

 

OK, ¿Puedes confirmar que IndicatorCounted() devolverá un número -ve, en este caso de barras perdidas / indicadores corruptos? Déjame intentar reiniciar las matrices de indicadores y volver a dibujar los movimientos de la barra de retroceso.

 
AnkaSoftware:

OK, ¿Puede confirmar, IndicatorCounted() devolverá un número -ve, en este caso de barras perdidas / indicadores corruptos?

No, lo que ocurre -como ya he dicho en la página 5, y como puedes comprobar fácilmente por ti mismo- es que MT4 pone a cero IndicatorCounted() cuando se añaden nuevas barras al inicio del histórico utilizando un método como el anterior. Esto hará que un indicador normal vuelva a dibujar todos sus valores históricos, porque normalmente utilizará la diferencia entre Bars e IndicatorCounted() para determinar qué barras están "sucias" y necesitan ser actualizadas. Si IndicatorCounted() es cero, el indicador recalcula cada barra histórica, es decir, porque Bars - 0 = Bars.

La documentación de IndicatorCounted()(https://docs.mql4.com/customind/IndicatorCounted) proporciona un ejemplo de cómo hacer esto, y hay versiones alternativas como https://www.mql5.com/en/forum/132447 que pretenden mejorar muy marginalmente el rendimiento porque el código estándar en https://docs.mql4.com/customind/IndicatorCounted recalcula innecesariamente una barra que está "limpia".
 

La adición de comprobaciones de IndicatorCounted() y la reinicialización de los indicadores cuando IndicatorCounted() devuelve el valor 0, resuelve el problema de desplazamiento de los indicadores que se produce cuando se insertan barras históricas o adicionales.

Sin embargo, hay otro problema de corrupción de indicadores, que parece no ser causado por la inserción de barras de historia. El código de ejemplo adjunto para reproducir el problema, debe ejecutarse durante más de 10 horas, hasta al menos dos reinicializaciones de los indicadores, es decir, IndicatorCounted() devuelve 0 (después del inicio del indicador).

Archivos adjuntos: