Questions des débutants MQL5 MT5 MetaTrader 5 - page 1201

 
Сергей Таболин:

J'écris tout dans un seul fichier. L'écriture, puis la lecture, de plusieurs structures dans un même fichier se passe bien.

Mais il lit le tableau du début à la fin. Comment le diviser en 3 parties ? Comment avez-vous écrit une structure et réussi à écrire un tableau dans le même fichier ? Je suis autodidacte, je ne sais pas grand chose, mais le fait qu'il s'agisse de formats de données différents, je le soupçonne en quelque sorte.

J'admets qu'il est possible d'ouvrir le fichier en écriture une fois et d'y insérer trois tableaux, mais on ne peut pas le lire par parties comme ça.

 
Alexey Viktorov:

Mais il lit le tableau du début à la fin. Comment le diviser en 3 parties ? Comment écrire une structure et réussir à écrire un tableau dans le même fichier ? Je suis autodidacte, je n'y connais pas grand chose, mais le fait qu'il s'agisse de formats de données différents est quelque peu suspect.

J'admets que je peux m'en sortir en ouvrant un fichier en écriture une fois et en y entassant trois tableaux, mais je ne peux pas le lire aussi facilement en partie.

Je dis que si vous écrivez dans le même fichier seulement 1 structure et 3 tableaux, alors vous pouvez les lire à partir de là (en supposant que pour lire les tableaux vous devez spécifier la taille de chacun). Mais l'astuce consistant à écrire puis à lire plusieurs séquences de ce type n'a pas fonctionné pour moi. Je dois peut-être déplacer le pointeur, mais il est déjà tendu...

 
Сергей Таболин:

Je vous l'ai dit, si vous n'écrivez qu'une structure et 3 tableaux dans un fichier, vous pourrez les lire plus tard (à condition de spécifier la taille de chacun d'eux pour lire les tableaux). Mais l'astuce consistant à écrire puis à lire plusieurs séquences de ce type n'a pas fonctionné pour moi. Je dois peut-être déplacer le pointeur, mais c'est un peu lourd...

Comment est-il tendu ? Pas assez de puissance ? Et comment pouvez-vous être sûr que l'écriture a réussi et comment le supposez-vous si la lecture a échoué ? Pour autant que je sache, vous ne pouvez pas regarder un fichier .bin avec vos yeux.

 
Сергей Таболин:

Artyom, pouvez-vous me donner un exemple ? En tenant compte du fait que la taille des tableaux est dynamique.

Non, il n'y aura pas encore d'exemples - je ne l'ai pas encore fait moi-même, et quand je le ferai, je le décrirai dans mes articles. Et ce ne sera pas de sitôt. Le fait est que vous ne pouvez écrire que des structures POD dans un fichier en utilisant FileWriteStruct(). Il s'agit de structures simples qui ne contiennent pas de chaînes de caractères, de tableaux dynamiques, defonctions virtuelles, ainsi que de pointeurs vers des objets et des fonctions.

Et cela signifie que vous devez les inventer et les tester. Mais j'ai écrit la direction. Il faut réfléchir à la mise en œuvre.

 
Artyom Trishkin:

Non, il n'y aura pas encore d'exemples - je ne l'ai pas encore fait moi-même, et quand je l'aurai fait, je le décrirai dans des articles. Et ce ne sera pas de sitôt. Le fait est que seules les structures POD peuvent être écrites dans un fichier à l'aide de FileWriteStruct(). C'est-à-dire des structures simples qui ne contiennent pas de chaînes de caractères, des tableaux dynamiques, des fonctions virtuelles, ainsi que des pointeurs vers des objets et des fonctions.

Et cela signifie que nous devons l'inventer et le tester. Mais j'ai écrit la direction. La mise en œuvre doit être réfléchie.

Il s'avère que, quelle que soit la façon dont on l'envisage, la tâche ne peut être résolue. Après tout, l'exemple de Sergei contient trois tableaux dynamiques. Quelle que soit la façon dont la structure est disposée dans la structure, elle restera un tableau dynamique.

Mais si vous créez un tableau de structures, le problème est résolu en écrivant le tableau. FileWriteArray(). Cela a déjà été testé et la documentation indique clairement qu'il faut écrire un tableau de structures.

 
Alexey Viktorov:

Mais il lit le tableau du début à la fin. Comment le diviser en 3 parties ? Comment écrire une structure et réussir à écrire un tableau dans le même fichier ? Je suis autodidacte, je ne connais pas beaucoup de choses, mais le fait qu'il s'agisse de formats de données différents, d'une certaine manière, je m'en doute.

J'admets que vous pouvez vous en tirer en ouvrant un fichier en écriture une fois et en y entassant trois tableaux, mais vous ne pourrez pas le lire par parties comme ça.

Dans un fichier binaire, vous pouvez écrire n'importe quelle structure, n'importe quel tableau, même des variables simples, le tout dans un seul fichier.

MAIS, lors de la lecture, vous devez lire les données dans le même ordre.

tout fonctionnera.

je n'ai pas vu le dump du fichier, lors de l'écriture avec FileWriteArray() , il est fort probable que la taille du tableau soit écrite dans les premiers octets - mais c'est plus facile de faire un script de test, il y a une douzaine de lignes de code ;)

 
Alexey Viktorov:

Il s'avère que, quelle que soit la façon dont on l'aborde, le problème est insoluble. Après tout, dans l'exemple de Sergei, il y a trois tableaux dynamiques à l'intérieur. Quelle que soit la façon dont vous construisez la structure dans la structure, elle restera un tableau dynamique.

Et si vous créez un tableau de structures, vous résoudrez le problème en écrivant le tableau. FileWriteArray(). Cela a déjà été testé et c'est clairement indiqué dans la documentation sur l'écriture d'un tableau de structures.

Un tableau de structures est stocké, mais... s'il y avait des chaînes de caractères, elles peuvent être emballées dans un tableau uchar à l'intérieur de la structure, ce qui est fait avec succès. Mais il est impossible qu'un tableau double puisse tenir dans un tableau uchar. En outre, il est dynamique. Et sauvegarder les trois tableaux séparément dans des fichiers, puis les insérer dans la structure déballée du fichier... Je ne l'ai pas essayé. Je n'y ai pas pensé et je ne sais pas.

 
Igor Makanu:

vous pouvez écrire n'importe quelles structures, tableaux, et même des variables individuelles dans un fichier binaire - le tout dans le même fichier

MAIS lors de la lecture, vous devez lire les données dans le même ordre.

tout fonctionnera

Je n'ai pas vu le dump du fichier lors de l'écriture avec FileWriteArray() , il est probable que la taille du tableau soit écrite dans les premiers octets - mais c'est plus facile de faire un script de test, il y a une douzaine de lignes de code ;)

Je ne sais pas où vous avez commencé à lire ce problème, laissez-moi vous le rappeler au cas où : vous devez écrire une structure contenant trois tableaux dynamiques dans un fichier. Ensuite, j'ai eu une question sur le fait que le fichier n'était pas lu correctement.

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégie

FAQ des débutants MQL5 MT5 MetaTrader 5

Sergey Tabolin, 2020.03.24 18:02

Je demande à ))))

J'ai essayé de faire les choses "à ma façon".

La première structure et les 3 tableaux se lisent bien (à condition que les récepteurs des tableaux ne soient pas dynamiques, sinon toutes les données écrites après la structure sont lues dans le premier tableau).

Cependant, s'il y a plus d'entrées, alors

   // Проверка
   double   rdata_1[6];
   double   rdata_2[6];
   double   rdata_3[6];
   
   filehandle = FileOpen(filename,FILE_READ|FILE_COMMON|FILE_BIN);
   if(filehandle != INVALID_HANDLE)
   {
      while(!FileIsEnding(filehandle))
      {
         FileReadStruct(filehandle,rfann);
         FileReadArray(filehandle,rdata_1);
         FileReadArray(filehandle,rdata_2);
         FileReadArray(filehandle,rdata_3);
         Print("++++++++++++++++++++++++++++++");
         Print("Структура");
         Print(rfann.v_main_up+"|"+rfann.v_main_dn+"|"+rfann.v_add_up+"|"+rfann.v_add_dn+"|"+rfann.answer);
         Print("Массивы");
         Print("--- 1");
         ArrayPrint(rdata_1);
         Print("--- 2");
         ArrayPrint(rdata_2);
         Print("--- 3");
         ArrayPrint(rdata_3);
      }
   }

ça donne un sacré coup...

Структура
4.0|-1.0|2.8|-0.7|1
Массивы
--- 1
 1.00000  0.33225 -0.76202 -0.93263 -1.00000 -0.79174
--- 2
-0.14603  0.89562  0.91407  0.93450  0.89481  0.89829
--- 3
 0.89564  0.89217 -0.91174 -0.86623 -1.00000 -0.07680
++++++++++++++++++++++++++++++
Структура
1.839259944929932 e+277|-nan|5.295254096666168 e-315|3.0|-618173028
Массивы
--- 1
 2.10000 -2.00000 -1.40000 -0.85098 -1.00000 -0.79900
--- 2
-0.30490  0.47926  1.00000  0.70827  0.84163  0.84134
--- 3
 0.83925  0.84173  0.84760  0.84678  0.80368 -0.00063
++++++++++++++++++++++++++++++
Структура
9.384173261527221 e-276|5.298850499315376 e-315|2.955277867691187 e+299|-9.638234784517503 e-243|-1705145188
Массивы
--- 1
+0.00000 +0.00000  4.00000  2.80000  0.00000  0.00000
--- 2
 1.00000  0.22097 -0.37383 -0.73115 -0.81752 -1.00000
--- 3
-0.87753  0.46919  0.59706  0.76223  0.82610  0.84312
++++++++++++++++++++++++++++++

