Разработка инструментария для анализа Price Action (Часть 61): Структурные пробои наклонных трендовых линий с подтверждением по трем свингам
Содержание
Введение
В предыдущей статье был задан структурированный подход к построению наклонных трендовых линий как практическому способу интерпретации направления рынка и понимания того, как цена ведет себя внутри развивающейся структуры. Привязка трендовых линий к проверенным точкам свинга позволяет опираться при анализе непосредственно на структуру рынка, тем самым повышая согласованность и устраняя произвольное проведение линий.
Развивая эту основу, статья вводит усовершенствованный аналитический инструмент, который превращает наклонные трендовые линии в систему сигналов на основе пробоев. Пробои трендовых линий остаются одной из самых важных и широко используемых стратегий в торговле по Price Action, поскольку они показывают моменты, когда накопленное давление переходит в направленное импульсное движение. При таком подходе структурный анализ выполняется системно: выявляются только валидные трендовые линии, а сигналы формируются только по значимым пробоям, что делает торговлю пробоями трендовых линий более понятной, дисциплинированной и заметно более простой в исполнении.
Этот инструмент разработан на языке MQL5. В следующих разделах сначала излагается логика стратегии, а затем показывается, как эта структура переводится в реализацию на языке MQL5. Затем рассматриваются тестирование и наблюдаемые результаты, после чего приводятся итоговые замечания.
Обзор стратегии
Пробои трендовых линий относятся к числу самых ранних концепций в торговле по Price Action и служат базовым инструментом для понимания направленности, структуры рынка и развития импульса. Со временем многие трейдеры отходят от этих принципов, часто в погоне за все более сложными стратегиями, которые обещают точность, но добавляют лишний шум. Такой переход часто приводит к избыточному анализу и непоследовательному исполнению. Вместо добавления сложности этот подход возвращает пробои трендовых линий к четким структурным правилам и дисциплинированному исполнению, сосредотачиваясь на том, что цена объективно делает, а не на том, что предположительно произойдет дальше.
Трендовые линии как динамические уровни поддержки и сопротивления
Трендовые линии служат структурным выражением поддержки и сопротивления. Большинство трейдеров знакомы с горизонтальными уровнями поддержки и сопротивления, которые строятся по ценовым зонам, где рынок неоднократно реагировал в прошлом. Эти уровни особенно эффективны в условиях диапазона или консолидации, когда цена колеблется между относительно фиксированными границами.

Рисунок 1. Горизонтальные уровни поддержки и сопротивления в консолидации
На рисунке 1 показаны горизонтальные уровни поддержки и сопротивления в условиях консолидации. Обведенные области показывают повторяющиеся реакции цены на одних и тех же уровнях, подтверждая техническую значимость этих зон. В такой среде уровни поддержки и сопротивления остаются относительно статичными, поскольку цена движется вбок, а не развивается направленно. Однако консолидация – это временное состояние. По мере перехода цены в тренд формируются более высокие максимумы и более высокие минимумы при восходящем тренде или более низкие максимумы и более низкие минимумы при нисходящем. В таких условиях уровни поддержки и сопротивления уже не остаются фиксированными: они адаптируются к направленному давлению и развиваются вместе с ценой.
Наклонные трендовые линии отражают это динамическое поведение, соединяя ключевые точки свинга внутри тренда. В восходящем тренде наклонная линия поддержки соединяет повышающиеся минимумы свингов, обозначая области, где устойчиво появляется давление покупателей. В нисходящем тренде наклонная линия сопротивления соединяет понижающиеся максимумы свингов, выявляя зоны, где неоднократно появляется давление продавцов. Помимо обозначения ценовых уровней, эти трендовые линии передают наклон, силу и устойчивость тренда, давая более ясное представление о том, как цена развивается во времени, а не только реагирует на отдельные горизонтальные зоны.
Иллюстрация пробоя наклонной трендовой линии

Рисунок 2. Бычий пробой наклонной трендовой линии
На рисунке 2 показан бычий пробой наклонной трендовой линии, построенной по проверенным точкам свинга. Обведенные области отмечают свинги, используемые для построения нисходящей наклонной трендовой линии, которая служит динамическим сопротивлением в рамках преобладающего медвежьего тренда. По мере того как цена продолжает взаимодействовать с линией, повторяющиеся реакции подтверждают ее значимость. Пробой фиксируется только тогда, когда цена уверенно пересекает наклонную трендовую линию вверх, что указывает на ослабление давления продавцов и смещение контроля по направлению движения.
Этот пример показывает, как проверка свингов, построение трендовой линии и подтверждение пробоя складываются в четкий сигнал, основанный на правилах стратегии.
Значимость пробоев трендовых линий
Наклонные трендовые линии представляют собой динамически развивающиеся уровни поддержки и сопротивления на трендовом рынке. Когда цена уверенно пробивает хорошо сформированную трендовую линию, это указывает на то, что направленное давление, поддерживавшее тренд, ослабло. Такие пробои часто предшествуют заметному изменению рыночного поведения – через разворот, более глубокую коррекцию или ускорение в противоположную сторону.
На практике слабое место торговли по пробоям трендовых линий заключается не в самой концепции, а в том, как именно определяется факт пробоя. Многие неудачные сетапы возникают из-за трендовых линий без структурного обоснования или из-за того, что незначительные выходы цены принимаются за действительные пробои. Такие преждевременные сигналы добавляют шум, ухудшают точность входа и подрывают согласованность. Чтобы избежать этого, стратегия использует строгие правила построения и подтверждения. Трендовые линии должны строиться по четкой структуре свингов, а пробой признается только тогда, когда цена совершает уверенное пересечение линии с одной стороны на другую, а не просто кратковременно касается ее или прокалывает.
Для дополнительного повышения надежности трендовые линии проверяются по трем точкам свинга. Хотя двух точек достаточно, чтобы геометрически задать линию, это еще не доказывает, что цена действительно реагирует на эту линию. Именно третий свинг дает такое подтверждение, показывая повторное взаимодействие с тем же наклонным уровнем. Это требование отфильтровывает случайные совпадения и гарантирует, что анализ пробоя будет выполняться только по трендовым линиям с реальной структурной значимостью.

Рисунок 3. Проверка трендовой линии по трем свингам
Диаграмма показывает, как третий свинг подтверждает значимость трендовой линии, демонстрируя повторное взаимодействие цены с одной и той же наклонной структурой.
Логика стратегии и генерация сигналов
В этом инструменте трендовые линии строятся строго по проверенным точкам свинга, поэтому каждая линия отражает реальное рыночное поведение. Дополнительное подтверждение обеспечивается требованием нескольких взаимодействий свингов с одной и той же трендовой линией, что подтверждает ее значимость до использования для генерации сигнала.
Как только сформирована подтвержденная наклонная трендовая линия:
- генерируется сигнал BUY, когда цена уверенно пробивает вверх подтвержденную наклонную трендовую линию сопротивления;
- генерируется сигнал SELL, когда цена уверенно пробивает вниз подтвержденную наклонную трендовую линию поддержки.
Пробои подтверждаются логикой пересечения цены, а не простыми касаниями, что помогает фильтровать шум и снижает количество ложных сигналов. Благодаря системному выявлению свингов, построению трендовых линий и проверке пробоев анализ остается последовательным и свободным от произвольного проведения линий, полностью сохраняя соответствие принципам чистого Price Action.
В следующем разделе показано, как эта структура реализована на языке MQL5 и как аналитические правила переводятся в код, который объединяет выявление свингов, проверку трендовых линий и подтверждение пробоя в едином рабочем процессе.
Реализация на MQL5
В этом разделе показано, как логика стратегии переводится в реализацию на языке MQL5. Код организован в модульные компоненты, отвечающие за выявление свингов, проверку трендовых линий и подтверждение пробоя, что делает логику ясной и расширяемой. Ниже показаны этапы реализации, чтобы было видно, как все части складываются в единую систему.
Настройка входных параметров
Работа советника начинается с задания полного набора входных параметров, которые позволяют настроить его поведение в соответствии с торговыми предпочтениями пользователя. Сюда входят параметры выявления свингов, такие как число баров для окна проверки (SwingLookback) и минимальный размер свинга (MinSwingSize), которые можно задавать либо по ATR, либо фиксированным значением. Можно выбрать, использовать ли фильтрацию ATR (UseATRFiltering) для динамического определения размера свинга, а также отображать ли на графике точки свинга и подписи к ним (ShowSwingPoints, ShowSwingLabels). Настройки трендовых линий позволяют задать, нужно ли рисовать линии сопротивления и поддержки (DrawResistanceLine, DrawSupportLine), продлевать ли их до правого края графика (ExtendToRightEdge), а также какое минимальное число касаний требуется, чтобы линия считалась значимой (MinTouchPointsRequired).
input int SwingLookback = 5; input double MinSwingSize = 0.0003; input bool UseATRFiltering = true; input bool ShowSwingPoints = true; input bool ShowSwingLabels = false; input bool DrawResistanceLine = true; input bool DrawSupportLine = true; input bool ExtendToRightEdge = true; input int MinTouchPointsRequired = 3; input double ThirdSwingToleranceATR = 0.15; input bool RequireThirdSwingAfterAnchor2 = true; input bool EnableBreakoutSignals = true; input bool BreakoutUseClose = true; input int BreakoutBufferPoints = 5; input bool AlertOnBreakout = false; input bool PermanentArrows = true; input color BullArrowColor = clrLimeGreen; input color BearArrowColor = clrRed;
Для проверки трендовых линий по третьей точке свинга используются такие параметры, как допуск на основе ATR (ThirdSwingToleranceATR) и требование, чтобы третий свинг формировался после второго (RequireThirdSwingAfterAnchor2), что повышает надежность. В числе параметров обнаружения – включение или отключение сигналов (EnableBreakoutSignals), выбор между определением по ценам закрытия и по теням свечей (BreakoutUseClose), задание буфера в пунктах за пределами трендовой линии для подтверждения (BreakoutBufferPoints), включение алертов (AlertOnBreakout), а также отображение постоянных стрелок на графике (PermanentArrows). Кроме того, параметры визуальной настройки, такие как цвет, ширина и стиль линии, а также размер стрелки, позволяют подстроить внешний вид графика под свои предпочтения.
Глобальные переменные и структуры данных
Для поддержки этой логики в реализации используется небольшой набор глобальных переменных и структур данных. Инициализируется хэндл индикатора ATR (atrHandle), а также переменная currentATR для хранения последнего значения ATR. Создаются массивы для хранения точек свинга (significantHighs, significantLows) и информации о пробоях (breakoutsArray).
int atrHandle = INVALID_HANDLE; double currentATR = 0.0001; struct SwingPoint { datetime time; double price; int barIndex; double size; bool isHigh; int order; }; struct BreakoutInfo { datetime time; double price; bool isBullish; string lineType; // "RES" or "SUP" int touchCount; };
Определены две структуры: SwingPoint, которая хранит время, цену, индекс бара, размер, признак максимума или минимума и порядковый номер; а также BreakoutInfo, которая фиксирует временную метку, цену, тип линии и число касаний для каждого подтвержденного пробоя.
SwingPoint significantHighs[10], significantLows[10]; BreakoutInfo breakoutsArray[]; int breakoutsCount = 0;
Эти структуры помогают логично организовать данные, упрощая обработку точек свинга, проверку трендовых линий и систематическую фиксацию событий пробоя.
Вспомогательные функции
Вспомогательные функции обеспечивают необходимые служебные операции для основного анализа. Функция DeleteObjectsByPrefix сканирует график и удаляет все объекты с заданным префиксом, помогая очищать устаревшие трендовые линии и точки перед их новой отрисовкой. Функции BreakoutBufferPrice и ThirdSwingTolerancePrice рассчитывают буферные зоны на основе числа пунктов и ATR; эти зоны используются для подтверждения пробоев и проверки близости точек свинга к трендовым линиям.
void DeleteObjectsByPrefix(const string prefix) { int total = ObjectsTotal(0, -1, -1); for(int i = total - 1; i >= 0; i--) { string name = ObjectName(0, i, -1, -1); if(StringLen(name) >= StringLen(prefix) && StringSubstr(name, 0, StringLen(prefix)) == prefix) ObjectDelete(0, name); } }
LinePriceAtTime вычисляет интерполированную цену трендовой линии в заданный момент времени, что необходимо для визуализации и проверки наклонных линий.
double LinePriceAtTime(const SwingPoint &a, const SwingPoint &b, datetime t) { double dt = (double)(b.time - a.time); if(dt == 0.0) return a.price; double slope = (b.price - a.price) / dt; return a.price + slope * (double)(t - a.time); }
Функция ThirdSwingConfirms проверяет, попадает ли третья точка свинга (максимум или минимум) в зону допуска трендовой линии, тем самым подтверждая ее корректность. DrawPermanentArrow создает визуальную стрелку-маркер в точке пробоя, обозначает бычий или медвежий характер пробоя и сохраняет это событие в массиве breakoutsArray. RedrawPermanentArrows перебирает сохраненные данные о пробоях и заново отрисовывает стрелки, обеспечивая их постоянное отображение. Функции OnInit, OnDeinit и OnTick отвечают за инициализацию, очистку и обновление: обновляют значения ATR, удаляют старые объекты и запускают аналитические процедуры на каждой новой свече.
bool ThirdSwingConfirms(const SwingPoint &a, const SwingPoint &b, const SwingPoint &c) { double lp = LinePriceAtTime(a, b, c.time); return (MathAbs(c.price - lp) <= ThirdSwingTolerancePrice()); }
Поиск точек свинга
Функция FindSignificantSwings последовательно просматривает последние бары, чтобы выявить потенциальные максимумы и минимумы свинга. Обход начинается со смещения SwingLookback, чтобы избежать проблем на границах. Для каждого бара проверяется, превышает ли его максимум максимумы соседних баров, что позволяет выявить максимумы свинга; аналогично минимум сравнивается с соседними значениями для выявления минимумов свинга. Далее вычисляется размер свинга (разница между экстремумами максимума и минимума) и сравнивается с порогом минимального размера, который может либо основываться на ATR, либо быть фиксированным. Если точка свинга проходит отбор, ее параметры – время, цена, индекс бара, размер и тип – сохраняются в соответствующем массиве. Таким образом, для построения трендовых линий учитываются только значимые свинги, а мелкие ценовые колебания отсеиваются.
void FindSignificantSwings(const MqlRates &rates[], int totalBars, SwingPoint &highs[], int &highCount, SwingPoint &lows[], int &lowCount) { highCount = 0; lowCount = 0; double minSize = UseATRFiltering ? (currentATR * 0.8) : MinSwingSize; for(int i = SwingLookback; i < totalBars - SwingLookback; i++) { // Swing high detection bool isSwingHigh = true; double currentHigh = rates[i].high; for(int j = 1; j <= SwingLookback; j++) { if(rates[i-j].high >= currentHigh || rates[i+j].high >= currentHigh) { isSwingHigh = false; break; } } if(isSwingHigh) { // Save swing high info ... } // Swing low detection bool isSwingLow = true; double currentLow = rates[i].low; for(int j = 1; j <= SwingLookback; j++) { if(rates[i-j].low <= currentLow || rates[i+j].low <= currentLow) { isSwingLow = false; break; } } if(isSwingLow) { // Save swing low info ... } } }
Присвоение порядка точкам свинга
После обнаружения точек свинга функция AssignSwingOrder сортирует их по времени – от самых старых к самым новым – на основе временных меток. Такое упорядочивание важно, поскольку трендовые линии строятся между конкретными точками свинга в заданной последовательности. После сортировки каждой точке свинга присваивается порядковый номер, начиная с 1 для самой старой. Эта нумерация помогает сохранять согласованность при выборе точек для построения и проверки трендовых линий, особенно при анализе нескольких свингов в динамике.
void AssignSwingOrder(SwingPoint &swings[], int count) { if(count <= 0) return; // Sorting by time ascending for(int i = 0; i < count-1; i++) { for(int j = i+1; j < count; j++) { if(swings[i].time > swings[j].time) { SwingPoint tmp = swings[i]; swings[i] = swings[j]; swings[j] = tmp; } } } for(int i = 0; i < count; i++) swings[i].order = i + 1; }
Отрисовка точек свинга
Функция DrawSwingPoints отображает на графике выявленные максимумы и минимумы свинга. Для каждой такой точки создается объект-стрелка: OBJ_ARROW_THUMB_DOWN для максимумов и OBJ_ARROW_THUMB_UP для минимумов; он размещается на соответствующих координатах времени и цены. Для лучшей наглядности задаются визуальные свойства – цвет, ширина и точка привязки. При включенной опции рядом с точками свинга добавляются метки H1 и L1; они слегка смещаются на величину ATR, чтобы не накладываться на свечи. Эти визуальные маркеры помогают быстро распознавать значимые свинги и понимать структуру Price Action.
void DrawSwingPoints(const SwingPoint &highs[], int highCount, const SwingPoint &lows[], int lowCount) { for(int i = 0; i < highCount; i++) { string pointName = TL_PREFIX + "H_" + IntegerToString(highs[i].order); if(ObjectFind(0, pointName) < 0) ObjectCreate(0, pointName, OBJ_ARROW_THUMB_DOWN, 0, highs[i].time, highs[i].price); else ObjectMove(0, pointName, 0, highs[i].time, highs[i].price); ObjectSetInteger(0, pointName, OBJPROP_COLOR, SwingHighColor); ObjectSetInteger(0, pointName, OBJPROP_WIDTH, 2); ObjectSetInteger(0, pointName, OBJPROP_ANCHOR, AnchorPoint); ObjectSetInteger(0, pointName, OBJPROP_BACK, false); // Labels if enabled if(ShowSwingLabels) { ... } } // Similar for lows }
Поиск наиболее значимых линий сопротивления и поддержки
Функции FindBestResistanceLine3 и FindBestSupportLine3 анализируют ранее выявленные точки свинга, чтобы выбрать наиболее значимые трендовые линии сопротивления и поддержки. Они последовательно перебирают пары точек свинга, проверяя наличие нисходящих паттернов сопротивления (старый максимум выше нового) или восходящих паттернов поддержки (старый минимум ниже нового). Для каждой пары вычисляется наклон потенциальной трендовой линии и подсчитывается число касаний или взаимодействий цены с линией в пределах допустимого отклонения. Функции также проверяют наличие третьей точки свинга, подтверждающей корректность трендовой линии, с помощью функции ThirdSwingConfirms. Каждая линия-кандидат оценивается по количеству касаний, величине отклонения, недавности формирования и наличию подтверждения третьим свингом. Линии с наивысшей оценкой выбираются как наиболее значимые и представляют самые сильные уровни сопротивления или поддержки в текущем контексте графика.
void FindBestResistanceLine3(const SwingPoint &highs[], int highCount, const MqlRates &rates[], int totalBars, SwingPoint &bestAnchor1, SwingPoint &bestAnchor2, SwingPoint &bestAnchor3, int &bestTouchCount, double &bestScore) { ... for(int a = 0; a < highCount-1; a++) { for(int b = a+1; b < highCount; b++) { if(!(pts[a].price > pts[b].price)) continue; ... // Count touches and confirm third swing ... // Calculate score and update best line } } }
Построение трендовых линий
Функция DrawTrendline3 создает или обновляет объекты трендовых линий, соединяющих выбранные точки свинга. Функция присваивает трендовой линии уникальное имя в зависимости от того, является ли она сопротивлением или поддержкой, и задает ее визуальные свойства – цвет, ширину, стиль и режим продления – в соответствии с настройками пользователя. Трендовая линия строится по первым двум опорным точкам, а рядом с третьей точкой свинга размещается метка с числом точек свинга, использованных для подтверждения, с небольшим вертикальным смещением для лучшей видимости. Такое отображение помогает видеть наклонные уровни поддержки и сопротивления, подтвержденные несколькими свингами, и дает контекст для возможных пробоев.
void DrawTrendline3(const SwingPoint &anchor1, const SwingPoint &anchor2, const SwingPoint &anchor3, bool isResistance, int touchCount) { string lineName = TL_PREFIX + (isResistance ? "RESISTANCE" : "SUPPORT"); string labelName = TL_PREFIX + (isResistance ? "RES_LABEL" : "SUP_LABEL"); if(ObjectFind(0, lineName) < 0) { ObjectCreate(0, lineName, OBJ_TREND, 0, anchor1.time, anchor1.price, anchor2.time, anchor2.price); } else { ObjectMove(0, lineName, 0, anchor1.time, anchor1.price); ObjectMove(0, lineName, 1, anchor2.time, anchor2.price); } ObjectSetInteger(0, lineName, OBJPROP_COLOR, lineColor); ObjectSetInteger(0, lineName, OBJPROP_WIDTH, LineWidth); ObjectSetInteger(0, lineName, OBJPROP_STYLE, LineStyle); ObjectSetInteger(0, lineName, OBJPROP_RAY_RIGHT, ExtendToRightEdge); ObjectSetInteger(0, lineName, OBJPROP_BACK, false); // Label near 3rd swing ... }
Проверка пробоя (логика пересечения для наклонных линий)
Функция CheckBreakouts отслеживает последние свечи, чтобы определить момент, когда цена пересекает линию сопротивления вверх или линию поддержки вниз, указывая на возможный пробой. Функция рассчитывает ожидаемую цену трендовой линии на двух последних закрытых свечах и сравнивает ее с фактическими ценами закрытия или тенями, учитывая буферную зону, чтобы отсечь ложные сигналы. Если цена пересекает линию сопротивления вверх (бычий пробой) или линию поддержки вниз (медвежий пробой) и на этом баре ранее не был зафиксирован пробой, функция регистрирует событие, отображает постоянную стрелку и при необходимости отправляет алерт. Система гарантирует не более одного пробоя по каждой стороне на бар: для этого отслеживаются временные метки и исключаются повторные сигналы по одному и тому же событию.
void CheckBreakouts(const MqlRates &rates[], bool haveRes, const SwingPoint &resA, const SwingPoint &resB, int resTouches, bool haveSup, const SwingPoint &supA, const SwingPoint &supB, int supTouches) { ... if(haveRes) { double line1 = LinePriceAtTime(resA, resB, t1); double line2 = LinePriceAtTime(resA, resB, t2); double p1 = BreakoutUseClose ? rates[1].close : rates[1].high; double p2 = BreakoutUseClose ? rates[2].close : rates[2].high; bool crossedUp = (p2 <= line2 + buf) && (p1 > line1 + buf); if(crossedUp && t1 != g_lastBuyBarTime) { g_lastBuyBarTime = t1; // Draw arrow and alert } } // Similar for support line }
Обработка событий графика и главный цикл
Функция OnChartEvent оставлена как заготовка под ручное управление или горячие клавиши, если они понадобятся, но в этой реализации она остается пустой. Основная логика выполняется в функции OnTick, которая вызывается на каждом ценовом тике. Сначала по временным меткам баров проверяется, сформировалась ли новая свеча. Если это так, обновляется значение ATR, удаляются предыдущие объекты трендовых линий и через DrawMostSignificantTrendlines запускается основная последовательность анализа. В эту последовательность входят выявление точек свинга, выбор лучших линий сопротивления и поддержки, построение трендовых линий и проверка пробоев. Для подтвержденных пробоев постоянные стрелки отрисовываются заново, чтобы график отражал актуальную техническую картину. Этот непрерывный процесс позволяет советнику гибко адаптироваться к меняющимся рыночным условиям и выдавать своевременные сигналы.
void OnTick() { static datetime lastBarTime = 0; datetime currentBarTime = iTime(_Symbol, _Period, 0); if(currentBarTime == lastBarTime && lastBarTime != 0) return; lastBarTime = currentBarTime; if(UseATRFiltering && atrHandle != INVALID_HANDLE) { double atrBuffer[1]; if(CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0) currentATR = atrBuffer[0]; } DeleteObjectsByPrefix(TL_PREFIX); DrawMostSignificantTrendlines(); RedrawPermanentArrows(); }
После реализации код компилируется и проверяется, чтобы перед тестированием убедиться, что сборка проходит без ошибок. Любые сообщения компилятора рассматриваются как структурная обратная связь: по ним исправляются синтаксис, объявления и использование функций, пока код не начнет компилироваться без ошибок и не будет готов к тестированию в MetaTrader 5.
Тестирование и результаты
После успешной компиляции инструмента следующим этапом становится тестирование. Это можно делать на реальном графике; однако начинать настоятельно рекомендуется с демо-счета, а не с реального счета. Тестирование в демо-среде позволяет наблюдать за стратегией в реальных рыночных условиях без лишнего риска.
Помимо тестирования на реальном графике, инструмент можно оценивать в Тестере стратегий MetaTrader 5. Этот формат – тестирование на исторических данных – позволяет оценить, как стратегия вела бы себя в прошлых рыночных условиях. Тестирование на исторических данных также помогает выявлять сильные и слабые стороны, а также области, где могут потребоваться корректировки параметров, особенно потому, что разные инструменты часто демонстрируют разное ценовое поведение.
Дальнейшая доработка возможна через оптимизацию в MetaTrader 5, где входные параметры систематически проверяются для повышения эффективности. Этот процесс может требовать значительных вычислительных ресурсов и обычно требует достаточно мощного компьютера.
В этом разделе я привожу результаты, полученные на этапе тестирования, и показываю, как инструмент вел себя в разных условиях и какие выводы удалось сделать.
Первый результат

Рисунок 4. Пример тестирования на исторических данных по EURUSD (H1)
Рисунок 4 показывает пример тестирования на исторических данных, полученный в Тестере стратегий MetaTrader 5 в визуальном режиме. В этом сценарии инструмент определяет и строит наклонную трендовую линию сопротивления (показана красным), соединяя три подтвержденные точки свинга. По мере роста цены трендовая линия уверенно пробивается вверх. Инструмент подтверждает этот пробой и отмечает его зеленой стрелкой вверх, сигнализируя о бычьем пробое. Сигналы генерируются только после явного пересечения ценой линии, а не в ответ на незначительные касания или кратковременные выходы за ее пределы. Этот пример показывает, как инструмент ведет себя при тестировании на исторических данных: трендовые линии строятся по проверенной структуре свингов, а сигналы пробоя появляются только при выполнении значимых условий, что дает четкие и дисциплинированные сигналы, согласованные с логикой Price Action.
Второй результат
На диаграмме ниже показан второй тест по золоту (XAUUSD) на таймфрейме H1, зафиксированный при тестировании на исторических данных в Тестере стратегий MetaTrader 5 в визуальном режиме. Этот пример показывает, как инструмент работает в более волатильной рыночной среде, где движения цены масштабнее, а условия меняются быстрее. В этом тесте инструмент автоматически определяет и наклонную трендовую линию сопротивления, и наклонную трендовую линию поддержки на основе проверенных точек свинга.
Красная нисходящая трендовая линия представляет сопротивление, построенное по трем подтвержденным максимумам свинга, тогда как синяя восходящая линия представляет поддержку, сформированную по нескольким минимумам свинга. По мере развития движения линия сопротивления остается актуальной до момента решающего взаимодействия с ценой. Вместо реакции на кратковременные выходы за линию или всплески, вызванные волатильностью, инструмент ждет четкого пересечения цены относительно наклонной трендовой линии и только потом оценивает условие пробоя. Такая сдержанность особенно важна на инструментах вроде золота, где из-за повышенной волатильности ложные пробои встречаются чаще.

Рисунок 5. Пример тестирования на исторических данных по XAUUSD (H1)
Ключевое наблюдение по итогам этого теста состоит в том, что инструмент адаптируется к ценовому поведению золота без ручного вмешательства. Выявление свингов, построение трендовых линий и их проверка остаются последовательными, несмотря на более широкие ценовые диапазоны и более резкие движения. Это подтверждает, что логика стратегии не привязана к конкретному инструменту, а опирается на устойчивые свойства ценового поведения. В целом этот тест дополнительно подтверждает устойчивость инструмента в разных рыночных условиях. Те же структурные правила, которые применяются к валютным парам Forex, действуют и на товарных инструментах, таких как золото, позволяя объективно и последовательно выявлять пробои трендовых линий при тестировании на исторических данных. Как и у любых инструментов Price Action, результативность зависит от рыночных условий, выбора таймфрейма и дисциплинированной интерпретации сигналов.
Заключение
В этой статье был представлен структурный подход к пробоям наклонных трендовых линий и показано, как базовые принципы Price Action можно воплотить в дисциплинированный аналитический инструмент на MQL5. За счет четких структурных правил инструмент устраняет значительную часть неопределенности, которая часто подрывает анализ пробоев трендовых линий.
Примеры тестирования подтверждают, что эта структурно-ориентированная логика работает последовательно на разных инструментах и в разных рыночных условиях. Вместо подстройки правил под рынок анализ остается привязанным к структуре свингов и поведению цены, благодаря чему сигналы пробоя естественно возникают из графика.
В рамках этого подхода пробои трендовых линий легче выявлять, оценивать и включать в дисциплинированный процесс работы с Price Action – без опоры на субъективную интерпретацию или произвольное построение линий.
Этот инструмент предназначен исключительно для анализа и подтверждения сигналов, а не для автоматической торговли. Перед использованием на реальном счете настоятельно рекомендуется тщательно протестировать инструмент и на исторических данных, и на демо-счетах в реальном времени. При использовании вместе с уже существующим торговым подходом этот инструмент может выступать дополнительным уровнем подтверждения, усиливая дисциплину в принятии решений, а не подменяя ее.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/21277
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
От начального до среднего уровня: Объекты (III)
От начального до среднего уровня: События мыши
Переосмысливаем классические стратегии (Часть 20): Современная интерпретация стохастического осциллятора
Разработка инструментария для анализа Price Action (Часть 60): Объективное построение трендовых линий по свингам для структурного анализа
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования