English 中文 Español Deutsch 日本語 Português
Неторгующий эксперт тестирует индикаторы

Неторгующий эксперт тестирует индикаторы

MetaTrader 4Примеры | 21 мая 2008, 10:47
2 110 12
Sergey Kravchuk
Sergey Kravchuk

Введение

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

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

Сиутация усложняется и становится почти тупиковой в случае динамических индикаторов. Примером такого индикатора может служить практически любой индикатор каналов. Как правило, эти индикаторы рисуют одну или несколько линий, показывающих коридор движения цены. Естественно, что эти линии строятся для текущего момента, и приход новых цен, значительно отличающихся от совсем недавних, могут изменить расположение линий на совершенно противоложное в течении нескольких секунд. Оценить насколько правильно работает такой индикаторо во всех возможных случаях расположений цен только по последней точке текущей цены просто невозможно. Вы можете почти все время видеть правильную работу индикатора на протяжении нескольких часов, и решите что он работает правильно, однако именно в момент принятия вами решения торговать, на рынке может сложится та самая ситуация, в которой он отрабатывает не правильно (ниже приведен пример неправильного построения скользящих каналов Баришпольца одним из индикторов), и вы, доверившись прошлому его "опыту", откроетесь совсем не в том направлении куда следовало. И сам индикатор буквально через пару баров, восстановит свое прежнее "правильное" показание. Но вам то что до того? - ваша открытая позиция уже убыточна!

Тестер тестирует индикаторы

Основное назначение тестера стратегий - тестировать торговые советники. Поскольку некоторые из советников используют в своей работе индикаторы, тестер также должен уметь работать с ним в режиме тестирования. Этим мы и воспользуемся!

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

Неторгующий эксперт-фотограф

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

Единственная функция которую мы поручим ему делать - снимать скриншоты текущего состояния. Они нам сильно пригодятся при пошаговом анализе работы индикатора. Вот код эксперта:

//+------------------------------------------------------------------+
//|                                              IndicatorTester.mq4 |
//|                           Copyright © 2006-2008, Sergey Kravchuk |
//|                                         http://forextools.com.ua |
//+------------------------------------------------------------------+
 
#property copyright "Copyright © 2006-2008, Sergey Kravchuk. http://forextools.com.ua"
#property link      "http://forextools.com.ua"
 
//+------------------------------------------------------------------+
 
extern datetime ScreenShotStart=0; // дата и время снятия первого скриншота
extern int ScreenShotMax=100;      // сколько скриншотов нужно сделать
extern int ScreenShotStep=0;       // шаг съемки: <=0-не делать, N-на каждом N-ом баре
extern string FilesPrefix="_";     // префикс для имен файлов скриншотов
 
//+------------------------------------------------------------------+
 
datetime   NextScreenShot=0;       // дата время когда делать следующий скриншот
double ScreenShotCnt=0;            // подготовим счетчик скриншотов
double ScreenShotCur=0.001;        // номер начального скриншота
string FileName;                   // имя файла для записи очередного скриншота
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
 
int start()
{
  if(ScreenShotStep>0                       // нужно ли вообще делать снимкм?      
    && ScreenShotStart<=Time[0]             // уже наступило время начала съемки?
    && NextScreenShot<=Time[0]              // пора делать следующий кадр?
    && ScreenShotCur*1000<=ScreenShotMax+1) // еще не все снимки сняты?
  {
    // соберем имя файла и запишем в него скриншот
    FileName=FilesPrefix+StringSubstr(DoubleToStr(ScreenShotCur,3),2)+".gif";   
    WindowScreenShot(FileName,800,600);
   
    // выдадим подсказочку
    Comment("Записан файл "+FileName+
    "\nЕще осталось "+DoubleToStr((ScreenShotMax-ScreenShotCur*1000),0) +" шт.");
   
    // продвинем дату и счетчик на следующий снимок
    ScreenShotCur+=0.001;
    NextScreenShot=Time[0]+ScreenShotStep*Period()*60;   
  }
 
  if(ScreenShotCur*1000>ScreenShotMax+1) Comment("Все скриншоты записаны");
 
  return(0);
}
//+------------------------------------------------------------------+

Алгоритм съемки скриншотов достаточно прост: дожидаемся момента времени с которого мы хотим начать делать серию снимков (ScreenShotStart) и затем каждый ScreenShotStep бар снимаем до ScreenShotMax скриншотов. Каждый скришот записывается в файл, имя которого начинается с заданного префикса FilesPrefix, к которому пристыковывается номер снимка.

Для формирования номера с лидирующими нулями (это необходимо для правильной сортировки снимков, иначе _10.gif будет идти сразу после _1.gif а только потом появится _2.gif) используется немножно необычный способ нумерации. Нумерация начинается с ScreenShotCur=0.001; и далее идет с шагом 0.001 (ScreenShotCur+=0.001;). Сам номер получается преобразованием десятичного числа в строку символов из которой в качестве номера выделяется подстрока начиная со 3-го символа. Таким образом мы отрезаем начальные "0." и получаем лидирующие нули перед цифрами номера. Такой способ позволяет накопить до тысячи снимков, что более чем достаточно для анализа. Если же вам этого будет мало - увеличьте "дробность" начального числа и шага до 0.0001 и вы сможете накопить до 10 тысяч снимков.

Приступаем к тестированию

Теперь, когда у нас все готово и эксперт откомпилировался без ошибок, приступаем к процессу тестирования. Запускаем тестер стратегий через меню Вид | Тестер стратегий или горячей клавишей Ctrl+R. В поле Советник выбираем наш советник IndicatorTester. Далее - валютную пару и тестируемый период. При необходимости выбираем диапазон тестирования в поле "Использовать дату" От и До. Для активации режима визуального тестирования взводим галочку Визуализация. Теперь можно нажать кнопку Свойства эксперта и задать необходимые параметры съемки скриншотов.

Ну вот - почти все готово. Нажимаем кнопку Старт и сразу же за ней кпопку Пауза, расположенную справа от движка регулировки скорости визуализации. Эксперт приостанавливает свою работу. Теперь вы можете присоединить к графику тестируемый индикатор и отпустив кнопку Пауза продолжить тестирование эксперта. Как мы помним, эксперт не выполняет никаких торговых операций. Но тестер об этом не знает и добросовестно тик за тиком, бар за баром обрабатывает котировки. Поскольку к графику присоединен один или несколько индикаторов, тестер вынужден их пересчитывать и перерисовывать, поскольку в нормальной работе показаниями этих индикаторов может пользоваться нормальный эксперт.

Ну вот. Теперь как пишут некоторые программы-установщики "откинтесь на спинку кресла и наблюдайте" как работает ваш индикатор. В любой момент вы можете приостановить тестирование (нажав кнопку Пауза) а также ускорить или замедлить его скорость. Когда тестер дойдет до назначенной вами даты/времени ScreenShotStart он начнет с заданной периодичностью снимать скриншоты и складывать их в каталог c:\Program Files\MetaTrader 4\tester\files. Если вам не нужны скришоты и вы просто хотите посмотреть за работой индикатора, перед нажатием кнопки Старт задайте параметр эксперта ScreenShotStep меньше или равным нулю и автосъемка будет отключена.

Пример использования

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

Для сравнения различных методик построения СКБ я написал собственный индикатор, который тоже строит каналы, но "более объективно" - по линии среднего движения цены, очень похоже на то, как это делает стандартный инструмент Равноудаленный канал, но немного по другому алгоритму построения границ канала (кому интересны детали - можете прочесть правила его построения на моем сайте на страничке Метод двух каналов). Вот теперь давайте посмотрим как будет себя вести один из индикаторов СКБ (SHI_Channel_true) размещенный в Разделе CodeBase по сравнению с "правильным" каналом средней цены. Линии тестируемого индикатора рисуются зеленым цветом, линии длинного (недельного) канала из индикатора двух каналов - рыжие, и короткий (33 часовой) канала - голубыми, которые становятся красными, при приближении цены к границам канала.


Фильм - фильмом, а давайте теперь подробно рассмотрим некоторые снятые кадры.

На отрезке с 4 по 7 декабря 2007 года (EURUSD M30) мы видим сколько раз СКБ "переворачивается" и возвращается к линии средней цены.


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


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


Произошло это потому, что новая котировка превратила точку экстремума в обычную внутреннюю точку, и индикатор снова отработал это изменение. На следующем баре снова переворот:


Еще пара-тройка баров - снова переворот:


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


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


Заключение

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

Важной особенностью предлагаемой методики тестирования индикаторов является возможность снятия скриншотов. Многие программы просмотра изображений (например бесплатная IrfanView) умеют показывать файлы в режиме листания. Нажимая кнопку PageDown вы переходите к следующему снимку, как бы вручную в тестере переходите к следующему бару. Но вот чего нельзя сделать в тестере и легко делается в IrfanView - это переход к предыдущему бару. Просто нажмите PageUp и вы "пошли по истории назад". Еще одно нажатие - и вернулись еще раньше. Это позволяет не просто просматривать поведение индикаторов, но и внимательно изучать их и находить причины их неправильного поведения.


Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (12)
[Удален] | 28 мая 2008 в 05:48
А я давно пользуюсь подобным индикатором, только вот при приближениии цены к какой-либо границе канала у меня появлялось по краям, к примеру нисходящего сопротивления, еще 2 тонких штриховых красных линии, как бы одна внутри канала, другая снаружи, но потом я тоже отошел к варианту с простым изменением толщины и цвета. И использую в основном только каналы Н4, Н1 и М30. Кому нужен индикатор обращайтесь!
Сергей
Сергей | 11 июн. 2008 в 19:16
Заинтересовал индикатор по методу двух каналов. К сожалению потестировать его не удалось из-за ограничения по валютной паре CADJPY. Такой валютной пары нет в демо счёте ни у Альпари, ни у Укрсоцбанка. Что можете сказать на этот счёт?
Sergey Kravchuk
Sergey Kravchuk | 11 июн. 2008 в 21:13
Climber:
... CADJPY. Такой валютной пары нет в демо счёте ни у Альпари, ни у Укрсоцбанка. Что можете сказать на этот счёт?
Она есть в demo.metaquotes.net (только что проверил)
Сергей
Сергей | 11 июн. 2008 в 22:47

ForexTools писал(а):

Она есть в demo.metaquotes.net (только что проверил)

Спасибо. Не знал про такой вариант. Буду пробовать.
[Удален] | 24 мая 2010 в 23:42

Приветствую Вас!

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

Задаваемые параметры в индикаторе:

extern datetime ScreenShotStart=2009.01.05. 00:00

extern int ScreenShotMax=100;

extern int ScreenShotStep=3;
extern string FilesPrefix="_eur";

Интеграция MetaTrader 4  с MS SQL-сервером Интеграция MetaTrader 4 с MS SQL-сервером
В статье показан пример интеграции клиентского терминала MetaTrader 4 и сервером MS SQL посредством использования dll. Приложены как исходные коды на С++ и MQL4, так и готовый скомпилированный проект Visual C++ 6.0 SP5.
Заблуждения, Часть 2: Статистика - лженаука, или Хроника пикирующего бутерброда Заблуждения, Часть 2: Статистика - лженаука, или Хроника пикирующего бутерброда
Многочисленные попытки применения методов статистики к объективной реальности, т.е. к финансовым рядам, разбиваются о скалы нестационарности процессов, «толстохвостости» сопутствующих вероятностных распределений и недостаточного объема финансовых данных.В данной публикации я попытаюсь обратиться не к финансовым рядам как таковым, а к их субъективному отражению – в данном случае к тому, как эти ряды пытается оседлать трейдер, т.е. к торговой системе. Выявление статистических закономерностей процесса, описывающего результаты сделок, оказывается довольно увлекательным занятием. В некоторых случаях возможно даже сделать вполне достоверные выводы о модели этого процесса и применить эти выводы к торговой системе.
Show Must Go On... или очередное возвращение к ZigZag'у Show Must Go On... или очередное возвращение к ZigZag'у
Об одном очевидном и, одновременно, нестандартном методе построения ZigZag'а и о том, что из этого получилось - индикаторе Мультифреймовый Фрактальный ZigZag, отображающем на одном, рабочем, таймфрейме (ТФ) ZigZag'и, построенные на трех старших. В свою очередь, величины старших ТФ могут быть нестандартными, в диапазоне от M5 до MN1.
Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Часть 5) Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Часть 5)
В этой статье автор предлагает способы улучшения торговых систем, представленных в его предыдущих статьях. Статья будет интересной для трейдеров, уже имеющих опыт в написании экспертов.