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

MetaQuotes | 18 июля, 2007

Введение

Работа на финансовых рынках невозможна без наличия торговой системы. Трейдеры тратят много сил и времени на разработку правил открытия и закрытия торговых позиций, эмпирически подбирают методы сопровождения этих позиций следящим стоп-приказом (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. |
//|                                        https://www.metaquotes.net/|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
 
//---- 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 года, и все эти годы на многих форумах продолжают возникать одни и те же вопросы, связанные с неправильным пониманием работы тестера. Здесь собраны наиболее частые вопросы, порожденные мифами о тестерах прошлых лет.


Заключение

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