English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Алгоритм генерации тиков  в тестере стратегий терминала MetaTrader 5

Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5

MetaTrader 5Тестер | 21 мая 2010, 15:58
19 155 190
MetaQuotes
MetaQuotes


Создание экспертов - автоматических торговых систем на MQL5

В составе клиентского терминала MetaTrader 5 есть встроенная среда программирования для разработки полностью автоматических стратегий (торговых роботов), которые могут торговать без вмешательства человека.  Другое название торговых роботов - эксперты.  Эксперты и технические индикаторы для терминала MetaTrader 5 пишутся на языке MQL5, в котором реализованы все преимущества современных языков программирования:

  • скорость исполнения;
  • поддержка объектно-ориентированного программирования (ООП);
  • возможность отладки.

Возможность отладки программ на MQL5 позволяет написать максимально безопасный код с точки зрения программирования, но это является только необходимым, но не достаточным условием для разработки прибыльной стабильной торговой системы. Торговые системы, способные показывать хорошие результаты на большом промежутке исторических данных называют робастными, от английского слова robust - устойчивый к сбоям, ошибкам.


Тестирование торговых стратегий

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

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

Но для того, чтобы информации можно было доверять, сам процесс тестирования должен максимально точно моделировать саму текущую среду, в которой выполняется эксперт. В тестере MetaTrader 5 используется потиковое моделирование цены, при этом используются исторические значения спреда для каждого инструмента, на котором производятся торговые операции.


Немного истории о тестере стратегий


MetaTrader 3

Первый тестер стратегий появился еще в клиентском терминале MetaTrader 3. Это был сравнительно простой по современным меркам тестер, в нем тестирование производилось по трем моделям развития цены в баре:
  • Модель четырех цен - цена последовательно проходила цену Open, Low, High и Close для бычьей свечи, для медвежьей Open, High, Low и Close;
  • Модель "Every 1 point"- используется волновая модель 3-5-3, где последовательно с шагом в 1 пункт цена проходит последовательно трехволновку, пятиволновку и снова трехволновку;
  • Модель "Spread/2" - используется такая же модель, как и в "Every 1 point", но шаг изменения цены  составляет половину от спреда, указанного пользователем.

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

MetaTrader 4

На смену третьему терминалу пришел MetaTrader 4 с новым компилируемым языком MQL4 (предыдущий MQL-II был интерпретируемым) и совершенно новым подходом к тестированию. Теперь тестирования можно было проводить в трех режимах:

  • Все тики (Every Tick) - генерация тиков внутри свечи, позволяет максимально близко к реальной торговле моделировать работу эксперта в режиме тестирования;
  • Контрольные точки (Control points) - компромисс между точностью и скоростью тестирования;
  • По ценам открытия (Open Price) - запуск эксперта производится только на открытии свечи, это дает возможность проводить очень быструю оценку стратегии.

При этом важным отличием от тестера 3-го терминала было то, что в тестере стратегий терминала MetaTrader 4 для моделирования использовались ценовые данные самого младшего доступного таймфрейма. Поэтому при наличии минутной истории на всем тестируемом интервале результаты тестирования максимально близки к результатам, полученным в режиме онлайн. При отсутствии нижележащих таймфреймов моделирование развития цены внутри бара производится так же, как и в тестере терминала MetaTrader 3.

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

Новый клиентский терминал MetaTrader 5-го поколения основан на опыте создания предыдущих терминалов, и это касается, в том числе, и тестера стратегий. Появилась возможность проводить тестирование мультивалютных стратегий, то есть стратегий, которые одновременно торгуют на нескольких инструментах.

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

Но для базового понимания процесса тестирования в терминале MetaTrader 5 необходимо представлять себе как происходит моделирование цены в тестере стратегий.


Алгоритм генерации тиков

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

Использование в тестере таймфрейма М1 позволяет очень точно моделировать движение цен с минимальной погрешностью в отличие от моделирования тиков на основе старших таймфреймов. Вследствие этого максимальные погрешности при моделировании цены в тестере стратегий MetaTrader 5 являются мизерными, и расхождения между смоделированной ценой и ценой, прошедшей в реальности, могут быть только внутри масштаба минутного бара.

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

Бары всех необходимых таймфреймов формируются в исторической базе тестера обычным образом (как и в клиентском терминале) по поступлении сгенерированных тиков. Минутный бар тиковым объёмом 1 не подвергается никакой генерации - записывается тик со значением Close.


Бар с 2 тиками тоже не генерируется - сначала записывается его тик со значением Open, затем записывается тик со значением Close.

          



Бар с 3 тиками генерируется по схеме, для трёхтиковых баров существует всего 4 шаблона развития бара:
  1. Сходили в одну сторону и вернулись на уровень Open




  2. Сходили в одну сторону, откатились и пробили уровень Open




  3. Сходили в одну сторону, откатились, но не дошли до уровня Open




  4. Несколько пунктов в одну сторону




Опорные точки

Если у бара больше 3 тиков, то сначала генерируются опорные точки. Количество опорных точек не может быть больше тикового объёма. Цена открытия Open не входит в подсчет количества опорных точек, так как с нее начинается движение. Максимальное число опорных точек - 11.

Опорные точки распределяются между открывающей тенью, размахом свечи и закрывающей тенью. 


В зависимости от количества тиков распределения опорных точек таковы (открывающая тень - размах свечи - закрывающая тень):

3 - 5 - 3
2 - 6 - 2
2 - 5 - 2
2 - 4 - 2
2 - 3 - 2
1 - 4 - 1
1 - 3 - 1
1 - 2 - 1
1 - 1 - 1
Если у свечи нет какой-либо из теней, то опорные точки соответствующей тени отдаются размаху свечи.



Размах свечи генерируется по нечётному количеству опорных точек. Если у размаха чётное количество опорных точек, то "лишняя" точка отдаётся одной из теней при условии, что у тени уже есть 2 точки. В противном случае "лишняя" точка просто пропадает.

Значения опорных точек представляют собой разницу  в пунктах между ценой опорной точки и ценой открытия свечи. Идеальное распределение (3-5-3) опорных точек для бычьей (белой) свечи таково:





Для медвежьей (черной) свечи генерация опорных точек по схеме 3-5-3 делается аналогично:




Если свеча является дожи, то есть Сlose==Open, то анализируются предыдущие свечи, если предыдущая свеча была восходящей, то этот дожи считается нисходящей свечой.



Если тень генерируется при помощи 3 опорных точек и целые значения 3/4 размера тени и 1/2 размера тени равны (это бывает, когда разница между Open и Low или Open и High не превышает 2 пунктов), то генерация тени меняется следующим образом:

 

Если тень генерируется при помощи 2 опорных точек, то опорные точки расставляются таким образом:





Аналогичным способом генерируется и закрывающая тень.


Формирование опорных точек от Low до High

Размах свечи генерируется волнами-импульсами, количество волн вычисляется как:

количество волн=(количество опорных точек в размахе + 1)/2.

Например, если количество опорных точек в размахе свечи равно 5 (схема 3-5-3), то будет сгенерировано 3 волны = (5+1)/2.

Каждая волна-импульс имеет длину step в пунктах, которая вычисляется по формуле:

step=(High-Low-1)/(количество волн)+1

Например, размах свечи (High - Low) = (1.3113 - 1.3100) = 0.0013 составляет 13 пунктов, тогда длина волны step= (13-1)/3+1=5 пунктов.

После импульса в step пунктов следует откат на 1 пункт. Далее в цикле вычисляются положения опорных точек (для бычьей свечи):

prev=low
цикл
n1=prev+step
n2=prev+step-1
prev=n2
  • n1 - первая опорная точка импульса,
  • n2 - вторая опорная точка - точка отката.

Применим этот алгоритм для бычьей свечи по схеме 3-5-3, где количество волн равно 3 и step=5 пунктов, пункт=0.0001:

  1. Первый шаг. Переменная prev=Low=1.3100, входим в цикл.
  2. Вычисляем данные для первой волны
    • Вычисляем положения точки n1=prev+step=1.3100 + 5*0.0001 = 1.3105.
    • Вычисляем положения точки n2=prev+step-1=1.3100 + 5*0.0001-1*0.0001 = 1.3104;
    • Переменной prev присваиваем значение n2: prev=1.3104;
  3. Вычисляем данные для второй волны
    • Вычисляем положения точки n1=prev+step=1.3104 + 5*0.0001 = 1.3109.
    • Вычисляем положения точки n2=prev+step-1=1.3104 + 5*0.0001-1*0.0001 = 1.3108;
    • Переменной prev присваиваем значение n2: prev=1.3108;
  4. Вычисляем данные для третьей волны
    • Вычисляем положения точки n1=prev+step=1.3108 + 5*0.0001 = 1.3113.
    • Выход из цикла, prev = n2 = 1.3112

Все вышеизложенное показано для наглядности на картинке:


Для медвежьей свечи вычисление опорных точек аналогично:

prev=high
цикл
n1=prev-step
n2=prev-step+1
prev=n2


Генерация тиков производится по опорным точкам

Промежуточные тики между опорными точками генерируются по следующим правилам:
  • Если количество тиков больше, чем количество пунктов между опорными точками, то генерируется "пила".
  • Если между опорными точками достаточно много пунктов, то генерируется линейная последовательность тиков.


Проверка тиковой последовательности

В заключение сравним тиковую историю, записанную с сервера MetaQuotes-Demo 13 мая 2010 с 13:00 по 13:30 с тиковой последовательностью сгенерированной тестером в клиентском терминале MetaTrader 5. Для записи тиков в лог агента тестирования использовался простой эксперт:

//+------------------------------------------------------------------+
//|                                                  Write_Ticks.mq5 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+

input datetime start=D'2010.05.13 13:00:00';
input datetime end=D'2010.05.13 14:00:00';

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   datetime time=TimeCurrent();
//---
   SymbolInfoTick(Symbol(),tick);
   Print(time,tick.bid);
//---
   if(time>end) ExpertRemove();
//---
  }

История тиков в онлайне была собрана с помощью индикатора, описанного в статье Создание тиковых индикаторов.

Обе тиковые последовательности - из тестера и записанные в файл - представлены на графике. Зеленым цветом представлены тики, полученные в тестере, а синим цветом тики, полученные на торговом сервере MetaQuotes-Demo и записанные в файл индикатором.

Вы можете подвести указатель мыши к любому месту графика и посмотреть во всплывающей подсказке данные о каждом тике:

  • происхождение (Тестер или История);
  • время тика;
  • цена в тике.

На графике хорошо видно, что качество моделирования тиков в тестере клиентского терминала MetaTrader 5 позволяет проводить адекватное тестирование экспертов на исторических данных.

Последние комментарии | Перейти к обсуждению на форуме трейдеров (190)
Mykola Demko
Mykola Demko | 12 сент. 2013 в 14:48

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета версия MetaTrader 4 IDE, включающая в себя новый компилятор MQL4 и редактор

Urain, 2013.09.12 13:18

Вы наивно полагаете что торгуя на старших ТФ вы уходите от проклятия неверной генерации тиков, это не так. Пересечение close определённого уровня не зависит от ТФ. Оно пронизывает все таймфреймы. И на W1 close точно так же пересекает уровень как и на M1.

Вот вам пример:


Горизонтальные участки наилучшие точки для в открытия/закрытия (в плане исполнения), цена стоит, на рынке имеется достаточный объём который рынок постепенно выбирает (поэтому цена и стоит), риск получить реквот минимальный.

Но тестер сгенерирует этот участок как расчёску тиков (вверх вниз), поэтому в реале вы на любом ТФ достаточно уверенно откроетесь (если есть сигнал, например close пересекла линию индикатора), в тестере же на этих участках вы получите кучу ложняков и заплатите 8 спредов, а потом ещё через 100 тиков заплатите ещё 8 спредов. Вот так генерация ложных тиков убъёт нормальную ТС, а останутся весь мусор, и из него и придётся оптимизатору выбирать что вам предоставить в качестве победившей обезьяны.

ЗЫ кстати таких участков в реале великое множество.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета версия MetaTrader 4 IDE, включающая в себя новый компилятор MQL4 и редактор

Urain, 2013.09.12 14:13

Тики есть. Тики в реале генерируються по событию изменения состояния стакана.

То есть бывают тики четырёх видов, именился bid, изменился ask, изменилмя и bid и ask, и наконец небыло изменения прайсов но изменился объём в стакане.

Вот как раз четвёртый тип и даёт прямую линию, и как раз он и ещё изменения ask неадекватно генерируется тестером.


К прошлому посту: ... 

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

Как именно обезьяны вылазят вперёд... в реале резкий скачёк по которому не откроешься, а в тестере плавный подьём по прайсам которых небыло, на таком подьёме тестерные обезьяны вполне показывают прибыль, хотя сливают в реале.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бета версия MetaTrader 4 IDE, включающая в себя новый компилятор MQL4 и редактор

Urain, 2013.09.12 14:21

Я сейчас не по примеру спрашиваю, вы когда пишите программу продумываете ведь возможные варианты.

Сейчас вопрос в адекватности моделирования в конкретных ситуациях. Я привёл ссылку на пример, но ситуация вполне может случиться на любом инструменте у любого брокера.

ЗЫ из 4-х ситуаций приводящих к генерации тика 2-е у вас обрабатываются неадекватно.

Из оставшихся двух, ситуация с изменением обоих прайсов (bid и ask) обрабатывается не всегда верно.

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

В сухом остатке правильно всегда обрабатывается только одна ситуация - изменения bid.

тчк




unreal
unreal | 21 сент. 2013 в 10:13

Чуть подправил советник для записи тиков тестера из статьи.

//+------------------------------------------------------------------+
//|                                                  Write_Ticks_mod.mq5 |
//|              Copyright Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+

input datetime start = D'2013.09.06 14:29:00';
input datetime end   = D'2013.09.06 14:31:00';

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick tick;
   datetime time=TimeCurrent();
//---
   SymbolInfoTick(Symbol(),tick);
   //Print(time,tick.bid);
   Print(time,", ",tick.bid,", ",tick.ask); // добавлена ask
//---
   if(time>end) ExpertRemove();
//---
  }


http://www.gkfx.ru/trade_specs/tick_history.html

http://www.dukascopy.com/swiss/russian/marketwatch/historical/

https://www.alpari.ru/ru/login/ (тики в личном кабинете),  http://ticks.alpari.org/


Все файлы + xlsx в прицепе

unreal
unreal | 21 сент. 2013 в 12:21

Свеча в 14:30 (время в MetaTrader 5) объёмом в 39 тиков, в альпари она равна 86 на ECN и 136 тиков на стандарт,

но это абсолютно не важно (кол-во тиков), т.к. принцип генерации тиков будет тот-же, просто тики будут идти плотнее.


В тестере MetaTrader 5 видно, что цена на этой свече монотонно, равномерно и без рывков 36 секунд повышается до максимума, затем идёт мелкий откат.

А на фьючерсе (биржевые тики) видно что цена резко, за доли секунды скакнула и далее уже пошла обычная торговля.


На других новостях/статистике с резкими скачками котировок принцип будет тот-же.

https://www.mql5.com/ru/forum/1031/page19#comment_597854


Разница реальных тиков FOREX и фьючерса совсем небольшая т.к. есть арбитраж между ними и есть фильтрация и агрегация тиков на FOREX. 

+ При совершении реальных сделок задержка в исполнении ордеров различна, т.к. у некоторых фьючерсных брокеров все ордера хранятся на бирже и исполняются в несколько микросекунд в отличии от FOREX.

https://www.mql5.com/ru/forum/10454/page88#comment_584876


По этому-же и произвольная задержка (опция в тестере) не актуальна т.к. при генерации тиков тестера не учитывается точное время (миллисекунды, секунды) формирования максимумов или минимумов или откатов внутри свечи М1.

Или её (произвольная задержка) нужно ставить вручную более 1 минуты , но нет такой возможности (опять же будет уменьшение точности в других случаях).

Vladimir Karputov
Vladimir Karputov | 18 сент. 2017 в 19:00

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Пиши и зарабатывай на MQL5

fxsaber, 2017.09.18 18:40

История тиков в онлайне была собрана с помощью индикатора, описанного в статье Создание тиковых индикаторов.


Обе тиковые последовательности - из тестера и записанные в файл - представлены на графике. Зеленым цветом представлены тики, полученные в тестере, а синим цветом тики, полученные на торговом сервере MetaQuotes-Demo и записанные в файл индикатором.



Вы можете подвести указатель мыши к любому месту графика и посмотреть во всплывающей подсказке данные о каждом тике:

происхождение (Тестер или История);

время тика;

цена в тике.


На графике хорошо видно, что качество моделирования тиков в тестере клиентского терминала MetaTrader 5 позволяет проводить адекватное тестирование экспертов на исторических данных.

https://www.mql5.com/ru/articles/75

А где в статье этот график?


Denis Kirichenko
Denis Kirichenko | 3 мар. 2020 в 10:32

Прошу уточнить значение термина "размах свечи".

Генетические алгоритмы - это просто! Генетические алгоритмы - это просто!
В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
Пример торговой системы на основе индикатора Heiken-Ashi Пример торговой системы на основе индикатора Heiken-Ashi
В данной статье мы рассмотрим возможности использование индикатора Heiki-Ashi. Создадим на его базе простейшую торговую систему(ТС) и напишим на MQL5 советник. Протестируем ТС на истории с помощью MetaTrader5 Strategy Tester.
Руководство по написанию DLL для MQL5 на Delphi Руководство по написанию DLL для MQL5 на Delphi
Статья рассматривает механизм написания модудя DLL на популярном языке программирования ObjectPascal в среде разработки Delphi. Изложенный в статье материал ориентирован в первую очередь на начинающих программистов, решающих задачи, выходящие за рамки встроенного языка программирования MQL5, путем подключения внешних DLL модулей.
Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов Построение мультивалютного индикатора с применением множества промежуточных индикаторных буферов
В последнее время возрос интерес к кластерному анализу рынка FOREX. MQL5 открывает новые возможности исследования закономерностей движения валютных пар. Важным преимуществом MQL5, по сравнению с MQL4, является возможность использования неограниченного количества индикаторных буферов. В данной статье описан пример построения мультивалютного индикатора.