Errores, fallos, preguntas - página 3032

 
Andrey Dik:

Gracias, Andrew. Usted es el único que ha entendido bien la cuestión.


Ahora todo funciona como estaba previsto, los indicadores han calculado completamente sólo una vez durante la primera ejecución y luego sólo una vez cada vez en su nueva barra.


El código final del segundo indicador espero que le sea útil a alguien:

Este es el principio de lo que debería haber pensado

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

Alexey Viktorov, 2021.05.28 08:36

¿Para qué sirve este cheque?

//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

Sería más fácil escribir return 0; sin ninguna condición...

En cada nueva barra se cumplirá la condición y se recalcularán todas las barras, independientemente de la sincronización. Has escrito un código poco meditado y pretendes que sea un bug terminal...


E Igor Makanu dijo esto incluso antes...
 

Me gustaría recordarles.

1. Para cada símbolo, para el que está abierto al menos un gráfico, hay un hilo separado para procesar los ticks entrantes. Pueden abrirse varios gráficos para algún símbolo, pero seguirá habiendo un solo hilo.

2. El hilo de símbolos maneja las series de tiempo, no los gráficos. Es decir, las mismas matrices de datos que se someten a la solicitud de CopyRates.

3. es inútil preguntar a su símbolo en OnTick o OnCalculate, si está sincronizado. ¡Claro que sí!

4. Todas las series temporales se tratan en orden, de menor a mayor. En primer lugar, se aplica el tick, y luego el cálculo de todos los indicadores, creados en esta serie de tiempo. Si pide datos para el mismo símbolo H1 del indicador, trabajando en M1, nunca obtendrá datos con el tick aplicado. Los datos siempre estarán un poco más atrás, independientemente de los trucos que se apliquen. Porque un hilo por símbolo con un procesamiento de tiempo consecutivo.

5. La afirmación anterior no se aplica a los EAs y a los scripts, porque los EAs y los scripts trabajan cada uno en sus propios hilos separados.

 
Slava:

Me gustaría recordarles.

1. Para cada símbolo, para el que está abierto al menos un gráfico, hay un hilo separado para procesar los ticks entrantes. Pueden abrirse varios gráficos para algún símbolo, pero seguirá habiendo un solo hilo.

2. El hilo de símbolos maneja las series de tiempo, no los gráficos. Es decir, las mismas matrices de datos que se someten a la solicitud de CopyRates.

3. es inútil preguntar a su símbolo en OnTick o OnCalculate, si está sincronizado. ¡Claro que sí!

4. Todas las series temporales se tratan en orden, de menor a mayor. Primero aplicamos el tick, y luego el cálculo de todos los indicadores, creados en esta serie temporal. Si pide datos para el mismo símbolo H1 del indicador, trabajando en M1, nunca obtendrá datos con el tick aplicado. Los datos siempre estarán un poco más atrás, independientemente de los trucos que se apliquen. Porque un hilo por símbolo con un procesamiento de tiempo consecutivo.

5. La afirmación anterior no se refiere a los Asesores Expertos y a los scripts, porque los Asesores Expertos y los scripts trabajan en sus propios hilos separados.

Por favor, envíenme más recordatorios detallados como éste. Gracias.

 
Slava:

Me gustaría recordarles.

4. Todas las series temporales se procesan en orden, de la más baja a la más alta. Primero la aplicación de ticks, luego el cálculo de todos los indicadores creados sobre esta serie temporal. Si pide datos para el mismo símbolo H1 de un indicador, trabajando en M1, nunca obtendrá datos con un tick aplicado. Los datos siempre estarán un poco más atrás, independientemente de los trucos que se apliquen. Porque un hilo por símbolo con un procesamiento de tiempo consecutivo.

5. La afirmación anterior no se aplica a los EAs y a los scripts, ya que los EAs y los scripts trabajan cada uno en su propio hilo.

¿Estoy siguiendo correctamente, si un EA que trabaja en M1 utiliza un indicador en M1 (o cualquier otro TF?) que toma los datos del TF superior, entonces en el primer tick de una nueva barra no podrá devolver el valor real en ningún caso, porque la cola para calcular el TF superior lo alcanzará después de n ticks?

Simplemente me enfrenté a este comportamiento y estaba buscando un problema en el indicador, y ahora resulta que debe ser así. Pero si es así, interfiere fuertemente con las pruebas porque tengo que saltar varios ticks, lo cual es crítico cuando se hacen pruebas en el modo OHLC.

 
Slava:

2. El flujo de símbolos no procesa gráficos, sino series temporales. Es decir, las propias matrices de datos que se dan a la solicitud de CopyRates

....

4. Todas las series temporales se procesan en orden, de menor a mayor. Primero la aplicación del tick, luego el cálculo de todos los indicadores, creados sobre esta serie temporal. Si pide datos para el mismo símbolo H1 de un indicador, trabajando en M1, nunca obtendrá datos con un tick aplicado. Los datos siempre estarán un poco más atrás, independientemente de los trucos que se apliquen. Porque un hilo por símbolo con un procesamiento de tiempo consecutivo.

¿Por qué aparecen pantallas negras de "Actualización" cuando cambio de TF?

abrí el gráfico que estaba usando antes (H1 en EURUSD), dejé el indicador, no hice nada durante 2-3 minutos, luego cambié a un gráfico inferior (M30...M1), la pantalla negra "Update" puede aparecer durante 10 segundos

y esta pantalla negra depende de la compilación - cuando el terminal es sin pantalla negra, y cuando realmente me molesta, porque usted sabe exactamente lo que la historia está cargada, sólo tiene que hacer un gráfico a la terminal, y por qué esperar a que esta pantalla negra


Por ejemplo, si el indicador se ejecuta en M5 y cada 30 minutos llama al indicador en H1, ¿conseguirá CopyBuffer() siempre los datos correctos de H1?

o no es un hecho, por lo tanto "tirar del indicador" en H1 cada tick(la ruptura de la conexión no se considera todavía)

 

¿cómo manejar las variables de un bucle/función en otra función?

¿se puede hacer más global la visibilidad?

 
Igor Makanu:

¿por qué aparecen pantallas negras de "Actualización" al cambiar de TF?

abrí el gráfico que usé antes (H1 en EURUSD), dejé el indicador, no hice nada durante 2-3 minutos, luego cambié a un gráfico inferior (M30...M1), "actualización de pantalla negra" puede aparecer durante 10 segundos

y esta pantalla negra depende de la compilación - cuando el terminal es sin pantalla negra, y cuando realmente me molesta, porque usted sabe exactamente lo que la historia está cargada, sólo tiene que hacer un gráfico a la terminal, y por qué esperar a que esta pantalla negra


Por ejemplo, si el indicador se ejecuta en M5 y cada 30 minutos llama al indicador en H1, ¿conseguirá CopyBuffer() siempre los datos correctos de H1?

o no es un hecho, por lo tanto "tira del indicador" en H1 cada tick(no consideramos todavía las variantes de ruptura de la conexión)

Creo, basándome en las palabras de Slava, que no es un hecho.

Como todos los cálculos se realizan sólo en el tick, la cadena de indicadores ligados puede no completarse y tendremos que esperar al siguiente tick.

Pero hay algunos problemas interesantes, cuyas respuestas no he encontrado en la documentación.

¿Qué hacer, cuando no se producen ticks (por ejemplo, en el fin de semana)? Si coloca un indicador, que funciona en el marco temporal actual, se dibujará sin problemas, y lo que es interesante - ¡no necesita que se reciba un tick! Pero si el indicador solicita datos de otro marco temporal, no hará nada hasta que llegue un nuevo tick, y no hay ningún tick - ¡fin de semana!

Si llamamos a ChartRedraw (ChartID ()) en el temporizador, entonces para cierto Comentario (cnt); dondecnt se incrementa en 1, vemos que cnt funciona correctamente en la pantalla, pero el indicador no se dibuja.

Cuando actualizo la pantalla con el botón Actualizar del menú contextual, el indicador se redibuja desde el principio hasta el final.

Pero en cuanto se actualiza la pantalla con Actualizar desde el menú contextual, el indicador se dibuja alegremente desde el principio hasta el final.


HH Tu ejemplo del segundo indicador funciona, pero el código del Experto es más rápido.

 
Andrey Dik:

¿qué hacer cuando no hay ticks (fin de semana por ejemplo)? si pones un indicador que trabaje sobre el TF actual, se dibujará sin problemas, y lo que es interesante - ¡la llegada de un tick no es necesaria para esto!

no es necesario

cuando se dibuja el indicador en el gráfico, hay una secuencia de llamadas estrictamente definida: OnInit() e inmediatamente OnCalculated(). es decir, el primer OnCalculated() se llama antes de la recepción de ticks, por esoprev_calc tiene que ser comparado con 0. En la recepción de ticks o en la conexión con el servidor OnCalculated() será llamado de nuevo yprev_calc será igual a cero

Andrey Dik:

Resulta que ChartRedraw () y Update by button no son lo mismo, aunque pueda pensar lo contrario.

lo más probable es que deba utilizar ChartSetSymbolPeriod() con los parámetros NULL y el período actual, debería ayudar

 
Igor Makanu:

Lo más probable es que deba utilizar ChartSetSymbolPeriod() con los parámetros NULL y el período actual, debería ayudar

ChartSetSymbolPeriod

La llamada ChartSetSymbolPeriod con el mismo símbolo y marco temporal puede utilizarse para refrescar el gráfico (similar al comando Refresh en el terminal). La actualización del gráfico, a su vez, provoca el recálculo de los indicadores asociados a él. De este modo, puede recalcular el indicador en el gráfico incluso cuando no hay ticks (por ejemplo, los fines de semana).

También, como recuerdo ahora, ac Pushkin solía decir:

Oh, cuántos descubrimientos maravillosos
Preparanuestroespíritu iluminado
Y la experiencia, hijo de duros errores,
Y el genio, amigo de las paradojas,
Y el azar, Dios inventor.

 
Andrey Dik:


¿Qué hacer cuando los ticks no vienen (por ejemplo, los fines de semana)? Si el indicador funciona en el marco temporal actual, se dibujará sin problemas, y lo que es interesante - ¡no necesita que venga un tick! Pero si el indicador solicita datos de otro marco temporal, no puede hacer nada hasta que venga un nuevo tick, y no viene - ¡los fines de semana!


Del otro plazo se obtendrán los datos que estén listos en el momento. Así, en la salida todos los datos estarán perfectamente sincronizados

Razón de la queja: