Error en MQL5 al trabajar con el acceso a series temporales iClose/iOpen, etc. - página 4

 
Renat Fatkhullin:

Directamente sobre el código y el trabajo:

  1. La función CopyXXX en los indicadores no espera a que se descarguen completamente los datos de forma sincrónica, sino que da lo que está disponible. De lo contrario, los indicadores se ralentizarían mucho.

  2. Parece que hay un problema con el seguimiento, si no se han sincronizado todos los datos la primera vez.
    Es necesario cambiar a un modo suave "esperaré cuidadosamente a que se descargue con éxito". Por ejemplo, no se llama a OnCalculate.

  3. Lo malo es que una inicialización global con la máxima carga se coloca en OnInit donde el indicador cuenta y espera durante mucho tiempo.
    En este caso, la actualización de los gráficos de este símbolo se bloquea y muchos otros participantes tienen que esperar y no recibir datos frescos. El indicador no debe tomar recursos durante mucho tiempo. Es mejor estirar la larga inicialización paso a paso/inicialización de símbolos en OnCalculate, contando paso a paso.

  4. He hecho que este indicador bombee unos 800 MB de datos históricos a través de la red para su sincronización

  5. El indicador tiene 512 líneas de dibujo para las que se asigna memoria explícitamente. Esto es extremadamente caro. Sólo se utilizan 100 líneas.

  6. El código es poco legible

1. sí, por eso tengo que llamarlos varias veces con una pausa, o reiniciar el indicador manualmente varias veces, pero incluso eso no siempre ayuda y el indicador deja de calcular después de algún tiempo

2. Admito que la versión actual no es óptima; he probado diferentes variantes, incluyendo la función recomendada en la documentación (sección "organizar el acceso a los datos"); en la última versión lo he simplificado un poco, y probablemente tampoco es óptimo llamar muchas veces a las funciones de iBarShift, pero por otro lado si las rechazas, necesitas crear una función especial para preparar los datos sincronizados que todavía no puedo escribir, es muy engorroso, y no hay una función estándar, además si el lenguaje tiene una característica estándar para solicitar el tiempo n

3. OnInit sólo define las combinaciones de carteras y asigna los buffers, no hay peticiones en OnInit. Opcionalmente he probado a abrir los gráficos de todos los instrumentos de M1 en segundo plano para evitar la desaparición de la caché, y parece que ayuda, claro que a máxima carga todo es terrible, 28 gráficos... La primera solicitud de datos es en OpsCalculate donde llamo a CopyClose en bucle con pausa (función RequestData) para que los datos se almacenen en caché y las series para que todos los instrumentos se reúnan y luego viene la llamada (SetupIntervals, CalculateEquity y otros) y pensé que todos los datos estarán listos y todas las llamadas de iBarShift y iClose y otras funciones útiles devolverán los datos en caché, pero de alguna manera no siempre funciona

4. ¿esto debe ser un dato de 800 mb de ticks...? Pero no sé de qué otra manera podría formar un montón de carteras con 28 instrumentos, deben ser solicitados de todos modos, en mt4 no había ningún problema con él (probablemente porque todos los plazos existen por separado en mt4)

5. La cuestión es que el indicador asume que puede haber muchas combinaciones de carteras, ahora hay una combinación preestablecida con 420 líneas + líneas de servicio (todo tipo de varitas, canales, etc.), teóricamente el usuario puede solicitar las 512 líneas, el número de buffers no se puede limitar de antemano usando la #propiedad indicators_buffers, porque no se sabe cuántas solicitará el usuario, en mt4 se retrasa a máxima carga, pero funciona

6. Lo comentaré si es necesario.


P.D. Pensé que tal vez te habías equivocado de versión, porque me equivoqué la primera vez y publiqué otra versión, luego corregí el archivo adjunto.

P.P.S. Quiero aprovechar la oportunidad para aclarar la funcionalidad de los gráficos sintéticos, ¿se desarrollará de alguna manera esta funcionalidad? Por ejemplo quiero hacer no sólo la fórmula de índices, sino simular la posición de compra/venta de un grupo de instrumentos, ahora es difícil de hacer porque tengo que escribir una fórmula engorrosa para el valor del punto y el tamaño del contrato, y el valor del punto no cambia en el historial ...

 

Renat Fatkhullin:

El indicador no debe ocupar recursos durante mucho tiempo. Es mejor estirar uniformemente la larga inicialización a una inicialización paso a paso/característica en OnCalculate, calculando en trozos.

Está claro, para no ralentizar otros programas en el terminal, pero hay una contradicción: Al calcular el modelo de la cartera, el indicador necesita todas las filas de datos a la vez, porque la equidad de la cartera se calcula por ellos, es decir, no puede calcular nada sin los datos listos, y la cartera necesita todos los componentes a la vez, y si hay varias carteras y si se hace la comparación o la suma de carteras, entonces necesita todas las carteras, y entonces no es mucho tramo - no es una ventana deslizante que se puede calcular en partes, aquí primero se hace el cálculo - Por eso planteé la cuestión de una función estándar universal que preparara correctamente una matriz de datos sincronizados para su cálculo.

 
Vladimir Karputov:

Descargado de

Ahora es 18.10 y todo funciona.


Te felicito, has tenido suerte y no tienes la CPU, la memoria, el SO o lo que sea... pero eso no hace que el bug no sea real.

Es real y no me está pasando sólo a mí.

 
transcendreamer:

Esto es comprensible, para no ralentizar otros programas en el terminal, pero hay una contradicción: al calcular el modelo de cartera, el indicador necesitará todas las filas de datos a la vez, porque la equidad de la cartera se calcula con ellos, es decir, sin datos listos es imposible calcular nada, y la cartera necesita todos los componentes a la vez, y si hay varias carteras y si hay una comparación o suma entre carteras, entonces para varias carteras, y entonces no se puede estirar, porque no es una ventana deslizante que se pueda calcular por partes, aquí primero se hace el cálculo - Por eso hice la pregunta sobre una función estándar universal que preparara correctamente un array de datos sincronizados para su cálculo.

Ese es el fallo clave. Tengo el mismo problema.

El cálculo y la visualización funcionan instantáneamente en mt4, pero no hay ningún problema con los indicadores en mt5, mientras que todos los gráficos de los que necesito obtener los precios están siempre abiertos. Resulta que sólo puedo escribir indicadores simples, como MAs de un solo búfer(

 

Definitivamente hay un error en:

1) Servidor 2012 (build 9200) en Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memoria: 3033 / 3839 Mb, Disco: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, versión virtual de QEMU (cpu64-rhel6), Memoria: 1340 / 2047 Mb, Disco: 15 / 28 Gb, GMT+2


 
Stanislav Dray:

Definitivamente hay un error en:

1) Servidor 2012 (build 9200) en Hyper-V x64, IE 10, RDP, UAC, Intel Xeon E5-2687W v2 @ 3.40GHz, Memoria: 3033 / 3839 Mb, Disco: 96 / 107 Gb, GMT-5

2) Windows Server 2012 R2 (build 9600) x64, IE 11, RDP, UAC, versión virtual de QEMU (cpu64-rhel6), Memoria: 1340 / 2047 Mb, Disco: 15 / 28 Gb, GMT+2

Lo tengo:

Windows 7 Service Pack 1 (build 7601) x64, IE 11, Intel Core i5-2400 @ 3.10GHz, Memoria: 469 / 8182 Mb, Disco: 96 / 148 Gb, GMT+2

 
transcendreamer:

Esto es comprensible, para no ralentizar otros programas en el terminal, pero hay una contradicción: al calcular el modelo de cartera, el indicador necesitará todas las filas de datos a la vez, porque la equidad de la cartera se calcula con ellos, es decir, sin datos listos es imposible calcular nada, y la cartera necesita todos los componentes a la vez, y si hay varias carteras y si hay una comparación o suma entre carteras, entonces para varias carteras, y entonces no se puede estirar, porque no es una ventana deslizante que se pueda calcular por partes, aquí primero se hace el cálculo - Por eso hice la pregunta sobre una función estándar universal que preparara correctamente un array de datos sincronizados para su cálculo.

Debe escribir el indicador teniendo claro que no lo conseguirá todo de una vez.

En OnInit se debe estimular la carga del historial de los instrumentos requeridos mediante llamadas individuales de CopyXXX, pero hay que esperar a la inicialización completa en OnCalculate.

Su fase de inicialización parece tener un error: está esperando datos de forma incorrecta y se está bloqueando.

 
Renat Fatkhullin:

Ponga el código a trabajar. Hasta aquí todo bien.

Archivo sin cuerpo, por cierto.

En 2 horas todo está bien, el temporizador está marcando la fecha correcta en los comentarios.
 
Vitaly Muzichenko:

Este es el fallo clave. Tengo el mismo problema.

En mt4 el cálculo y la visualización funcionan al instante, pero en mt5 hay un problema total con los indicadores, aunque todos los gráficos de los que se quieren recibir precios están siempre abiertos. Resulta que sólo puedo escribir indicadores simples, como MAs de un solo búfer(

Entiendo que todo está pensado para la velocidad del terminal y de los programas en él.

 
Vitaly Muzichenko:

Este es el fallo clave. Tengo el mismo problema.

En mt4 el cálculo y la visualización funcionan al instante, pero en mt5 hay un problema total con los indicadores, aunque todos los gráficos de los que se quieren recibir precios están siempre abiertos. Resulta que sólo puedo escribir indicadores simples, como MAs de un solo búfer(

Tengo que mirar el código.

En el código anterior hay claramente un montón de problemas lógicos y de recursos.

Razón de la queja: