Тестирование экспертов на нестандартных таймфреймах

Dmitry Fedoseev | 18 мая, 2009

Введение

Цена на рынке меняется с достаточно большой частотой, чтобы для технического анализа было удобно пользоваться графиком непосредственного изменения цены, так называемого тикового графика. Для упрощения восприятия изменений цены и обеспечения возможности использования в анализе большие интервалы времени используется отображение графиков в виде баров или свечей. Каждый бар показывает значение цены на начало определенного периода времени, его окончание, максимальную и минимальную цены за этот промежуток времени. Традиционно принято использовать следующие периоды или таймфреймы: 1 минута, 5 минут, 15 минут, 30 минут, час, 4-ре часа, сутки, неделя, месяц, что можно видеть на панели инструментов терминала MetaTrader4.

Несмотря на существование общепринятых и ставших уже стандартными периодов, теоретически ничто не мешает использовать любые другие периоды для отображения изменений цены. Так же и практически - в комплекте с терминалом имеется скрипт period_converter, позволяющий пользователю терминала создавать графики нестандартных периодов, например 2 минуты, 7 минут, 45 минут, 2 часа, практические любые и прикреплять и ним индикаторы. Однако в тестере терминала имеется возможность выбрать для тестирования только стандартный период.

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


Основная часть

План действий такой:

  1. Подготовка дополнительного терминала для работы в off-line режиме, чтобы новые данные стандартных таймфреймов не добавлялись к графикам нестандартных периодов.
  2. Подготовка данных нестандартных таймфреймов при помощи скрипта period_converter в терминале, имеющем достаточных архив минутных данных.
  3. Импорт подготовленных данных в терминал, подготовленный для тестирования.

Теперь более подробно:

1. Подготавливаем терминал для тестирования на нестандартных таймфреймах.

Устанавливаем дополнительный терминал. Запускаем терминал, открываем демо-счет, дожидаемся появления списка символов в окне обзора рынка:

Отключаем сохранение личной информации: щелкаем левой кнопкой на индикаторе "Состояние соединения" расположенном в правом нижнем углу терминала и выбираем команду "Логин", в открывшемся окне снимаем галку "Хранить личную информацию", нажимаем кнопку "Логин" и ждем, когда терминал подключится к счету.

Это необходимо для того, чтобы на запуске терминал не подключался к счету автоматически, и в архив истории не добавлялись новые данные. Закрываем терминал.

В каталоге history открываем каталог с именем, соответствующим названию дилингового центра, в котором открывался демо-счет, и удаляем из него все файлы *.hst.

2. Подготавливаем данные нестандартных таймфреймов.

В каком-нибудь другом терминале, в котором имеются достаточное количество данных М1 нужного символа, например EURUSD, при помощи скрипта period_converter (входит в комплект терминала MetaTrader 4) создаем нестандартные таймфреймы, например М2 и М7. Для этого открываем график EURUSD M1, запускаем на нем скрипт period_converter, на запуске скрипта, в его окне свойств ставим значение ExtPeriodMultiplier равным 2. После того, как скрипт конвертирует данные, во вкладке "Эксперты" окна Терминал" должно появиться сообщение о количестве записей сделанных в файл, например:

"2009.03.19 18:28:09 period_converter EURUSD,M1: 25378 record(s) written"

После этого скрипт можно удалить с графика (кликнуть на графике, на котором был запущен скрипт, правой кнопкой, выбрать команду "Удалить скрипт"). Открываем полученный график: Главное меню - Файл - Открыть автономно (в колонке "Исторические данные" ищем запись EURUSD,M2). Аналогично создаем таймфрейм М7 (при запуске скрипта period_converter ставим значение ExtPeriodMultiplier равным 7).

Пишем скрипт для сохранения данных с графика в файл *.csv (файл s_ExportChartToCSV_v1.mq4 приложения):

int start(){
   int h=FileOpen(Symbol()+Period()+".csv",FILE_WRITE|FILE_CSV,",");
      for(int i=Bars-1;i>=0;i--){
         FileWrite(h,TimeToStr(Time[i],TIME_DATE),TimeToStr(Time[i],TIME_MINUTES),Open[i],High[i],Low[i],Close[i],Volume[i]);
      }
   FileClose(i);
   return(0);
}

Исполняем скрипт на графиках нестандартных таймфреймов. В результате работы скрипта в каталоге experts/filies получаем стандартные файлы *.csv с данными нестандартных таймфреймов.

3. Импортируем данные.

Открываем терминал, подготовленный в п.1, открываем Архив котировок (Главное меню - Сервис - Архив котировок или клавиша F2), разворачиваем в списке слева список таймфреймов импортируемого символа, выделяем строку М1 (двойное нажатие кнопкой мышки на ней, чтобы в строке заголовка окна появился соответствующий текст):

В открытом окне архива котировок жмем кнопку "Импорт", выбираем созданный в п. 2 файл EURUSD2.csv, жмем "ОК" и также в таймфрейм М5 импортируем данные из файла EURUSD7.csv, закрываем окно "Архив котировок". Все готово!

Открываем график EURUSD M1 и видим данные M2:

Аналогично с графиком EURUSD M5 - вместо данных М5 можно увидеть данные М7.

Для тестирования советника по данным М2 в тестере надо будет выбрать таймфрейм М1, и, соответственно, для тестирования на М7 - в тестере выбрать М5. Для доступа к данным таймфрейма М7 в индикаторах, вызываемых из тестируемого советника, необходимо указывать таймфрейм М5.

4. Проверяем.

Используем простой эксперт, открывающий и закрывающий ордера по пересечению двух МА (файл 2МА.mq4 приложения). Внимание! Эксперт предназначен только для работы в тестере.

extern int TimeFrame=0;
extern double Lots=0.1;
extern int FastMAPeriod=13;
extern int FastMAMethod=0;
extern int FastMAPrice=0;
extern int SlowMAPeriod=21;
extern int SlowMAMethod=0;
extern int SlowMAPrice=0;

int start(){
      double fast_ma_1=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,1);
      double slow_ma_1=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1);
      double fast_ma_2=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,2);
      double slow_ma_2=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,2);
      static int bt=0;
      static int st=0;
         if(fast_ma_1>slow_ma_1){
            if(fast_ma_2<=slow_ma_2){
               if(st>0)OrderClose(st,Lots,Ask,0,CLR_NONE);
               st=0;
               if(OrdersTotal()==0)bt=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",0,0,CLR_NONE);
            }
         }
         if(fast_ma_1<slow_ma_1){
            if(fast_ma_2>=slow_ma_2){
               if(bt>0)OrderClose(bt,Lots,Bid,0,CLR_NONE);
               bt=0;            
               if(OrdersTotal()==0)st=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",0,0,CLR_NONE);
            }
         }         
   return(0);
}

4.1. Эксперт на одном нестандартном тайфмрейме.

Открываем тестер (Главное меню - Вид - Тестер стратегий, или клавиши Ctrl+R). Выбираем эксперта 2МА, символ - EURUSD, период М1, открываем окно свойств эксперта (кнопкой "Свойства эксперта" в тестере), в окне свойств ставим значение переменной TimeFrame 1 или 0. Запускаем тестирование, после тестирования открываем график (кнопка "Открыт график" в тестере) и убеждаемся, что тестирование проведено правильно.

4.2. Эксперт на одном таймфрейме, отличающемся от таймфрейма тестера.

В окне свойств эксперта ставим переменной TimeFrame значение 5, выполняем тестирование, открываем график, переключаем таймфрейм графика на М5, устанавливаем на график две простых МА с периодами 13 и 21, по ценам закрытия и убеждаемся, что тестирование выполнено верно.

4.3. Двухтаймфреймовый эксперт.

Используется эксперт, открывающий ордера по пересечению двух МА на одном таймфрейме с подтверждением по положению двух МА на большем таймфрейме (файл 2МА2TF.mq4 приложения). Внимание! Эксперт предназначен только для работы в тестере.

int start(){
      double fast_ma_1=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,1);
      double slow_ma_1=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1);
      double fast_ma_2=iMA(NULL,TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,2);
      double slow_ma_2=iMA(NULL,TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,2);
      
      double _fast_ma_1=iMA(NULL,MA2TimeFrame,FastMAPeriod,0,FastMAMethod,FastMAPrice,1);
      double _slow_ma_1=iMA(NULL,MA2TimeFrame,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1);
      
      static int bt=0;
      static int st=0;
         if(fast_ma_1>slow_ma_1){
            if(fast_ma_2<=slow_ma_2){
               if(_fast_ma_1>_slow_ma_1){
                  if(st>0)OrderClose(st,Lots,Ask,0,CLR_NONE);
                  st=0;
                  if(OrdersTotal()==0)bt=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",0,0,CLR_NONE);
               }
            }
         }
         if(fast_ma_1<slow_ma_1){
            if(fast_ma_2>=slow_ma_2){
               if(_fast_ma_1<_slow_ma_1){
                  if(bt>0)OrderClose(bt,Lots,Bid,0,CLR_NONE);
                  bt=0;            
                  if(OrdersTotal()==0)st=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",0,0,CLR_NONE);
               }
            }
         }         
   return(0);
}

По умолчанию стоят значения TimeFrame - 1, MA2TimeFrame - 5. В тестере выбираем таймфрейм М1, выполняем тестирование, открываем график, далее при помощи расстановки вертикальных линий в местах открытия ордеров и пересечения МА без открытия ордеров и переключения таймфрейма с М1 на М5 убеждаемся, что тестирование выполнено правильно.


Заключение

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