Диапазон и ложный прорыв диапазона (MQL4)

 

Периодически у меня возникал интерес к разного рода классическим моделям. Решил проверить на форексе, как работает диапазонная торговля.

В принципе объяснить на словах ее просто, запрограммировать немного сложнее (за основу взят советник из учебника MQL4):

 

 1. Находим максимум и минимум по последнему кол-ву баров.

2.Ставим условие диапазон меньше или равен заданному.

3.Теперь нужно, чтобы в этом диапазоне цены были в рейндже,

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

Вот тут на примере тестирования верха детально пояснил комментариями к коду советника «kvadrat»:

for (int s=q;s>=2;s--)
{
if (Ur==1 && High[s] < up){tiketU=tiketU+1;}//2.если максимум меньше границы, то начинаем отсчет счетчика tiketU
if (Ur==1 && High[s] > up){tiketU=0;}//3.максимум больше границы, то сбрасываем счетчик tiketU на ноль
if (tiketU>=3)Ur=0;//три макисмума подряд меньше границы, Ur ставим на ноль, теперь можно считать строку под номером 1
if (High[s] >= up && Ur==0){Up=Up+1;Ur=1;tiketU=0;}//1. касание границы, при условии Ur==0, считаем счетчик Up
//Ur ставим на 1, tiketU на ноль
}

 

 Вот, что получилось на часовом графике EURUSD с датой 2004 по текущее время.

 

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


Код советника «kvadtratP» аналогичен «kvadrat», но с некоторыми дополнениями в конце торговых условий. В частности, после поиска диапазона и касаний, начинается поиск движения цены нижней границы, с последующим фиксированием индекса бара и уже от него начинается поиск закрытия выше верхней границы (важное условие, следующие закрытия должны быть выше абсолютного максимума, найденного в диапазоне):

if (Up >=t && Dn >= t)
{
for (int y=sdvig-1;y>=1;y--)//цикл расчета за пределами sdvig
{
if (Low[y] < Low[minbar]){tiket=1;INDEX=y;break;}//минимум меньше найденного абсолютного, получили его индекс
//ставим tiket=1, выходим из цикла
}
if (INDEX>1)//если INDEX больше 1
{
for (int x=INDEX;x>=1;x--)//ищем от него закрытие выше найденного абсолютного максимума, с условием, что после него
//нет закрытий ниже максимума
{
if (Close[x] < High[maxbar])tiket1=0;//если закрытие ниже
if (Close[x] > High[maxbar])tiket1=1;//если закрытие выше
}
}
if (tiket1==1 && Time[0] > b)Opn_B=true;//последнее закрытие оказалось выше, входим
}

 

Так как кол-во сделок резко сократилось при оптимизации, привожу результат с 30 минутного таймфрема.

Дополнительно в «kvadrat» и «kvadtratP» выводится вертикальная линия показывающая, откуда начинается поиск, вторая линия в «kvadtratP» обозначает сдвиг.

        Предлагаю обсудить конструктивно идею, внести какие-то дополнения, изменения и пр..

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

Файлы:
kvadrat.mq4  12 kb
kvadtratP.mq4  12 kb
 
forexman77:

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

Добрый вечер. Обрезать в графических объектах горизонтальные линии по экстремумам и границам? Вы имеете ввиду обрезать горизонтальную или вертикальную линии? Если да - никак. Но, вместо них можно рисовать трендовые линии с равными координатам времени (для вертикальных линий) или цены (для горизонтальных). Ну и свойство OBJPROP_RAY_LEFT/RIGHT = false.
 
А чтобы совсем четко строить гор. линии, и если их "не много", то можно написать индикатор с двумя граф. построениями DRAW_LINE/DRAW_COLOR_LINE (для верхней и нижней границы диапазона) и брать его значения из советника. Этот стиль позволяет разрывы, так что если диапазон закончился - разорвали линии, начался новый - продолжили линии и т.д.
 
Tapochun:
Добрый вечер. Обрезать в графических объектах горизонтальные линии по экстремумам и границам? Вы имеете ввиду обрезать горизонтальную или вертикальную линии? Если да - никак. Но, вместо них можно рисовать трендовые линии с равными координатам времени (для вертикальных линий) или цены (для горизонтальных). Ну и свойство OBJPROP_RAY_LEFT/RIGHT = false.

Добрый вечер!

Понятно почему не получалось. Пробовал обрезать "OBJ_HLINE" не выходило.

 
forexman77:

Добрый вечер!

Понятно почему не получалось. Пробовал обрезать "OBJ_HLINE" не выходило.

Единственное что можно "обрезать" у вертикальной линии - это отображение на подокно индикатора.
 

Спасибо Tapochun за подсказку. Выкладываю советники теперь уже с отображением эктремумов и границ линиями.

Файлы:
kvadrat.mq4  14 kb
kvadtratP.mq4  14 kb