Calcul d'un seul tableau pendant l'optimisation - page 5

 
Yuri Evseenkov:
Je fais ça. Je lance un seul test. Pendant ce test, j'écris des tableaux dans un fichier. J'effectue ensuite une optimisation dans la même zone mais les tableaux ne sont pas recalculés à chaque barre ou tick, ils sont lus depuis le fichier. L'optimisation par les prix d'ouverture sur une période hebdomadaire est instantanée. Sans opérations sur les fichiers, cela prend des heures.
Ma situation est légèrement différente. Je n'ai besoin de remplir le tableau qu'une seule fois et de l'utiliser pour toutes les passes. C'est-à-dire que pour moi, même avec chaque passage, remplir le tableau une fois dans l'inite est beaucoup.
 
-Aleks-:

Je vois, c'est-à-dire que vous pouvez lire le fichier prêt avec des chiffres dans un tableau (mon cas), puis l'écrire dans un fichier binaire, et ensuite l'utiliser.

Eh bien, si vous avez besoin de lire les données de 10 tableaux à partir du fichier, alors vous devez faire un trieur, qui comprendra la fin du tableau par un chiffre spécial et remplira le tableau suivant... En effet, il n'est pas pratique d'écrire la taille du tableau à chaque fois.

D'abord, nous écrivons une variable int avec la taille du tableau dans le fichier, puis un tableau, puis une autre variable int avec la taille, puis un tableau, etc.

Dans le même ordre, nous lisons : lire une variable de taille, lire un tableau de cette taille, la variable suivante, le tableau, etc.

 
forexman77:
J'ai une situation légèrement différente. Je n'ai besoin de remplir le tableau qu'une seule fois et de l'utiliser pour tous mes passages. C'est-à-dire que pour moi, même à chaque passage, remplir le tableau une fois dans l'inite est beaucoup.
Remplissez-le donc une fois en un seul test. Les programmes en cours de test et d'optimisation doivent différer dans les opérations sur les fichiers. Pendant le test, il s'agit d'écrire, tandis que pendant l'optimisation, il s'agit de lire. Deux codes doivent être écrits. Qu'entendez-vous par "remplir un tableau" ? L'appel d'un tableau à partir d'un fichier ne prend pas plus de temps que, par exemple, l'ouverture d'une commande ou une opération de multiplication avec double.
 
Yuri Evseenkov:
Il faut donc le remplir une fois pour un seul test. Les programmes en cours de test et d'optimisation doivent différer dans les opérations sur les fichiers. Pendant le test, il s'agit d'écrire, tandis que pendant l'optimisation, il s'agit de lire. Deux codes doivent être écrits. Qu'entendez-vous par "remplir un tableau" ? L'appel d'un tableau à partir d'un fichier ne prend pas plus de temps que, par exemple, l'ouverture d'une commande ou une opération de multiplication avec double.

En grande partie pour cette raison : je connais tout le tableau à l'avance. La question s'est donc posée de savoir comment sauvegarder ce tableau entre les passages. Je crois savoir qu'il est réinitialisé lors du passage suivant, mais je n'en suis pas tout à fait sûr.

Je ne suis pas d'accord pour dire que la lecture est plus rapide dans mon cas. La vitesse est plus rapide, si je reçois les mêmes données par le biais d'indicateurs, et ralentit considérablement, lorsque je lis ces données préparées à partir d'un fichier sans calcul d'indicateurs. Sur une petite échelle de temps avec le nombre de lignes d'un millier et dans un grand segment, il est très coûteux de lire le fichier à chaque fois.

L'idée était la suivante : lire les données et les écrire dans un tableau et ensuite, à chaque passage, n'utiliser que ce tableau, c'est-à-dire que le tableau est exactement le même du premier au dernier passage.

 
forexman77:

En grande partie pour cette raison : je connais tout le tableau à l'avance. La question s'est donc posée de savoir comment sauvegarder ce tableau entre les passages. Je crois savoir qu'il est réinitialisé lors du passage suivant, mais je n'en suis pas tout à fait sûr.

Je ne suis pas d'accord pour dire que la lecture est plus rapide dans mon cas. C'est plus rapide, lorsque j'obtiens les mêmes données par le biais d'indicateurs, et cela devient plus lent, lorsque je lis ces données depuis le fichier sans calcul d'indicateurs.

L'idée était la suivante : lire des données et les mettre dans un tableau, puis utiliser ce tableau pour toutes les passes, c'est-à-dire que le tableau est exactement le même de la première à la dernière passe.

Seule la pratique permettra de répondre à cette question. Lire le tableau à chaque passage. Cela fait longtemps que je me débats avec le même problème. J'ai optimisé pendant des heures. Jusqu'à ce qu'Andrey Khatimlansky suggère d'écrire une fois dans le fichier et de lire à partir de là. Maintenant je dois attendre le test de passage et ensuite l'optimisation est hors de cause. Les opérations sur les fichiers sont bien décrites dans le tutoriel de Kovalev.
 
Dmitry Fedoseev:

Nous écrivons d'abord une variable int avec la taille du tableau dans le fichier, puis un tableau, puis une autre variable int avec la taille, puis un tableau, etc.

Lire dans le même ordre : lire une variable de taille, lire un tableau de cette taille, la variable suivante, le tableau, etc.

C'est là que je me sens peu instruit... Comment écrire une variable int avec la taille d'un tableau dans un fichier binaire ? En d'autres termes, comment serait-il possible d'identifier cette variable lors de la lecture du fichier ?
 
forexman77:

L'idée était de lire les données et de les mettre dans un tableau, puis de n'utiliser que ce tableau à chaque passage, c'est-à-dire que le tableau est exactement le même du premier au dernier passage.

MT4 est vraiment très lent à travailler avec des fichiers, je ne sais pas comment ce sera dans MT5, surtout avec un fichier binaire...

Je résous ce problème avec une fonction qui écrit le tableau entier directement dans le code, mais ce n'est pas une solution universelle, bien sûr.

 

Voici un exemple d'écriture et de lecture d'un tableau

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);
}/*******************************************************************/


Exécutez-le deux fois en mode débogage et voyez combien de temps il faut pour écrire et lire le tableau. La première exécution écrira le tableau dans le fichier, et la seconde le lira et commencera à imprimer les dates du tableau. Ensuite, déterminez la partie mise en évidence, si IS_DEBUG_MODE doit être supprimé, et si IsOptimization() doit être inséré dans la condition.

 
-Aleks-:
C'est là que je me sens inculte... Comment écrire une variable int d'une taille de tableau dans un fichier binaire ? En d'autres termes, comment serait-il possible d'identifier cette variable lors de la lecture du fichier ?

Il existe une fonction, quelque chose comme FileWriteInteger(). Identifier par emplacement, la variable doit être au début du fichier, après l'avoir lue le pointeur se déplacera à son extrémité, c'est-à-dire au début du tableau, après avoir lu le tableau le pointeur sera avant la variable suivante...

Un article sur le travail avec les fichiers sera bientôt publié.

 
Dmitry Fedoseev:

Il existe une fonction, quelque chose comme FileWriteInteger(). Identifier par emplacement, la variable doit être au début du fichier, après l'avoir lue le pointeur se déplacera à son extrémité, c'est-à-dire au début du tableau, après avoir lu le tableau le pointeur sera avant la variable suivante...

Un article sur le travail avec les fichiers sera bientôt publié.

Je comprends, merci.

Mais j'aimerais jeter un coup d'œil au code, alors j'attendrai l'article.

Raison: