Cálculo de una matriz durante la optimización - página 6

 
Alexey Viktorov:

Este es un ejemplo de escritura y lectura de un array

Ejecútelo dos veces en modo de depuración y vea cuánto tiempo tarda en escribir y leer el array. La primera ejecución escribirá la matriz en el archivo, y la segunda la leerá y comenzará a imprimir las fechas de la matriz. A continuación, averiguar la parte resaltada, si IS_DEBUG_MODE debe ser eliminado, y si IsOptimization() debe ser insertado en la condición.

Gracias.
 
Dmitry Fedoseev:

Hay una función, algo así como FileWriteInteger(). Identificar por ubicación, la variable debe estar al principio del archivo, después de leerla el puntero se moverá a su final, es decir, al principio del array, después de leer el array el puntero estará antes de la siguiente variable...

Pronto se publicará un artículo sobre el trabajo con archivos.

Quería escribirte que no hay ningún artículo sobre las operaciones de archivo. Los haces informativos y lúcidos. Sin duda los leeré cuando aparezcan.

 

He intentado declarar un array a nivel global (código mql4)

datetime T[];

rellenar en el inite

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

Si no se establece al principio, imprime la fecha de 1971, es decir, la matriz está vacía

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

Si relleno el array en el inicio, aparecen los valores. ¿Puede ser la razón, que la matriz se reinicia datetaime, pero sin ella el código no compila?

El conjunto desaparece. ¿Qué hago mal?

 
forexman77:

He intentado declarar un array a nivel global (código mql4)

rellenar en el inite

Si no se establece al principio, imprime la fecha de 1971, es decir, la matriz está vacía

Si relleno el array en el inicio, aparecen los valores. ¿Puede ser la razón, que la matriz se reinicia datetaime, pero sin ella el código no se compila?

El conjunto desaparece. ¿Qué hago mal?

Mira lo que dice el compilador.

ArrayResize(T,40);
datetime T[40]=

Con un movimiento tan fácil, has definido un array local T que desaparecerá al salir de OnInit...

 
Maxim Kuznetsov:

comprobar la advertencia que genera el compilador.

Con un movimiento tan fácil, has definido un array local T que se perderá al salir de OnInit...

Dice que ya existe una declaración global)

la declaración de 'T' oculta la declaración global en la línea 40

Pero, cómo hacerlo bien. Nunca había declarado un array utilizando llaves. Lo inicialicé con cero y fijé su tamaño y luego lo llené con el bucle. ¿Hay alguna otra forma de hacerlo?

Si borro el datetime en el inite, el código no compila, pero escribe dos errores:

'{' - expresión esperada

'=' - uso de operación ilegal



 
forexman77:

Dice que ya existe una declaración global)

la declaración de 'T' oculta la declaración global en la línea 40

Pero, cómo hacerlo bien. Nunca había declarado un array utilizando llaves. Lo inicialicé con cero y fijé su tamaño y luego lo llené con el bucle. ¿Hay alguna otra forma de hacerlo?

Si borro el datetime en el inite, el código no compila, pero escribe dos errores:

'{' - expresión esperada

'=' - uso de operación ilegal



La declaración del array junto con la inicialización de las constantes podría (y debería) hacerse a nivel global.

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

Dice que ya existe una declaración global)

la declaración de 'T' oculta la declaración global en la línea 40

Pero, cómo hacerlo bien. Nunca había declarado un array utilizando llaves. Lo inicialicé con cero y fijé su tamaño y luego lo llené con el bucle. ¿Hay alguna otra forma de hacerlo?

Si borro el datetime en el inite, el código no compila, pero escribe dos errores:

'{' - expresión esperada

'=' - uso de operación ilegal



Con '=' se pueden inicializar las matrices sólo al declararlas. Parece un remanente de C, pero así es como se hace aquí :-)
 
Maxim Kuznetsov:

La declaración del array junto con la inicialización de las constantes podría (y debería) haberse hecho a nivel global.

Sí, lo he probado y funciona. Y no se puede hacer sin nivel global, sólo lo hice para reducir el coste computacional, para llenar el array una vez en el init y luego usar los valores del array?

Aunque lógicamente, las variables a nivel global son siempre constantes, por lo que el cálculo se realiza una vez al principio del programa?

 
forexman77:

Sí, lo he probado y funciona. Y no se puede hacer sin nivel global, sólo lo hice para reducir el coste computacional, para llenar el array una vez en el init y luego usar los valores del array?

Aunque lógicamente las variables a nivel global son siempre constantes, por lo que el cálculo se realiza una vez al principio del programa?

Sí, al preparar un binario ex4 ex5 para su ejecución por el terminal. Se puede pensar que son sólo enlaces a la matriz de datos descrita (y guardada dentro de ex4/5 en tiempo de compilación), y eso es muy rápido...
 
forexman77:

Dice que ya existe una declaración global)

la declaración de 'T' oculta la declaración global en la línea 40

Pero, cómo hacerlo bien. Nunca había declarado un array utilizando llaves. Lo inicialicé con cero y fijé su tamaño y luego lo llené con el bucle. ¿Hay alguna otra forma de hacerlo?

Si borro el datetime en el inite, el código no compila, pero escribe dos errores:

'{' - expresión esperada

'=' - uso de operación ilegal



Realmente no importa cómo se llene el array. Simplemente hay que establecer una condición por la cual si el tamaño del array es cero, debe ser evaluado, llenado y escrito en un archivo. Y en OnInit(), intenta leer en el array declarado usando mi ejemplo. Por lo tanto, si hay un array de archivos, se lee, y el array se llena, el array no será recalculado y llenado de nuevo.