Результаты тестирования мультивалютных экспертов

 

   Прочитав статьи по строению мультивалютных экспертов, задав вопросы и получив ответы от "воротил" сообщества для меня пока осталось под вопросом: "Как составить код эксперта таким образом, чтобы результаты тестов были правильными?".  Цель темы,  как раз  выяснить этот вопрос.

   Провёл тестирование по трём разным методам, которые были предложены участниками сообщества. 

·         OnTick().

·         OnChartEvent(). Этот метод предложил Константин Груздев в своей статье "Реализация мультивалютного режима в MetaTrader 5".

·         OnTimer()

   Схему строения мультивалютного эксперта позаимствовал у Николая Косицина, которую он подробно описал в своей статье "Создание эксперта, торгующего на разных инструментах". 

 

   Для теста написал простого эксперта, так как суть в сравнении результатов тестов. «Эталоном» будет результат с дневного графика EURUSD с 2000 года. Затем этот результат с теми же параметрами будет сравниваться с результатом, который был получен с графика GBPUSD. В принципе в тестах участвует только один инструмент, но необходимо добиться идентичности в результатах независимо от того, с какого инструмента производиться тестирование.  

 

OnTick()

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_tick

 

 

 

 

Тест на инструменте EURUSD  с графика GBPUSD:

Метка: 02_tick

 

 

 

 

Результаты тестов не соответствуют.

 

OnChartEvent()

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:

Метка: 01_event == 01_tick

 

 

 

  

Результат идентичен с результатом отмеченным, как 01_tick.

 

Тест на инструменте EURUSD  с графика GBPUSD:

Метка: 02_event ~= 02_tick

 

 

 

 

     

     Результаты тестов не соответствуют.

 

OnTimer()

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_ time == 01_ event

 

 

 

 

Тест на инструменте EURUSD  с графика GBPUSD:

Метка: 02_time == 01_tick  &&  02_ time == 01_ event

 

 

 

 

Результаты тестов идентичны. Только в одном месте я увидел маленькую неточность. Я также заметил, что чем меньше интервал в таймере, тем точнее результат. То есть, даже если тест проводится на дневных барах, а интервал в тестере установлен, например, на 1 час, то тест пройдёт существенно быстрее, чем на 10 секунд, но результаты тестов будут не совпадать.

 ------

В общем всё. Интересно мнение каждого и ещё интереснее методы решения.))) 

 

 


 

На мой взгляд не корректно сравнивать эти варианты по отдельности.

Лично я придерживаюсь мнения что таймер в мульте должен быть обязательно, а что будет добавлено к нему (тики или события) - вопрос отдельный.

По идеи в мульте должны быть задействованы все доступные обработчики, вопрос только в их начинке и реализации общего алгоритма работы.

 
tol64:

  "Как составить код эксперта таким образом, чтобы результаты тестов были правильными?".  

Изначально не понял постановку вопроса. Что значит "правильные" результаты тестов, и зачем их надо достигать?
 
Interesting:

На мой взгляд не корректно сравнивать эти варианты по отдельности.

Лично я придерживаюсь мнения что таймер в мульте должен быть обязательно, а что будет добавлено к нему (тики или события) - вопрос отдельный.

По идеи в мульте должны быть задействованы все доступные обработчики, вопрос только в их начинке и реализации общего алгоритма работы.


Почему некорректно сравнивать эти варианты? В рамках приведённого простого эксперта, когда решение принимается после того, как бар сформирован на нужном символе и нужном ТФ, по моему вполне корректно. 

Некорректно, как раз о чём Вы далее упомянули, было бы, если добавить более сложный алгоритм анализа текущей ситуации по тем же тикам. Но меня интересуют только сформировавшиеся бары. 

 
Yedelkin:
Изначально не понял постановку вопроса. Что значит "правильные" результаты тестов, и зачем их надо достигать?

То есть те, которые соответствуют действительности. С какого бы символа мы не производили тестирование, результаты должны быть идентичными. В данном случае идентичный результат был достигнут только при использовании функции OnTimer(). 

Мне очень интересен метод Константина Груздева. Возможно я что-то не так делаю, поэтому не получилось добиться правильных (достоверных) результатов. Надеюсь также на его комментарии по этому вопросу.

 
tol64:

Почему некорректно сравнивать эти варианты? В рамках приведённого простого эксперта, когда решение принимается после того, как бар сформирован на нужном символе и нужном ТФ, по моему вполне корректно. 

Некорректно, как раз о чём Вы далее упомянули, было бы, если добавить более сложный алгоритм анализа текущей ситуации по тем же тикам. Но меня интересуют только сформировавшиеся бары. 

Не спорю, теоретически корректно, на практике же возникает куча вопросов.

К примеру вот такой - Реализация в обработчике тиков, при этом теряется коннект с сервером. Как система будет работать и как она определит что что-то идет не по плану?

Реализация только в таймере - Более или менее приемлемый вариант, но тут нужен разумный компромисс в выборе периода (но и тогда будут возникать определенные трудности).

События - Сами по себе тоже не очень эффективны. Вообще говоря обработка тиков и событий должна быть реализована таким образом чтобы наиболее эффективно использовать ресурсы и достаточно быстро позволять эксперту переходить к обработке новой порции данных.

Yedelkin:
Изначально не понял постановку вопроса. Что значит "правильные" результаты тестов, и зачем их надо достигать?

Тоже полагаю что 100% идентичных результатов добиваться не стоит. Тем более что странно ограничивать возможности мульта только торговлей по ОДНОМУ символу.

Вот скажем хотя бы если два символа будет торговаться (один из которых возможно может быть символом графика).

 
tol64:

То есть те, которые соответствуют действительности. С какого бы символа мы не производили тестирование, результаты должны быть идентичными.

Поверьте, поиск 100% неидентичности это самообман и иллюзия. Такая же иллюзия как вечно работающий ГРААЛЬ. Нужно всегда учитывать определенную погрешность/неидентичность.

Да и в таком виде тестирование мульта не очень показательно. Разговор о мультах стоит вести только в разрезе торговли по нескольким символам или торговли по нескольким стратегия на одном символе.

Тут я имею введу то, что в мульте не важна ПРОСТАЯ идентичность результатов, а важны механизмы позволяющие эксперту принимать торговые решения с учетом имеющихся позиций и истории.

Попробуйте к примеру поторговать два символа EURUSD и GBPUSD, при этом торговля должна вестись с применением хеджирования и сигналов по второму символу.

 
Interesting:

Поверьте, поиск 100% неидентичности это самообман и иллюзия. Такая же иллюзия как вечно работающий ГРААЛЬ. Нужно всегда учитывать определенную погрешность/неидентичность.

Да и в таком виде тестирование мульта не очень показательно. Разговор о мультах стоит вести только в разрезе торговли по нескольким символам или торговли по нескольким стратегия на одном символе.

Тут я имею введу то, что в мульте не важна ПРОСТАЯ идентичность результатов, а важны механизмы позволяющие эксперту принимать торговые решения с учетом имеющихся позиций и истории.

Попробуйте к примеру поторговать два символа EURUSD и GBPUSD, при этом торговля должна вестись с применением хеджирования и сигналов по второму символу.

Вы смотрите сейчас на общую картину, как должен работать эксперт. Давайте пока опустим все трудности и технические тонкости реализации программы для торговли на реале. В данной теме вопрос стоит "ребром".

1. Простая торговая система. По сформировавшимся барам.

2.  Тест на одном символе, но с другого символа. 

 Я специально упростил структуру до минимума. Это для того, чтобы было проще проанализировать результаты тестов. Можно хоть все символы протестировать, идентичнее от этого результаты не станут. Получится каша, которую будет сложнее и дольше разбирать. Эксперт покажет точные действия на том символе на котором находится, но бардак будет на всех остальных, что и показывают представленные результаты. Результаты тестов должны быть идентичными, иначе получается, что находясь на одном символе эксперт совершает правильные действия, а на других нет или совершает их не точно по системе. И это несоответствие довольно ощутимо.

Идентичности получилось добиться пока только через функцию OnTimer().

P.S. В ГРААЛИ я не верю. Точнее я по другому понимаю это нежели многие другие.)))

 

Вот результат сразу на пяти символах через функцию OnTimer():

 

С какого бы символа не проводился тест, результат всегда один.

Но при использовании других методов (OnTick() и OnChartEvent()) результаты бы отличались при изменении символа, на котором находится эксперт. И это как раз подтверждает то, что эксперт совершает неправильные действия на других символах.

С OnTick() то всё ясно, почему это происходит. Это уже неоднократно обсуждалось. А вот метод OnChartEvent() всё таки остаётся под вопросом. 

 

tol64:

С OnTick() то всё ясно, почему это происходит. Это уже неоднократно обсуждалось. А вот метод OnChartEvent() всё таки остаётся под вопросом. 

Нужно учитывать возможное запаздывание обработки событий, или даже возможной ПОТЕРИ события.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64:

То есть те, которые соответствуют действительности. С какого бы символа мы не производили тестирование, результаты должны быть идентичными. В данном случае идентичный результат был достигнут только при использовании функции OnTimer(). 

Примерно понял. Фактически, Вы ведете речь о выборе "движка", на котором собираетесь строить свой многовалютный эксперт. Для этого беретё некую примитивную торговую стратегию и сначала прогоняете её по схеме "источник сигнала и обработчик сигнала - на одном символе", затем по схеме "источник сигнала и обработчик сигнала - на разных символах". Правильно?

Если так, то не очень понял фразы типа "Тест на инструменте EURUSD  с графика GBPUSD". Какой символ в данном случае служит источником сигнала, а на какой символ прикреплён обработчик сигнала?