Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1201

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

Her şeyi tek bir dosyada yazıyorum. Birkaç yapıyı tek bir dosyaya yazmak, ardından okumak iyidir.

Ancak dizi baştan sona okunur. Nasıl 3 parçaya bölersin? Yapıyı nasıl yazdınız ve aynı dosyaya bir dizi yazmayı nasıl başardınız? Kendi kendime öğrendim, pek çok şey bilmiyorum ama bir şekilde bunların farklı veri formatları olduğundan şüpheleniyorum.

Yazmak için bir dosya açarak , üç diziyi bir kez içine sıkıştırarak, bunu başarabileceğinizi ve beğenebileceğinizi kabul ediyorum, ancak onu sadece parçalar halinde okuyamazsınız.

 
Alexey Viktorov :

Ancak dizi baştan sona okunur. Nasıl 3 parçaya bölersin? Yapıyı nasıl yazdınız ve aynı dosyaya bir dizi yazmayı nasıl başardınız? Kendi kendime öğrendim, pek çok şey bilmiyorum ama bir şekilde bunların farklı veri biçimleri olduğundan şüpheleniyorum.

Yazmak için bir dosya açarak , üç diziyi bir kez içine sıkıştırarak, bunu başarabileceğinizi ve beğenebileceğinizi kabul ediyorum, ancak onu sadece parçalar halinde okuyamazsınız.

Bir dosyaya sadece 1 yapı ve 3 dizi yazılırsa oradan okunabilir diyorum (dizileri okumak için her birinin boyutunu belirtmeniz şartıyla). Ancak bu tür birkaç diziyi kaydetme ve daha sonra okuma hilesi benim için işe yaramadı. Belki işaretçiyi hareket ettirmeniz gerekiyor, ancak bu zaten stresli ...

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

Bir dosyaya sadece 1 yapı ve 3 dizi yazılırsa, oradan okunabilir diyorum (dizileri okumak için her birinin boyutunu belirtmeniz şartıyla). Ancak bu tür birkaç diziyi kaydetme ve daha sonra okuma hilesi benim için işe yaramadı. Belki işaretçiyi hareket ettirmeniz gerekiyor, ancak bu zaten stresli ...

Bu ne kadar stresli? Yeterli beygir gücü yok mu? Ve kaydın başarılı olduğundan nasıl emin olabilirsiniz ve okuma başarısız olursa bunu nasıl varsayabilirsiniz? Bildiğim kadarıyla .bin dosyasına gözlerinizle bakamazsınız.

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

Artyom, bir örnek verir misin? Dizilerin boyutunun dinamik olduğunu dikkate alarak.

Hayır, hiç örnek kalmayana kadar - Henüz kendim yapmadım ve yaptığımda makalelerde anlatacağım. Ve yakında olmayacak. Gerçek şu ki, FileWriteStruct() kullanılarak bir dosyaya yalnızca POD yapıları yazılabilir. Onlar. - dizeler, dinamik diziler, sanal işlevler ve ayrıca nesnelere ve işlevlere işaretçiler içermeyen basit yapılar.

Bu da icat etmeniz ve test etmeniz gerektiği anlamına gelir. Ama yönü yazdım. Uygulamayı düşünmek gerekir.

 
Artyom Trishkin :

Hayır, hiç örnek kalmayana kadar - Henüz kendim yapmadım ve yaptığımda makalelerde anlatacağım. Ve yakında olmayacak. Gerçek şu ki, FileWriteStruct() kullanılarak bir dosyaya yalnızca POD yapıları yazılabilir. Onlar. - bir dize, dinamik diziler , sanal işlevler ve ayrıca nesnelere ve işlevlere işaretçiler içermeyen basit yapılar.

Bu da icat etmeniz ve test etmeniz gerektiği anlamına gelir. Ama yönü yazdım. Uygulamayı düşünmek gerekir.

Görünen o ki, ne söylenirse söylensin, ancak sorun çözülemez. Sonuçta, örnekteki Sergey'in içinde üç dinamik dizi var. Bir yapı içinde bir yapıyı nasıl inşa ederseniz edin, dinamik bir dizi ile kalacaktır.

Ancak bir dizi yapı oluşturursanız, sorun bir dizi yazarak çözülür. FileWriteArray(). Bu zaten test edildi ve belgeler bir dizi yapı yazmakla ilgili açıkça belirtiyor.

 
Alexey Viktorov :

Ancak dizi baştan sona okunur. Nasıl 3 parçaya bölersin? Yapıyı nasıl yazdınız ve aynı dosyaya bir dizi yazmayı nasıl başardınız? Kendi kendime öğrendim, pek çok şey bilmiyorum ama bir şekilde bunların farklı veri formatları olduğundan şüpheleniyorum.

Yazmak için bir dosya açarak , üç diziyi bir kez içine sıkıştırarak, bunu başarabileceğinizi ve beğenebileceğinizi kabul ediyorum, ancak onu sadece parçalar halinde okuyamazsınız.

herhangi bir yapıyı, diziyi, hatta bağımsız değişkenleri bir ikili dosyaya yazabilirsiniz - ve hepsini tek bir dosyada

AMA okurken, verileri aynı sırayla okumalısınız.

her şey işe yarayacak

FileWriteArray() kullanarak yazarken dosya dökümüne bakmadım, büyük olasılıkla dizinin ilk bayttaki boyutu yazılacak - ancak sadece bir test betiği yazmak daha kolay, yaklaşık bir düzine kod satırı var; )

 
Alexey Viktorov :

Görünen o ki, ne söylenirse söylensin, ancak sorun çözülemez. Sonuçta, örnekteki Sergey'in içinde üç dinamik dizi var. Bir yapı içinde bir yapıyı nasıl inşa ederseniz edin, dinamik bir dizi ile kalacaktır.

Ancak bir dizi yapı oluşturursanız, diziyi yazarak sorun çözülür. FileWriteArray(). Bu zaten test edildi ve belgeler bir dizi yapı yazmakla ilgili açıkça belirtiyor.

Bir dizi yapı kaydedilir, ancak .. dizeler varsa, bunlar yapının içinde bir uchar dizisine paketlenebilir, bu başarıyla yapılır. Ancak çift dizi, uchar dizisine sığmaz. Üstelik dinamiktir. Ve üç diziyi ayrı ayrı dosyalara kaydetmek ve daha sonra bunları dosyadan açılmış yapıya itmek için ... Denemedim. Düşünmedim, bilmiyorum.

 
Igor Makanu :

herhangi bir yapıyı, diziyi, hatta bağımsız değişkenleri bir ikili dosyaya yazabilirsiniz - ve hepsini tek bir dosyada

AMA okurken, verileri aynı sırayla okumalısınız.

her şey işe yarayacak

FileWriteArray() kullanarak yazarken dosya dökümüne bakmadım, büyük olasılıkla dizinin ilk bayttaki boyutu yazılacak - ancak sadece bir test betiği yazmak daha kolay, yaklaşık bir düzine kod satırı var; )

Bu sorunu nereden okudunuz bilmiyorum, her ihtimale karşı hatırlatayım: Bir dosyaya üç dinamik dizi içeren bir yapı yazmanız gerekiyor. Sonra dosyanın doğru okunmadığına dair bir soru vardı.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5

Sergey Tabolin , 2020.03.24 18:02

Soruyorum))))

Kendi yolumla yapmaya çalıştım.

İlk yapı ve 3 dizi normal olarak okunur (alıcı dizilerin dinamik olmaması şartıyla, aksi takdirde yapıdan sonra yazılan tüm veriler ilk diziye okunur).

Ancak, daha fazla kayıt varsa, o zaman

   // Проверка
   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);
      }
   }

ne saçmalıyor...

Структура
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
++++++++++++++++++++++++++++++

Bu yüzden tartışıyorum: bir dosyadan yapı ve üç dizi nasıl okunabilir, nasıl yazıldığı bilinmiyor.

Bu yüzden kendimi yetiştirdim dedim, pek bir şey bilmiyorum ama bölüm bölüm okuyamıyorsunuz .

Ve .bin dosyasına herhangi bir şey eklemek için seçenekler olduğunu çok iyi anlıyorum, ancak onu okumak için neyin hangi sırayla yazıldığını bilmeniz gerekiyor. Ve bunun mql aracılığıyla olmaması da mümkündür.

 

Ama şunu hiç anlamıyorum...

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

Burada sorun ne?

 
Alexey Viktorov :

Bu yüzden tartışıyorum: bir dosyadan yapı ve üç dizi nasıl okunabilir, nasıl yazıldığı bilinmiyor.

bu yüzden kontrol etmenin daha kolay olduğunu yazıyorum, 10 dakika içinde .... kontrol edildi, FileWriteArray() dizinin boyutunu başlığa veya ilk bayta yazmıyor, bu yüzden bu değerleri kendimiz yazıyoruz

 #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 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 127 127

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

onlar. dizinin boyutları dinamik ise yazarken dizinin boyutlarını kendimiz yazarız ve okurken dizi boyutunun değerini dosyadan okuruz ve yapının dizilerinin boyutlarını belirleriz

benim örneğimde 2 yapı var - biri başlatıldı ve yazıldı, ikincisi okundu, dosya verilerinden başlatma