mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 60

 
알렉세이 코지친 :
어떤 GUI를 말씀하시는지 모르겠지만 테스터 창의 옵션 탭 에서 시작 및 중지 필드를 설정할 수 있습니다 . 그리고 테스터는 매개 변수 값의 수를 올바르게 결정합니다.

필드 단계.

 
fxsaber :

필드 단계.

죄송합니다. 자세히 읽지 않았습니다.
 
fxsaber :

필드 단계.

그 이유는 열거 필드에 어떤 단계의 배수가 아닐 수도 있는 고유한 값이 주어질 수 있기 때문일 수 있습니다.

 
알렉세이 코지친 :

그 이유는 열거 필드에 어떤 단계의 배수가 아닐 수도 있는 고유한 값이 주어질 수 있기 때문일 수 있습니다.

예, 이것은 버그가 아닙니다. 그래서 이 스레드에서 시작된 것입니다. 그리고 최적화 단계는 정말 필요한 경우 enum용 MQL을 통해 설정됩니다.

 

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

라이브러리: TesterBenchmark

fxsaber , 2017.11.22 16:54

각 MT5 옵션에 한 줄만 삽입합니다.

 #define Comment (A)

본격적인 가속 67%, 수공예 108%!


하지만 그게 핵심이 아닙니다. 한 줄은 고문의 속도를 높이는 것으로 나타났습니다! 그리고 이것은 Comment가 어떤 역할도 하지 않는 Optimizer에 있습니다.

 
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам
// Перед использованием должен быть хотя бы один OnTick вызван тестером
bool IsRealTicks( void )
{
   MqlTick Tick;
  
   return ( SymbolInfoTick ( _Symbol , Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST )));
}


사용 예

 // Советник будет тестироваться только в режиме по реальным тикам
void OnTick ()
{
   static bool IsRemove = true ;
  
   if (IsRemove)
  {
    IsRemove = MQLInfoInteger ( MQL_TESTER ) && !IsRealTicks();
    
     if (IsRemove)
    {
       Print ( "Real ticks mode is needed!" );
      
       ExpertRemove ();
      
       return ;
    }
  }
  
   //........
}
OnInit(OnTick 제외)에서 수행하는 방법 - 모르겠습니다.
 

언급된 주제에 대한 대화

fxsaber 2017.11.24 08:35
인쇄 옵션(또는 주석)에 표현식을 사용하지 마십시오. 쉼표로 구분된 매개변수를 지정하십시오. 그러면 정확히 모든 문자열 변환이 적용됩니다.

최적화 모드에서 이 두 줄이 어떻게 다른지 예를 들어 설명해 주시겠습니까?

 Print (( string )i + ( string )d);
Print (i, d);
지원팀 2017.11.24 08:44

첫 번째 경우에 최적화할 때 인쇄하기 전에 문자열 표현식이 계산됩니다. 인쇄 자체가 호출되지만 작동하지 않습니다.

두 번째 경우에는 인쇄가 호출되지만 작동하지 않습니다. 그리고 문자열 i + d로의 변환은 작동하지 않습니다

간단한 테스트를 통해 첫 번째와 두 번째 호출의 결과는 시간과 출력 면에서 동일합니다.

저것들. 최적화 모드에서 하나의 입력 매개변수를 문자열로 구성하는 것보다 쉼표와 함께 Print를 사용하는 것이 훨씬 저렴합니다.


반면에 Print 내에서 모든 것을 한 줄로 형성하면 Optimization 모드에서 다음을 통해 형성을 쉽게 끊을 수 있습니다

 #define Print (A)

그러나 쉼표를 사용하면 이 구성이 작동하지 않습니다. 또한 이러한 구성은 최적화 모드에서도 이 기능을 끕니다.

 Print (SendOrder()); // SendOrder будет проигнорирован при #define Print(A)


따라서 (그리고 다른 이유로) Print 내부에서 정말 중요한 함수를 호출하지 않는 것이 좋습니다. 결과적으로 최적화 모드에서 성능을 중시한다면 여전히 다음과 같은 작업을 수행해야 합니다.

 static const bool IsNotOptim = ! MQLInfoInteger ( MQL_OPTIMIZATION );

if (IsNotOptim)
{
   const string Str = GetString(); // дорогой вызов
  
   Print (Str);
//  Comment(Str); 
//  Alert(Str);
}
 
fxsaber :

언급된 주제에 대한 대화

저것들. 최적화 모드에서 하나의 입력 매개변수를 문자열로 구성하는 것보다 쉼표와 함께 Print를 사용하는 것이 훨씬 저렴합니다.


반면에 Print 내에서 모든 것을 한 줄로 형성하면 Optimization 모드에서 다음을 통해 형성을 쉽게 끊을 수 있습니다

그러나 쉼표를 사용하면 이 구성이 작동하지 않습니다. 또한 이러한 구성은 최적화 모드에서도 이 기능을 끕니다.


따라서 (그리고 다른 이유로) Print 내부에서 정말 중요한 함수를 호출하지 않는 것이 좋습니다. 결과적으로 최적화 모드에서 성능을 중시한다면 여전히 다음과 같은 작업을 수행해야 합니다.

죄송합니다, 제가 이해하지 못하는 것일까요? 인쇄에서 중요한 기능을 호출하는 이유는 무엇입니까?
 
블라디슬라프 안드루셴코 :
죄송합니다, 제가 이해하지 못하는 것일까요? 인쇄에서 중요한 기능을 호출하는 이유는 무엇입니까?

금지되지 않습니다.

 
fxsaber :

금지되지 않습니다.

동의한다.

그냥 요점이 뭔지 알고 싶었어?

히스토리에 1000건 이상의 거래가 있을 때 히스토리 수익을 계산하는 히스토리 처리 기능을 호출 할 때 문제가 발생했습니다. + 현재 거래의 이익 추가 - 차트의 정보가 느려지기 시작하고 터미널이 멈춥니다. 저것들. 견적이 지연됩니다.