English 中文 Español Deutsch 日本語 Português
Тестер в терминале MetaTrader 4: Это необходимо знать

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

MetaTrader 4Тестер | 18 июля 2007, 02:39
13 548 14
MetaQuotes
MetaQuotes

Введение

Работа на финансовых рынках невозможна без наличия торговой системы. Трейдеры тратят много сил и времени на разработку правил открытия и закрытия торговых позиций, эмпирически подбирают методы сопровождения этих позиций следящим стоп-приказом (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 года, и все эти годы на многих форумах продолжают возникать одни и те же вопросы, связанные с неправильным пониманием работы тестера. Здесь собраны наиболее частые вопросы, порожденные мифами о тестерах прошлых лет.

  • Почему у меня советник, использующий индикатор, открывает сделки не там?

    После окончания тестирования кнопкой "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.52 KB)
ExpertZigzag.mq4 (1.46 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (14)
[Удален] | 1 февр. 2009 в 15:53
Помогите пожалуйста новичку. В хелпе ответа не нашел и на форуме тоже. Почему не проходит оптимизация советника и не выводятся ее результаты, а иногда и не тестирует? На демо торгует. В настройках самого советника при оптимизации естественно выставляю галочки на тех параметрах которые необходимо оптимизировать.
[Удален] | 4 мая 2009 в 11:00
В тексте статьи картинки тестера с чёрно-белыми свечами и всё-такое красивое. А когда я запускаю тестер в режиме "visual" - рисует зелёными барами на чёрном фоне. Задолбался искать настройки!!! Если тупо переключить режим окна - теряются изображения торговых сделок и всё другое, и восстановить их никак не получает - история сделок (в отличие от реала) нигде не прописана. Подскажите, люди добрые, дайте ссылку!
[Удален] | 4 мая 2009 в 12:13
alexpert007:
В тексте статьи картинки тестера с чёрно-белыми свечами и всё-такое красивое. А когда я запускаю тестер в режиме "visual" - рисует зелёными барами на чёрном фоне. Задолбался искать настройки!!!
Настройте график как Вам нужно и сохраните шаблон с именем tester.tpl
Oleg
Oleg | 11 янв. 2010 в 23:22

Есть несколько вопросов с которыми необходимо разобраться:


1. Я хочу провести оптимизацию на 30-минутном таймфрейме - насколько я понял достаточно подгрузить только историю 1-минуток. Все остальные промежуточные таймфреймы сгенерируются автоматически из минуток, верно? Зачем тогда в в архив помещена история 5, 15, 30 и т.д.? Когда они вообще нужны?


2. Если я хочу протестировать один и тот же Советник на платформах трех брокеров начиная с 1999 года то мне придется подгружать историю 1-минуток

из MetaQuotes History Center - все три загруженных файла изначально будут помещены в директорию "\history\..\EURUSD1.hst" - это одни и те же исторические данные во всех трех случаях??? Или эти данные на каждой платформе оптимизированы под конкретного брокера? (как насчет 4 или 5 цифр после запятой?)


3. Сегодня на одной платформе (очень известного брокера) обнаружилась странная вещь - вручную удалил все файлы истории (включая файл FXT из тестера),

в настройках МТ установил по максимумам количества видимых Баров в окне и Баров на истории (об этом кстати тоже неплохо было бы упоминуть - это совсем не очевидно!), перегрузил МТ, загрузил 1-минутки с 1999 года, перегрузил МТ.

- После этого запустил тестирование Советника на истории и получил результат: 65 000 $.

- После этого взял один параметр со значением 33 и провел его оптимизацию по значениям 32, 33, 34 - Оптимизация для 33 показала уже бОльший результат

чем это было при тестировании (78 000 или 88 000$).

- Затем с теми же начальными параметрами Советника (33) запустил еще одно тестирование - все условия как и в прежнем тестировании, зато теперь прибыль > 100 000$ !!!

Вывод - тестирование после "пустой" оптимизации принесет на 20-30% больше денег :)

- Можно ли доверять такому тестеру?


4. Пытался (уже после обнаружения проблемы и удаления всех файлов истории) импортировать HST-файл одного брокера в МТ другого брокера.

Сразу после этого бары с 1999 года появились в окне. Перегрузил МТ и запустил тестрование (или оптимизацию, не помню) - он видит только историю с 2009 года, вместо 1999. Что это значит?


Спасибо!





[Удален] | 7 янв. 2012 в 09:11

Цитата

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

Тестер видит. А мы можем видеть движение цены на этих графиках?

Цитата

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

Тестер в MetaTrader 4 позволяет видеть не только тестируемый тайм-фрейм, но и другие старшие и младшие тайм-фреймы."

Хотелось бы видеть, причем одновременно на четырех графиках.

Что такое Мартингейл и имеет ли смысл им пользоваться? Что такое Мартингейл и имеет ли смысл им пользоваться?
В статье содержится подробное описание системы мартингейл, а также точные математические вычисления необходимые для ответа на вопрос "Имеет ли смысл применять мартингейл?".
Стратегия торговли, основанная на Анализе Точек Вращения (Pivot Points) Стратегия торговли, основанная на Анализе Точек Вращения (Pivot Points)
Анализ Точек Вращения (Pivot Points, PP) - одна из самых простых и эффективных стратегий для рынков с высокой степенью внутридневной волатильности. Она применялась еще в докомпьютерную эпоху, когда трейдеры, работающие на бирже, не имели возможности применять какую-либо вычислительную технику, кроме бухгалтерских счетов и арифмометров.
Брейкпойнты в тестере – это возможно! Брейкпойнты в тестере – это возможно!
Статья посвящается программной эмуляции точки останова при прогоне на тестерe с выводом отладочной информации.
Как сократить код торгового эксперта, попутно упростив себе жизнь и уменьшив число возможных ошибок Как сократить код торгового эксперта, попутно упростив себе жизнь и уменьшив число возможных ошибок
Простая концепция, изложенная в данной статье, позволит разработчикам МТС на MQL4 упростить существующие торговые системы, а также сократить время разработки новых систем за счет сокращения объема кода торговых экспертов.