다중통화 Expert Advisors 테스트 결과

 

다중 통화 Expert Advisors의 구성에 대한 기사를 읽고 커뮤니티의 "거물"로부터 질문을 받고 답변을 얻은 후에도 여전히 질문이 남아 있습니다. "테스트 결과가 정확하도록 Expert Advisor를 코딩하는 방법은 무엇입니까? ". 이 주제의 목적은 이 문제를 명확히 하는 것입니다.

커뮤니티 구성원이 제안한 세 가지 다른 방법에 대한 테스트를 수행했습니다.

·          OnTick() .

·          OnChartEvent() . 이 방법은 Konstantin Gruzdev가 그의 기사 " MetaTrader 5의 다중 통화 모드 구현 "에서 제안했습니다.

·          OnTimer() .

나는 Nikolai Kositsin의 다중 통화 전문가 고문의 구조 계획을 빌렸습니다. Nikolai Kositsin은 그의 기사 " 다른 도구에서 거래하는 전문가 고문 만들기 "에 대해 자세히 설명했습니다.

 

테스트를 위해 테스트 결과를 비교하는 것이 요점이므로 간단한 Expert Advisor를 작성했습니다. "벤치마크"는 EURUSD 일일 차트의 결과입니다. 2000년부터. 그런 다음 동일한 매개변수를 사용하는 이 결과를 GBPUSD 차트에서 얻은 결과와 비교합니다. 원칙적으로 하나의 장비만 테스트에 참여하지만 어떤 장비를 사용하든 동일한 결과를 얻을 필요가 있습니다.

온틱 ()

 int OnInit ()
{
 return ( 0 );
}

void OnDeinit ()
{
}

void OnTick ()
{  
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[ 1 ];  
 static bool UpSignal[ 1 ], DnSignal[ 1 ];
   
 // Получение торговых сигналов
 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 차트에서:

태그: 01_

EURUSD 상품에 대한 테스트   GBPUSD 차트에서:

레이블: 0 2 _

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

차트 이벤트 ()

 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 );}
   
 if ( iCustom ( "GBPUSD" , PERIOD_D1 , "Spy Control panel MCM" , ChartID (), 1 ,CHARTEVENT_TICK) == INVALID_HANDLE )
   { Print ( "Ошибка установки шпиона на GBPUSD" ); return ( true );}
}

void OnDeinit ()
{
}

void OnChartEvent ( const int id,         // идентификатор события
                   const long &   lparam, // флаг события поступившего от агента панели.
                                         // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                   const double & dparam, // цена
                   const string & sparam   // инструмент 
                 )
{
 if (id >= CHARTEVENT_CUSTOM )      
   {
     // Объявление массивов переменных для торговых сигналов
     static datetime New_Bar[ 1 ];  
     static bool UpSignal[ 1 ], DnSignal[ 1 ];
      
     // Получение торговых сигналов
    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 차트에서:

레이블: 0 1 _ 이벤트 == 01_tick

결과는 01_ tick 으로 표시된 것과 동일합니다.

 

EURUSD 상품에 대한 테스트   GBPUSD 차트에서:

레이블: 0 2 _ 이벤트 ~= 02_tick

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

온타이머 ()

 int OnInit ()
{
 EventSetTimer ( 10 );

 return ( 0 );
}

void OnDeinit ()
{
 EventKillTimer ();
}

void OnTimer ()
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[ 1 ];  
 static bool UpSignal[ 1 ], DnSignal[ 1 ];
   
 // Получение торговых сигналов
 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);
}

타이머는 10초 간격으로 설정됩니다.

EURUSD 상품에 대한 테스트   EURUSD 차트에서:

레이블 : 01_time == 01_tick   &&   01_시간 == 01_이벤트

EURUSD 상품에 대한 테스트   GBPUSD 차트에서:

레이블 : 02_time == 01_tick   &&   02_시간 == 01_이벤트

테스트 결과는 동일합니다. 한 곳에서만 작은 부정확성을 보았습니다. 또한 타이머의 간격이 작을수록 결과가 더 정확하다는 것을 알았습니다. 즉, 일일 막대에서 테스트를 수행하고 테스터의 간격을 예를 들어 1시간으로 설정해도 테스트는 10초보다 훨씬 빠르게 실행되지만 테스트 결과가 일치하지 않습니다.

------

그게 다야. 모두의 의견이 흥미롭고 해결 방법이 훨씬 더 흥미 롭습니다.)))


 

제 생각에는 이러한 옵션을 개별적으로 비교하는 것은 옳지 않습니다.

개인적으로 만화 속 타이머는 필수이고, 거기에 무엇을 추가할지(틱이나 이벤트)는 별개의 문제라고 생각합니다.

아이디어에 따르면 사용 가능한 모든 핸들러는 만화에 참여해야하며 유일한 질문은 채우기와 일반적인 작업 알고리즘의 구현입니다.

 
tol64 :

"테스트 결과가 정확하도록 Expert Advisor 코드를 작성하는 방법은 무엇입니까?".

처음에는 질문을 이해하지 못했습니다. "정확한" 시험 점수는 무엇을 의미하며 왜 달성해야 합니까?
 
Interesting :

제 생각에는 이러한 옵션을 개별적으로 비교하는 것은 옳지 않습니다.

개인적으로 만화 속 타이머는 필수이고, 거기에 무엇을 추가할지(틱이나 이벤트)는 별개의 문제라고 생각합니다.

아이디어에 따르면 사용 가능한 모든 핸들러는 만화에 참여해야하며 유일한 질문은 채우기와 일반적인 작업 알고리즘의 구현입니다.


이러한 옵션을 비교하는 것이 잘못된 이유는 무엇입니까? 위의 단순한 Expert Advisor의 틀 내에서 원하는 심볼과 원하는 TF에 바를 형성한 후 결정을 내리는 것이 제 생각에는 꽤 맞다고 생각합니다.

같은 틱에 대해 현재 상황을 분석하기 위해 더 복잡한 알고리즘을 추가하면 추가로 언급한 것처럼 올바르지 않습니다. 그러나 나는 형성된 막대에만 관심이 있습니다.

 
Yedelkin :
처음에는 질문을 이해하지 못했습니다. "정확한" 시험 점수는 무엇을 의미하며 왜 달성해야 합니까?

즉, 사실입니다. 어떤 기호를 테스트하든 결과는 동일해야 합니다. 이 경우 OnTimer () 함수를 사용할 때만 동일한 결과를 얻었습니다.

나는 Konstantin Gruzdev의 방법에 매우 관심이 있습니다. 아마도 내가 뭔가 잘못하고 있어서 올바른(신뢰할 수 있는) 결과를 얻지 못했습니다. 또한 이 문제에 대한 그의 의견을 기대합니다.

 
tol64 :

이러한 옵션을 비교하는 것이 잘못된 이유는 무엇입니까? 위의 단순한 Expert Advisor의 틀 내에서 원하는 심볼과 원하는 TF에 바를 형성한 후 결정을 내리는 것이 제 생각에는 꽤 맞다고 생각합니다.

같은 틱에 대해 현재 상황을 분석하기 위해 더 복잡한 알고리즘을 추가하면 추가로 언급한 것처럼 올바르지 않습니다. 그러나 나는 형성된 막대에만 관심이 있습니다.

나는 이론적으로 정확하다고 주장하지 않지만 실제로는 많은 질문이 발생합니다.

예를 들어, 이것은 - 틱 핸들러에서 구현하는 동안 서버와의 연결이 끊어집니다. 시스템은 어떻게 작동하며 계획대로 진행되지 않는 일이 무엇인지 어떻게 결정할 것입니까?

타이머로만 구현 - 어느 정도 수용 가능한 옵션이지만 여기에서는 기간 선택에 합리적인 타협이 필요합니다(하지만 그런 경우에도 특정 어려움이 발생함).

이벤트 - 그 자체로도 그다지 효과적이지 않습니다. 일반적으로 틱 및 이벤트 처리는 리소스를 가장 효율적으로 사용하고 EA가 새로운 데이터 처리로 빠르게 이동할 수 있는 방식으로 구현되어야 합니다.

예델킨 :
처음에는 질문을 이해하지 못했습니다. "정확한" 시험 점수는 무엇을 의미하며 왜 달성해야 합니까?

또한 100% 동일한 결과를 얻을 수는 없다고 생각합니다. 게다가 하나의 심볼만 거래해서 만화의 가능성을 제한하는 것도 이상하다.

최소한 두 개의 기호가 거래되는 경우(그 중 하나는 차트 기호일 수 있음)를 가정해 보겠습니다.

 
tol64 :

즉, 사실입니다. 어떤 기호를 테스트하든 결과는 동일해야 합니다.

100% 비정체성을 추구하는 것은 자기기만이며 환상입니다. 끊임없이 작동하는 GRAIL과 같은 환상. 항상 특정 오류/비신원을 고려해야 합니다.

예, 그리고 이 형식에서 만화를 테스트하는 것은 그다지 공개적이지 않습니다. 만화에 대해 이야기하는 것은 여러 기호로 거래하거나 하나의 기호에 여러 전략으로 거래하는 맥락에서만 수행되어야 합니다.

여기서는 결과의 SIMPLE 아이덴티티가 만화에서 중요하지 않다는 사실을 소개할 것이지만 전문가가 기존 포지션과 이력을 고려하여 거래 결정을 내릴 수 있도록 하는 메커니즘이 중요합니다.

예를 들어 EURUSD 및 GBPUSD 두 기호 를 거래하려고 시도하는 동안 거래는 두 번째 기호에 대한 헤징 및 신호를 사용하여 수행해야 합니다.

 
Interesting :

100% 비정체성을 추구하는 것은 자기기만이며 환상입니다. 끊임없이 작동하는 GRAIL과 같은 환상. 특정 오류/비신원은 항상 고려되어야 합니다.

예, 그리고 이 형식에서 만화를 테스트하는 것은 그다지 공개적이지 않습니다. 만화에 대해 이야기하는 것은 여러 기호로 거래하거나 하나의 기호에 여러 전략으로 거래하는 맥락에서만 수행되어야 합니다.

여기서는 결과의 SIMPLE 아이덴티티가 만화에서 중요하지 않다는 사실을 소개할 것이지만 전문가가 기존 포지션과 이력을 고려하여 거래 결정을 내릴 수 있도록 하는 메커니즘이 중요합니다.

예를 들어 EURUSD 및 GBPUSD 두 기호를 거래하려고 시도하는 동안 거래는 두 번째 기호에 대한 헤징 및 신호를 사용하여 수행해야 합니다.

이제 Expert Advisor가 어떻게 작동해야 하는지 큰 그림을 보고 계십니다. 실제 거래를 위한 프로그램 구현의 모든 어려움과 기술적 미묘함은 제쳐두고 가자. 이 주제에서 질문은 "가장자리"입니다.

1. 간단한 거래 시스템. 형성된 막대로.

2. 한 문자에 대해 테스트하지만 다른 문자에서 테스트합니다.

나는 의도적으로 구조를 최소한으로 단순화했다. 이는 테스트 결과를 보다 쉽게 분석할 수 있도록 하기 위한 것입니다. 최소한 모든 기호를 테스트할 수 있습니다. 결과는 이와 동일하지 않습니다. 그것은 분해하기가 더 어렵고 더 오래 걸리는 죽을 나올 것입니다. EA는 해당 기호에 대한 정확한 작업을 표시하지만 나머지 모든 항목에는 엉망이 될 것입니다. 이는 제시된 결과가 보여주는 것입니다. 테스트 결과는 동일해야 합니다. 그렇지 않으면 하나의 기호에서 Expert Advisor가 올바른 작업을 수행하지만 다른 기호에서는 수행하지 않거나 시스템에 따라 정확히 수행하지 않는 것으로 나타났습니다. 그리고 이 불일치는 상당히 눈에 띕니다.

아이덴티티는 지금까지 OnTimer () 함수를 통해서만 달성되었습니다.

추신: 나는 GRAIL을 믿지 않습니다. 더 정확하게는 다른 많은 사람들과 다르게 이해합니다.)))

 

다음은 OnTimer () 함수를 통해 5개 문자에 대한 결과입니다.

어떤 기호를 테스트하든 결과는 항상 동일합니다.

그러나 다른 메서드( OnTick () 및 OnChartEvent ())를 사용할 경우 Expert Advisor가 있는 기호가 변경되면 결과가 달라집니다. 그리고 이것은 Expert Advisor가 다른 기호에 대해 잘못된 작업을 수행한다는 것을 확인합니다.

OnTick ()을 사용하면 왜 이런 일이 발생하는지 명확합니다. 이것은 이미 여러 번 논의되었습니다. 그러나 OnChartEvent () 메서드는 여전히 의문의 여지가 있습니다.

 

tol64 :

OnTick ()을 사용하면 왜 이런 일이 발생하는지 명확합니다. 이것은 이미 여러 번 논의되었습니다. 그러나 OnChartEvent () 메서드는 여전히 의문의 여지가 있습니다.

이벤트 처리 의 지연 가능성 또는 이벤트의 가능성 있는 손실을 고려해야 합니다.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64 :

즉, 사실입니다. 어떤 기호를 테스트하든 결과는 동일해야 합니다. 이 경우 OnTimer () 함수를 사용할 때만 동일한 결과를 얻었습니다.

거의 이해했습니다. 사실, 당신은 다중 통화 전문가 고문을 구축할 "엔진"을 선택하는 것에 대해 이야기하고 있습니다. 이렇게 하려면 몇 가지 원시적인 거래 전략을 취하고 먼저 "동일한 기호에 대한 신호 소스 및 신호 처리기" 체계에 따라 실행한 다음 "다른 기호에 대한 신호 소스 및 신호 처리기" 체계에 따라 실행합니다. 바르게?

그렇다면 " EURUSD 상품에서 테스트   GBPUSD 차트에서". 이 경우 신호 소스 역할을 하는 기호는 무엇이며 신호 처리기가 연결된 기호는 무엇입니까?