Errores, fallos, preguntas - página 2723

 
Aleksey Mavrin:

¿Puedes decirme qué ocurre y cómo acelerar la actualización del gráfico? La función ChartRedraw se llama desde el Asesor Experto, pero todavía hay un par de minutos de retraso.

ChartRedraw es necesario sólo para dibujar (actualizar) objetos gráficos, no necesitamos ChartRedraw para un indicador normal que dibuje por buffers de indicadores

creo que deberías buscar el problema en el indicador, quizás el cálculo de los buffers en cada tick no es correcto, hay "autores" que calculan todo el historial en cada tick

ZZY: No puedo confirmarlo, pero tal vez ChartRedraw actualiza todo el gráfico con el historial sincronizado, si es así, en realidad se reinicia el indicador con un cálculo completo de todo el historial cada vez

UPD: tratar de limitar la historia en el gráfico a un menor número de barras 10 000 es suficiente, en MT4 hubo un caso en el que un indicador pesado "engulló" toda la memoria y luego buscó por qué EA no funcionó correctamente (funcionó entonces no). Aunque en MT5 es poco probable que se haya utilizado toda la memoria .... pero ocurre

 
Igor Makanu:

ChartRedraw es necesario sólo para dibujar (actualizar) objetos gráficos, no se necesita ChartRedraw para un indicador normal que dibuje por medio de buffers de indicadores

creo que deberías buscar el problema en el indicador, quizás el cálculo de los buffers en cada tick no es correcto, hay "autores" que calculan todo el historial en cada tick

ZZY: No puedo confirmarlo, pero tal vez ChartRedraw actualiza todo el gráfico con el historial sincronizado, si es así, realmente se reinicia el indicador con un cálculo completo de todo el historial cada vez

UPD: tratar de limitar la historia en el gráfico a un menor número de barras 10 000 es suficiente, en MT4 hubo un caso en el que un indicador pesado "engulló" toda la memoria y luego buscó por qué EA no funcionó correctamente (funcionó entonces no). Aunque en MT5 es poco probable que se utilice toda la memoria.... pero puede ocurrir.

He intentado optimizar el cálculo y he probado la versión anterior del indicador. He calculado cada 1000 barras antes y ahora estoy esperando a que se abra una nueva barra.

Si esta es la razón, todavía debería estar muy sorprendido. ¿1k barras de cálculos no muy fuertes ralentizan el dibujo del gráfico durante 2 minutos?

 
Aleksey Mavrin:

Si esa es la razón, todavía vale la pena una gran sorpresa. ¿1 barra de cálculos no muy fuertes ralentiza el dibujo del gráfico durante 2 minutos?

no puede ser, en mi opinión, el terminal descargará tal indicador con un mensaje diciendo " cálculo demasiado largo en el indicador xxx".

el tiempo de ejecución de la MT (4/5) es muy rápido, por supuesto que puedes calcular los mismos datos varias veces, pero imho, tienes que probarlo mucho

Creo que el autor del indicador no está familiarizado con el cálculo económico de los topes de los indicadores, y se olvida de calcular correctamente las últimas barras... vete a QB a estudiar cómo se escribe un indicador ;)

 
Slava :

¿Estos dos programas están en el mismo terminal o en dos terminales diferentes?

El código para reproducir el problema está publicado aquí. https://www.mql5.com/en/forum/332849

Es necesario ejecutar el código al menos 2 veces para reproducirlo.

File-Sharing ... my next "Sometimes-Bug" in MT5?
File-Sharing ... my next "Sometimes-Bug" in MT5?
  • 2020.02.16
  • www.mql5.com
FILE_SHARE_READ and FILE_SHARE_WRITE do not work proper. MQL creates buffers with different contents for the same file. Please watch the example...
 
Alexey Navoykov:

No es necesario en absoluto. ¿Por qué C? ¿Qué tal C#? - Está más cerca de C# en términos de significado.

Probablemente porque µl c++ es similar, y las estructuras llegaron allí desde c.

Todo lo que se dice sobre las estructuras pasivas son nociones arcaicas, en mi opinión.

Si necesitas constructores, usa clases o vete a Sharp. ¿Por qué debemos privar a las estructuras de esta connotación? Esto sólo hará que los programas sean más expresivos. Puedo tomar el código de alguien y ver que tiene una estructura en lugar de una clase y obtener mucha información de una sola palabra. No conseguirás nada, estudiarás diligentemente el código fuente para obtener el mismo resultado, que yo conseguí en un abrir y cerrar de ojos. En mi experiencia - esta convención de estructuras se respeta, bueno tal vez una especie de marginalismo nihilista al viento.

Creo que, como mínimo, cada tipo debería tener un constructor. Los campos no inicializados son malos y deben evitarse.

No hay maldad ahí, te parece. Vaughn incluso arrastró a la norma: la lectura de unsigned char y std::byte sin inicializar no es un comportamiento indefinido. Puede utilizar la inicialización agregada para POD. Y no olvides que toda esta inicialización no es gratuita, es un consumo real de recursos (CPU, memoria, tamaño de un ejecutable). Si te importa un carajo con tu máquina de hacer números, en el caso de algún microcontrolador puede ser importante. Al fin y al cabo, C/C++ no es sólo una baraja de Windows como Sharp.

unsigned char fn() {unsigned char q; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1121:       83 c0 02                add    $0x2,%eax
    1124:       5 d                      pop    %rbp
    1125:       c3                      retq           

unsigned char fn2() {unsigned char q = 5; return q + 2;}
int main() {
    fn();
}
0000000000001119 <fn2>:
    1119:       55                      push   %rbp
    111 a:       48 89 e5                mov    %rsp,%rbp
    111 d:       c6 45 ff 05             movb   $0x5,-0x1(%rbp)
    1121:       0 f b6 45 ff             movzbl -0x1(%rbp),%eax
    1125:       83 c0 02                add    $0x2,%eax
    1128:       5 d                      pop    %rbp
    1129:       c3                      retq
La inicialización de una sola variable aumentó el tamaño de la instrucción en un 30%.
 
Stanislav Korotky:

En un terminal. El experto escribe los datos, el indicador los lee. Colgados en gráficos diferentes, pero obviamente podrían estar en el mismo (si es que eso importa). Construye 2380.

El Asesor Experto que lee el archivo debe mantener este archivo cerrado.

La peculiaridad de la implementación de los archivos en MQL5 es que mantienen al máximo los datos de los archivos en sus propios buffers. Si la cantidad de información es tan grande que no cabe en el buffer, entonces tu truco de mover el puntero al principio y luego al final del archivo puede funcionar.

Así que en este punto, abre el archivo, comprueba el contenido y vuelve a cerrarlo

 
Slava :

Un Asesor Experto que lee un archivo debe mantenerlo cerrado.

La peculiaridad de la implementación de los archivos en MQL5 es que mantienen los datos de los archivos en sus propios buffers tanto como sea posible. Si la cantidad de información es tan grande que no cabe en el buffer, entonces tu truco de mover el puntero al principio y luego al final del archivo puede funcionar.

Así que en este punto, abre el archivo, comprueba el contenido y vuelve a cerrarlo

¿Así que FileFlush () es inútil?
 
Alain Verleyen:
¿Así que FileFlush () es inútil?

No. Hay que hacer FileFlush si se quiere que otra persona pueda leer el archivo modificado

El problema es que el programa MQL5 lee el archivo en su propio buffer cuando lo abre. No sabrá nada de los cambios en el archivo hasta que lo vuelva a leer. El archivo sólo puede ser leído de nuevo cerrando y abriendo el archivo

 
Slava:
No. Hay que hacer FileFlush si se quiere que otra persona pueda leer el archivo modificado

¿Incluso si se cierra el archivo?

 
Andrey Barinov:

¿Incluso si se cierra el archivo?

A eso me refiero exactamente. Cerrar y volver a abrir

¿O se refiere a FileFlush antes de cerrar el archivo?