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

 
Alain Verleyen #:

제가 뭔가 놓친 것일 수도 있지만, 스크립트를 사용하여 기간 초(만)를 확인했습니다.


테스트 결과를 확인했습니다:

2023.11.15 00:26:58.896 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.78 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:26:59.056 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 16.03 наносекунд - PeriodSecondsFast
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.08 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:16.018 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:16.318 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.99 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:16.474 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.59 наносекунд - PeriodSecondsFast
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.74 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:25.206 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:25.508 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.14 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:25.666 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.77 наносекунд - PeriodSecondsFast
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 44.47 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:40.780 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:41.089 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.90 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:41.249 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.98 наносекунд - PeriodSecondsFast
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.72 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       ========================================================================

0 errors, 0 warnings, 234 msec elapsed, cpu='AVX2 + FMA3'               


테스트에서 천만 번의 동일한 계산이 발생하기 때문에 테스트 자체가별로 마음에 들지 않습니다.
그리고 총 21*10,000,000번의 반복이 있기 때문에 이 값은 21로 나누어야 합니다.

그러나이 테스트는 또한 내 결론을 확인하지만 더 신선 해 보이는 프로세서의 경우 최신 성능 기능을 최대한 사용하므로 더 최신이므로 더 객관적입니다.


다른 분들도 이 테스트의 결과를 확인해 보시면 흥미로울 것 같습니다.

 
fxsaber #:

형식을 살펴봤습니다.

아마 속도가 빨라지지는 않을 겁니다. 하지만 스위치의 기적적인 속도에 대해 들었습니다.

스파스 스위치는 기적적인 속도를 제공하지 않습니다.

가장 놀라운 속도는 0에서 255까지 1 단위로 케이스가 있는 스위치일 것입니다.

 
Slava #:

스파스 스위치는 놀라운 속도를 제공하지 않습니다.

가장 놀라운 속도는 0에서 255까지 1 단위의 케이스가 있는 스위치일 것입니다.

감사합니다.

 
Nikolai Semko # :

내 테스트 결과를 확인하세요:



테스트에서 천만 번의 동일한 계산이 발생하기 때문에 테스트 자체가별로 마음에 들지 않습니다.
그리고 이 값은 총 21*10,000,000회의 반복이 있기 때문에 21로 나누어야 합니다.

그러나이 테스트는 또한 내 결론을 확인하지만 내 프로세서의 경우 더 신선 해 보이므로 최신 성능 기능을 최대한 사용하므로 더 최신이므로 더 객관적입니다.


다른 분들도 이 테스트의 결과를 확인해 보시면 흥미로울 것 같습니다.

고마워요.

어제 늦게 컴파일러 최적화를 하지 않은 결과를 올렸습니다.

다음은 cpu='AVX2 + FMA3', 최대 최적화를 적용한 결과입니다.


 
Nikolai Semko #:

이 알고리즘의 가장 큰 어려움은 월의 시작 시간(녹색으로 강조 표시됨)을 계산하는 것입니다.

코드에서 가장 흥미로운 부분이지만 토론에서는 거의 다루지 않았습니다.

 
fxsaber #:

코드에서 가장 흥미로운 부분이지만 토론에서는 거의 다루지 않았습니다.

거기서 한 해는 1월 1일이 아닌 3월 1일에 시작됩니다.
이것은 제가 스택오버플로우에서 본 팁입니다. 좋은 조언이었습니다.
30.68 인자를 찾기 위해 스크립트를 작성해야 했습니다.
 

저는 매우 짧은 코드(15줄 미만)를 mqh-library 형태로 저장해야 할 필요성에 직면했습니다.

template <typename T1, typename T2>
T1* New( const string &ClassName ) { return((typename(T2) == ClassName) ? new T2 : NULL); }

template <typename T1, typename T2>
T1* New( string ClassName, const T2 &FuncNew[] )
{  
  T1* Res = NULL;
  
#ifdef __MQL5__
  ClassName = "class " + ClassName;
#endif // #ifdef __MQL5__
  
  for (uint i = ArraySize(FuncNew); (Res == NULL) && (bool)i--;)
    Res = FuncNew[i](ClassName);  
    
  return(Res);
}

함수에 대한 포인터는 글로벌 스코퍼스에서 함수에 대해서만 가능하기 때문에 어쩔 수 없는 조치입니다.

얼마나 짧은 라이브러리를 사용하시나요?

 
템플릿 함수의 서명은 호출 위치에 따라 달라질 수 있습니다.

트레이딩, 자동매매 시스템 및 트레이딩 전략 테스트 포럼

오류, 버그, 질문

fxsaber, 2023.11.26 23:26

template <typename T>
void Func( void ) { Print(__FUNCSIG__); }

void OnStart()
{
  Func<int>(); // void "void OnStart()"::Func<int>()
}
 

내가 올바르게 이해했다면, 이 경우 A::f() 메서드는 g()에 인라인 처리됩니다.

class A
{
  void f() {}
  void g() { this.f(); }
};


그리고 여기서는 그렇지 않습니다.

class A
{
  virtual void f() {}
  void g() { this.f(); }
};


코드의 어느 곳에도 A 클래스의 하위 객체가 생성되지 않는다면 두 번째 경우 컴파일러가 A::f()를 인라인 처리할까요?

 
비주얼라이저의 특정 위치에 중단점을 만들어야 할 때가 있습니다. 저는 이런 용도로 이 기능을 사용합니다.
bool IsManualChangeTester()
{
  static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE);
  static ENUM_CHART_MODE PrevChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);  
  
  bool Res = false;
  
  if (IsVisual)
  {
    const ENUM_CHART_MODE ChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);
      
    if (Res = (ChartMode != PrevChartMode))
      PrevChartMode = ChartMode;
  }
    
  return(Res);
}


이 애플리케이션에서요.

if (IsManualChangeTester())
  DebugBreak();


이 조건을 만들어야 할 때는 비주얼라이저에서 그래프 표시 모드를 변경하기만 하면 됩니다.

그런 다음 ME에서 Expert Advisor의 동작을 분석합니다.