Визуализация тестирования. Расширение функциональности.

Andrey Khatimlianskii | 18 августа, 2006

1. Мотивация

В 196-м билде клиентского терминала MetaTrader 4 появилась функция визуализации тестирования. Она позволяет контролировать процесс тестирования экспертов на качественно новом уровне. Теперь трейдер-программист может наблюдать за каждым действием своего эксперта, проверяя его работу на истории!

Об использовании визуализатора вы можете прочитать в статье Тестирование экспертов в клиентском терминале MetaTrader 4. Взгляд изнутри. В настоящей статье будет описано, как сделать тестер стратегий максимально похожим на терминал.

Итак, в чем основное отличие тестера? Чего не хватает при визуализации? Наверное, самое главное — это отсутствие закладки "Торговля" терминала.

Сколько открыто позиций? Как скоро сработает отложенный ордер? Передвинулся ли Стоп Лосс у позиции? Сколько используется маржи в данный момент и как далеко до MarginCall? При реальной торговле ответы на эти и многие другие вопросы мы ищем на закладке "Торговля" Терминала. Но что делать при тестировании?

Решению этого вопроса и посвящена данная статья.

2.Техническая сторона вопроса

Написание программы начнём, как всегда, с постановки задачи. Какой мы хотим получить результат?

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

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

Для решения поставленной задачи нам придется найти обходной путь.

Индикатор мы всё-таки создадим, но он будет выполнять только функцию "создателя подокна графика", он не будет ничего отображать, то есть у нас всегда будет "зарезервирована" часть графика. Это надо для того, чтобы созданное подокно с уникальным именем можно было сохранить в шаблоне tester.tpl либо в шаблоне <имя_эксперта>.tpl.

А вот отображение и обновление информации мы доверим библиотеке функций, оформленной в виде включаемого файла.

3. Использование

Для начала необходимо создать шаблон графика, который будет использовать визуализатор. Просто настройте внешний вид графика (цвета, линии сетки, масштаб), "прицепите" к нему индикатор vTerminal.mq4 и воспользуйтесь командой "Сохранить шаблон":


Окно сохранения шаблона:

При визуализации используется шаблон tester.tpl либо <имя_эксперта>.tpl, именно под этими именами надо сохранить наш шаблон.


4. Интеграция в эксперта

Функции, реализующие отображение информации о позициях, находятся во включаемом файле VisualTestingTools.mq4, который находится в директории ...\MetaTrader 4\experts\include\. Прежде всего надо "присоединить" его к эксперту - перед функцией старт вставить строку #include <visualtestingtools.mq4>. На примере эксперта CrossMACD_DeLuxe это будет выглядеть так:

...
double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1;

#include <visualtestingtools.mq4>

int start()
{
if ( FastEMAPeriod &gt;= SlowEMAPeriod )
{
return(-1);
}


int _GetLastError = 0;
...

Теперь мы можем использовать функции в любой части программы. Вызов одной из них - vTerminalInit() - мы поместим в функцию init() эксперта - она должна вызываться всего один раз, так как её задача - создание объектов для отображения информации. Вторую - vTerminalRefresh() - необходимо вызывать каждый тик. Она будет обновлять информацию об открытых позициях. Код эксперта, использующего функции, будет выглядеть так:

...
double _Commission = 0.0; string _Comment = ""; datetime _Expiration = -1;
#include <visualtestingtools.mq4>
int init()
{
if ( FastEMAPeriod &gt;= SlowEMAPeriod )
{
return(-1);
}
vTerminalInit();
return(0);
}
int start()
{
if ( FastEMAPeriod &gt;= SlowEMAPeriod )
{
return(-1);
}
vTerminalRefresh();
int _GetLastError = 0;
...

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

5. Тестирование

Теперь давайте посмотрим, что у нас получилось.

Во-первых, в эксперте добавились новые внешние переменные:

После включения в код эксперта файла VisualTestingTools.mq4 добавились новые внешние переменные.

Их назначение интуитивно понятно, но я всё же расскажу о них подробнее:

Установим MainColor = Black и нажмем кнопку "ОК". Теперь эксперт готов к тестированию. Перед нажатием кнопки "Старт", устанавливаем галочку "Визуализация", и наслаждаемся результатом:

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

Первой открылась селл-позиция. Как видите, строка красного цвета.

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


Когда цена подходит к уровню Стоп Лосс позиции, поле StopLoss меняет цвет на установленный в настройках:

Как по мне, получилось очень неплохо.

6. Возможные проблемы

Стоит упомянуть об одной особенности, связанной с использованием шаблона tester.tpl с индикатором vTerminal: при тестировании функция, отвечающая за поиск окна индикатора (WindowFind()) не работает. Поэтому номер подокна задаётся в коде явно:

win = WindowFind( "vTerminal" );
if ( IsTesting() ) { win = 1; }

Если в шаблоне будут присутствовать другие индикаторы, рисующиеся в отдельном окне, вся информация о позициях будет выводиться в верхнем из них. То есть надо либо vTerminal делать "первым" (верхним), либо вместо win = 1; написать win = номер подокна.

Других проблем в работе с индикатором не наблюдалось.

7. Заключение

В завершение статьи приведу ещё несколько скриншотов - они будут красноречивее любых слов.