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

Хотя горизонтальные уровни остаются важными, они не всегда показывают полную картину. Многие рыночные фазы разворачиваются вдоль наклонных структур, однако такие трендовые линии часто трудно провести объективно, поэтому на практике их нередко наносят слишком субъективно. Этот инструмент предназначен для того, чтобы сделать работу с наклонными трендовыми линиями более объективной, последовательной и воспроизводимой, чтобы их можно было более надежно встраивать в аналитический процесс.
Логика работы инструмента
В общих чертах инструмент работает по дисциплинированной и структурированной схеме:
- Выявление значимых свингов
Процесс начинается с выявления значимых точек свинга непосредственно по исходным ценовым данным, без опоры на опорные точки, заданные индикатором. Эти свинги отражают точки локального доминирования, где цена показывает временное истощение или ускорение.
- Фильтрация и проверка свингов
Для снижения шума каждый выявленный свинг оценивается по критериям размера и значимости. Это обеспечивает сохранение только реальных изменений в поведении рынка, тогда как незначительные колебания игнорируются.
- Построение структурных связей
Затем проверенные свинги оцениваются, чтобы определить, могут ли они сформировать целостные структуры поддержки или сопротивления. Максимумы и минимумы обрабатываются независимо: нисходящие максимумы свинга оцениваются как кандидаты на линии сопротивления, а восходящие минимумы свинга – как кандидаты на линии поддержки.
- Формирование и продолжение трендовых линий
Когда выявлена корректная структурная связь, трендовая линия строится по выбранным свингам, сохраняя точный наклон, заданный рынком. Затем линия продлевается вперед в виде луча, сохраняя структурную непрерывность без сглаживания, усреднения и регрессии. Цель состоит не в прогнозе будущего движения цены, а в сохранении структуры и наблюдении за тем, как цена продолжает взаимодействовать с ней.
- Избирательный и сфокусированный вывод
Сохраняются только наиболее значимые трендовые линии с каждой стороны. Это намеренное ограничение поддерживает порядок на графике и удерживает фокус на доминирующих структурных уровнях, не перегружая график избыточной геометрией.
Построение свингов по исходным ценовым данным
Основа этого подхода – прямое выделение точек свинга по исходным ценовым данным, без опоры на вспомогательные индикаторы. Максимум свинга определяется тогда, когда бар локально доминирует над соседними барами, указывая на временное истощение давления покупателей. И наоборот, минимум свинга отражает точку, в которой давление продавцов ослабевает, а цена начинает стабилизироваться.

На рисунке выше показан пример ценовой структуры с более высокими максимумами и более высокими минимумами, формирующей восходящий структурный каркас, из которого может быть построена линия поддержки.
Чтобы сохранить структурную значимость, каждый свинг дополнительно проверяется по его величине относительно рыночной волатильности. Рассматриваются только свинги, превышающие заданный порог размера. Такое сочетание локального доминирования и фильтрации по размеру гарантирует, что итоговая структура будет отражать значимое рыночное поведение, а не кратковременный шум.
Соединение свингов в трендовые линии
После того как свинги проверены и упорядочены хронологически, инструмент оценивает их структурные связи. Не каждая пара свингов подходит для формирования трендовой линии. Рассматриваются только те пары, которые соответствуют четким направленным правилам: нисходящие максимумы – для сопротивления, восходящие минимумы – для поддержки. Это предотвращает построение искусственной или вводящей в заблуждение геометрии, противоречащей реальному поведению рынка.
Когда выявлена корректная пара, трендовая линия строится с точным наклоном, заданным этими свингами. Продление линии в виде луча сохраняет структурную целостность во времени и позволяет наблюдать Price Action относительно стабильного ориентира. На этом этапе фокус остается сугубо аналитическим: трендовая линия сохраняется для наблюдения за структурой, а не для прогноза результата.
Теперь, когда эта концептуальная и логическая основа задана, в следующем разделе мы перейдем от теории к практике и покажем, как эти идеи переводятся в конкретную реализацию на языке MQL5 с четкими правилами. На диаграмме ниже сопоставлены корректные и некорректные трендовые линии, построенные по свингам на одной стороне ценовой структуры. Корректные трендовые линии опираются на последовательные связи между свингами, тогда как некорректные примеры возникают при смешении противоположных сторон структуры или нарушении направленной непрерывности.

