Обсуждение статьи "Трендовые линии на основе фракталов посредством MQL4 и MQL5"

 

Опубликована статья Трендовые линии на основе фракталов посредством MQL4 и MQL5:

В статье описано решение по автоматизации построения трендовых линий на основе индикатора Fractals с помощью MQL4 и MQL5. Структура статьи представлена в сравнительном виде в рамках решения поставленной задачи с позиции двух языков. Построение трендовых линий осуществляется по двум последним известным фракталам.

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

Анализ рынков я часто делаю на основной своей работе, где я могу уделить трейдингу немного времени. К тому же недостаточно просто расчертить линии на старшем таймфрейме, линия должна чертиться по экстремумам с точностью до 15 минут. Данная необходимость обусловлена тем, что время фрактала на старшем таймфрейме не всегда соответствует времени этого же экстремума на M15. Словом, автоматизация приходит на помощь. Так получилось, что "кодить" я начал на MQL5, а в последующем на MQL4, так как для MetaTrader 4 мне также нужна была аналогичная программа.

Свое решение поставленной задачи с позиции MQL4 и MQL5 я и хочу представить в данной статье. Статья представлена в сравнительном виде, однако сравнивать MQL4 и MQL5 на предмет эффективности в рамках данной статьи было бы некорректно. Я также не исключаю, что есть решения более эффективные, чем те, что указаны здесь. Статья может быть полезна новичкам при написании скриптов как на MQL4, так и на MQL5, в особенности тем, кто собирается применять в работе фракталы и трендовые линии.

3. Поиск ценовых и временных значений фракталов

Для того чтобы прочертить линию, нужно найти также время и цену фрактала. С позиции MQL4 можно было бы, конечно, воспользоваться просто предопределенными таймсериями High[] и Low[], а также функцией iTime(), однако дополнительно требуется также уточнение временных координат линии - от этого будет зависеть корректность прорисовки трендовой линии.

На рис. 1-2 представлена разница во временных значениях экстремумов на таймфреймах H4 и M15.

Рис.1. Время экстремума с позиции таймфрейма H4

Рис.1. Время экстремума с позиции таймфрейма H4

Рис.2. Время экстремума с позиции таймфрейма M15

Рис.2. Время экстремума с позиции таймфрейма M15

Автор: Almat Kaldybay

 
Добрый день. Критика. День - не всегда фиксированное количество свечей. В Вашем случае - не всегда корректно проверять данные 96 свечей для М15. Иногда Вы можете залезть в данные другого дня.
 
Tapochun:
Добрый день. Критика. День - не всегда фиксированное количество свечей. В Вашем случае - не всегда корректно проверять данные 96 свечей для М15. Иногда Вы можете залезть в данные другого дня.
Спасибо за замечание, я правда, сам с этим не столкнулся так как отказался от дневной ТЛ в пользу внутридневной торговли (смотрю на 4 часа, час и м15). Но вообще надо будет ситуацию по-внимательней рассмотреть.
 
Almat Kaldybay:
Спасибо за замечание, я правда, сам с этим не столкнулся так как отказался от дневной ТЛ в пользу внутридневной торговли (смотрю на 4 часа, час и м15). Но вообще надо будет ситуацию по-внимательней рассмотреть.
Это справедливо для любого ТФ, не обязательно М15. Суть такова, что если искать вершинки/низинки в пределах дня, например, предыдущего, то не следует полагаться на фиксированное количество свечей, лучше полагаться на время: от открытия предыдущего, в данном случае, дня, до открытия (первой свечи, которая может иметь время не 00.00) текущего дня.
 
Tapochun:
Это справедливо для любого ТФ, не обязательно М15. Суть такова, что если искать вершинки/низинки в пределах дня, например, предыдущего, то не следует полагаться на фиксированное количество свечей, лучше полагаться на время: от открытия предыдущего, в данном случае, дня, до открытия (первой свечи, которая может иметь время не 00.00) текущего дня.

Как раз сейчас пишу одного советника на mql4 и вспомнил про вашу критику. Хоть и не столкнулся на практике с этой ситуацией, решил все же ее исключить. Решение следующее:

//1.2 Определяем бар, следующий за экстремумом
int UpperFractal_1_base_next=UpperFractal_1_base-1;
int UpperFractal_2_base_next=UpperFractal_2_base-1;
int LowerFractal_1_base_next=LowerFractal_1_base-1;
int LowerFractal_2_base_next=LowerFractal_2_base-1;
//1.3 Определяем время формирования фрактала
datetime UpFractalTime_1_base=iTime(NULL,base_tf,UpperFractal_1_base);
datetime UpFractalTime_2_base=iTime(NULL,base_tf,UpperFractal_2_base);
datetime LowFractalTime_1_base=iTime(NULL,base_tf,LowerFractal_1_base);
datetime LowFractalTime_2_base=iTime(NULL,base_tf,LowerFractal_2_base);
//1.4 Определяем время бара, следующего за экстремумом
datetime UpFractalTime_1_base_next=iTime(NULL,base_tf,UpperFractal_1_base_next);
datetime UpFractalTime_2_base_next=iTime(NULL,base_tf,UpperFractal_2_base_next);
datetime LowFractalTime_1_base_next=iTime(NULL,base_tf,LowerFractal_1_base_next);
datetime LowFractalTime_2_base_next=iTime(NULL,base_tf,LowerFractal_2_base_next);
//1.5 Определяем индексы баров на м15 для времени открытия фрактального бара
int UpperFractal_1_m15_base=iBarShift(NULL, 15, UpFractalTime_1_base,true);
int UpperFractal_2_m15_base=iBarShift(NULL, 15, UpFractalTime_2_base,true);
int LowerFractal_1_m15_base=iBarShift(NULL, 15, LowFractalTime_1_base,true);
int LowerFractal_2_m15_base=iBarShift(NULL, 15, LowFractalTime_2_base,true);
//1.6 Определяем индексы баров на м15 для бара, следующего за экстремумом
int UpperFractal_1_m15_base_next=iBarShift(NULL, 15, UpFractalTime_1_base_next,true);
int UpperFractal_2_m15_base_next=iBarShift(NULL, 15, UpFractalTime_2_base_next,true);
int LowerFractal_1_m15_base_next=iBarShift(NULL, 15, LowFractalTime_1_base_next,true);
int LowerFractal_2_m15_base_next=iBarShift(NULL, 15, LowFractalTime_2_base_next,true);
//1.7 Находим количестве баров на м15 между баром - фракталом и следующим баром
int UpperFractal_1_m15_NumBars_base=(UpperFractal_1_m15_base-UpperFractal_1_m15_base_next);
int UpperFractal_2_m15_NumBars_base=(UpperFractal_2_m15_base-UpperFractal_2_m15_base_next);
int LowerFractal_1_m15_NumBars_base=(LowerFractal_1_m15_base-LowerFractal_1_m15_base_next);
int LowerFractal_2_m15_NumBars_base=(LowerFractal_2_m15_base-LowerFractal_2_m15_base_next);
// --- Этап 2 - - уточнение экстремумов
//2.1 Для первого наименьшего фрактала
int Bar_1_Lowest_m15_base=iLowest(NULL,PERIOD_M15,MODE_LOW,LowerFractal_1_m15_NumBars_base,LowerFractal_1_m15_base_next);
datetime Time_1_Lowest_m15_base=iTime(NULL,PERIOD_M15,Bar_1_Lowest_m15_base);
double Price_1_Lowest_m15_base=iLow(NULL,PERIOD_M15,Bar_1_Lowest_m15_base);
//2.2 Для второго наименьшего фрактала
int Bar_2_Lowest_m15_base=iLowest(NULL,PERIOD_M15,MODE_LOW,LowerFractal_2_m15_NumBars_base,LowerFractal_2_m15_base_next);
datetime Time_2_Lowest_m15_base=iTime(NULL,PERIOD_M15,Bar_2_Lowest_m15_base);
double Price_2_Lowest_m15_base=iLow(NULL,PERIOD_M15,Bar_2_Lowest_m15_base);
//2.3 Для первого наибольшего фрактала
int Bar_1_Highest_m15_base=iHighest(NULL,PERIOD_M15,MODE_HIGH,UpperFractal_1_m15_NumBars_base,UpperFractal_1_m15_base_next);
datetime Time_1_Highest_m15_base=iTime(NULL,PERIOD_M15,Bar_1_Highest_m15_base);
double Price_1_Highest_m15_base=iHigh(NULL,PERIOD_M15,Bar_1_Highest_m15_base);
//2.4 Для второго наибольшего фрактала
int Bar_2_Highest_m15_base=iHighest(NULL,PERIOD_M15,MODE_HIGH,UpperFractal_2_m15_NumBars_base,UpperFractal_2_m15_base_next);
datetime Time_2_Highest_m15_base=iTime(NULL,PERIOD_M15,Bar_2_Highest_m15_base);
double Price_2_Highest_m15_base=iHigh(NULL,PERIOD_M15,Bar_2_Highest_m15_base);

	          
 
Almat Kaldybay:

Хоть и не столкнулся на практике с этой ситуацией, решил все же ее исключить

Сегодня, например, откройте пару GBPUSD/EURUSD М5 первая свеча открылась в 00:05. Если бы по аналогии с М15 брать 288 свечей, то залезем в данные другого дня.

Правда, это для МТ5... на МТ4 (сервер MetaQuotes-Demo) - также, у др. брокера с 00:00, так что... все индивидуально и проверка, все же, нужна.

 
Приветствую! Подскажите как поставить советник в мт4. Я скачал файл trendlines.mq4  скомпилировал его и вместе с исходником отправил в папку mql4/Indicators, перезагрузил терминал, пытаюсь присоединить индикатор к графику - ноль реакции. Что делаю не так?
 
Roman Kornev:
Приветствую! Подскажите как поставить советник в мт4. Я скачал файл trendlines.mq4  скомпилировал его и вместе с исходником отправил в папку mql4/Indicators, перезагрузил терминал, пытаюсь присоединить индикатор к графику - ноль реакции. Что делаю не так?

Ошибка: "... отправил в папку mql4/Indicators...", так после скачивания автоматически открывается редактор кода MetaEditor, который сам автоматически размещает в нужном каталоге программу. И после компиляции не нужно никого никуда "отправлять".

Добавлено: и вообще - это не индикатор, а советник!

 
Karputov Vladimir:

Ошибка: "... отправил в папку mql4/Indicators...", так после скачивания автоматически открывается редактор кода MetaEditor, который сам автоматически размещает в нужном каталоге программу. И после компиляции не нужно никого никуда "отправлять".

Добавлено: и вообще - это не индикатор, а советник!

Спасибо. Я открыл его свойства как советника и увидел там только настройки стиля линий. Поэтому и решил что это индикатор. Более того, в тестере на евро за месяц он не открыл ни одной сделки. Может я не особо внимательно читал статью конечно, просто решил включить посмотреть...
 
Roman Kornev:
Спасибо. Я открыл его свойства как советника и увидел там только настройки стиля линий. Поэтому и решил что это индикатор. Более того, в тестере на евро за месяц он не открыл ни одной сделки. Может я не особо внимательно читал статью конечно, просто решил включить посмотреть...
Здравствуйте, он (советник) не открывает сделок. Целью статьи не было написание советника, который бы открывал сделки. Я лишь привел решение по автоматизации черчения трендовых линий.  Спасибо, что уделили статье время и внимание. 
 

Добрый день.

Прогнал советник на тестере на MQL5 и оказалось, что он перерисовывает линию меняя только одну точку (более свежую), экстремум номер 2 в каждой из линий остается всегда неизменным. Получается, что если не перегружать советник длительное время, то линии не будут актуальными.

В коде вреде-как предусмотрена проверка обновления всех экстремумов. Не пойму где проблема.