Тестер в терминале MetaTrader 4: Это необходимо знать

Автор: lexy Вторник, Сентябрь 9th, 2014 Нет комментариев

Рубрика: Разное

Работа на финансовых рынках невозможна без наличия торговой системы. Трейдеры тратят много сил и времени на разработку правил открытия и закрытия торговых позиций, эмпирически подбирают методы сопровождения этих позиций следящим стоп-приказом (Trailing Stop). На помощь привлекаются знания из различных областей наук. И когда стратегия создана, на первый план выходит тестирование механической торговой системы (МТС) на исторических данных. А значит, тестер становится важнейшим компонентом любой программы технического анализа.

 

Два вида моделирования: упрощенное и детализированное

Да, возможность тестирования есть далеко не в каждой программе для технического анализа(ТА), тем более не в каждом терминале! И даже там, где тестер заявлен и возможность тестирования есть, возможны ошибки или архитектурные ограничения и запреты. Поэтому при разработке тестера для терминала MetaTrader 4 так важно было сразу заложить такие решения на уровне архитектуры, которые не позволяли бы существовать целому классу стратегий, основанных на знании будущего. Есть два пути при тестировании любой стратегии программно:

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

Треугольник «Current Time» обозначает место, где находится тестер в данный момент. В первом случае, существует Прошлое (Last), где тестер уже обработал данные, и Будущее (Future), куда тестеру еще предстоит прийти. И прошлое и будущее уже рассчитаны (индикаторы, цены закрытия, открытия, High и Low), тестер просто проходит по этой последовательности. И если есть лазейка для подглядывания в будущее (явная или ошибочная), то результаты тестирования на таком тестере требуют тщательной проверки. И закрытие известных лазеек не гарантирует, что не найдутся другие обходные пути. Это потенциально постоянная головная боль разработчика тестера и пользователей тестера.

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

Именно в этом и заключается разница в двух подходах. Первый путь создания тестера дает обманчивую легкость и скорость тестирования, второй дает уверенность в том, что все написанные стратегии будут вести себя в тестере абсолютно так же, как и в режиме торговли реального времени при одинаковых ценовых изменениях. Не случайно, смоделированные для тестера последовательности хранятся в виде файлов, содержащих снимки состояния бара (файлы с расширением fxt), которые можно открыть как и обычный график через меню «Файл» — >> «Открыть автономно».

 

Файлы тестера имеют значок с буквой G (generated) и дают информацию о типе моделирования, диапазоне смоделированных изменений цены, количестве баров и тайм-фрейме:

Например, если мы откроем файл EURUSD M15, то увидим как было смоделировано развитие 15-минутного бара для тестера:

На рисунке показано развитие бара на 15 минутном тайм-фрейме, именно в такой последовательности видел тестер эту 15-минутную свечу (от 10:00 21 апреля 2006 года) при тестировании эксперта. Сколько раз менялась цена на минутном баре — столько раз изменялся вид свечи в процессе тестирования. Таким образом, в каждый момент времени тестер видит корректную цену Open (которая фиксирована и равна Open[0]), корректные максимальную и минимальную цены (которые могут меняться в период развития бара), равные текущему High [0] и Low[0], и последнюю известную цену Bid, равную текущей цене Close[0], которая меняется до закрытия бара. Объемы также моделируются максимально корректно, это видно по нарастающей зеленой гистограмме объемов, как и на обычном графике. Красной ломанной линией показан индикатор Moving Average (простая скользящая) с периодом 1. Эта скользящая средняя показывает где находилась цена Close в каждый момент времени при тестировании.

Важно! Тестер в MetaTrader 4 обрабатывает каждое изменение цены и не позволяет заглянуть в будущее никоим образом.

 

Моделирование на разных тайм-фреймах тестируемого инструмента

Тестер в MetaTrader 4 позволяет видеть не только тестируемый тайм-фрейм, но и другие старшие и младшие тайм-фреймы. Таким образом, если мы тестируем советника на EURUSD M15, то можем смотреть значения индикаторов для EURUSD H1 или EURUSD M5. А также видеть максимальную и миимальную цену текущего нулевого бара на любом доступном тайм-фрейме EURUSD. Если нам необходимо получить максимальную цену текущего дня, мы просто смотрим значение iHigh(NULL,PERIOD_D1,0). Также как и при торговле в онлайне. И не имеет значения на каком периоде мы тестируем советника, или на график какого тайм-фрейма он прикреплен в режиме реального времени.

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

На рисунке показано синим цветом завершенные бары, зеленым цветом текущий изменяющийся нулевой бар. Цифры +1 обозначают поступление нового тика. Каждый новый тик поступает сразу на все необходимые моделируемые тайм-фреймы. Чтобы убедиться в этом, достаточно запустить на тестирование простейший советник CheckModelling.mq4, который выводит видимые тестеру цены в каждый момент времени.

Корректно моделируются все запрашиваемые тайм-фреймы, причем не только цены, но и объемы. Тестер видит синхронное развитие цены на каждом тайм-фрейме, как и в реальной жизни:

 

Видно, что цена Low для 15-минутного тайм-фрейма отличается от цены Low вышестоящих тайм-фреймов. Аналогично с ценой High. При этом цена Bid на всех тайм-фреймах одинакова при поступлении нового тика.

Важно: моделирование всех тайм-фреймов родного инструмента происходит также корректно — цены Open, High, Low и Close моделируются 100% корректно.Объемы старших тайм-фреймов также моделируются 100% корректно.

 

Моделирование цен на других инструментах

Объемы смоделированных данных для точного тестирования на истории порой достаточно велики и могут быть требовательны к ресурсам памяти и процессора. Тестер в MetaTrader 4 не позволяет проводить портфельное тестирование, но развитие компьютерной техники идет такими темпами, что, возможно, в скором времени станет доступным и точное тестирование сложных стратегий, открывающих позиции на множестве инструментов. Несмотря на это, тестер в МТ4 позволяет получать данные о ценах других символов, отличных от тестируемового. При этом моделирования не происходит, а данные берутся как есть. Нулевой бар упрощается до представления на начальной стадии развития High[0]=Low[0]=Close[0]=Open[0], Volume[0]=1, что позволяет узнать цену на начало бара, но не на конец. Чтобы убедиться в этом, достаточно запустить на тестирование простой эксперт на EURUSD M15 в режиме «Every tick».

//+------------------------------------------------------------------+
//|                                               CheckModelling.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.ru/"

//---- input parameters
extern int       DayS=21;
extern int       MonthS=4;
extern int       YearS=2006;
extern int       HourS=10;
extern int       MinuteS=00;
extern int       CounterS=20;
int counter;
int start()
  {
//----
   if (counter>CounterS) return;
   if (Year()<2006) return;
   if (Month()<MonthS) return;
   if (Day()<DayS) return;
   if (Hour()<HourS) return;
   if (Minute()<MinuteS) return;
   Print("My time frame   "," Open=",Open[0],"  High=",High[0],"   Low=",Low[0],
      "  Close=",Close[0],"  Volume=",Volume[0],"  Bid=",Bid);
   Print("30 minute frame "," Open=",iOpen(NULL,PERIOD_M30,0),"  High=",iHigh(NULL,PERIOD_M30,0),
      "   Low=",iLow(NULL,PERIOD_M30,0),"  Close=",iClose(NULL,PERIOD_M30,0),
      "  Volume=",iVolume(NULL,PERIOD_M30,0),"  Bid=",Bid);
   Print("1 hour frame    "," Open=",iOpen(NULL,PERIOD_H1,0),"  High=",iHigh(NULL,PERIOD_H1,0),
      "   Low=",iLow(NULL,PERIOD_H1,0),"  Close=",iClose(NULL,PERIOD_H1,0),
      "  Volume=",iVolume(NULL,PERIOD_H1,0),"  Bid=",Bid);
   Print("4 hour frame    "," Open=",iOpen(NULL,PERIOD_H4,0),"  High=",iHigh(NULL,PERIOD_H4,0),
      "   Low=",iLow(NULL,PERIOD_H4,0),"  Close=",iClose(NULL,PERIOD_H4,0),
      "  Volume=",iVolume(NULL,PERIOD_H4,0),"  Bid=",Bid);

   counter++;
//----
   return(0);
  }
//+------------------------------------------------------------------+

 

Расчеты индикаторов при моделировании

Десять лет назад недостаточные мощности домашних компьютеров и рабочих станций диктовали свои условия разработчикам программного обеспечения. Ограничения на оперативную память, менее 100 MГц тактовая частота процессора — все это позволяло применять только самые экономные виды расчета и тестирования торговых стратегий. Внутрибарного моделирования не существовало как понятия, все необходимые индикаторы рассчитывались заранее и подавались тестеру в готовом неизменном виде. Тогда это было единственным решением, которое накладывало свои ограничения на тестирование. При таком подходе мы имеем корректные значения индикаторов только на момент закрытия бара, использовать эти значения на нулевом баре фактически означало подсматривать в будущее.

Тестер в MetaTrader 4 не получает никаких готовых рассчитанных данных, он получает только моделированное развитие цены, и на основании поступающих новых цен в процессе тестирования производится расчет всех необходимых индикаторов на лету. То есть, все индикаторы рассчитываются точно таким же образом, как и при работе в режиме онлайн. Это большой плюс для тестера, но если алгоритм индикатора написан не оптимально, то тестирование советника может существенно замедлиться. Сам по себе расчет индикатора в тестере происходит так же быстро, как и в терминале, и неоптимизированный алгоритм может себя не проявить. Но в тестере MetaTrader4 при расчетах на миллионах баров (аминутная история по EURUSD c 1999 года близка к трем миллионам баров) любая неоптимальность сразу проявляется. Не забывайте, что потиковое моделирование минутного барадает не один, а несколько тиков, каждый из которых тестер обсчитывает.

В наше время процессоры работают уже с гигабайтами оперативной памяти на частотах в несколько гигагерц, на смену 32-ти битовой архитектуре идут уже 64 битовые системы и появилась многопроцессорность. Но многие по-прежнему думают категориями прошлого века, и проецируют все недостатки программ ТА предыдущих поколений и производителей на тестер MetaTrader 4. Эти люди пугаются внутрибарного моделирования, для них оно — синоним некорректной работы тестера. Тестер в MetaTrader 4 показывает и доказывает не только возможность достоверного моделирования цены на любом тайм-фрейме, но и необходимость именно такого подхода при тестировании стратегий на исторических данных.

Вы можете посмотреть видео и оценить, как происходит развитие цены и расчет индикаторов в тестере:

 

Важно: тестер реализует реальную модель тестирования, а это требует определенных ресурсов.

 

Наиболее частые вопросы из-за незнания правильного моделирования цены в тестере

MetaTrader 4 официально выпущен 1 июля 2005 года, и все эти годы на многих форумах продолжают возникать одни и те же вопросы, связанные с неправильным пониманием работы тестера. Здесь собраны наиболее частые вопросы, порожденные мифами о тестерах прошлых лет.

  • Почему у меня советник, использующий индикатор, открывает сделки не там?После окончания тестирования кнопкой «Open chart» можно открыть график, на котором будут видны все точки входа и выхода, а также все индикаторы, которые вызывались из эксперта. При этом часто забывается, что значения индикатора, рассчитанные на истории в данный момент могут существенно отличаться от значений, которые были в момент тестирования (фактически, в режиме онлайн). Яркий пример такого индикатора — индикатор ZigZag.

    После открытия графика тестирования эксперта, в котором использовались вызовы этого индикатора мы можем хорошо видеть переломы ZigZag’a. Стратегия, построенная на отслеживании таких переломов на нулевом баре, вроде бы должна давать хорошую прибыль. Многие, не понимающие работы тестера MetaTrader 4 ошибочно полагают, что такая стратегия должна в тестере показывать безусловную прибыль, потому что в других программах теханализа для такой стратегии происходит подглядывание в будущее. Но прибыли нет, и более того, сделки открываются совсем не там! Запустите тестирование в визуальном режиме, наложите все индикаторы, которые вызываются данным экспертом — и иллюзии пройдут! Для этого не требуется специальных знаний — тестер сам все покажет в визуальном режиме. Пример такого эксперта прилагается — ExpertZigzag:

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

  • Почему показания индикатора в советнике при тестировании и показания индикатора на онлайновом графике не совпадают?Одна из ошибок при написании индикаторов — некорректный расчет значений индикатора и нарушения в логике. Такая ситуация приводит к тому, что индикатор начинает «врать» со временем, в нем начинают накапливаться ошибки. Другими словами, индикатор вчера показывал другие значения нежели значения на том же участке сегодня.

    Ошибку в таких индикаторах можно увидеть и в режиме онлайновой работы индикатора. Например, накладываем индикатор на 15 минутный график, ждем появление 3-4 новых баров и накладываем еще один такой же индикатор, но с другими цветами. Разницу зачастую можно будет увидеть даже визуально. Пример такого некорректного индикатора прилагается:

    Важно: индикаторы в тестеры рассчитываются «на лету» как при онлайновой работе, поэтому все ошибки в логике индикатора проявятся и в процессе тестирования!

  • Почему мой советник видит неправильные цены старшего таймфрема, хотя я импортировал мою собственную глубокую историю?Для моделирования тестер использует данные из fxt-файла. Обычно этот fxt-файл генерируются самим тестером на основании имеющейся истории в файлах с расширением *.hst (history). Но если подготовленный fxt-файл сгенерирован в другой тайм-зоне, или по котировкам другого брокера (или подготовлен самостоятельно — формат fxt файлов открыт), и при этом данные в этом fxt-файле не соотвествуют данным в существующих hst-файлах — то возможны всякие казусы. Обычно такое бывает после ручного импорта и переконвертирования котировок из сторонних источников.

    Например, в советнике происходит обращение к функции iOpen(NULL, PERIOD_D1,1) или iHighest(NULL,PERIOD_D1,MODE_HIGH,20,1). Выражение iOpen(NULL, PERIOD_D1,1) запрашивает цену открытия вчерашнего дня на том же символе, на котором происходит тестирование. Выражение iHighest(NULL,PERIOD_D1, MODE_HIGH,20,1) дает индекс дневного бара, который имеет самый высокий High на протяжении 20 баров начиная с первого (вчерашнего дня). Обе функции в тестере вычисляются на основании данных из hst-файлов.

    И если файл fxt не соответствует хранящейся истории в hst-файлах(в данном примере данные по EURUSD1440.hst), то в тестере будут совсем другие цены. Получаются две разные истории — одна в тестере и другая в файле EURUSD*.hst.

    Важно: для корректного тестирования необходимо соотвествие между данными в fxt и hst файлах. Нежелательно использовать кусочный импорт котировок из сторонних источников. Используйте штатный History Center с минутной историей котировок с 1999 года. Минутные котировки из History Center автоматически пересчитываются во все таймфреймы и конвертируются в таймзону текущего счета, что обеспечивает отсутствие «временных сдвигов».

  • Почему после импорта моих котировок в тестере врут индикаторы со старших тайм-фреймов?Так как моделируются только цены нулевого бара, то значения стандартных и пользовательских индикаторов на остальных барах происходит на основании данных из hst-файлов. То есть, расчет правильных значений индикатора невозможно получить без корректных исходных ценовых данных других таймфреймов.

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

 

Заключение

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

При подготовке статьи были использованы сообщения из веток форума:

  • «Снова про индикаторы в Экспертах — вопрос к разработчикам»
  • «Проблемы при тестировании»
Прикрепленные файлы:
 CheckModelling.mq4 (2.5 Kb)
 ExpertZigzag.mq4 (1.5 Kb)
 InconsistentIndicator.mq4 (2.6 Kb)
Источник: mql4.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты