MetaTrader 5 전략 테스터의 테스트 결과 분석 및 최적화 - 페이지 2

 
Anatoli Kazharski :

긴 매개변수(lparam)가 확인됩니다. 틱 이벤트 ID가 포함되어 있습니다.

사용자 이벤트 ID(int id)가 null입니다.

더 명확하게 하기 위해 다음과 같이 할 수 있습니다.

제대로 작동하려면 모든 것을 다시 작성해야 한다는 것을 깨달았습니다. 이제 던지고 있습니다.

 
fxsaber :

제대로 작동하려면 모든 것을 다시 작성해야 한다는 것을 깨달았습니다. 이제 던지고 있습니다.

이런 일이 벌어지고 있기 때문에 할 수 없습니다.

 2018.01 . 28 12 : 37 : 23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01 . 28 12 : 37 : 24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0 : 00.998 ( 0.09 Kb/sec)
2018.01 . 28 12 : 37 : 24.692 Tester  EURUSD: ticks data begins from 2017.09 . 01 00 : 00
2018.01 . 28 12 : 37 : 24.692 Core 1   agent process started
2018.01 . 28 12 : 37 : 33.425 Core 1   connecting to 127.0 . 0.1 : 3000
2018.01 . 28 12 : 37 : 50.450 Core 1   tester agent authorization error
2018.01 . 28 12 : 37 : 50.456 Core 1   connection closed
테스터를 시작하지 마십시오.
 

지시자

 #property indicator_chart_window
#property indicator_plots 0

input long Chart = 0 ; // идентификатор графика-получателя события
input int Index = 0 ;

int OnCalculate ( const int rates_total, const int prev_calculated, const int , const double &[] )
{
   if (prev_calculated)
     EventChartCustom (Chart, 0 , Index, 0 , NULL );
  
   return (rates_total);
}


조언자

 #include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1 ;

const string Symbols[] = { "EURUSD" , "GBPUSD" , "AUDUSD" , "USDJPY" , "USDCAD" };

double Sum2 = 0 ;

double GetBid( const string &Symb )
{
   static MqlTick Tick;

   return ( SymbolInfoTick (Symb, Tick)? Tick.bid : 0 );
}

void OnInit ()
{
   for ( int i = 0 ; i < AmountSymbols; i++)
     iCustom (Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit ( const int )
{
   Print (Sum2);
}

void OnTick ()
{
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & )
{
   if (id == CHARTEVENT_CUSTOM )
    Sum2 += GetBid(Symbols[( int )lparam]);
}

EURUSD M1 MetaQuotes-데모, 헤지, USD, 지연 없음, Core1 에이전트 전용, 실제 틱 09/01/2017 - 01/28/2018.


한 문자

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677 , 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s .: Count = 9986677 , 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


두 캐릭터

i = 0 Pass = 0 OnTester = 25.747 s .: Count = 9986677 , 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677 , 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


세 글자

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677 , 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s .: Count = 9986677 , 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


  1. 단일 기호 모드에서 "스파이"는 순수한 OnTick보다 2.5배 느리게 작동합니다. 저것들. 빈 표시기(바 이력이 최소화되도록 PERIOD_W1 기반)는 테스터에서 엄청난 오버헤드를 가지고 있습니다!
  2. 두 개의 기호는 하나보다 3.5배 느립니다.
  3. 그러나 3개의 문자는 2개의 문자보다 1.8만 느립니다. 저것들. 2에서 3으로의 전환은 2항과 대조적으로 확장성으로 설명됩니다.
 

Anatoly, 저는 주제를 Forex 전문가, 거래 로봇 및 전문가 고문 섹션으로 옮기고 거기에 고정할 것을 제안합니다.

그래서 그녀는 항상 눈에 보일 것입니다. 여기에는 이미 고정된 주제가 너무 많습니다.

 
Rashid Umarov :

Anatoly, 저는 주제를 Forex 전문가, 거래 로봇 및 전문가 고문 섹션으로 옮기고 거기에 고정할 것을 제안합니다.

그래서 그녀는 항상 시야에있을 것입니다. 여기에는 이미 고정된 주제가 너무 많습니다.

물론 반대가 아닙니다. 주제가 유용할 수 있다면 말이죠.
 
fxsaber :

...

  1. 단일 기호 모드에서 "스파이"는 순수한 OnTick보다 2.5배 느리게 작동합니다. 저것들. 빈 표시기(바 이력이 최소화되도록 PERIOD_W1 기반)는 테스터에서 엄청난 오버헤드를 가지고 있습니다!
  2. 두 개의 기호는 하나보다 3.5배 느립니다.
  3. 그러나 3개의 문자는 2개의 문자보다 1.8만 느립니다. 저것들. 2에서 3으로의 전환은 2항과 대조적으로 확장성으로 설명됩니다.

당신의 결과는 6, 25, 46입니다. 6, 12, 18은 왜 안 될까요?

감속은 한 캐릭터와 관련하여 살펴봐야 합니다. 그런 다음 세 개의 기호는 예상대로 3이 아니라 1보다 거의 8배 느립니다.

질문은 바로 이것입니다. 확장성으로 이러한 결과를 얻은 이유는 무엇입니까? 그리고 결과를 개선할 수 없으면 새로운 테스트 모드에 대한 변형이 제안 되었습니다. 이렇게 하면 여러 문자를 사용할 때 긴 테스트 문제를 해결할 수 있습니다.

문자별로 순차적으로 테스트할 수 있는 다른 모드를 추가하는 것입니다. 이것은 결과적으로 예상 테스트 시간을 제공합니다. 문제는 다중 기호 Expert Advisors가 다음과 같은 경우에 매우 자주 사용된다는 것입니다.

  1. 더 많은 테스트 데이터가 필요합니다.
  2. 동일한 매개변수를 사용하여 더 다양한 가격 조치, 조건(스프레드, 중지/제한 수준) 등에서 거래 알고리즘을 테스트합니다.

테스트 기간과 매개변수 최적화를 크게 줄이는 새로운 모드가 필요한 경우입니다. 그리고 최종 테스트를 위해 모든 기호를 동시에 테스트합니다.


 
Anatoli Kazharski :

당신의 결과는 6, 25, 46입니다. 6, 12, 18은 왜 안 될까요?

감속은 한 캐릭터와 관련하여 살펴봐야 합니다.

스파이가 있는 두 개의 기호 - 하나의 기호와 매우 다른 테스터 작동 모드. 따라서 확장성을 2와 관련하여 보는 것이 논리적입니다.

게다가, 지표 오버헤드가 너무 거칠어서 스파이를 통해 일하는 것은 목발입니다. 캐릭터 하나만으로도 확장성이 거의 완벽에 가까운 서비스를 기다리고 있습니다. 타이머와 어떻게 작동합니까? 틱 간격이 없을뿐입니다.

 
대폭 가속
 #include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1 ;

const string Symbols[] = { "EURUSD" , "GBPUSD" , "AUDUSD" , "USDJPY" , "USDCAD" };

double Sum2 = 0 ;

double GetBid( const string &Symb )
{
   static MqlTick Tick;

   return ( SymbolInfoTick (Symb, Tick)? Tick.bid : 0 );
}

void OnInit ()
{
   for ( int i = 0 ; i < AmountSymbols; i++)
     if (Symbols[i] != _Symbol )
       iCustom (Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit ( const int )
{
   Print (Sum2);
}

void OnTick ()
{
   OnTick ( _Symbol ); 
}

void OnTick ( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent ( const int id, const long &lparam, const double &, const string & )
{
   if (id == CHARTEVENT_CUSTOM )
     OnTick (Symbols[( int )lparam]);
}


한 문자

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677 , 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s .: Count = 9986677 , 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


두 캐릭터

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677 , 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s .: Count = 9986677 , 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


세 글자

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677 , 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s .: Count = 9986677 , 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755


네 글자

i = 0 Pass = 0 OnTester = 68.459 s .: Count = 9986677 , 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677 , 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent- 127.0 . 0.1 - 3000 build = 1755
 
fxsaber :

스파이가 있는 두 개의 기호 - 하나의 기호와 매우 다른 테스터 작동 모드. 따라서 확장성을 2와 관련하여 보는 것이 논리적입니다.

게다가, 지표 오버헤드가 너무 거칠어서 스파이를 통해 일하는 것은 목발입니다. 캐릭터 하나만으로도 확장성이 거의 완벽에 가까운 서비스를 기다리고 있습니다. 타이머와 어떻게 작동합니까? 틱 간격이 없을뿐입니다.

fxsaber :
대폭 가속

한 문자

두 캐릭터

세 글자

네 글자

두 문자에 대한 결과를 보면 두 문자의 결과를 2로 나눕니다. 17 / 2 = 8.5

그런 다음 문자를 추가할 때 이 값에 문자 수를 곱하여 예상 테스트 시간을 얻습니다.

  • 3개의 문자: 8.5 * 3 = 25 이지만 실제로는 35.462 입니다.
  • 4개의 문자: 8.5 * 4 = 34 이지만 실제로는 68.459 입니다.

그러나 어쨌든 이것은 지금까지 최고의 결과입니다. 흥미로운 옵션은 OnTick에서 현재 기호를 사용하고 나머지는 사용자 지정 이벤트에서 사용하는 것으로 나타났습니다.

서비스가 없어도 사용할 수 있습니다.

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

Init() 및 DeInit() 실행 순서

슬라바 , 2017.04.14 10:18

서비스에는 무엇보다도 거래 기능과 개체 관리 기능이 있습니다. 그리고 차트.

시장 데이터 제공자는 가능성 중 하나일 뿐입니다.

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

Init() 및 DeInit() 실행 순서

슬라바 , 2017.04.14 10:21

서비스에는 OnTick(문자열 기호)이 있습니다. 그러나 특정 기호의 눈금을 구독해야 합니다.

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

Init() 및 DeInit() 실행 순서

fxsaber , 2017.04.14 10:46

서비스에는 OnInit, OnDeinit, OnTick(string)과 같은 거의 모든 On-function이 있는 것으로 나타났습니다. 시간제 노동자, 온트레이드, OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit , OnBookEvent, OnChartEvent(long ChartID, ...), OnCalculate , ...

그리고 표시기 버퍼가 필요하지 않고 표시기/EA의 목발을 처리하고 싶지 않다면 제한(MT의 이전 버전에서 가져온) - 서비스를 겪지 않는 새로운 종류의 프로그램을 작성하십시오.

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

Init() 및 DeInit() 실행 순서

슬라바 , 2017.04.14 10:56

정확히.

OnCalculate는 하지 않습니다.

OnChartEvent를 사용하면 아직 솔루션이 없습니다.

 
사유: