Тестирование экспертов в клиентском терминале MetaTrader 4. Взгляд изнутри

Slava | 13 августа, 2006

Чтобы провести тестирование, необходимо открыть окно "Тестер", если оно ещё не открыто. Сделать это можно несколькими способами: из главного меню выбрать "Вид-Тестер стратегий", комбинация клавиш Ctrl+R, кнопка "Тестер стратегий" на панели инструментов, из контекстного меню графика, к которому присоединён эксперт выбрать "Советники-Тестирование стратегии" либо нажать клавишу F6.

Перед началом тестирования необходимо выбрать советника. Советника можно выбрать из выпадающего списка, либо перетащить советника мышкой из окна "Навигатор" и бросить его в окне "Тестер". Таким же способом можно выбрать символ инструмента для тестирования - выбрать из выпадающего списка либо перетащить символ из окна "Обзор рынка". Нажатие на клавишу F6 позволяет одновременно выбрать советника, символ и период активного графика, для этого к активному графику должен быть присоединён советник.

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

static datetime prevtime=0;
...
if(prevtime == Time[0]) return(0);
prevtime = Time[0];

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

При нажатии на кнопку "Старт" сначала формируется тестовая последовательность изменения цены, которая кешируется в файле с расширением FXT. Все FXT-файлы сохраняются в директории <client_terminal_dir>\tester\history и имеют имя типа SSSSSSPP_M.fxt, где:

  • SSSSSS - символ тестируемого инструмента;
  • PP - значение периода тестируемого инструмента в минутах;
  • M - модель тестирования (0 - "Все тики", 1 - "Контрольные точки", 2 - "По ценам открытия").

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


Зачем же каждый раз пересчитывать уже существующие данные?

Необходимо пояснить, как формируется тестовая последовательность, если используются начальная и конечная даты (должна быть включена соответствующая настройка, галочка "Использовать дату"). Тестовая последовательность начинается не с начальной даты. Перед тем как начать генерацию тиков, тестер помещает 1 тысячу готовых немоделируемых баров в начало последовательности. Если начальных баров меньше, то используются все бары от начала истории, но не меньше 100. Таким образом, если начальная дата установлена слишком близко относительно начала всей истории, то генерация тиков может начаться позже указанной даты. Мы должны обеспечить как минимум 100 баров до начала теста. Начальные бары в последовательности необходимы для того, чтобы у эксперта была возможность правильно посчитать индикаторы, основанные на предыдущих данных (особенно это касается скользящих средних). Вот как выглядит сгенерированная последовательность развития бара на основе смоделированных тиков с установленной начальной датой 2007.08.01:

Моделирование прекращается при достижении конечной даты. Ценовые данные с 0:00 конечной даты в тестировании не участвуют и в сгенерированную последовательность не попадают. Если указаны даты, выходящие за пределы истории или использование дат не включено, то в генерации участвует вся история (за исключением первых 100 баров). Настройка максимального количества баров на графике не имеет никакого значения для моделирования - используется вся история, хранящаяся на диске.

Если при формировании тестовой последовательности оказывается, что соответствующих исторических данных меньше, чем 100 баров, то в журнале тестирования появится сообщение "TestGenerator: deficient data", и тестер не будет запущен. Также возможна ситуация, что данных совсем нет, часто из-за неправильно указанного диапазона дат, и в журнале тестера появится сообщение "TestGenerator: no history data". В этих случаях необходимо обеспечить необходимое количество исторических данных, для этого можно открыть соответствующий график и вручную, клавишей PageUp, подкачать данных. После этого заново запустить тестер.

Перед запуском тестера необходимо установить входные параметры тестируемого эксперта. Особое внимание необходимо обратить на валюту депозита. Например, при открытом аккаунте типа micex, тестирование эксперта на символе GAZP не даст результата, если в качестве валюты депозита не указать RUB (это значение можно ввести вручную, несмотря на то, что его нет в выпадающем списке):


Вкладка "Входные параметры" будет присутствовать только в том случае, если в эксперте объявлены внешние переменные. Разные наборы значений входных параметров можно сохранять в set-файлы под разными именами (кнопка "Сохранить") и в дальнейшем их использовать (кнопка "Загрузить").


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

После того, как процесс тестирования завершён, можно открыть график с нанесёнными на него стрелочками торговых операций и использованными в процессе тестирования индикаторами. Однако, есть проблема с тем, что использованные в процессе тестирования индикаторы будут отображены с умолчательной расцветкой. Например, если использовались скользящие средние с разными периодами усреднения, то все они будут отрисованы красным цветом, что не очень удобно. Можно вручную поменять цвета индикаторов, но есть другой выход. Если заранее создать шаблон <имя_эксперта>. tpl (например, Moving Average.tpl) с нанесёнными индикаторами, то этот шаблон будет использован при открытии "тестового" графика. При отсутствии соответствующего шаблона будет применён шаблон tester.tpl.

Тестер стратегий поддерживает так называемую визуализацию процесса тестирования.


Если включена галочка "Визуализация", то при старте тестера автоматически открывается "отладочный" график с применением шаблонов <имя_эксперта>. tpl или tester.tpl. На графике отображается текущее состояние тестовой последовательности. Изменение скорости отображения достигается путём использования бегунка слайдера, влево - замедление, вправо - ускорение. Для паузы можно нажать кнопку "||" либо клавишу Pause на клавиатуре, для возобновления после паузы - нажать кнопку ">>" либо, опять же, клавишу Pause. В состоянии паузы можно нажать клавишу F12, таким образом можно обеспечить ручную пошаговую визуализацию. Можно указать дату и нажать кнопку "Пропустить до". В этом случае пока тестер не дойдёт до указанной даты, перерисовка графика осуществляться не будет, что значительно ускоряет процесс. После завершения процесса тестирования (в том числе по нажатии кнопки "Стоп") на графике будет отображено состояние исторических данных на момент остановки.

При просмотре графика тестирования двойной клик мышью на каком-либо его участке обеспечивает переключение на вкладку результатов и выделение соответствующей позиции. Если был открыт график тестирования (включение галочки "Визуализация", либо после нажатия кнопки "Открыть график"), то двойной клик на какой-либо позиции во вкладке "Результаты" переместит график на соответствующую дату.

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


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


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

Довольно частой причиной заявлений "оптимизатор стратегий не работает" является как раз то, что по умолчанию неудачные результаты в список не попадают. В этом случае в журнале тестера появится сообщение "NNN results have been discarded as insignificant".

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

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

Тестер не может контролировать изменение библиотек второго и выше уровня (то есть библиотеки, которые вызываются из библиотек)! Поэтому, в таких случаях необходимо сбрасывать кеш самостоятельно, например путём перекомпиляции эксперта. Файлы кешированных данных оптимизатора хранятся в директории tester\caches

Кеширование результатов оптимизации помогает также и при включении генетического алгоритма. Генетический алгоритм оптимизации включается в свойствах эксперта во вкладке "Тестирование".


Параметры генетического алгоритма определяются автоматически.

Журнал тестирования находится в директории tester\logs. Файлы журнала тестирования имеют расширение log. Каждому дню соответствует отдельный log-файл. Логи тестера уничтожаются автоматически через 5 дней. Также в контекстном меню вкладки "Журнал" можно выбрать пункт "Стереть все журналы". Текущее содержимое вкладки "Журнал" будет уничтожено, все log-файлы будут стёрты.

Так как в процессе тестирования возможен массовый вывод информации в журнал, то не вся информация может попасть во вкладку "Журнал", но гарантированно попадает в log-файл. При оптимизации вывод в журнал не производится.

После завершения тестирования можно освободить больше неиспользуемую тестером оперативную память. Для этого достаточно закрыть окно "Тестер" либо из главного меню, либо комбинацией клавиш Ctrl-R либо при помощи кнопки "Тестер стратегий" на панели инструментов.