Je me demande donc comment il est possible de lire la structure et les trois tableaux d'un fichier dont on ne sait pas comment il a été écrit.

C'est pourquoi j'ai dit que je suis autodidacte et que je ne sais pas grand-chose, mais qu'il ne faut pas le lire par morceaux.

Et je comprends qu'il existe des options pour ajouter tout au fichier .bin, mais pour le lire, il faut savoir ce qui est écrit et dans quel ordre. Et il est possible que pas au moyen de mql.

 

Je ne comprends pas du tout...

      FileSeek(filehandle,0,FILE_END);
'FILE_END' - cannot convert enum                        282     31
'FILE_END' - improper enumerator cannot be used         282     31

Qu'est-ce qu'il y a de mal à ça ?

 
Alexey Viktorov:

Je me demande donc comment il est possible de lire une structure et trois tableaux à partir d'un fichier dont on ne sait pas comment il a été écrit.

c'est ce que j'écris, c'est plus facile à vérifier, dans les 10 minutes..... vérifié, FileWriteArray() n'écrit pas la taille du tableau dans l'en-tête ou le premier octet, cela signifie que vous devez écrire ces valeurs vous-même

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"

struct SMystruct
{
   double            d_arr[];
   int               i_arr[];
   uchar             c_arr[];
   int               a;
   double            b;
};

//+------------------------------------------------------------------+
void OnStart()
{
   SMystruct mstruct;
   ArrayResize(mstruct.d_arr,5);    ArrayInitialize(mstruct.d_arr,3.1415926);
   ArrayResize(mstruct.i_arr,3);    ArrayInitialize(mstruct.i_arr,1234567890);
   ArrayResize(mstruct.c_arr,7);    ArrayInitialize(mstruct.c_arr,127);
   mstruct.a = 666;
   mstruct.b = 123.123;
//---  
   if(!SaveMStructToFile("mfile.bin",mstruct)) return;
   SMystruct read_struct;
   if(!LoadMStructInFile("mfile.bin",read_struct)) return;
   Print("1. d_arr");
   ArrayPrint(read_struct.d_arr);
   Print("2. i_arr");
   ArrayPrint(read_struct.i_arr);
   Print("2. c_arr");
   ArrayPrint(read_struct.c_arr);
   printf("mstruct.a = %i , mstruct.b = %f",read_struct.a , read_struct.b);
   
}
//+------------------------------------------------------------------+
bool SaveMStructToFile(const string fname,const SMystruct &data)
{
   int h = FileOpen(fname,FILE_WRITE | FILE_BIN | FILE_COMMON);
   if(h<0) { Print("Write IO Err #",GetLastError()); return(false); }
   FileWriteInteger(h,ArraySize(data.d_arr));   FileWriteArray(h,data.d_arr);
   FileWriteInteger(h,ArraySize(data.i_arr));   FileWriteArray(h,data.i_arr);
   FileWriteInteger(h,ArraySize(data.c_arr));   FileWriteArray(h,data.c_arr);
   FileWriteInteger(h,data.a);
   FileWriteDouble(h,data.b);
   FileClose(h);  
   return(true);
}

bool LoadMStructInFile(const string fname,SMystruct &data)
{
   int h = FileOpen(fname,FILE_READ | FILE_BIN | FILE_COMMON);
   if(h<0) { Print("Write IO Err #",GetLastError()); return(false); } 
   int amount = ArrayResize(data.d_arr,(int)FileReadInteger(h));     FileReadArray(h,data.d_arr,0,amount);
       amount = ArrayResize(data.i_arr,(int)FileReadInteger(h));     FileReadArray(h,data.i_arr,0,amount);
       amount = ArrayResize(data.c_arr,(int)FileReadInteger(h));     FileReadArray(h,data.c_arr,0,amount);
   data.a = FileReadInteger(h);
   data.b = FileReadDouble(h);
   FileClose(h); 
   return(true);
}

2020.03.25 10:18:36.058 tst (EURUSD,H1) 1. d_arr

2020.03.25 10:18:36.058 tst (EURUSD,H1) 3.14159 3.14159 3.14159 3.14159 3.14159

2020.03.25 10:18:36.058 tst (EURUSD,H1) 2. i_arr

2020.03.25 10:18:36.058 tst (EURUSD,H1) 1234567890 1234567890

2020.03.25 10:18:36.058 tst (EURUSD,H1) 2. c_arr

2020.03.25 10:18:36.058 tst (EURUSD,H1) 127 127 127 127 127

2020.03.25 10:18:36.058 tst (EURUSD,H1) mstruct.a = 666 , mstruct.b = 123.123000

c'est-à-dire que si les dimensions des tableaux sont dynamiques, cela signifie que nous écrivons les dimensions des tableaux eux-mêmes lors de l'écriture, et que lors de la lecture, nous lisons la valeur de la taille du tableau depuis le fichier et définissons les dimensions des tableaux de la structure.

dans mon exemple 2 structures - une a été initialisée et écrite, la seconde a été lue, initialisation à partir des données du fichier
Raison: