초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1201

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

나는 모든 것을 하나의 파일에 씁니다. 하나의 파일에 여러 구조를 쓴 다음 읽는 것이 좋습니다.

그러나 배열은 처음부터 끝까지 읽습니다. 어떻게 3부분으로 나누나요? 어떻게 구조를 작성하고 동일한 파일에 배열을 쓸 수 있었습니까? 나는 독학으로 많은 것을 알지는 못하지만 어떻게 든 이것들이 다른 데이터 형식이라고 의심합니다.

나는 당신이 쓰기 위해 파일을 열어서 3개의 배열을 한 번에 밀어 넣을 수 있다는 것을 인정하지만, 부분적으로만 읽을 수는 없습니다.

 
Alexey Viktorov :

그러나 배열은 처음부터 끝까지 읽습니다. 어떻게 3부분으로 나누나요? 어떻게 구조를 작성하고 동일한 파일에 배열을 쓸 수 있었습니까? 나는 독학으로 많은 것을 알지는 못하지만 어떻게 든 이것들이 다른 데이터 형식이라고 의심합니다.

나는 당신이 쓰기 위해 파일을 열어서 3개의 배열을 한 번에 밀어 넣을 수 있다는 것을 인정하지만, 부분적으로만 읽을 수는 없습니다.

하나의 파일에 1개의 구조와 3개의 배열만 쓰여지면 거기에서 읽을 수 있다고 말합니다(배열을 읽으려면 각각의 크기를 지정해야 함). 그러나 그러한 여러 시퀀스를 녹음하고 후속적으로 읽는 트릭은 저에게 효과가 없었습니다. 아마도 포인터를 움직여야 할 수도 있지만 이것은 이미 스트레스가 많습니다 ...

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

하나의 파일에 1개의 구조와 3개의 배열만 기록된 경우 거기에서 읽을 수 있습니다(배열을 읽으려면 각각의 크기를 지정해야 함). 그러나 그러한 여러 시퀀스를 녹음하고 후속적으로 읽는 트릭은 저에게 효과가 없었습니다. 아마도 포인터를 움직여야 할 수도 있지만 이것은 이미 스트레스가 많습니다 ...

얼마나 스트레스가 많습니까? 마력이 부족합니까? 그리고 녹음이 성공적이었다는 것을 어떻게 확신할 수 있으며 판독이 실패했다면 어떻게 가정합니까? 내가 아는 한, .bin 파일은 눈으로 볼 수 없습니다.

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

Artyom, 예를 들어 줄 수 있습니까? 배열의 크기가 동적임을 고려하십시오.

아니요, 예가 없을 때까지-아직 직접하지 않았으며 할 때 기사에서 설명하겠습니다. 그리고 그것은 곧되지 않을 것입니다. 사실 FileWriteStruct()를 사용하여 파일에 POD 구조만 쓸 수 있습니다. 저것들. - 문자열, 동적 배열, 가상 함수 , 객체 및 함수에 대한 포인터를 포함하지 않는 간단한 구조.

그리고 이것은 당신이 발명하고 테스트해야 함을 의미합니다. 그러나 나는 방향을 썼다. 구현에 대해 생각해야 합니다.

 
Artyom Trishkin :

아니요, 예가 없을 때까지-아직 직접하지 않았으며 할 때 기사에서 설명하겠습니다. 그리고 그것은 곧되지 않을 것입니다. 사실 FileWriteStruct()를 사용하여 파일에 POD 구조만 쓸 수 있습니다. 저것들. - 문자열, 동적 배열 , 가상 함수 , 객체 및 함수에 대한 포인터를 포함하지 않는 간단한 구조.

그리고 이것은 당신이 발명하고 테스트해야 함을 의미합니다. 그러나 나는 방향을 썼다. 구현에 대해 생각해야 합니다.

무슨 말을 해도 문제가 해결되지 않는다는 것이 밝혀졌습니다. 결국, 예제의 Sergey는 내부에 3개의 동적 배열을 가지고 있습니다. 구조 내에서 구조를 구축하는 방법에 관계없이 동적 배열로 유지됩니다.

그러나 구조의 배열을 생성하면 배열을 작성하여 문제가 해결됩니다. 파일쓰기 배열(). 이것은 이미 테스트되었으며 문서에는 구조체 배열 작성에 대해 명확하게 명시되어 있습니다.

 
Alexey Viktorov :

그러나 배열은 처음부터 끝까지 읽습니다. 어떻게 3부분으로 나누나요? 어떻게 구조를 작성하고 동일한 파일에 배열을 쓸 수 있었습니까? 나는 독학으로 많은 것을 알지는 못하지만 어떻게 든 이것들이 다른 데이터 형식이라고 의심합니다.

나는 당신이 쓰기 위해 파일을 열어서 3개의 배열을 한 번에 밀어 넣을 수 있다는 것을 인정하지만, 부분적으로만 읽을 수는 없습니다.

모든 구조, 배열, 심지어 개별 변수를 바이너리 파일에 쓸 수 있습니다. 모두 하나의 파일에 있습니다.

하지만 읽을 때는 데이터를 같은 순서로 읽어야 합니다.

모든 것이 작동합니다

FileWriteArray() 를 사용하여 작성할 때 파일 덤프를 보지 않았습니다. 대부분의 경우 첫 번째 바이트의 배열 크기가 기록될 것입니다. 하지만 테스트 스크립트를 작성하는 것이 더 쉽고 약 12줄의 코드가 있습니다. )

 
Alexey Viktorov :

무슨 말을 해도 문제가 해결되지 않는다는 것이 밝혀졌습니다. 결국, 예제의 Sergey는 내부에 3개의 동적 배열을 가지고 있습니다. 구조 내에서 구조를 구축하는 방법에 관계없이 동적 배열로 유지됩니다.

그러나 구조의 배열을 생성하면 배열을 작성하여 문제가 해결됩니다. 파일쓰기 배열(). 이것은 이미 테스트되었으며 문서에는 구조체 배열 작성에 대해 명확하게 명시되어 있습니다.

구조의 배열이 저장되지만 .. 문자열이 있는 경우 구조 내부의 uchar 배열로 압축할 수 있으며 성공적으로 완료됩니다. 그러나 이중 배열은 uchar 배열에 맞지 않습니다. 게다가 다이내믹하다. 그리고 3개의 배열을 따로 파일에 저장한 다음, 파일에서 압축을 푼 구조로 밀어넣으려면... 해보지는 않았습니다. 나는 그렇게 생각하지 않았다, 나는 모른다.

 
Igor Makanu :

모든 구조, 배열, 심지어 개별 변수를 바이너리 파일에 쓸 수 있습니다. 모두 하나의 파일에 있습니다.

하지만 읽을 때는 데이터를 같은 순서로 읽어야 합니다.

모든 것이 작동합니다

FileWriteArray() 를 사용하여 작성할 때 파일 덤프를 보지 않았습니다. 대부분의 경우 첫 번째 바이트의 배열 크기가 기록될 것입니다. 하지만 테스트 스크립트를 작성하는 것이 더 쉽고 약 12줄의 코드가 있습니다. )

나는 당신이 이 문제에 대해 무엇을 처음부터 읽었는지 모르지만 만일을 대비하여 당신에게 상기시켜 드리겠습니다: 3개의 동적 배열을 포함하는 구조를 파일에 작성해야 합니다. 그런 다음 파일을 제대로 읽지 못한다는 질문이 있었습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

초보자의 질문 MQL5 MT5 MetaTrader 5

세르게이 타볼린 , 2020.03.24 18:02

나는 묻는다))))

나는 내 방식대로 하려고 노력했다.

첫 번째 구조와 3개의 배열은 정상적으로 읽힙니다(수신기 배열이 동적이지 않은 경우, 그렇지 않으면 구조 이후에 기록된 모든 데이터가 첫 번째 배열로 읽혀짐).

그러나 더 많은 기록이 있는 경우

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

도대체 무엇을 제공합니다 ...

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

그래서 나는 주장한다: 어떻게 하나의 파일에서 구조와 세 개의 배열을 읽을 수 있고, 어떻게 쓰여지는지는 알려져 있지 않다.

그래서 제가 독학이라 아는게 많지 않은데 부분적으로만 못읽는다고 말씀드린겁니다.

그리고 .bin 파일에 무엇이든 추가할 수 있는 옵션이 있다는 것을 완벽하게 이해하지만 그것을 읽으려면 어떤 내용이 어떤 순서로 작성되었는지 알아야 합니다. 그리고 mql을 사용하지 않는 것이 가능합니다.

 

근데 이게 도무지 이해가 안감...

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

여기서 무슨 문제가 있습니까?

 
Alexey Viktorov :

그래서 나는 주장한다: 어떻게 하나의 파일에서 구조와 세 개의 배열을 읽을 수 있고, 어떻게 쓰여지는지는 알려져 있지 않다.

그래서 10분 안에 확인이 더 쉽다고 씁니다.... 확인, FileWriteArray()는 배열의 크기를 헤더나 첫 번째 바이트에 쓰지 않으므로 이 값을 직접 작성합니다.

 #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

저것들. 배열의 차원이 동적이면 쓸 때 배열의 차원을 직접 쓰고 읽을 때 파일에서 배열 크기 값을 읽고 구조 배열의 크기를 설정합니다.

내 예에는 2개의 구조가 있습니다. 하나는 초기화 및 쓰기, 두 번째는 읽기, 파일 데이터에서 초기화
사유: