다중통화 Expert Advisors 테스트 결과 - 페이지 4

 
tol64 :
하지만 분기 초반에 했던 것과 같은 방식으로 예시를 보여주실 수 있나요? 하나의 기호에 대해서만 거래를 활성화하고 다른 기호에 대해 Expert Advisor를 테스트하십시오. 스크린샷을 찍고 테스트 중인 기호를 테스트합니다. 분기의 시작 부분에 제시된 것과 유사한 분기가 있습니까? 모든 기호의 막대 형성을 모니터링하더라도 모든 것이 동일해야 합니다. 하지만 아직 확인이 필요합니다...

글쎄, 나는 테스트하지 않을 것이다. 코드를 게시하고 테스트할 수 있습니다 ;-):

string Instruments[] = ...
int SymbolCount = ArraySize(Instruments);

void RefreshRates( string symbol)
{
   MqlTick tick;
   SymbolInfoTick (symbol, tick);
   SymbolInfoDouble (symbol, SYMBOL_BID );
}

bool Synchronization()
{
   static bool Sync = true ;

   string StrUnsync;
   int u = 0 ;

   datetime dt0 = ( datetime ) SeriesInfoInteger ( _Symbol , Period (), SERIES_LASTBAR_DATE );
  
   for ( int j = 0 ; j < SymbolCount; j++)
  {
    RefreshRates(Instruments[j]);
     datetime dt = ( datetime ) SeriesInfoInteger (Instruments[j], Period (), SERIES_LASTBAR_DATE );
     if (dt != dt0)
    {
      StrUnsync = StrUnsync + Instruments[j] + " " ;
      u++;
    }
  }
   if (u > 0 )
  {
     Print ( "Some symbols are unsynchonized:" , StrUnsync);
    Sync = false ;
     return ( false );
  }
   else
  {
     if (!Sync)
    {
       Print ( "Synchronization done" );
    }
    Sync = true ;
  }
   return ( true );
}

void OnTick ()
{
   if (!Synchronization()) return ;
  ...
}
 
marketeer :

글쎄, 나는 테스트하지 않을 것이다. 코드를 게시하고 테스트할 수 있습니다 ;-):

)) 제공된 옵션에 감사드립니다. 이제 가능한 오류를 지적하는 YedelkinInteresting 포럼 회원이 생성한 가정을 확인한 다음 기꺼이 귀하의 버전을 테스트하겠습니다. 그 결과를 자세히 보고하겠습니다. ))
 

Yedelkin 

코드 부분에 주의하십시오.

여기에서 두 개의 다른 기호에 특정 표시기 "Spy Control panel MCM"을 "매달"한 것을 볼 수 있습니다. 저것들. 신호 소스가 다른 문자입니다. 그러나 동시에 "거래는 EURUSD에서 수행됩니다"라고 주장합니다. 신호의 소스는 동일한 문자입니다. 결정합시다.

거래는 EURUSD 에서만 수행됩니다.

내 테스트에서 Konstantin Gruzdev가 작성한 계획 - " MetaTrader 5의 다중 통화 모드 구현 "을 고려합니다. ))) 모든 것이 정의됩니다. 기사에 첨부된 파일에는 스파이 제어판 MCM 표시기와 exSpy 제어판 MCM 전문가가 포함되어 있습니다. 차트에 Expert Advisor를 배치하면 어떻게 작동하는지 볼 수 있습니다. 로그는 다른 기호에서 전문가가 수신한 지정된 이벤트를 명확하게 표시합니다. 모든 것이 명확하고 아무것도 섞이지 않습니다.

이제 식별자를 수신한 기호를 OnChartEvent ()에 지정하려고 했지만 결과가 변경되지 않았습니다. 잘못된 이벤트가 발생할 가능성을 없애기 위해 OnInit ()에서 두 번째 문자를 제거했습니다. 이제 이 옵션에 따라 테스트가 수행되었습니다.

 enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_NO         = 0 ,           // События отключены
   CHARTEVENT_INIT       = 0 ,           // Событие "инициализация" 
   
   CHARTEVENT_NEWBAR_M1  = 0x00000001 , // Событие "новый бар" на 1 -минутном графике
   CHARTEVENT_NEWBAR_M2  = 0x00000002 , // Событие "новый бар" на 2 -минутном графике
   CHARTEVENT_NEWBAR_M3  = 0x00000004 , // Событие "новый бар" на 3 -минутном графике
   CHARTEVENT_NEWBAR_M4  = 0x00000008 , // Событие "новый бар" на 4 -минутном графике
   
   CHARTEVENT_NEWBAR_M5  = 0x00000010 , // Событие "новый бар" на 5 -минутном графике
   CHARTEVENT_NEWBAR_M6  = 0x00000020 , // Событие "новый бар" на 6 -минутном графике
   CHARTEVENT_NEWBAR_M10 = 0x00000040 , // Событие "новый бар" на 10-минутном графике
   CHARTEVENT_NEWBAR_M12 = 0x00000080 , // Событие "новый бар" на 12-минутном графике
   
   CHARTEVENT_NEWBAR_M15 = 0x00000100 , // Событие "новый бар" на 15-минутном графике
   CHARTEVENT_NEWBAR_M20 = 0x00000200 , // Событие "новый бар" на 20-минутном графике
   CHARTEVENT_NEWBAR_M30 = 0x00000400 , // Событие "новый бар" на 30-минутном графике
   CHARTEVENT_NEWBAR_H1  = 0x00000800 , // Событие "новый бар" на 1 -часовом графике
   
   CHARTEVENT_NEWBAR_H2  = 0x00001000 , // Событие "новый бар" на 2 -часовом графике
   CHARTEVENT_NEWBAR_H3  = 0x00002000 , // Событие "новый бар" на 3 -часовом графике
   CHARTEVENT_NEWBAR_H4  = 0x00004000 , // Событие "новый бар" на 4 -часовом графике
   CHARTEVENT_NEWBAR_H6  = 0x00008000 , // Событие "новый бар" на 6 -часовом графике
   
   CHARTEVENT_NEWBAR_H8  = 0x00010000 , // Событие "новый бар" на 8 -часовом графике
   CHARTEVENT_NEWBAR_H12 = 0x00020000 , // Событие "новый бар" на 12-часовом графике
   CHARTEVENT_NEWBAR_D1  = 0x00040000 , // Событие "новый бар" на дневном графике
   CHARTEVENT_NEWBAR_W1  = 0x00080000 , // Событие "новый бар" на недельном графике
     
   CHARTEVENT_NEWBAR_MN1 = 0x00100000 , // Событие "новый бар" на месячном графике   
   CHARTEVENT_TICK       = 0x00200000 , // Событие "новый тик"
   
   CHARTEVENT_ALL        = 0xFFFFFFFF , // Все события включены
  };

...

int OnInit ()
{
 if ( iCustom ( "EURUSD" , PERIOD_D1 , "Spy Control panel MCM" , ChartID (), 0 ,CHARTEVENT_TICK) == INVALID_HANDLE )
   { Print ( "Ошибка установки шпиона на EURUSD" ); return ( true );}

 return ( 0 );
}

void OnChartEvent ( const int id,         // идентификатор события
                   const long &   lparam, // флаг события поступившего от агента панели.
                                         // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                   const double & dparam, // цена
                   const string & sparam   // инструмент 
                 )
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
 
 if (id >= CHARTEVENT_CUSTOM )
   {
     if (sparam == Symbol_01)
      {
       // Получение торговых сигналов
       TradeSignalCounter( 0 ,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);
      
       // Совершение торговых операций
       TradePerformer( 0 ,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
      }
   }
}

EURUSD 차트에서 EURUSD 상품을 테스트합니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다.

결과가 일치하지 않습니다.

흥미로운

이 코드로 판단하면 신호는 실제로 두 개의 기호에서 비롯되지만 EA는 이러한 신호 중 하나를 지연으로 처리할 수 있습니다.

두 번째 기호는 더 이상 없으며 신호는 EURUSD 에서만 제공됩니다. 그러나 이것은 불행히도 문제를 해결하지 못했습니다.

 
marketeer :

글쎄, 나는 테스트하지 않을 것이다. 코드를 게시하고 테스트할 수 있습니다 ;-):

나는 당신의 버전을 테스트했습니다. )) 결과는 거의 동일합니다. 예비(빠른) 테스트에 매우 적합합니다. 완전히 동일한 결과를 얻으려면 OnTimer () 함수를 사용합니다.

테스트 결과는 다음과 같습니다.

EURUSD 차트에서 EURUSD 상품을 테스트합니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다.

 
MetaDriver :

10초는 너무 짧은 것 같아요. 형성된 막대만 관심 있는 경우 간격은 최소 1분이어야 합니다 .

짧게 하는건 말이 안되고, 1 분이 적당한 최소 간격입니다..

결국 10초가 넘는 결과 간의 불일치를 보여주기 위해 또 다른 일련의 테스트를 수행했습니다. 주제 시작 부분에 제공된 동일한 "표준"과 비교할 것입니다. 즉, 형성된 일봉에 의한 OnTick () 함수에서 Expert Advisor가 테스트된 기호에 있을 때. 그가 있다:

또한 모든 결과는 OnTimer () 함수에서 가져옵니다. GBPUSD 기호에 대한 전문가 고문:

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 10 초:

가장 정확한 결과입니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 1 분:

사실이 아니다. 결과는 훨씬 더 나은 것으로 밝혀졌으며 이는 정확하지도 않고 오해의 소지가 있습니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 60 분:

결과는 많은 곳에서 표준과 일치하지 않습니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 1 일:

결과는 가장 일관성이 없습니다.

------------------------

일반적으로 올바른 결과를 완전히 확인하려면 최대 최소 간격을 설정하면서 OnTimer () 함수를 사용하여 다중 통화 Expert Advisors를 테스트해야 합니다.

 
tol64 :

결국 10초가 넘는 결과 간의 불일치를 보여주기 위해 또 다른 일련의 테스트를 수행했습니다. 주제 시작 부분에 제공된 동일한 "표준"과 비교할 것입니다. 즉, 형성된 일봉에 의한 OnTick () 함수에서 Expert Advisor가 테스트된 기호에 있을 때. 그가 있다:

또한 모든 결과는 OnTimer () 함수에서 가져옵니다. GBPUSD 기호에 대한 전문가 고문:

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 10 초:

가장 정확한 결과입니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 1 분:

사실이 아니다. 결과는 훨씬 더 나은 것으로 밝혀졌으며 이는 정확하지도 않고 오해의 소지가 있습니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 60 분:

결과는 많은 곳에서 표준과 일치하지 않습니다.

GBPUSD 차트에서 EURUSD 상품을 테스트합니다. 타이머 간격 1 일:

결과는 가장 일관성이 없습니다.

------------------------

일반적으로 올바른 결과를 완전히 확인하려면 최대 최소 간격을 설정하면서 OnTimer () 함수를 사용하여 다중 통화 Expert Advisors를 테스트해야 합니다.

나는 잘 이해하지 못했다. 잘못 비교한 것이 있습니다.

첫 번째 테스트는 정확합니다. "귀하의" 기기와 다른 기기의 두 가지 테스트 방법을 비교한 것입니다. 그리고 나서 이 첫 번째 결과를 벤치마크로 사용하고 다른 모든 결과를 그것과 비교했습니다.

옳지 않다. 첫 번째 결과가 아니라 "귀하의" 기기에서 동일한 틱 빈도의 실행과 동일성을 위해 다른 실행을 비교할 필요가 있습니다.

그들은 "10 초"와 다를 것입니다. 이것은 매우 자연 스럽습니다. 가장 중요한 것은 쌍으로 동일해야한다는 것입니다.

테스트를 완료하십시오.

그렇지 않으면 그는 "10초 테스트의 이점"에 대한 초기 환상을 어떻게든 확인하고 헛되이 시간을 죽인 것으로 판명되었습니다.

 
tol64 :

나는 당신의 버전을 테스트했습니다. )) 결과는 거의 동일합니다. 예비(빠른) 테스트에 매우 적합합니다. 완전히 동일한 결과를 얻으려면 OnTimer () 함수를 사용합니다.

내가 이해하는 한, 당신은 내 동기화 방법이 아니라 MetaTrader 틱 생성기를 테스트했습니다. 사실은 테스트를 시작할 때 eurusd라는 이름과 gbpusd라는 이름으로 서로 다른 틱 기반이 형성되었으며 결과는 거의 동일하지 않을 것입니다. 실제로 다른 기호에서 지정된 동기화 블록으로 두 개의 Expert Advisor를 실행하는 경우 차이는 무시할 수 있거나 아예 없어야 합니다.
 
MetaDriver :

나는 잘 이해하지 못했다. 잘못 비교한 것이 있습니다.

첫 번째 테스트는 정확합니다. "귀하의" 기기와 다른 기기의 두 가지 테스트 방법을 비교한 것입니다. 그리고 나서 이 첫 번째 결과를 벤치마크로 사용하고 다른 모든 결과를 그것과 비교했습니다.

옳지 않다. 첫 번째 결과가 아니라 "귀하의" 기기에서 동일한 틱 빈도의 실행과 동일성을 위해 다른 실행을 비교할 필요가 있습니다.

그들은 "10 초"와 다를 것입니다. 이것은 매우 자연 스럽습니다. 가장 중요한 것은 쌍으로 동일해야한다는 것입니다.

테스트를 완료하십시오.

그렇지 않으면 그는 "10초 테스트의 이점"에 대한 초기 환상을 어떻게든 확인하고 헛되이 시간을 죽인 것으로 판명되었습니다.

좋은. 이제 또 다른 긴 테스트를 시작했습니다. 내가 일어나면 끝날 것이다. 그러나 지금도 나는 그들이 본 것처럼 쌍으로 동일하다고 말할 수 있습니다. 당신에게 그것을 보여주는 것만 남아 있습니다. 그러나 유사한 테스트를 직접 수행할 수도 있습니다. 이것은 또한 거래 시스템을 테스트할 때 중요한 포인트입니다. 그리고 갑자기 나는 뭔가 잘못하고 있습니다.)))

PS 나에게 중요한 것은 OnTimer () 함수를 통해 테스트할 때 어쨌든 쌍으로 동일할 것이기 때문에 쌍으로 동일하지 않다는 것입니다. 목표는 처음에 막대를 명시적으로 제어하여 OnTick () 함수의 일반 모드에서 얻은 결과와 동일하게 만드는 것이었습니다. 단일 심볼에서 거래하는 Expert Advisors는 이를 훌륭하게 수행합니다. 그러나 다중 통화 모드에서는 이를 명확히 해야 했습니다. 결과가 있습니다.

 
marketeer :
내가 이해하는 한, 당신은 내 동기화 방법이 아니라 MetaTrader 틱 생성기를 테스트했습니다. 사실은 테스트를 시작할 때 eurusd라는 이름과 gbpusd라는 이름으로 서로 다른 틱 기반이 형성되었으며 결과는 거의 동일하지 않을 것입니다. 실제로 다른 기호에서 지정된 동기화 블록으로 두 개의 Expert Advisor를 실행하는 경우 차이는 무시할 수 있거나 아예 없어야 합니다.
어떤 현실을 말하는 겁니까? 실시간 테스트? 그렇다면 확실히 동의합니다. 두 명의 전문가를 기호에 매달면 모든 것이 정확할 것입니다. 하지만 다중 통화 모드를 테스트하고 있습니다. 그리고 OnTimer () 함수(10초)에서만 동일한 결과가 나타납니다.
 
tol64 :

거래는 EURUSD 에서만 수행됩니다.

올바른 표현부터 시작하겠습니다. 원래 예에서는 "유로달러가 거래됨"을 원합니다. 실제로 사용자 이벤트 는 두 개의 기호에서 수신되었으며 이벤트 처리기에서는 이 두 기호 중 하나에서 이벤트가 수신될 때 TradeSignalCounter()+TradePerformer() 함수가 호출되었습니다. 이벤트 큐가 항상 한계까지 채워졌다고 가정할 수 있습니다.

이제 신호 소스 중 하나를 제거했지만 어떤 이유로 이벤트 핸들러에서 " if (sparam == Symbol_01)" 검사를 입력했습니다. 그러나 또 다른 질문은 다릅니다. 코드로 판단하면 "All ticks" 모드에서 Lizar의 방식을 사용하고 신호 소스(EURUSD)의 각 틱마다 TradeSignalCounter()+TradePerformer() 함수가 호출됩니다. 관심은 이미 이벤트 대기열의 오버플로 가능성에 대해 암시했습니다. 이 두 함수의 Symbol_01 매개변수로 어떤 도구를 사용하는지 궁금하며, Lizar의 방식에서 이벤트 빈도를 변경해 보셨습니까?