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

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

Я говорю о реальном запуске в мультивалютном режиме (торговля на N символах в советниках (в каждом советнике), установленных на каждый из символов) - это дает реальную оценку, а в случае тестера Вы сравниваете в первую очередь режимы тестирования, а не правильность работы каждого из методов обработки мультивалютных тиков. Какой смысл сравнивать различные режимы, если вcе они основываются на искусственном окружении тестера? Идентичность результатов прогонов не дает основания утверждать, что он дает самые правильные результаты с точки зрения торговли, это оптимум с точки зрения внутренних механизмов работы тестера.

 
Yedelkin:

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

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

Да, мне так хотелось. Ведь каждое наше действие спровоцировано нашим желанием. В данном случае, я получил, как раз то, что мне хотелось. То есть торговля велась только по EURUSD, так как в функции TradePerformer() для каждого символа в массиве символов идёт проверка на разрешение торговать. Эта опция находится во внешних переменных и на тот момент торговля по символу GBPUSD была запрещена. Пользовательские события поступали с двух символов, но в обработчике событий, повторюсь, функция TradePerformer() разрешала торговать только по символу EURUSD. В функции  TradePerformer() находится также функция, которая определяет наступил ли новый бар на конкретном символе, в данном случае EURUSD. Ваше предположение, что очередь событий всегда была забита до упора верно, но в данном случае все обрабатывалось отдельно, а опоздание в один тик не значимо при тестировании на дневных барах.

Удаление одного источника сигнала, того, который не должен участвовать в тестировании, только подтвердило то, что до этого было всё сделано правильно. Проверка  "if(sparam == Symbol_01)" осталась с того момента, когда я проверил результаты не удаляя источник сигналов, на котором не должно вестись тестирование, но с которого оно должно проходить. Это проверка оказалась на самом деле даже лишней. Результаты не изменились. В качестве параметра Symbol_01 используется символ EURUSD. Я пробовал изменить периодичность поступления событий, но это ничего не изменило. Точнее могу сказать, что режим все тики самый точный.

 
marketeer:

Я говорю о реальном запуске в мультивалютном режиме (торговля на N символах в советниках (в каждом советнике), установленных на каждый из символов) - это дает реальную оценку, а в случае тестера Вы сравниваете в первую очередь режимы тестирования, а не правильность работы каждого из методов обработки мультивалютных тиков. Какой смысл сравнивать различные режимы, если вcе они основываются на искусственном окружении тестера? Идентичность результатов прогонов не дает основания утверждать, что он дает самые правильные результаты с точки зрения торговли, это оптимум с точки зрения внутренних механизмов работы тестера.

Теперь понятно. Но изначально обсуждение ведь шло о тестировании именно в тестере. Ведь прежде, чем начать торговлю, систему нужно протестировать. И чем точнее будет проведён тест, тем Вы увереннее будете чувствовать себя в реальной торговле. Представленные результаты тестов показывают, что протестировать можно правильно и неправильно. Теперь у каждого есть выбор и каждый сам сможет для себя решить, что является правильным или неправильным. Кто-то из трейдеров очень верно подметил (если не ошибаюсь это Ван Тарп): "Мы торгуем своими представлениями". Я могу дополнить эту фразу. Мы не только торгуем своими представлениями. Мы даже живём лишь своими представлениями. )) 

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

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

Какой смысл сравнивать различные режимы, если вcе они основываются на искусственном окружении тестера?  

Смысл в том, чтобы на основании полученных результатов принять правильно решение. А вот смысла анализировать искажённые данные я точно никакого не вижу. Ведь, что посеешь, то и пожнёшь.))

 
tol64:

Удаление одного источника сигнала, того, который не должен участвовать в тестировании, только подтвердило то, что до этого было всё сделано правильно.

"...до этого было всё сделано правильно" - это из категории самоуспокоения. Изначально было неправильно. По всей видимости, Вы не придаёте значения такому явлению, как "переполненность очереди событий". Особенно при потиковой передаче событий. Посмотрите справочные материалы и форум на эту тему. Ключевое слово "очередь".

tol64:

... торговля велась только по EURUSD, так как в функции TradePerformer() для каждого символа в массиве символов идёт проверка на разрешение торговать. Эта опция находится во внешних переменных и на тот момент торговля по символу GBPUSD была запрещена. Пользовательские события поступали с двух символов, но в обработчике событий, повторюсь, функция TradePerformer() разрешала торговать только по символу EURUSD. В функции  TradePerformer() находится также функция, которая определяет наступил ли новый бар на конкретном символе, в данном случае EURUSD. Ваше предположение, что очередь событий всегда была забита до упора верно, но в данном случае все обрабатывалось отдельно, а опоздание в один тик не значимо при тестировании на дневных барах.  

От того, что функции TradeSignalCounter()+TradePerformer() обрабатывали события только от одного источника сигнала, состояние очереди событий и её возможная переполненность никак не менялись. Иными словами, "запрет на обработку событий по символу GBRUSD" совершенно не удалял соответствующие события из очереди событий. В третий раз обращаю внимание на проблему: "На возможное переполнение очереди событий уже намекал Interesting" :) Если Вы считаете, что речь идёт всего лишь об "опоздании на один тик", то на чём основаны такие выводы?

"...в данном случае все обрабатывалось отдельно". Проблема в том, что в первоначальном варианте обработчик событий вызывал функции при поступлении событий от обоих источников сигналов, а потом уже эти функции отфильтровывали сигнал от "ненужного" источника. Но функции вызывались каждый (!) раз.

tol64:

 опоздание в один тик не значимо при тестировании на дневных барах.  

Да не важно, на каком периоде тестируется обработчик событий. Если схема Lizar'а генерирует сигналы потиково, то и очередь событий они забивают потиково, а не раз в день.

"Я пробовал изменить периодичность поступления событий, но это ничего не изменило. Точнее могу сказать, что режим все тики самый точный". Не могли бы привести сравнительные скриншоты на нетиковых режимах Lizar'а?

 
tol64:

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

Как это не нужно делать синхронизацию баров в онлайне?! Все эти эксперименты в тестере нужны для оценки онлайновой торговли, и вопрос данного топика упирается в проблему не тестера (который эмулирует онлайн), а именно онлайна, и прежде всего в онлайне нужна синхронизация баров (для соотв. советников).
tol64:

Смысл в том, чтобы на основании полученных результатов принять правильно решение. А вот смысла анализировать искажённые данные я точно никакого не вижу. Ведь, что посеешь, то и пожнёшь.))

Я пытаюсь обратить внимание на то, что категория "правильности" сейчас заменена идентичностью прогонов тестера, но это не означает, что такие данные менее искажены. В частности, Вы сейчас выбрали 10-секундный интервал, который несомненно больше искажает данные, чем, например, 5- или 1-секундный. Т.е. Вы эксплуатируете некую особенность в условиях работы тестера, которая Вам и дает предпочтительный метод с 10-секундным таймером. На самом деле Вы событиями таймера пытаетесь "поймать" момент прихода тиков новых баров на всех инструментах, и совершенно очевидно, что лучший способ это делать - событие OnTick.

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 

Не тратьте попусту время. Полного совпадения на тиках не добьетесь никогда. Время закрытия бара отличается для разных инструментов и то что для одного

инструмента текущее время, это время закрытия бара, для другого бар еще не сформировался, а для третьего уже сформирован несколько тиков назад.

Посмотрите тиковую историю, объемы тиков отличается от инструмента к инструменту в разы.

Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
  • 2010.05.21
  • MetaQuotes Software Corp.
  • www.mql5.com
MetaTrader 5 позволяет во встроенном тестере стратегий моделировать автоматическую торговлю с помощью экспертов на языке MQL5. Такое моделирование называется тестированием экспертов, и может проводиться с использованием многопоточной оптимизации и одновременно по множеству инструментов. Для проведения тщательного тестирования требуется генерировать тики на основе имеющейся минутной истории. В статье дается подробное описание алгоритма, по которому генерируются тики для исторического тестирования в клиентском терминале MetaTrader 5.
 

Yedelkin 2011.08.25 08:16 #

 "...до этого было всё сделано правильно" - это из категории самоуспокоения.

---

 Доброе утро! ))

Кроме этой отдельно вырванной из текста фразы, я также написал: "...я никогда не исключаю того, что я где-то ошибаюсь и я всегда всё проверяю. Но даже после самых жёстких проверок, когда на первый взгляд всё выглядит правильно, я всё равно не исключаю того, что где-то может быть ошибка". Добавлю, что я не из той категории людей, которые думают, что они всегда во всём правы. )))

---

Yedelkin:
Изначально было неправильно. По всей видимости, Вы не придаёте значения такому явлению, как "переполненность очереди событий". Особенно при потиковой передаче событий. Посмотрите справочные материалы и форум на эту тему. Ключевое слово "очередь".

---

 Посмотрел тему Таймер. Ключевые моменты такие выделил:

1. Во время обработки одного события другие обрабатываться не могут.

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); }

 return(0);
}

То есть, принимать будем событие CHARTEVENT_TICK только с символа EURUSD. Никаких других символов больше нет.

Тест начался. При наступлении какого-либо события программа заходит в функцию OnChartEvent(), объявляет массивы переменных для торговых сигналов и проверяет, что за событие. Если это пользовательское событие программа определяет сигнал в TradeSignalCounter(), затем в функции TradePerformer() проверяет наступил ли новый бар и в зависимости от этого потом принимает решение по другим условиям. Функция завершила свою работу и начнёт её только после того, как наступит событие на графике EURUSD. То есть тик в данном случае.

 

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)
   {
    // Получение торговых сигналов
    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);
   }
}

Yedelkin: 
От того, что функции TradeSignalCounter()+TradePerformer() обработывали события только от одного источника сигнала, состояние очереди событий и её возможная переполненность никак не менялись. Иными словами, "запрет на обработку событий по символу GBRUSD" совершенно не удалял соответствующие события из очереди событий. В третий раз обращаю внимание на проблему: "На возможное переполнение очереди событий уже намекал Interesting" :) Если Вы считаете, что речь идёт всего лишь об "опоздании на один тик", то на чём основаны такие выводы?  

 ---

Исполнение перечисленных функций происходит очень быстро. Никакая очередь событий не успеет переполниться и никаких значимых событий мы не пропустим. А если очередь даже переполнится и будут пропущены события то, что мы пропустим? Тик, два тика, три? Ну и что из этого? Это незначительно на дневных барах.

---

 Yedelkin: 
Проблема в том, что в первоначальном варианте обработчик событий вызывал функции при поступлении событий от обоих источников сигналов, а потом уже эти функции отфильтровывали сигнал от "ненужного" источника. Но функции вызывались каждый (!) раз.

---
Да что Вы прицепились к этому второму источнику.))) Нет больше второго источника. Есть один - EURUSD, но эксперт торгует с графика GBPUSD по EURUSD. И результаты получаются идентично-неправильными. Копия. То есть такими же, как если второй источник присутствует. )))

-----------

Проведите лучше тест самостоятельно, покажите результаты тестов и напишите (кратко), что Вы сделали, чтобы получить правильные результаты тестов, если конечно же Вам это удастся сделать. Для этого теста подойдёт самый простой эксперт. Вход по любому условию, Stop Loss, Take Profit. Пусть это будут дневные бары за последние 10 лет. И Вы сами во всём убедитесь. Какие-то участки будут совпадать, а какие-то нет. Откройте график результатов и посмотрите, где несоответствие. 

 
marketeer:
 Как это не нужно делать синхронизацию баров в онлайне?! 

Потому что Вы писали до этого, что:

  marketeer:

Я говорю о реальном запуске в мультивалютном режиме (торговля на N символах в советниках (в каждом советнике), установленных на каждый из символов) - это дает реальную оценку...

Из этого я понял, что под реальным запуском Вы имеете ввиду онлайн-тест, когда запущено несколько экспертов и каждый висит на своём символе непосредственно. Если Вы именно это имели ввиду, то тогда вопрос. Зачем в таком случае нужно делать синхронизацию баров, если каждый эксперт висит на своём символе? Возможно синхронизация баров в этом случае нужна, если торговая система устроена таким образом, когда решение принимается по нескольким символам сразу, поэтому нужно, чтобы бары на этих нескольких символах были сформированы. Я же имею ввиду независимую торговлю на нескольких символах находясь при этом на одном символе (на любом символе).

  marketeer:

Все эти эксперименты в тестере нужны для оценки онлайновой торговли, и вопрос данного топика упирается в проблему не тестера (который эмулирует онлайн), а именно онлайна, и прежде всего в онлайне нужна синхронизация баров (для соотв. советников).

Для меня эксперименты в тестере нужны для оценки результатов торговли на истории. И от этой оценки зависит мой выбор для торговли в онлайн. Поэтому вопрос данного топика упирается в проблему тестера, а не онлайн и именно поэтому нужна синхронизация баров и в тестере тоже (для соответствующих экспертов). Какие-то зеркальные взгляды.)))

  marketeer:

Я пытаюсь обратить внимание на то, что категория "правильности" сейчас заменена идентичностью прогонов тестера, но это не означает, что такие данные менее искажены. В частности, Вы сейчас выбрали 10-секундный интервал, который несомненно больше искажает данные, чем, например, 5- или 1-секундный. Т.е. Вы эксплуатируете некую особенность в условиях работы тестера, которая Вам и дает предпочтительный метод с 10-секундным таймером. 

 Да, чем меньше интервал, тем точнее результат. Но, на самом деле это нужно, по крайней мере для меня, для последнего теста. А для предварительного, всё таки соглашусь с Владимиром (MetaDriver), что достаточно минутного интервала.

marketeer:

На самом деле Вы событиями таймера пытаетесь "поймать" момент прихода тиков новых баров на всех инструментах, и совершенно очевидно, что лучший способ это делать - событие OnTick.

 А вот здесь видно, что Вы невнимательно прочитали первый пост темы. Не событиями таймера, а OnChartEvent(). Или это опечатка?

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

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

Примерно так.


tol64:

 А вот здесь видно, что Вы невнимательно прочитали первый пост темы. Не событиями таймера, а OnChartEvent(). Или это опечатка?

С чего бы это? У Вас там OnTimer третьим номером. Вас уже цитировали по этому поводу: Нужно только реализовать метод, который будет корректно проводить тест. Он есть. Это функция OnTimer() с минимальным интервалом. Так что Вы видимо о чем-то другом задумались.


tol64:

Есть один - EURUSD, но эксперт торгует с графика GBPUSD по EURUSD. И результаты получаются идентично-неправильными.

Если Вам это важно, я бы все-таки рекомендовал уточнить у разработчиков, что является аналогом четверошного fxt-файла в пятерке. Я уже писал, что для разных тестов, скорее всего, генерируются разные базы тиков.

Причина обращения: