최적화 중 일회성 어레이 계산 - 페이지 5

 
Yuri Evseenkov :
나는 그렇게 한다. 일회성 테스트를 하고 있습니다. 이 테스트에서는배열을 . 그런 다음 동일한 섹션에서 최적화를 수행합니다. 이제 배열이 각 막대 또는 눈금 모양에서 다시 계산되지 않고 파일에서 읽힙니다. 주간 기간에 가격을 공개하여 최적화가 즉시 발생합니다. 그리고 파일 작업 없이는 몇 시간 동안 지속됩니다.
나는 약간 다른 상황이 있습니다. 어레이를 한 번만 채우고 모든 패스 중에 사용하면 됩니다. 즉, 저에게는 매 패스를 한 번만 해도 init에서 배열을 채우는 것이 많습니다.
 
-Aleks- :

이해, 즉 숫자가 있는 완성된 파일은 배열로 읽을 수 있고(제 경우), 이진 파일에 쓴 다음 사용할 수 있습니다.

글쎄, 파일에서 10개의 배열에서 데이터를 읽어야 한다면 특별한 숫자로 배열의 끝을 이해하고 다음 배열을 채울 정렬기를 만들어야 합니다... 수동으로 작성하는 것이 편리하지 않기 때문에 매번 배열의 크기.

먼저 배열 크기가 있는 int 변수를 파일에 쓴 다음 배열, 다음으로 크기가 포함된 또 다른 int 변수, 배열 등의 방식으로 int 변수를 작성합니다.

우리는 같은 순서로 읽습니다: 우리는 크기가 있는 변수를 세고, 이 크기의 배열, 다음 변수, 배열 등을 세었습니다.

 
forexman77 :
나는 약간 다른 상황이 있습니다. 어레이를 한 번만 채우고 모든 패스 중에 사용하면 됩니다. 즉, 저에게는 매 패스마다 한 번씩 init에 배열을 채우는 것이 많습니다.
자, 한번의 테스트로 한번 채워보세요. 테스트 및 최적화 중 프로그램 은 파일 작업이 달라야 합니다. 테스트할 때는 쓰기, 최적화할 때는 읽기입니다. 두 개의 코드를 작성해야 합니다. 배열을 init로 많이 채운다는 것은 무엇을 의미합니까? 내 생각에는 파일에서 배열을 호출하는 데는 예를 들어 주문을 열거나 double을 곱하는 것보다 더 많은 시간이 걸리지 않습니다.
 
Yuri Evseenkov :
자, 한번의 테스트로 한번 채워보세요. 테스트 및 최적화 중 프로그램 은 파일 작업이 달라야 합니다. 테스트할 때는 쓰기, 최적화할 때는 읽기입니다. 두 개의 코드를 작성해야 합니다. 배열을 init로 많이 채우는 것은 무엇을 의미합니까? 내 생각에는 파일에서 배열을 호출하는 데는 예를 들어 주문을 열거나 double을 곱하는 것보다 더 많은 시간이 걸리지 않습니다.

많은 이유가 있습니다. 전체 어레이를 미리 알고 있습니다. 그래서 패스 사이에 이 배열을 저장하는 방법에 대한 질문이 생겼습니다. 나는 이것이 정확히 확실하지 않지만 다음 패스에서 재설정된다는 것을 이해합니다.

제 경우에는 읽기가 더 빠르다는 데 동의하지 않습니다. 인디케이터를 통해 동일한 데이터를 수신하면 속도가 더 빨라지고 인디케이터를 계산하지 않고 파일에서 이렇게 준비된 데이터를 읽으면 속도가 크게 떨어집니다. 수천 개의 라인이 있는 작은 시간대와 큰 세그먼트에서 매번 파일을 읽는 데 비용이 많이 듭니다.

아이디어는 다음과 같습니다. 데이터를 읽고 배열에 입력하고 모든 패스에서 더 나아가 이 배열만 사용합니다. 즉, 배열은 첫 번째 패스에서 마지막 패스까지 절대적으로 동일합니다.

 
forexman77 :

많은 이유가 있습니다. 전체 어레이를 미리 알고 있습니다. 그래서 패스 사이에 이 배열을 저장하는 방법에 대한 질문이 생겼습니다. 나는 이것이 정확히 확실하지 않지만 다음 패스에서 재설정된다는 것을 이해합니다.

