오류, 버그, 질문 - 페이지 437

 
voix_kas :

그가 망친 것 같습니다. 비판은 환영합니다.

분명히 우리는 전문가에 대해 이야기 할 것이므로 다음과 같습니다.

    bool    SetSymbols( string );

그리고:

CSymbolList slMain;

int OnInit ()
  {
   if(!slMain.SetSymbols(inWorkSymbols)) return(-1);
   for ( int i = 0 ; i < slMain.GetSymbolCount(); i++)
       Print (slMain.GetSymbolName(i));
//--- ok
   return(0);
  }
[삭제]  
MetaDriver :
보장합니다. 적어도 나는 끊임없이 그것에 의존하고 있으며 문제는 결코 발생하지 않았습니다.

알았습니다. 어쨌든 미묘한 순간입니다.

삼촌

그래서 그렇습니다. 그러나 제 경우에는 이것이 중복됩니다.

 #include <CSymbolList.mqh>

input int     inTimeToRescan = 3600 ; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF" ; // Рабочие инструменты

CSymbolList slMain;

int OnInit () {
  slMain.SetSymbols(inWorkSymbols);
   return 0 ;
}

void OnTick () {
   static long LastScan = 0 ;
   if (!slMain.GetSymbolCount() || (( long ) TimeCurrent () - LastScan >= inTimeToRescan)) {
     Comment ( "Идентификация рабочих инструментов..." );
    slMain.SetSymbols(inWorkSymbols);
    LastScan = ( long ) TimeCurrent ();
     return ;
  }

   static string Information;
  Information = TimeToString ( TimeCurrent (), TIME_DATE|TIME_SECONDS);

   for ( int i = 0 ; i < slMain.GetSymbolCount(); i++) {
     if (! SymbolSelect (slMain.GetSymbolName(i), true ) || ! SymbolIsSynchronized (slMain.GetSymbolName(i))) continue ;
     //
     StringConcatenate (Information, Information, "\n" , slMain.GetSymbolName(i));
  }
   Comment (Information);
}

보시다시피 마지막 주기의 도구에 오류가 있으면 OnTik에서 반복이 없습니다.

 
voix_kas :

알았습니다. 어쨌든 미묘한 순간입니다.

삼촌

그래서 그렇습니다. 그러나 제 경우에는 이것이 중복됩니다.

보시다시피 마지막 주기의 도구에 오류가 있으면 OnTik에서 반복이 없습니다.

예, 나는 주장하지 않습니다. 실행 결과를 확인하는 것만으로도 정확합니다.

[삭제]  
uncleVic :

예, 나는 주장하지 않습니다. 실행 결과를 확인하는 것만으로도 정확합니다.

알았습니다. 어쨌든 조언 감사합니다.
 

이 트릭을 찾았습니다. 여기에서 이 스크립트를 실행하면 "중단"됩니다.

 void OnStart ()
  {
   Print ( "Start  " , TimeLocal ());
   Sleep (- 1000 * 2764799 );
   Print ( "Finish " , TimeLocal ());
  }

그러나 동일한 세 줄(코드)이 Expert Advisor의 OnInit() 함수에 먼저 삽입되고 이러한 Expert Advisor가 테스트 모드 에서 시작되면 다음과 같은 결과가 나타납니다.

NS 0 Core 2 14:23:49 2011.01.03 00:00:00   Ye00-01-2Event5.mq5 OnInit: терминал (470), разрешение на торговлю (true), TERMINAL_MAXBARS=10000000, компилятор (470)
PD 0 Core 2 14:23:49 2011.01.03 00:00:00   Start  2011.01.03 00:00:00
NP 0 Core 2 14:24:18 2011.01.20 17:02:48   Finish 2011.01.20 17:02:48
II 0 Core 2 14:24:18 2011.01.20 17:02:48   MisFunciones.mqh FileInit: Поиск bin-файла Y.bin

첫째, 코드는 테스트 모드에서 어떻게든 작동합니다.

둘째, 더 중요한 것은 테스트의 처음 며칠의 기록이 손실된다는 것입니다. 따라서 위의 예에서 테스트는 날짜 2011.01.03(처음 두 줄에서 볼 수 있음)부터 설정되었지만 코드를 처리한 후(이 경우 줄 2-3) 테스터는 즉시 점프합니다. 앞으로 17일, 그 다음에는 이 17일을 고려하지 않고 테스트가 계속됩니다.

 
당신은 산술 오버플로를 발견했습니다.
 Sleep (- 1000 * 2764799 );
결과적으로 그들은 17.5일 동안 기다리기로 했습니다.
 
Renat :
당신은 산술 오버플로를 발견했습니다.
결과적으로 그들은 17.5일 동안 기다리기로 했습니다.
네, 하지만 테스터에서 작동합니다. 왜냐하면 Sleep 은 무시되기 때문입니다.
 
Renat :
당신은 산술 오버플로를 발견했습니다.
결과적으로 그들은 17.5일 동안 기다리기로 했습니다.

네, 저는 "caught overflow"에 대해 논쟁하는 것이 아닙니다. 왜냐하면 저는 잘 모르기 때문입니다. :) 문제는 컴파일러나 테스터 가 치명적인 오류를 발행하여 그러한 상황을 중지하는 것이 바람직하다는 것입니다. 또는 다른 방식으로). 모든 사람이 터미널의 경고가 없을 때 프로그램이 어떻게 작동하는지 세심하게 이해하지는 못할 것입니다.

나는 또한 코드가 첫 번째 줄의 OnInit()에 설정되어 있다는 문제를 봅니다(즉, 과거 데이터가 업로드되기 전). 하지만 어떤 이유로 처음 17.5일의 데이터가 손실됩니다.

Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Программы MQL5 / Ошибки выполнения - Документация по MQL5
 
joo :
네, 하지만 테스터에서 작동합니다. 왜냐하면 Sleep은 무시되기 때문입니다.
Sleep() 이 무시되고 있다고 확신합니까? - 2호선과 3호선의 종점시간 차이를 보세요.
 
Yedelkin :
Sleep()이 무시되고 있다고 확신합니까? - 2호선과 3호선의 종점시간 차이를 보세요.
아마도 코드에서 Sleep 의 존재 자체(부재와 비교하여)가 전체 실행 시간에 어떻게든 영향을 미칠 수 있지만, 테스터에서 Sleep이 고려되지 않는다는 사실은 확실합니다.