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

 
tol64:
А не могли бы Вы показать пример аналогично тому, как это сделал я в начале ветки. Включите торговлю только по одному символу, но эксперт при этом тестируйте на другом. Сделайте скриншот и протестируйте на том символе, на котором проходит тест. Будут ли расхождения подобные тем, как это представлено в начале ветки? Хотя если отслеживается формирование баров на всех символах, то должно быть всё идентично. Но всё же нужно всё проверять...

Ну, тестировать я не буду. Могу выложить код, а Вы его протестируйте ;-):

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:

Ну, тестировать я не буду. Могу выложить код, а Вы его протестируйте ;-):

)) Спасибо за предоставленный вариант. Сейчас только проверю своё предположение, которое было сгенерированно указанием на возможную ошибку участниками форума Yedelkin и Interesting, а затем с удовольствием протестирую Ваш вариант. О результатах подробно сообщу. ))
 

Yedelkin 

  Обратите внимание на часть кода:

  Здесь видно, что Вы "навешиваете" некий индикатор "Spy Control panel MCM" на два разных символа. Т.е. источниками сигнала у Вас служат разные символы. Но при этом Вы утверждаете, что "торговля ведётся по EURUSD", т.е. что источником сигнала является один и тот же символ. Давайте определимся.

  Торговля ведётся только по EURUSD.

  Я рассматриваю в своих тестах схему, которую написал Константин Груздев - "Реализация мультивалютного режима в MetaTrader 5". ))) Всё определено. В приложенных к статье файлах есть индикатор Spy Control panel MCM и эксперт exSpy Control panel MCM. Установив эксперт на график можно увидеть, как он работает. В журнале чётко отображаются указанные события принятые экспертом с разных символов. Всё чётко, ничего не смешивается.

  Я сейчас попробовал указать в 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:

 

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

  

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

 Interesting

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

 Второго символа больше нет, сигналы приходят только с EURUSD. Но это к сожалению не решило проблему. 

 
marketeer:

Ну, тестировать я не буду. Могу выложить код, а Вы его протестируйте ;-):

Протестировал Ваш вариант. )) Результаты практически идентичны. Для предварительного (быстрого) тестирования вполне подходит. Чтобы получить полностью идентичные результаты значит будем использовать функцию OnTimer().

Вот результаты тестирования:

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

 

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

 

 
MetaDriver:

Мне кажется 10 сек  слишком маленький интервал. Если интересуют только сформированные бары, интервал должен быть не менее минуты.

Нет смысла делать короче, минута это минимальный разумный интервал..

Провёл всё таки ещё серию тестов, чтобы показать несоответствие результатов, которые выше 10 секунд. Сравнивать будем с тем же "эталоном", который был предоставлен в начале темы. То есть из функции OnTick() по сформированным дневным барам, когда эксперт находится на тестируемом символе. Вот он:

 

 

Далее все результаты будут из функции OnTimer(). Эксперт на символе GBPUSD:

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 10 секунд: 

 

 Это самый точный результат.

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 1 минута:

 

Не соответствует действительности. Результат оказался даже существенно лучше, что тоже не правильно и вводит в заблуждение.

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 60 минут: 

 

Результат не совпадает во многих местах с эталоном.

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 1 день:   

 

Результат более всего неидентичен. 

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

В общем, чтобы быть полностью уверенным в правильных результатах, мультивалютные эксперты нужно тестировать через функцию OnTimer(), устанавливая при этом максимально минимальный интервал.

 
tol64:

Провёл всё таки ещё серию тестов, чтобы показать несоответствие результатов, которые выше 10 секунд. Сравнивать будем с тем же "эталоном", который был предоставлен в начале темы. То есть из функции OnTick() по сформированным дневным барам, когда эксперт находится на тестируемом символе. Вот он:

 

Далее все результаты будут из функции OnTimer(). Эксперт на символе GBPUSD:

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 10 секунд: 

 

 Это самый точный результат.

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 1 минута:

 

Не соответствует действительности. Результат оказался даже существенно лучше, что тоже не правильно и вводит в заблуждение.

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 60 минут: 

 

Результат не совпадает во многих местах с эталоном.

Тест на инструменте EURUSD с графика GBPUSD. Интервал таймера 1 день:   

 

Результат более всего неидентичен. 

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

В общем, чтобы быть полностью уверенным в правильных результатах, мультивалютные эксперты нужно тестировать через функцию OnTimer(), устанавливая при этом максимально минимальный интервал.

Я не совсем понял. Чего-то ты некорректно сравнил.

Первый тест правильный : сравнение двух способов тестирования - на "своём" инструменте и на другом. А дальше ты взял этот первый результат в качестве эталона, и сравнил все остальные результаты с ним.

Это неправильно.  Нужно сравнивать остальные прогоны на идентичность не с первым результатом, а с прогонами такой же периодичности тикания на "своём" инструменте.

Они будут отличаться от "10-ти секундного", это вполне естественно, главное они должны быть попарно идентичны.

Дополни, пожалуйста, тест.

Иначе получится, что только время зря убил, странным образом ухитрившись подтвердить свою первоначальную иллюзию "о преимуществах 10ти-секундного тестирования" .

 
tol64:

Протестировал Ваш вариант. )) Результаты практически идентичны. Для предварительного (быстрого) тестирования вполне подходит. Чтобы получить полностью идентичные результаты значит будем использовать функцию OnTimer().

Насколько я понимаю, Вы сейчас протестировали не мой способ синхронизации, а генератор тиков МетаТрейдера. Дело в том, что при запуске тестов у Вас были сформированы разные базы тиков - под именем eurusd и под именем gbpusd, и результаты по ним практически никогда не будут равны. В реальности же, если запустить два эксперта с указанным блоком синхронизации на разных символах, разница должна быть пренебрежимо малой или вовсе отсутствовать.
 
MetaDriver:

Я не совсем понял. Чего-то ты некорректно сравнил.

Первый тест правильный : сравнение двух способов тестирования - на "своём" инструменте и на другом. А дальше ты взял этот первый результат в качестве эталона, и сравнил все остальные результаты с ним.

Это неправильно.  Нужно сравнивать остальные прогоны на идентичность не с первым результатом, а с прогонами такой же периодичности тикания на "своём" инструменте.

Они будут отличаться от "10-ти секундного", это вполне естественно, главное они должны быть попарно идентичны.

Дополни, пожалуйста, тест.

Иначе получится, что только время зря убил, странным образом ухитрившись подтвердить свою первоначальную иллюзию "о преимуществах 10ти-секундного тестирования" .

Хорошо. Сейчас уже запустил ещё один долгий тест. Он закончится, когда я проснусь. Но уже сейчас могу сказать, что попарно они идентичны, так как я это видел. Осталось только и Вам это показать. Но Вы могли бы и сами провести аналогичный тест. Это же важный момент в тестировании торговых систем. А то вдруг я что-то неправильно делаю.)))

P.S. Для меня главное как раз было в том, чтобы они были идентичны не попарно, так как при тестировании через функцию OnTimer() они оказывается в любом случае будут идентичны попарно. Цель изначально стояла в том, чтобы они были идентичны с результатом, который был получен в обычном режиме в функции OnTick() с явным контролем баров. Эксперты торгующие на одном символе отлично с этим справляются. А вот в мультивалютном режиме это нужно было выяснить. Результат налицо.

 
marketeer:
Насколько я понимаю, Вы сейчас протестировали не мой способ синхронизации, а генератор тиков МетаТрейдера. Дело в том, что при запуске тестов у Вас были сформированы разные базы тиков - под именем eurusd и под именем gbpusd, и результаты по ним практически никогда не будут равны. В реальности же, если запустить два эксперта с указанным блоком синхронизации на разных символах, разница должна быть пренебрежимо малой или вовсе отсутствовать.
Вы говорите о какой реальности? Тестирование в режиме реального времени? Если да, то согласен конечно. Если вешать два эксперта на своих символах, то всё будет корректно. Но я то тестирую мультивалютный режим. И идентичный результат показан только с помощью функции OnTimer() (10 секунд). 
 
tol64:

  Торговля ведётся только по EURUSD.

Начнём с правильных формулировок. В первоначальном примере Вам бы хотелось, чтобы "торговля велась по евродоллару". На самом деле пользовательские события поступали с двух символов, а в обработчике событий функции TradeSignalCounter()+TradePerformer() вызывались при поступлении событий от любого из этих двух символов. Можно предположить, что очередь событий была всегда забита до упора.

Теперь Вы удалили  один из источников сигналов, но зачем-то в обработчике событий ввели проверку "if(sparam == Symbol_01)". Но очередной вопрос в другом. Судя по коду, схема Lizar'а используется у Вас в режиме "Все тики", и на каждом тике от источника сигнала (EURUSD) вызываются функции TradeSignalCounter()+TradePerformer(). На возможное переполнение очереди событий уже намекал Interesting. Мне же интересно, какой инструмент у Вас используется в качестве параметра Symbol_01 у этих двух функций, и не пробовали ли Вы изменить периодичность поступления событий в схеме Lizar'а.