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

 
Yuri Evseenkov:
Yo hago esto. Hago una sola prueba. Durante estas pruebas escribo matrices en un archivo. Luego realizo la optimización en la misma zona pero las matrices no se recalculan en cada barra o tick, se leen del archivo. La optimización mediante la apertura de precios en un periodo semanal es instantánea. Sin operaciones de archivo se tarda horas.
Mi situación es ligeramente diferente. Sólo necesito llenar el array una vez y utilizarlo para todos los pases. Es decir, para mí, incluso con cada pasada, llenar el array una vez en el inite es mucho.
 
-Aleks-:

Ya veo, es decir, se puede leer el archivo listo con dígitos en un array (mi caso), luego escribirlo en un archivo binario, y luego utilizarlo.

Bien, si necesitas leer datos de 10 arrays desde el archivo, entonces necesitas hacer un clasificador, que entenderá el final del array por un dígito especial y llenará el siguiente array... Porque no es conveniente escribir el tamaño del array cada vez.

Primero, escribimos una variable int con el tamaño del array en el archivo, luego un array, luego otra variable int con el tamaño, luego un array, etc.

En el mismo orden leemos: leer variable con tamaño, leer array de ese tamaño, siguiente variable, array, etc.

 
forexman77:
Mi situación es ligeramente diferente. Sólo tengo que llenar el array una vez y utilizarlo para todos mis pases. Así que, para mí, incluso con cada pase, llenar el array una vez en el inite es mucho.
Así que llénalo una vez en una sola prueba. Los programas durante las pruebas y la optimización deben diferir en las operaciones de archivo. Durante las pruebas está escribiendo, mientras que durante la optimización está leyendo. Hay que escribir dos códigos. ¿A qué te refieres con que llenar un array es mucho? La invocación de un array desde un archivo no lleva más tiempo que, por ejemplo, la apertura de una orden o una operación de multiplicación con doble.
 
Yuri Evseenkov:
Así que llénelo una vez para una sola prueba. Los programas durante las pruebas y la optimización deben diferir en las operaciones de archivo. Durante las pruebas está escribiendo, mientras que durante la optimización está leyendo. Hay que escribir dos códigos. ¿A qué te refieres con que llenar un array es mucho? La invocación de un array desde un archivo no requiere más tiempo que, por ejemplo, la apertura de una orden o una operación de multiplicación con doble.

Mucho por qué: conozco todo el conjunto de antemano. Y entonces surgió la pregunta de cómo guardar esta matriz entre pases. Tengo entendido que se reinicia en la siguiente pasada, aunque no estoy exactamente seguro de ello.

No estoy de acuerdo en que la lectura sea más rápida en mi caso. La velocidad es más rápida, si recibo los mismos datos a través de indicadores, y se ralentiza significativamente, cuando leo estos datos preparados desde un archivo sin cálculo de indicadores. En un plazo pequeño con el número de líneas de mil y en un segmento grande es muy costoso leer el archivo cada vez.

La idea era la siguiente: leer los datos y escribirlos en un array y luego, en todas las pasadas, sólo utilizar este array, es decir, el array es exactamente el mismo desde la primera pasada hasta la última.

 
forexman77:

Mucho por qué: conozco todo el conjunto de antemano. Y entonces surgió la pregunta de cómo guardar esta matriz entre pases. Tengo entendido que se reinicia en la siguiente pasada, aunque no estoy exactamente seguro de ello.

No estoy de acuerdo en que la lectura sea más rápida en mi caso. Es más rápido, cuando obtengo los mismos datos a través de indicadores, y se vuelve más lento, cuando leo estos datos desde el archivo sin cálculo de indicadores.

La idea era la siguiente: leer los datos y ponerlos en un array y luego utilizar este array para todas las pasadas, es decir, el array es exactamente el mismo desde la primera pasada hasta la última.

Sólo la práctica podrá responder a esta pregunta. Leer la matriz en cada pasada. Llevo mucho tiempo luchando con el mismo problema. Estuve optimizando durante horas. Hasta que Andrey Khatimlansky sugirió escribir en el archivo una vez y leer desde allí. Ahora tengo que esperar a la prueba de una vez y luego la optimización está fuera de juego. Las operaciones con archivos están bien descritas en el tutorial de Kovalev.
 
Dmitry Fedoseev:

Primero escribimos una variable int con el tamaño del array en el archivo, luego un array, luego otra variable int con el tamaño, luego un array, etc.

Leer en el mismo orden: leer variable con tamaño, leer array de ese tamaño, siguiente variable, array, etc.

Aquí es donde me siento inculto... ¿Cómo escribir una variable int con el tamaño de un array en un archivo binario? Es decir, ¿cómo sería posible identificar esta variable al leer del archivo?
 
forexman77:

La idea era leer los datos y ponerlos en un array y luego en todas las pasadas sólo utilizar este array, es decir, el array es exactamente el mismo desde la primera pasada hasta la última.

MT4 es realmente muy lento en el trabajo con archivos, no sé cómo será en MT5, especialmente con un archivo binario...

Yo resuelvo este problema con una función que escribe todo el array directamente en el código, pero no es una solución universal, por supuesto.

 

Este es un ejemplo de escritura y lectura de un array

datetime T[]=
   {
   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,
   1278456660,1278540000,1278626400,1278712800,1280447880,1280527200,1280789220,1280959200,1281045720,1283292000,
   1283378400,1283812200,1285626300,1285887060,1286229600,1286316000,1286404740,1288133220,1288216860,1288305120,
   1288392420,1288648860,1288735200,1288741980,1288822080,1288994400,1290722460,1290809040,1291069320,1291329540,
   1293228420,1293577020,1293666300,1293746400,1295992800,1296079320,1296253680,1296514200,1296686940,1296770400,
   1298503260,1298592000,1298672280,1298931060,1300831920,1300917600,1301609160,1301696460,1303512420,1303768920
   };

datetime newT[];
int fileHandle;

/******************Expert initialization function*******************/
int OnInit()
{
   if((fileHandle = FileOpen("test", FILE_READ|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)// здесь поставь точку останова нажав клавиш F9
    {
     FileReadArray(fileHandle, newT);
      for(int i = 0; i < ArraySize(newT); i++)
       Print(i, " ", TimeToString(newT[i], TIME_DATE|TIME_SECONDS));
      FileClose(fileHandle);
    }
  else
   if(/*IsOptimization()*/IS_DEBUG_MODE && (fileHandle = FileOpen("test", FILE_WRITE|FILE_BIN|FILE_COMMON)) != INVALID_HANDLE)
    {
     FileWriteArray(fileHandle, T);
     FileClose(fileHandle);
    }
   return(INIT_SUCCEEDED);
}/*******************************************************************/


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.

 
-Aleks-:
Aquí es donde me siento inculto... ¿Cómo escribir una variable int de un tamaño de matriz en un archivo binario? Es decir, ¿cómo sería posible identificar esta variable al leer del archivo?

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.

 
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 habrá un artículo sobre el trabajo con archivos.

Lo entiendo, gracias.

Pero me gustaría echar un vistazo al código, así que esperaré al artículo.