Реализация на MQL5
В этом разделе подробно показано, как концептуальная модель структурного анализа трендовых линий переводится в реальную программу на языке MQL5 с четкими правилами. Главная цель – точно реализовать основные принципы, такие как объективное выявление свингов, структурная проверка и дисциплинированное построение трендовых линий, так чтобы система оставалась стабильной, прозрачной и последовательной как на исторических, так и на текущих рыночных данных. Реализация организована в виде четко разграниченных этапов, каждый из которых напрямую соответствует ключевой части концептуальной модели. Такое прямое соответствие упрощает понимание и делает код более удобным для проверки, расширения и изменения. За счет ясного соответствия между идеями и кодом этот подход обеспечивает целостную работу системы и дает трейдерам надежный инструмент структурного анализа.
Инициализация и настройка окружения
Первый этап реализации – настройка окружения для надежного и точного анализа. В функции OnInit() код подготавливает необходимые индикаторы и удаляет артефакты предыдущего анализа. Если включена ATR-фильтрация (UseATRFiltering), система создает хэндл индикатора через iATR(), который рассчитывает текущую рыночную волатильность. Это позволяет последующим этапам выявления и проверки свингов динамически адаптироваться к меняющимся рыночным условиям, сохраняя актуальность порогов для значимых свингов независимо от режима волатильности.
Кроме того, система вызывает DeleteObjectsByPrefix(), чтобы удалить все существующие трендовые линии и объекты точек свинга, оставшиеся от предыдущих запусков. Этот шаг обеспечивает чистый график без остаточных объектов, которые могли бы создавать визуальный шум или приводить к ошибочной интерпретации. Процесс инициализации создает контролируемую среду, благодаря которой каждая сессия анализа начинается с последовательного и чистого визуального и информационного состояния, что критически важно для надежных и содержательных структурных выводов.
int OnInit() { if(UseATRFiltering) atrHandle = iATR(_Symbol, _Period, 14); DeleteObjectsByPrefix(OBJECT_PREFIX); return(INIT_SUCCEEDED); }
Обработка данных в реальном времени и работа с тиками
Основная рабочая логика выполняется в функции OnTick(), которая вызывается на каждом новом рыночном тике. Ее задача – поддерживать синхронизацию анализа с актуальными рыночными данными и обеспечивать, чтобы визуальный вывод отражал последнее ценовое движение. Процесс начинается с проверки, сформировался ли новый бар: для этого iTime() сравнивает временную метку текущего бара с последним уже обработанным баром. Если обнаружен новый бар, код обновляет значение ATR, копируя последние данные из хэндла индикатора ATR через CopyBuffer(). Этот шаг гарантирует, что пороги для проверки свингов, основанные на волатильности, остаются актуальными и уместными.
После обновления информации о волатильности система удаляет все предыдущие объекты трендовых линий и точек свинга с помощью DeleteObjectsByPrefix(), чтобы очистить график. Это не позволяет наложившимся или устаревшим объектам загромождать график. Наконец, вызывается функция DrawMostSignificantTrendlines(), которая анализирует последние данные, выявляет значимые свинги, оценивает их структурную важность и соответствующим образом строит новые трендовые линии. Этот цикл обеспечивает актуальность и надежность визуальной и аналитической системы, сохраняя ее соответствие текущей рыночной среде.
void OnTick() { static datetime lastBarTime = 0; datetime currentBarTime = iTime(_Symbol, _Period, 0); if(currentBarTime == lastBarTime && lastBarTime != 0) return; // No new bar, skip lastBarTime = currentBarTime; if(UseATRFiltering && atrHandle != INVALID_HANDLE) { double atrBuffer[1]; if(CopyBuffer(atrHandle, 0, 0, 1, atrBuffer) > 0) currentATR = atrBuffer[0]; } DeleteObjectsByPrefix(OBJECT_PREFIX); DrawMostSignificantTrendlines(); }
Выявление свинга – извлечение структурных точек из исходных ценовых данных
Выявление свингов реализовано через поиск значимых структурных точек непосредственно в исходных ценовых данных внутри функции FindSignificantSwings(). Такой подход делает анализ прозрачным и объективным: он не опирается на опорные точки, построенные индикатором, а использует только ценовой ряд. Алгоритм перебирает последние бары, начиная с индекса, заданного параметром SwingLookback, чтобы избежать проблем на границах диапазона. Для каждого бара проверяется, может ли он считаться максимумом свинга, путем сравнения его максимума с соседними барами в окне проверки. Максимум свинга подтверждается, если текущий максимум превышает все максимумы соседних баров, что указывает на временный пик. И наоборот, минимумы свинга фиксируются, когда минимум бара ниже минимумов соседних баров, что указывает на потенциальную точку поддержки.
Чтобы эти свинги действительно отражали значимые рыночные реакции, размер каждого кандидата рассчитывается как разница между точкой свинга и максимальным или минимальным значением среди соседних минимумов или максимумов. Затем этот размер сравнивается с порогами: либо с фиксированным минимумом (MinSwingSize), либо со значением, скорректированным по волатильности (currentATR * 0.8), чтобы отфильтровать незначительные колебания. Сохраняются только свинги, превышающие эти пороги, чтобы анализ был сосредоточен на реальных структурных сдвигах, а не на незначительном шуме.
void FindSignificantSwings(const MqlRates &rates[], int totalBars, SwingPoint &highs[], int &highCount, SwingPoint &lows[], int &lowCount) { // Loop through bars starting from SwingLookback for(int i = SwingLookback; i < totalBars - SwingLookback; i++) { // Detect swing high 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) { // Calculate swing size and validate double leftLow = MathMin(rates[i - 1].low, rates[i - 2].low); double rightLow = MathMin(rates[i + 1].low, rates[i + 2].low); double swingSize = currentHigh - MathMax(leftLow, rightLow); if(swingSize >= (UseATRFiltering ? currentATR * 0.8 : MinSwingSize)) { // Store swing high // ... } } // Detect swing low (similar logic) // ... } }
Упорядочивание свингов по времени для структурной согласованности
После того как значимые свинги выявлены и подтверждены, важно сохранить их хронологический порядок, чтобы не нарушать логическую целостность анализа. Это реализовано в функции AssignSwingOrder(), которая сортирует точки свинга по временным меткам – от более ранних к более поздним. Такое упорядочивание гарантирует, что последующее построение трендовых линий учитывает реальную временную последовательность рыночной активности. Соблюдение строгой хронологической последовательности предотвращает логические несоответствия – например, построение линий поддержки или сопротивления по свингам, которые как будто смещаются во времени, что может приводить к ложным интерпретациям.
Кроме того, такое упорядочивание защищает от перерисовки – ситуации, когда исторические уровни как будто меняются по мере поступления новых данных, – за счет фиксации последовательности свингов в анализе. Такой подход гарантирует, что структурные связи, показанные на графике, останутся стабильными и надежными, корректно отражая развитие рынка. Тем самым формируется последовательная и надежная основа для интерпретации Price Action.
void AssignSwingOrder(SwingPoint swings[], int count) { // Simple bubble sort by timestamp 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; } } } // Assign order indices for(int i = 0; i < count; i++) swings[i].order = i + 1; }
Построение и проверка трендовых линий поддержки и сопротивления
Выявление и проверка трендовых линий строятся на систематической оценке пар свингов, чтобы определить их пригодность в качестве структурных уровней поддержки или сопротивления. Функции FindBestResistanceLine() и FindBestSupportLine() анализируют все возможные пары, соответствующие критериям направления: нисходящие пары – для сопротивления, восходящие – для поддержки. Для каждой пары алгоритм вычисляет наклон как отношение вертикальной разницы цен к горизонтальной разнице по времени, чтобы линия точно отражала направленное движение рынка. Затем качество каждой линии-кандидата оценивается по тому, сколько баров между опорными точками укладываются относительно линии в допустимый диапазон отклонения, которое часто задается значениями вроде 0.2 или -0.3, чтобы учесть незначительные колебания.
Линии оцениваются по нескольким критериям: числу касаний, актуальности опорных точек и тому, достигает ли линия минимального порога касаний (MinTouchPointsRequired). Для визуализации выбираются только линии с высоким итоговым баллом. Такой строгий процесс проверки гарантирует, что на графике отображаются только самые стабильные и хорошо подтвержденные уровни поддержки и сопротивления, формируя ясную и содержательную структурную основу для анализа.
void FindBestResistanceLine(const SwingPoint &highs[], int highCount, /*...*/) { // Loop through pairs of swing highs for(int a = 0; a < highCount - 1; a++) { for(int b = a + 1; b < highCount; b++) { // Check directional and recency criteria // Calculate slope // Count touches and evaluate deviation // Score candidate line // Keep track of best score and pair } } }
Отрисовка и продление трендовых линий для наглядности
После того как лучшие пары-кандидаты определены, функция DrawTrendline() отображает эти уровни на графике. Каждая трендовая линия создается с помощью ObjectCreate() с типом объекта OBJ_TREND и привязкой к соответствующим точкам свинга. Трендовые линии продлеваются в будущее с помощью свойства OBJPROP_RAY_RIGHT, которое сохраняет исходный наклон и проецирует уровни поддержки или сопротивления вперед во времени. Такое продление позволяет наблюдать, как эти уровни могут взаимодействовать с будущим движением цены, создавая стабильный визуальный ориентир, который естественно адаптируется к текущим изменениям рынка.
Для наглядности добавляются метки, обозначающие тип линии ("R" – сопротивление, "S" – поддержка), а также число касаний. Визуальные параметры, такие как цвет, ширина и стиль линии, настраиваются через входные параметры, что позволяет трейдеру адаптировать отображение под свои предпочтения. Такой дисциплинированный подход к отрисовке гарантирует, что уровни поддержки и сопротивления остаются точными и стабильными, отражая реальную структуру рынка, а не кратковременные движения цены или визуальные артефакты.
void DrawTrendline(const SwingPoint &anchor1, const SwingPoint &anchor2, bool isResistance, int touchCount, const MqlRates &rates[]) { // Create or update trendline object // Set properties: color, width, style, extend // Add label with touch count }
Обеспечение структурной целостности и предотвращение перерисовки
На протяжении всей реализации используются механизмы, обеспечивающие стабильность структурного анализа и предотвращающие такие визуальные артефакты, как перерисовка. Свинги обрабатываются в порядке их появления с помощью функции AssignSwingOrder(), которая сортирует их по времени и присваивает порядковый индекс. Трендовые линии строятся только по проверенным парам свингов, которые соответствуют строгим критериям направленной согласованности и качества прилегания. Перед каждым циклом анализа все существующие объекты трендовых линий и точек свинга удаляются с помощью DeleteObjectsByPrefix(), чтобы на графике оставались только самые актуальные и точные уровни. Такой дисциплинированный подход предотвращает динамическое смещение уровней, способное вводить в заблуждение, и сохраняет согласованность отображаемых уровней поддержки и сопротивления во времени.
В результате формируется надежная и устойчивая основа структурного анализа, помогающая уверенно интерпретировать меняющуюся рыночную картину. Это также облегчает тестирование на исторических данных и форвард-тестирование, поскольку структурные связи здесь фиксированы, логичны и основаны исключительно на реальных рыночных данных.
// Function to delete all trendline and swing point objects before each analysis cycle void DeleteObjectsByPrefix(const string prefix) { int totalObjects = ObjectsTotal(0, -1, -1); for(int i = totalObjects - 1; i >= 0; i--) { string name = ObjectName(0, i); if(StringFind(name, prefix) == 0) // Object name starts with prefix { ObjectDelete(0, name); } } } // Usage within OnTick() to clear previous objects void OnTick() { // ... existing code to process new bar and update ATR DeleteObjectsByPrefix(OBJECT_PREFIX); DrawMostSignificantTrendlines(); }
Результаты
В этом разделе приведены наблюдения по итогам тестирования инструмента структурных трендовых линий в реальном времени. На иллюстрации ниже показан пример на EURUSD, H1, где за инструментом наблюдали в течение примерно 12 часов, чтобы оценить, как цена взаимодействовала с заранее построенной линией структурного сопротивления.
В течение этого периода наблюдения цена несколько раз подходила к нисходящей линии сопротивления, прежде чем в итоге подняться выше нее. После этого движения цена вернулась в ту же зону и снова протестировала уровень, что позволило изучить поведение в области бывшего сопротивления в реальном времени. Сигналы не генерировались, и никакой направленный сценарий не предполагался; внимание было сосредоточено исключительно на наблюдении за структурным взаимодействием, а не на попытке предвосхитить результат.
По мере дальнейшего развития цены инструмент повторно оценил формирующуюся структуру и выявил более свежую трендовую линию на противоположной стороне ценовой структуры. Эта линия строилась по свингам на одной стороне структуры и включала подтвержденный более низкий минимум, после которого начал формироваться более высокий минимум. Эти элементы удовлетворяют минимальным структурным условиям, необходимым для построения трендовой линии в логике инструмента, и показывают, как система адаптируется по мере появления новой структуры.
Этот пример показывает, как инструмент сохраняет существующие структурные ориентиры и одновременно отслеживает новые, позволяя трендовым линиям оставаться активными опорными уровнями по мере дальнейшего развития цены.

Диаграмма ниже дополняет анализ, показывая исторический тест той же структуры EURUSD H1. Этот режим тестирования на исторических данных применяет ту же структурную логику – выявление свингов, их упорядочивание и построение трендовых линий – без изменений, обеспечивая согласованность между оценкой в реальном времени и на исторических данных.
В этом примере нисходящая линия сопротивления строится по свингам на одной структурной стороне, тогда как восходящая линия поддержки формируется по упорядоченным свингам ниже цены. Обе линии строятся строго по проверенной структуре и продлеваются вперед в виде лучей, сохраняя исходный наклон и выравнивание. Взаимодействие цены с этими уровнями показывает, как несколько структурных ориентиров могут сосуществовать и развиваться по мере изменения рыночных условий.
Вместо акцента на результатах или торговых сценариях эта иллюстрация показывает, как инструмент сохраняет структурную непрерывность во времени. За счет применения одинаковых правил как при наблюдении в реальном времени, так и при историческом воспроизведении поведение цены относительно установленных трендовых линий можно оценивать объективно, что подводит к дальнейшему обсуждению структурной устойчивости и адаптивности по мере появления новых рыночных данных.

Эти наблюдения подтверждают роль трендовых линий, построенных по структуре, как стабильных опорных уровней, построенных непосредственно на основе поведения цены. Опора на проверенные свинги и дисциплинированные правила построения позволяет сохранять структурную ясность и одновременно адаптироваться как к текущим, так и к историческим рыночным условиям.
Заключение
В этой статье формализовано построение наклонных трендовых линий исключительно на основе ценовой структуры. Поскольку в основе подхода лежат упорядоченные свинги и строгие правила проверки, он снижает субъективность и при этом сохраняет структурную согласованность в разных рыночных условиях.
Этот инструмент предназначен прежде всего для аналитического и учебного использования: он дополняет существующие проверенные инструменты и стратегии, добавляя структурный контекст, а не выступая в качестве самостоятельной системы принятия решений.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/21226
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
От начального до среднего уровня: События мыши
Разработка торговой стратегии: Метод Triple Sine для возврата к среднему
Разработка инструментария для анализа Price Action (Часть 61): Структурные пробои наклонных трендовых линий с подтверждением по трем свингам
Разработка инструментария для анализа Price Action (Часть 59): Выявление точных пробоев при фрактальной консолидации с помощью геометрической асимметрии
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования