Глюк мультивалютной оптимизации МТ5

 
Посмотрел на форуме несколько советников, имеющих в названии слово "мультивалютный".
Ни один из них нельзя было оптимизировать по нескольким валютам в одном прогоне оптимизации.
Пришлось придумывать ...
extern   int      idxSymbols;
         string   arrSymbols[3];
         string   currSymbol;

OnInit ()
{
...
   arrSymbols[0]="AUDNZD";
   arrSymbols[1]="EURUSD";
   arrSymbols[2]="GBPUSD";

// Вариант 1 - классический : текущий символ = символу из настроек тестера
   currSymbol=Symbol();         
// Вариант 2 - оптимизация : текущий символ = элементу массива, индекс которого перебирается как input параметр при оптимизации
   currSymbol=arrSymbols[idxSymbols]; //
...
}

Моделирование : Только цены открытия

Отдельное тестирование каждой пары по первому варианту, чистая прибыль:
AUDNZD - 4180,96
EURUSD - 8674,95
GBPUSD - 1686,79

Оптимизация по второму варианту : на вкладке "Параметры" перебирается idxSymbols  от 0 до 2 включительно, в настройках тестера указан символ GBPUSD

Все правильно. Но ....
Поменял в настройках тестера символ на EURUSD : Изменилась прибыль по GBPUSD [проход 2]

Поменял в настройках тестера символ на AUDNZD : стали неправильные прибыли по EURUSD [проход 1] и GBPUSD  [проход 2]

Что это ? Помогите ... пожалуйста ... очень прошу :(

UPD  Чистка кэша не помогла

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии ( советники ) перед началом использования их в реальной торговле. При...
 

тест идет по тикам того символа, который указан в параметрах тестера

этот нюанс актуален для всех советников ищущих точку входа на каждом тике

решением может быть вызов ontick() в ontimer(), но это сильно тормозит процесс тестирования

 
Denis Nikolaev:

тест идет по тикам того символа, который указан в параметрах тестера

этот нюанс актуален для всех советников ищущих точку входа на каждом тике

решением может быть вызов ontick() в ontimer(), но это сильно тормозит процесс тестирования

А почему тогда в одном варианте посчиталось правильно для всех?
В это время в тестере был установлен GBPUSD

UPD:  Моделирование : Только цены открытия

 

точный ответ в коде вашего советника

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

иначе сами результаты тестов в таком режиме не достоверны

загляните в код, чтобы однозначно ответить себе на вопрос "как он работает?"

и еще  как вариант  - отсутствие м1 баров по gbpusd в тех местах истории, где по другим парам есть бары с сделками
 
Denis Nikolaev:

точный ответ в коде вашего советника

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

иначе сами результаты тестов в таком режиме не достоверны

загляните в код, чтобы однозначно ответить себе на вопрос "как он работает?"

и еще  как вариант  - отсутствие м1 баров по gbpusd в тех местах истории, где по другим парам есть бары с сделками

В код заглянул)
Я его сам писал.
OnTick() работает, только если NewBar==true, исключительно на открытии свечи М1.
Иначе return

.......
Такую странную зависимость результатов от символа в настройках тестера трудно объяснить отсутствием баров М1 по GBPUSD...
Ведь именно при установке этой пары в настройках тестера результаты по всем парам правильные и соответствуют одиночному тестированию каждой пары.
А нет ли у Вас ссылки на ветку, где утверждается, что тестер работает по тикам символа, который установлен в параметрах?

 
Mikhail Tkachev:

В код заглянул)
Я его сам писал.
OnTick() работает, только если NewBar==true, исключительно на открытии свечи М1.
Иначе return

.......
Такую странную зависимость результатов от символа в настройках тестера трудно объяснить отсутствием баров М1 по GBPUSD...
Ведь именно при установке этой пары в настройках тестера результаты по всем парам правильные и соответствуют одиночному тестированию каждой пары.
А нет ли у Вас ссылки на ветку, где утверждается, что тестер работает по тикам символа, который установлен в параметрах?

Ссылки нет, это лишь мое личное наблюдение моих мультивалютных советников
 
Mikhail Tkachev:

В код заглянул)
Я его сам писал.
OnTick() работает, только если NewBar==true, исключительно на открытии свечи М1.
Иначе return

.......
Такую странную зависимость результатов от символа в настройках тестера трудно объяснить отсутствием баров М1 по GBPUSD...

Это как раз всё и объясняет. Почитайте статьи и документацию, чтобы понять, что для мультивалютных стратегий вы должны самостоятельно обеспечить синхронизацию на всех используемых символах для получения повторяемых результатов независимо от символа, на котором запущен советник.
 
Rashid Umarov:
Это как раз всё и объясняет. Почитайте статьи и документацию, чтобы понять, что для мультивалютных стратегий вы должны самостоятельно обеспечить синхронизацию на всех используемых символах для получения повторяемых результатов независимо от символа, на котором запущен советник.

А какие статьи почитать?

 
Mikhail Tkachev:

А какие статьи почитать?

Читать много. На вскидку

 

Советник который ловит новый бар (кроме первого принта - первый принт служебный). 

//+------------------------------------------------------------------+
//|                                                     Expert 1.mq5 |
//|                              Copyright © 2021, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2021, Vladimir Karputov"
#property version   "1.00"
//--- input parameters
input int      Input1=9;
//---
datetime m_prev_bars                = 0;        // "0" -> D'1970.01.01 00:00';
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- forced initialization of variables
   m_prev_bars                = 0;        // "0" -> D'1970.01.01 00:00';
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(Symbol(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
   Print(Symbol(),", ",EnumToString(Period()),", ",TimeToString(time_0,TIME_DATE|TIME_SECONDS));
  }
//+------------------------------------------------------------------+

Запуск в режиме "каждый тик на основе реальных тиков" сначала на AUDUSD, PERIOD_M1

        2021.01.04 00:02:38   AUDUSD, PERIOD_M1, 2021.01.04 00:02:00
        2021.01.04 00:03:03   AUDUSD, PERIOD_M1, 2021.01.04 00:03:00
        2021.01.04 00:04:05   AUDUSD, PERIOD_M1, 2021.01.04 00:04:00
        2021.01.04 00:05:00   AUDUSD, PERIOD_M1, 2021.01.04 00:05:00
        2021.01.04 00:06:09   AUDUSD, PERIOD_M1, 2021.01.04 00:06:00
        2021.01.04 00:07:22   AUDUSD, PERIOD_M1, 2021.01.04 00:07:00
        2021.01.04 00:08:09   AUDUSD, PERIOD_M1, 2021.01.04 00:08:00
        2021.01.04 00:09:09   AUDUSD, PERIOD_M1, 2021.01.04 00:09:00

затем на USDRUB, PERIOD_M1

        2021.01.04 10:00:00   USDRUB, PERIOD_M1, 2021.01.04 10:00:00
        2021.01.04 10:01:00   USDRUB, PERIOD_M1, 2021.01.04 10:01:00
        2021.01.04 10:02:00   USDRUB, PERIOD_M1, 2021.01.04 10:02:00
        2021.01.04 10:03:00   USDRUB, PERIOD_M1, 2021.01.04 10:03:00
        2021.01.04 10:04:00   USDRUB, PERIOD_M1, 2021.01.04 10:04:00

ещё на USDSEK, PERIOD_M1

        2021.01.04 00:30:05   USDSEK, PERIOD_M1, 2021.01.04 00:30:00
        2021.01.04 00:31:00   USDSEK, PERIOD_M1, 2021.01.04 00:31:00
        2021.01.04 00:32:01   USDSEK, PERIOD_M1, 2021.01.04 00:32:00
        2021.01.04 00:33:02   USDSEK, PERIOD_M1, 2021.01.04 00:33:00


Но это не самое интересное - здесь можно увидеть, что на символе в принципе в 00:01 не было баров.

Самое интересное, если в терминале зайти в символы и заказать тики:

Рис. 1. USDJPY

Рис. 2. EURUSD


И это только начало пути ...

Файлы:
Expert_1.mq5  4 kb
 
Vladimir Karputov:

Читать много. На вскидку

Владимир, спасибо за столь развернутый ответ.
Пока я не понял, этот вопрос - перебор параметров input для разных символов в одном прогоне - в принципе решён ?
Вот здесь https://www.mql5.com/ru/forum/170952/page68#comment_6406566 утверждается, что можно с помощью костыля (специального индикатора) ловить новый бар каждого символа, независимо от установленного в тестере.
И я не понял, что значат обведённые строки в тиковых данных ?
В принципе, тики меня не интересуют, я делаю ТС на Н1 и Н4 с поминутным контролем, поэтому основной график у меня М1

UPD: На форуме оптимизация в МТ5 понимается, как поиск лучших input-параметров по критерию и пишут, что я не понимаю что такое тестирование и оптимизация. А что если мне нужно просто прогнать сочетания input-параметров для разных символов и вывести показатели ТС в свой репорт (желательно в одном прогоне) ? Это как будет называться ?  А та оптимизация, про которую на форуме пишут, является просто подгонкой под график, т.к. на основе тех критериев, которые предлагаются в тестере, можно что-то сказать о качестве торговой системы, но ничего - о степени подгонки ТС к графику.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2018.01.28
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
Причина обращения: