Скачать MetaTrader 5

Понравилась статья?
Поставьте ссылку на нее -
пусть другие почитают

Используй новые возможности MetaTrader 5

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

18 мая 2009, 09:11
Dmitry Fedoseev
11
3 387

Введение

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

Перевод с английского произведен MetaQuotes Software Corp.
Оригинальная статья: https://www.mql5.com/en/articles/1368

Прикрепленные файлы |
2MA.mq4 (1.29 KB)
2MA2TF.mq4 (1.64 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (11)
Dmitry Fedoseev
Dmitry Fedoseev | 29 май 2009 в 04:42
oranger:

Спасибо за интересную статью.

Только вот подсунуть тестеру более одного TF мне кажется не удастся. Если я правильно понимаю, Тестер в MT4 генерирует тиковые котировки для старших TF исходя из содержимого наименьшего TF, так что котировки содержащиеся в m1 (т.е. синтетические m2) будут использованы для генерирования котировок всех остальных TF, необходимых для теста, а значит для того же периода m5, тестер сгенерирует котировки по факту эквивалетные m10 (и значит m7, которые были втиснуты в m5, просто окажутся неудел). Ну и остальные TF "поплывут" аналогичным образом. Я не прав?


Думаю, если бары младшего таймфрейма укладываются в бар старшего, то должно быть все нормально. Например, вместо М1 загружены М2, а вместо М5 закгружены М10, то должно быть все нормально. Если вместо М5 загружены данные М11, то из М2 нельзя получить М11, наверно будут ошибки разсогласования.
Artur
Artur | 2 сен 2009 в 16:38
Неплохая статья. Но думаю, эта технология будет больше полезна людям, желающим протестировать советников не на нестандартных таймфреймах, а на нестандартных инструментах. Например, на сгенерированных искусственных рядах.
uskov34
uskov34 | 17 авг 2011 в 17:03
Подскажите пожалуйста можно ли протестировать график рендж баров или ренко.
Vitaliy
Vitaliy | 17 авг 2011 в 22:10
uskov34:
Подскажите пожалуйста можно ли протестировать график рендж баров или ренко.

В статье ведь сказано про тестирование. Что Вас смущает?
Andrey Egorov
Andrey Egorov | 22 фев 2013 в 14:07

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


Как подменить инструмент в онлайне ?

К вопросу об управлении капиталом К вопросу об управлении капиталом

В статье рассмотрены некоторые аспекты, возникающие при использовании различных систем управления капиталом, применительно к ФОРЕКС. Приведены данные экспериментов с моделью процесса торговли, в которой при совершении торговых сделок используются разные методы управления капиталом (Money Management - ММ).

Принцип суперпозиции и интерференции финансовых инструментов Принцип суперпозиции и интерференции финансовых инструментов

Чем больше факторов влияют на поведение валютной пары, тем сложнее оценить ее поведение и сделать прогнозы на будущее. И, следовательно, если бы нам удалось из валютной пары выделить ее составляющие, меняющиеся во времени значения национальной валюты, то тем самым, мы существенно сократили степень свободы движения национальной валюты по сравнению с валютной парой, в которую она входит, и количество факторов влияющих на ее поведение. А как результат, повысили точность оценки ее поведения и прогнозирования будущих значений. Как же нам это сделать?

Графическое управление внешними параметрами индикаторов Графическое управление внешними параметрами индикаторов

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

Файл Lite_EXPERT2.mqh - функциональный конструктор экспертописателя Файл Lite_EXPERT2.mqh - функциональный конструктор экспертописателя

Эта статья является продолжением цикла статей "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота". В ней автор знакомит читателей с более универсальной библиотекой функций файла Lite_EXPERT2.mqh