제 경우에는 읽기가 더 빠르다는 데 동의하지 않습니다. 인디케이터를 통해 동일한 데이터를 수신하면 속도가 더 빨라지고 인디케이터를 계산하지 않고 파일에서 이렇게 준비된 데이터를 읽으면 속도가 크게 떨어집니다.

아이디어는 다음과 같습니다. 데이터를 읽고 배열에 넣고 모든 패스에서 더 나아가 이 배열만 사용합니다. 즉, 배열은 첫 번째 패스에서 마지막 패스까지 절대적으로 동일합니다.

연습만이 여기에 답이 될 것입니다. 각 패스에서 배열을 읽습니다. 나는 오랫동안 같은 고통을 겪었습니다. 최적화하는 데 몇 시간이 걸렸습니다. 지금까지 Andrey Khatimlyansky는 파일에 한 번 쓴 다음 읽는 것을 제안하지 않았습니다. 이제 단일 테스트를 한 번 기다리면 최적화가 수행됩니다. 파일 작업은 Kovalev의 교과서에 잘 설명되어 있습니다.
 
Dmitry Fedoseev :

먼저 배열의 크기를 가진 int 변수를 파일에 쓴 다음 배열을 쓴 다음 크기를 가진 또 다른 int 변수를 쓴 다음 배열을 쓰는 식입니다.

우리는 같은 순서로 읽습니다: 우리는 크기가 있는 변수를 세고, 이 크기의 배열, 다음 변수, 배열 등을 세었습니다.

여기에서 나는 교육받지 못한 것 같습니다 ... 바이너리 파일에 배열 크기 의 int 변수를 작성하는 방법은 무엇입니까? 저것들. 파일에서 읽을 때 이 변수를 어떻게 식별할 수 있습니까?
 
forexman77 :

아이디어는 다음과 같습니다. 데이터를 읽고 배열에 입력하고 모든 패스에서 더 나아가 이 배열만 사용합니다. 즉, 배열은 첫 번째 패스에서 마지막 패스까지 절대적으로 동일합니다.

MT4에서는 실제로 파일 작업이 매우 느리고 MT5에서는 어떻게 될지, 심지어 바이너리 파일로도...

전체 배열을 코드에 직접 작성하여 비슷한 문제를 해결합니다. 그러나 이것은 물론 보편적인 솔루션은 아닙니다.

 

다음은 배열을 쓰고 읽는 예입니다.

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


디버그 모드에서 두 번 실행하고 배열을 쓰고 읽는 데 걸리는 시간을 확인하십시오. 첫 번째 실행은 배열을 파일에 쓰고 두 번째 실행은 배열을 읽고 배열에서 날짜 인쇄를 시작합니다. 그런 다음 선택한 부분을 처리하고 IS_DEBUG_MODE 를 제거하고 조건에 IsOptimization()을 삽입해야 하는지 여부

 
-Aleks- :
여기에서 나는 교육받지 못한 것 같습니다 ... 배열 크기의 int 변수를 바이너리 파일에 쓰는 방법은 무엇입니까? 저것들. 파일에서 읽을 때 이 변수를 어떻게 식별할 수 있습니까?

FileWriteInteger() 와 같은 함수가 있습니다. 위치로 식별합니다. 변수는 파일의 시작 부분에 있어야 합니다. 읽은 후 포인터는 끝으로 이동합니다. 배열의 시작 부분으로 배열을 읽은 후 포인터는 다음 변수 앞에 ...

파일 작업에 대한 기사가 곧 제공될 예정입니다.

 
Dmitry Fedoseev :

FileWriteInteger()와 같은 함수가 있습니다. 위치로 식별합니다. 변수는 파일의 시작 부분에 있어야 합니다. 읽은 후 포인터는 끝으로 이동합니다. 배열의 시작 부분으로 배열을 읽은 후 포인터는 다음 변수 앞에 ...

파일 작업에 대한 기사가 곧 제공될 예정입니다.

감사합니다.

그러나 코드에서 살펴보고 싶습니다. 기사를 기다릴 것입니다.