Индикатор пиков и впадин без перерисовки
Содержание статьи
Индикатор пиков и впадин без перерисовки
Торговля на рынке фоеркс – это бесконечная борьба ее участников за уровни, когда быки толкают цены вверх, а продавцы удерживают уровни, пытаясь сдвинуть ее вниз. Самое интересное, что в этой бесконечной борьбе варятся не только самые обычные трейдеры, но инвестиционные банкиры, хедж фонды, а также даже целые финансовые системы определенных государств. Тем не менее, именно законы спроса и предложения по-настоящему регулируют рынок, в то время как бесконечные следы борьбы участников между собой можно наблюдать на графике цены в виде формирования пиков и впадин.
Самое интересно, что именно пики и впадины являются сами по себе сильным аналитическим инструментом, ведь на основе их можно выстраивать полноценные системы, анализировать тенденции, а самое главное четко видеть, где можно спрятать свой стоп приказ. Однако многим новичкам сложно уследить за рынком и оценить его выкрутасы, поэтому специально для них был создан индикатор пиков и впадин без перерисовки.
p, blockquote 1,0,0,0,0 —>
Стоит понимать, что 90 процентов пиковых индикаторов уровней имеют перерисовку, поэтому их применение сводится лишь к вспомогательной функции. Тем не менее при правильном подходе можно достичь того, чтобы данная перерисовка практически не мешала трейдеру. Необходимо четко понимать, что скачав индикатор вершин и впадин, вы сможете отбрасывать в сторону рыночный шум даже на минутном графике, что позволяет производить правильную оценку тренда.
p, blockquote 2,0,1,0,0 —>
С какой целью используют пиковый индикатор уровня
Пики и впадины – это в первую очередь потенциальные уровни, которые должна преодолевать цена для того чтобы развивать свой тренд. Поэтому индикатор пиков и впадин для минутного графика будет столь же эффективен на всех тайм фреймах без исключения, ведь эти точки являются опорными. Итак, давайте перечисли с какой целью можно использовать пиковый индикатор уровня:
- Для поиска опорных точек при построении уровня;
- При построении сетки Фибоначчи;
- С целью поиска места для установки стоп приказа и профита;
- Для построения трендовых линия и интерпретации фигур;
- С целью построения стратегии на отбой или пробой уровня;
- Для отбрасывания рыночного шума и оценки тенденции.
Применение индикатора пиков и впадин EMMA
EMMA – это один из немногих индикаторов пиков и впадин без перерисовки, который внешне напоминает более известный инструмент под названием Zigzag. Стоит заметить, что в отличие от своего собрата, EMMA для поиска вершин использует скользящие средние, за счет чего у индикатора отсутствует какая-либо перерисовка.
p, blockquote 4,0,0,0,0 —>
Инструмент оснащен звуковым режимом оповещения о формировании вершины или впадины, более того он даже способен рисовать по своим отмеченными точкам линии Фибоначчи. Итак, пиковый индикатор уровня Фибоначчи EMMA выглядит вот так:
p, blockquote 5,1,0,0,0 —>
Использовать его необходимо в первую очередь как вспомогательный инструмент для оценки направления тренда, глубины отката. Однако можно вполне эффективно задействовать непосредственно для торговли.
Так, если вы обратили внимание на график, то наверняка увидели, что синей линией он соединяет экстремумы. Поскольку любому тренду характерно обновление своих экстремумов можно выстроить полноценную стратегию пробоя.
p, blockquote 6,0,0,0,0 —>
Единственное что не забудьте удалить второй противоположный ордер после срабатывания первого, так как у вас может банально получится замок.
p, blockquote 7,0,0,1,0 —>
Настройки пикового индикатора уровня EMMA
Пиковый индикатор уровня EMMA является неординарным помощником, ведь кроме базового функционала и настроек в нем присутствует возможность включения оповещений и даже создания разметки по Фибоначчи, вплоть до построения Веера. Итак, параметры настройки пикового индикатора уровня:
Разворотные паттерны: Тестируем паттерн "Двойная вершина/дно"
Анализ, проведенный в статье «Сколько длится тренд?», демонстрирует, что около 60% ценовое движение находится в тренде. И именно открытие позиции в начале тренда дает возможность получить максимальный результат. Поиски точек разворотов трендов породили большое количество разворотных паттернов. Одним из наиболее известных и часто применяемых паттернов является двойная вершина/дно.
1. Теоретические аспекты формирования паттерна
На ценовом графике паттерн «Двойная вершина/дно» можно встретить довольно часто. Природа его формирования тесно связана с теорией торговых уровней. Паттерн образуется в конце тренда или тенденции, когда ценовое движение упирается в уровень сопротивления или поддержки, в зависимости предыдущего движения, и после коррекции при повторном тестировании не пробивает уровень, а вновь откатывается.
В этот момент в игру вступают контр-трендовые трейдеры, которые торгуют на отскок от уровня и толкают цену в сторону коррекции. С ростом коррекционного движения начинают выходить из рынка трейдеры, торгующие по тренду. Которые либо фиксируют прибыль, либо закрывают убыточные сделки, открытые на пробитие уровня сопротивления/поддержки. Подобные действия еще больше усиливают движение, что приводит к зарождению новой тенденции.
При поиске паттерна на графике не следует искать точного совпадения вершин/впадин. Считается нормальным отклонение уровня вершин/впадин. Главное, чтобы вершины находились в пределах одного уровня сопротивления/поддержки. Надежность паттерна прямо пропорциональна силе уровня, в зоне которого происходит его формирование.
2. Стратегия торговли по паттерну
Насколько широкое распространение получил паттерн, настолько и различные стратегии его торговли. На просторах интернета существует как минимум три различные точки входа отработки данного паттерна.
2.1. Сценарий 1
Первая точка входа основана на пробитии линии шеи. Стоп-лосс выставляется за линией вершин / впадин. При этом существуют различные подходы для определения «пробития лини шеи». Здесь может использоваться как закрытие бара под линией шеи, так и преодоление линии шеи на фиксированное расстояние. Оба подхода имеют свои плюсы и минусы. При резком движении закрытие свечи может произойти на достаточном расстоянии от линии шеи, что сделает неэффективным использование паттерна.
К минусам такого подхода можно отнести относительно большой уровень стоп-лосса, что снижает коэффициент прибыль/риск используемой стратегии.
2.2. Сценарий 2
Вторая точка входа основана на теории зеркальных уровней, когда линия шеи из поддержки превращается в сопротивление и наоборот. Здесь вход осуществляется при откате цены к линии шеи после ее пробития. В таком варианте стоп-лосс выставляется за экстремум последней коррекции, что значительно сокращает уровень стоп-лосса. При этом следует отметить, что, к сожалению, далеко не всегда цена тестирует линию шеи после ее пробития. Этот факт также значительно сокращает количество входов.
2.3. Сценарий 3
Третья точка входа основана на трендовой теории. И определяется по пробитию трендовой линии, построенной от точки начала движения до экстремума на линии шеи. Стоп-лосс, как и в первом случае, выставляется за линией вершин/впадин. Ранний вход дает меньший уровень стоп-лосса по сравнению с первой точкой входа. А также дает больше сигналов по сравнению со вторым сценарием. В тоже время, такая точка входа дает больше ложных сигналов, так как возможно формирование канала между линиями экстремумом и шеи или паттерна вымпел, которые являются фигурами продолжения тренда.
Во всех трех стратегиях предлагается выход на уровне равном расстоянию от экстремумом до линии шеи.
Также, при определении паттерна на графике следует обратить внимание, что двойная вершина/дно должно четко выделяться из ценового движения. И часто при описании паттерна добавляется ограничение: между двумя вершинами/впадинами должно быть не менее 6 баров.
Более того, так как формирование паттерна основано на теории ценовых уровней, то и торговля по паттерну, как минимум, не должна ей противоречить. Поэтому, исходя из предполагаемой цели, линия шеи должна быть не ниже фибо уровня 50 начального движения. Кроме того, с целью отфильтровать ложные сигналы мы можем добавить минимальный уровень первой коррекции (формирующей линию шеи), как показатель силы ценового уровня.
3. Создаем советник
3.1. Поиск экстремумов
Создание торгового советника начнем с создания блока поиска паттерна. Для поиска экстремумом на графике воспользуемся индикатором зиг-заг из коробочной поставки MetaTrader 5. Перенесем расчетную часть индикатора в класс по технологии, описанной в статье [1]. Как известно, данный индикатор содержит два индикаторных буфера, содержащих значение цены в точках экстремумом. Между экстремумами индикаторные буферы содержат пустые значения. Чтобы не создавать два индикаторных буфера, содержащих множество пустых значений, они были заменены массивом структур, содержащих информацию об экстремуме. Структура для хранения информации об экстремуме имеет нижеследующий вид.
Я думаю, каждый, кто хотя бы раз пользовался индикатором зиг-заг, знает на сколько компромиссов придется пойти при поиске оптимальных параметров. Малые значения параметров ведут к разбиению одного большого движения на мелкие части. И наоборот, слишком большие значения параметров приведут к пропуску коротких движений. Алгоритм поиска графических паттернов очень требовательный к качеству нахождения экстремумов. В попытках «совместить несовместимое» было принято решение использовать индикатор с малыми значениями параметров, при этом создать дополнительную надстройку, которая будет объединять однонаправленные движения с короткими коррекциями в одно движение.
Для решения этой задачи был построен класс CTrends. Заголовок класса представлен ниже. При инициализации в класс передается ссылка на объект индикаторного класса и размер минимального движения, при котором новое движение будет считаться продолжением тренда.
Для получения информации об экстремумах в классе предусмотрены методы:
- ExtremumByTime — получение номера экстремума в базе по заданному времени,
- Extremum — возвращает экстремум по указанной позиции в базе,
- IsHigh — возвращает true, если указанный экстремум является вершиной, и false — если впадиной.
В блоке общей информации предусмотрены методы, возвращающие общее количество сохраненных экстремумом, используемые символ и таймфрейм.
Основная логика класса реализована в методе Calculate. Давайте рассмотрим его подробнее.
В начале метода проверим актуальность ссылки на объект индикаторного класса и наличие экстремумов, найденных индикатором.
Затем, определим количество необработанных экстремумов. В случае, если все экстремумы обработаны, выходим из метода с результатом true.
После этого запрашиваем необходимое количество экстремумов из индикаторного класса.
Если же до сих пор не было ни одного экстремума в базе, то добавляем в базу самый старый экстремум, вызвав метод AddTrendPoint.
Далее организовываем цикл с перебором всех загруженных экстремумом. Экстремумы до последнего ранее сохраненного пропускаются.
На следующем шаге проверяем, являются ли вершины однонаправленными. В случае, если новый экстремум перерисовывает предыдущий, то обновляем информацию.
Для разнонаправленных вершин, проверяем является ли новое движением продолжением предыдущей тенденции. В случае положительного ответа на этот вопрос обновляем информацию об экстремумах. При отрицательном результате проверки, добавляем информацию об экстремуме, вызвав метод AddTrendPoint;
С полным кодом всех классов и их методов можно ознакомиться во вложении.
3.2. Поиск паттернов
После определения ценовых экстремумом построим блок поиска точек открытия позиции. Разделим эту работу на 2 подэтапа:
- Поиск паттерна для потенциального открытия позиции.
- Непосредственно точки открытия позиции.
Этот функционал будет возложен на класс CPttern, заголовок которого представлен ниже.
Паттерн будем определять по четырем соседним экстремумам, информацию о которых сохраним в четырех структурах s_StartTrend, s_StartCorrection, s_EndCorrection и s_EndTrend. Для идентификации паттерна нам также потребуются уровни минимума и максимума коррекции, которые будут храниться в переменных d_MinCorrection и d_MaxCorrection. Экстремумы будем получать из экземпляра ранее созданного класса CTrends.
При инициализации класса передадим ему указатель на объект класса CTrends и граничные уровни коррекции. Внутри метода проверим действительность переданного указателя, сохраним полученную информацию и очистим структуры экстремумов.
Поиск потенциальных паттернов будем осуществлять в методе Search(). Данный метод в параметрах получает дату начала поисков паттерна, а возвращает логическое значение, информирующее о результатах поиска. Рассмотрим алгоритм метода подробнее.
Вначале метода проверим актуальность указателя на объект класса CTrends и наличие сохраненных экстремумов. В случае негативного результата выходим из метода с результатом false.
Затем определяем экстремум, соответствующий дате, полученной в входных параметрах. Если экстремум не найден, выходим из метода с результатом false.
Далее, организовываем цикл по перебору всех экстремумов, начиная с указанной даты и до последнего найденного. Сначала получим 4 последовательных экстремума. Если хотя бы один из экстремумов не получен, перейдем к следующему экстремуму.
На следующем этапе проверим соответствие экстремумов искомому паттерну. Если экстремумы не удовлетворяют искомому паттерну, переходим к следующим экстремумам. При нахождении паттерна устанавливаем флаг в положение true и выходим из метода с тем же результатом.
Следующим шагом, после определения паттерна, будем искать точку входа. Точку входа мы будем искать по второму сценарию. Но чтобы минимизировать риск невозврата цены к линии шеи, подтверждение сигнала мы будем искать на младшем тайм-фрейме.
Для реализации этого функционала создадим метод CheckSignal(). Данный метод, помимо непосредственно сигнала, будет возвращать торговые уровни стоп-лосса и тейк-профита, поэтому в параметрах метода воспользуемся указателями на переменные.
В начале метода проверим флаг на наличие ранее найденного паттерна, и если паттерн не найден, выходим из метода с результатом false.
Затем определим время закрытия свечи образования паттерна и загрузим данные интересующего нас таймфрейма от начала формирования паттерна до текущего момента.
После чего организуем цикл, в котором бар за баром будем проверять пробой линии шеи, коррекцию и закрытие свечи за линией шеи в сторону ожидаемого движения.
Стоит отметить, что здесь я добавил еще некоторые ограничения:
- Паттерн считается недействительным, если цена пробила уровень вершин/впадин.
- Паттерн считается недействительным, если цена достигла ожидаемого уровня тейк-профита.
- Сигнал на открытие сделки игнорируется, если с момента сигнала сформировалось более 2 свечей до открытия позици.
После обнаружения сигнала на открытие позиции укажем тип сигнала («-1» — Продажа, «1» — Покупка) и торговые уровни. Стоп-лосс установим на уровне максимальной глубины коррекции к линии шеи после ее пробития. Для тейк-профита установим 2 уровня:
1. На уровне, равном 90% расстояния от линии экстремумов до шеи в сторону открытия позиции.
2. На уровне, равно 90% от предыдущего трендового движения.
При этом добавим ограничение, что уровень первого тейк-профита не может превышать уровень второго тейк-профита.
С полным кодом всех классов и методов можно ознакомиться во вложении.
3.3. Собираем советник
После проведения подготовительной работы соберем все блоки в единый советник. Объявим внешние переменные, которые разделим на три блока:
- Параметры индикатора зиг-заг;
- Параметры для поиска паттернов и точек входа;
- Параметры для совершения торговых операций.
В блоке глобальных переменных объявим массив для хранения указателей на объекты паттернов, экземпляр класса торговых операций, экземпляр класса для поиска паттернов, в котором будет хранится указатель на обрабатываемый экземпляр класса, и переменную для хранения времени начала поиска очередного паттерна.
Для реализации возможности выставления одновременно двух тейк-профитов к позиции воспользуемся технологией, предложенной в статье [2]
В функции OnInit() проведем инициализацию всех необходимых объектов. При этом, так как мы глобально не объявляли экземпляры классов CZigZag и CTrends, мы просто их инициализируем и добавим указатели на эти объекты в наш массив. В случае ошибки инициализации на любом из этапов выходим из функции с результатом INIT_FAILED.
В функции OnDeinit() произведем очистку экземпляров используемых объектов.
Как всегда, основной функционал реализован в функции OnTick. Функционал данной функции можно условно разделить на два блока:
1. Проверка сигналов на открытие позиции в ранее найденных паттернах. Запускается при каждом открытии новой свечи на малом таймфрейме поиска подтверждения сигнала.
2. Поиск новых паттернов. Запускается при каждом открытии новой свечи на рабочем (указанном для индикатора) таймфрейме.
В начале функции проверим наступление нового бара на тайфрейме подтверждения точки входа. Если бар не сформирован, выходим из функции до следующего тика. Следует отметить, что подобный подход будет правильно работать только, если таймфрейм подтверждения точки входа не более рабочего таймфрейма. В противном случае вместо выхода из функции нужно будет перейти к блоку поиска паттернов.
В случае наступления нового бара организуем цикл проверки всех ранее сохраненных паттернов на наличие сигнала к открытию позиции. Здесь следует обратить внимание, что первые два объекта массива мы не будем проверять на наличие сигналов, так как в этих ячейках у нас хранятся указатели на экземпляры классов поиска экстремумов. В случаях, если хранимый указатель недействительный или функция проверки сигнала вернет значение false, указатель будет удален из массива. Непосредственно проверка сигналов паттерна будет осуществляться в функции CheckPattern(), алгоритм которой будет рассмотрен ниже.
После проверки ранее найденных паттернов, переходим к второму блоку — поиску новых паттернов. Для этого проверим наличие нового бара на рабочем таймфрейме. Если новый бар не сформирован, выходим из функции в ожидании нового тика.
При появлении нового бара определим начальную дату поиска паттернов (с учётом заданной в параметрах глубины анализируемой истории). Затем проверим актуальность указателя на объект класса CPattern и, в случае недействительного указателя, создадим новый экземпляр класса.
После чего в цикле вызываем метод поиска потенциальных паттернов. В случае успешного поиска сделаем сдвиг даты начала поиска нового паттерна и проверим наличие найденного паттерна в массиве ранее найденных. Если паттерн уже есть в массиве, переходим к новому поиску.
Если же найден новый паттерн, то проверим сигнал на открытие позиции, вызвав функцию CheckPattern(). После чего, при необходимости, сохраняем паттерн в наш массив и инициализируем новый экземпляр класса для следующего поиска. Цикл продолжается пока при очередном поиске метод Search() не вернет значение false.
Для полноты картины предлагаю рассмотреть алгоритм функции CheckPattern(). В параметрах данный метод получает указатель на экземпляр класса CPatern и возвращает логическое значение результата проведения операций. Напомню, что при получение результата false от рассматриваемой функции, анализируемый паттерн удаляется из массива сохраняемых объектов.
В начале функции вызовем метод поиска сигнала на открытия позиции класса CPattern. В случае ошибки проверки выходим из функции с результатом false.
При успешном поиске сигнала на открытие позиции установим торговые уровни и отправим приказ на открытие позиции в соответствии с полученным сигналом.
Следует обратить внимание, что при успешном открытии позиции выходим из функции с результатом false. Это связано не с ошибкой, а с необходимостью удаления из массива отработанного паттерна. Такой шаг позволяет избежать повторного открытия позиции по тому же паттерну.
С полным кодом всех методов и функций можно ознакомиться во вложении.
4. Тестирование стратегии
После создания нашего советника пришло время проверить его работу на исторических данных. Тестирование будем проводить за период в 9 месяцев 2018 года для пары EURUSD. Поиск паттернов будем проводить на тайм фрейме М30, а точки открытия позиции будем искать на тайм-фрейме М5.
Результаты тестирование показали возможность советника генерировать прибыль. За тестируемый период советник совершил 90 трейдов, 70 из которых было прибыльными. Советник показал профит фактор 2.02 и фактор восстановления 4.77, что свидетельствует о возможности использования советника на реальных счетах. Полные результаты тестирования приведены ниже.
Заключение
В данной статье мы создали советник, работающий на паттерне разворота тенденции «Двойная вершина/дно». Тестирование советника на исторических данных показало приемлемые результаты и способность советника генерировать прибыль. Подобная работа подтверждает возможность использования паттерна «Двойная вершина/дно» для поиска точек открытия позиции, как хороший сигнал разворота тенденции.
Источник https://runettrade.ru/foreks-indikatory/indikator-pikov-i-vpadin-bez-pererisovki.html
Источник https://www.mql5.com/ru/articles/5319
Источник
Источник