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

 
tol64:

Да что Вы прицепились к этому второму источнику.)))

Если начну отвечать по существу, в ответ последует либо что-то типа насчёт "отдельно вырванных из текста фраз", либо "я не из той категории людей, которые думают, что они всегда во всём правы". Это уже понятно.

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

 
marketeer:

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

До этого Вы написали, что:

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


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

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

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

1. Для каждого символа оптимизирую параметры отдельно, вешая эксперт при этом именно на тот символ, параметры которого оптимизируются. Процесс оптимизации производится с использованием функции OnTick(). В момент оптимизации параметров для одного символа все другие отключены, то есть не участвуют в тестировании и сделки проходят только по символу чьи параметры оптимизируются.

2. После оптимизации параметров по всем символам нужно провести тест сразу всеми символами одновременно. Код переношу в функцию OnTimer() (пока так), включаю таймер на предварительное тестирование (60 секунд), анализирую полученный результат. Если устраивает, настраиваю систему управления капиталом и прочие подсистемы. Затем включаю окончательное тестирование (таймер 10 секунд) и получаю, на мой взгляд, самый точный результат. Мой взгляд и выводы основаны на результатах тестов всех методов и сравнения этих результатов между собой. 

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

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

 
В мт5 нет fxt файлов. Теперь тики не записываются в файл, а моделируются из минутной истории на ходу.

Оказалось, что генерировать тики на ходу быстрее их чтения с диска.
Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
Renat:
В мт5 нет fxt файлов. Теперь тики не записываются в файл, а моделируются из минутной истории на ходу.

Оказалось, что генерировать тики на ходу быстрее их чтения с диска.
Здравствуйте Ренат. Спасибо за ответ. Это замечательная новость.
 
tol64:
Здравствуйте Ренат. Спасибо за ответ. Это замечательная новость.
не вижу ничего замечательного, получается, что в mt5 на реальных тиках протестировать нельзя 
 
Loky:
не вижу ничего замечательного, получается, что в mt5 на реальных тиках протестировать нельзя 
Вы хотели бы иметь возможность свою реальную базу тиков собрать или где-нибудь взять, и проводить тестирование на них что ли? 
 
Yedelkin:

Если начну отвечать по существу, в ответ последует либо что-то типа насчёт "отдельно вырванных из текста фраз", либо "я не из той категории людей, которые думают, что они всегда во всём правы". Это уже понятно.

Нет. Похоже на то, что Вам до сих пор ничего не понятно. И сейчас я Вам это буду объяснять в четвёртый раз. Восстановим наш диалог.

Всё началось вот с этого момента:

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

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

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

 На это я Вам ответил:

tol64: 

О, это уже ближе. Вроде бы нарисовался один вариант на чём я ошибаюсь.)) Я сейчас подумаю немного и сразу же подробнее напишу об этом...

 Подумал. Отвечаю:

  tol64: 

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

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

Я сейчас попробовал указать в OnChartEvent() символ, с которого принимается идентификатор, но это не изменило результаты. Из OnInit() я удалил второй символ, чтобы исключить любую возможность получения не тех событий. Теперь тест проводился по такому варианту:

...

код

...

картинки

...

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

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


Понимаете? Удаление второго источника не решило проблему. Ситуация упростилась и можно было уже оставить второй источник, но Вы продолжили приводить в пример первоначальный пример, вместо того, чтобы попытаться решить следующий вопрос. Почему имея только один символ (единственный источник), но торгуя (в режиме теста) с другого символа, мы получаем неидентичные варианты?

Вот пост, где Вы это выразили:

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

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

Я Вам второй раз всё объяснил (Вы это почему-то называете отфутболиванием):

tol64:   

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

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

 Ключевой момент: "Эта проверка оказалась на самом деле даже лишней. Результаты не изменились."
Вы второй раз "не заметили", что проблема не в том, на что Вы уже второй раз указываете, а я во второй раз Вам отвечаю то же самое, но ещё более развёрнуто.

Вы продолжили:

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

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

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

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

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

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

tol64:  

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

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

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

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

2. Если стек событий переполняется старые события удаляются из очереди без обработки.

Давайте по порядку. Есть перечисление событий:

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

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

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

...

код
...

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

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

-----------

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

 И после этого Вы пишите:

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

Тогда есть вопросы. 

1. Какую Вы ожидали реакцию, если Вы твердите одно и тоже, а именно то, что уже неактуально и то, на что Вам уже ответили трижды? 

2. С чего Вы взяли, что я спорю? Если Вы восприняли мои ответы, как спор, то Вы ошибаетесь, так как я отвечал и объяснял, что я делал. Но Вы это восприняли, как спор, потому что сами спорили. ))) 

3. Я никогда не рассчитываю на то, чтобы мою работу сделал, кто-то другой. 

4. Тема нужна не только мне, а также всем тем, кто столкнётся с этой проблемой. Если Вам это не нужно, зачем тогда Вы вступили в диалог? Мой полемический задор был лишь следствием, причина исходила от Вас. 

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

 

Конечно, лично мне не интересно разбирать особенности чужого мировосприятия. Выводы по поводу Вашего полемического задора я уже изложил выше. Добавить ничего. 

 
Yedelkin:

... Добавить ничего. 

Да, лучше не нужно. Иначе это получится пустая болтовня. Вернёмся к теме.

---

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

На этот раз я провёл тесты в режиме - Все тики, от начала 2011 года. Заодно интересно было посмотреть, сколько по времени займёт тот или иной метод. Например, при автоматической проверке экспертов для участия в чемпионате нужно, чтобы эксперт тестировался в режиме "Все тики" не более 15 минут. Для теста я собрал простой эксперт, который торгует по 12 валютным парам. Из условий в нём есть только условие на открытие позиции, Stop Loss, Take Profit, Trailing Stop. Нет наращивания и урезания позиции, нет системы управления капиталом, торгуемый лот фиксированный (0.1). Эксперт написан без единого цикла, то есть максимально упрощён. Рабочий таймфрейм на всех символах H8.

Я оптимизировал параметры для каждого символа отдельно, поочерёдно, используя функцию OnTick(). Окончания оптимизации не дожидался. После 100 проходов останавливал оптимизацию и выбирал не самый лучший вариант, а тот, в котором был наименьший риск.

Частота процессора, на котором проводилось тестирование - 2 GHz. Вот здесь сказано, на что нужно ориентироваться.

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

---

Результаты тестов:

 

Для первого теста использовалась функция OnTimer(), так как именно она в прошлый раз показала практически идентичные результаты. И теперь её результат будет служить эталоном для сравнения.

OnTimer()

Интервал таймера 60 секунд. 

 

 

Тест длился 27 минут. 

 ---

Интервал таймера 300 секунд:

 

 

 Результаты практически идентичны. Длительность теста 26 минут.

---

Интервал таймера 28800 секунд - 8 часов (используемый таймфрейм). 

 

Результаты практически идентичны. Длительность теста 25 минут.

Я также проводил тесты с интервалами 1800 и 3600 секунд, результаты также соответствуют.

-----------

 OnChartEvent()

 Период 1 минута - CHARTEVENT_NEWBAR_M1.

 

Результаты практически идентичны. Длительность теста 37 минут.

---

Период 1 минута - CHARTEVENT_NEWBAR_H1.

 

Результаты практически идентичны. Длительность теста 27 минут.

---

Период 1 минута - CHARTEVENT_NEWBAR_H8.

 

Результаты практически идентичны. Длительность теста 27 минут.

----------

OnTick()  

 

Результаты практически идентичны. Длительность теста 72 минуты.

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

В режиме "Все тики" все методы показали практически идентичные результаты. OnTick() оказался самым долгим вариантом.  Длительность теста  OnTimer() и OnChartEvent()  практически совпадает. 

Отчёт:

 

В итоге:

 Ни один метод не позволяет, в моём случае, даже самого простого мультивалютного эксперта, который торгует по 12 валютным парам на весьма крупном таймфрейме (H8), выставить на чемпионат, так как он не пройдёт проверку (15 минут на тест). Придётся "урезать аппетиты" или искать методы, как максимально эффективно оптимизировать код эксперта. 

---

Интересно, кто-нибудь добился быстрого теста на 12 парах? Сколько занимает времени Ваш тест? 

 
tol64:

Интересно, кто-нибудь добился быстрого теста на 12 парах? Сколько занимает времени Ваш тест? 


 

3. Configuration
capr2011 on EURUSD:H1 every tick 2011.01.01-2011.08.01


4. Start
finished in 3 min 21 sec


5. Statistics
1233 kb of log files
100 trades, 200 deals, profit 83043.82 USD
Причина обращения: