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

Sergey Kravchuk | 21 мая, 2008


Введение

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

Статическим являются подавляющее число индикаторов теханализа. Возьмем для примера тот же 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 и вы "пошли по истории назад". Еще одно нажатие - и вернулись еще раньше. Это позволяет не просто просматривать поведение индикаторов, но и внимательно изучать их и находить причины их неправильного поведения.