Поиск паттернов Гартли, Bat и Butterfly на матрицах в Pine Script v5

Поиск паттернов Гартли, Bat и Butterfly на матрицах в Pine Script v5 НАЛОГИ, ИП и САМОЗАНЯТОСТЬ
Пошаговое руководство по созданию скрипта для автоматического поиска и подсветки гармонических паттернов (Gartley, Bat, Butterfly) с использованием матриц в Pine Script v5.
Суть: Мы создадим профессиональный индикатор на Pine Script v5, который находит гармонические паттерны (Gartley, Bat, Butterfly) с помощью двумерных матриц (matrix). Это позволяет динамически управлять координатами пяти точек (X, A, B, C, D) без загромождения кода десятками переменных.

Гармонический анализ — мощный инструмент в арсенале количественного трейдера. Поиск таких паттернов, как Гартли (Gartley), Летучая мышь (Bat) и Бабочка (Butterfly), требует точного расчета соотношений Фибоначчи между пятью последовательными экстремумами (X, A, B, C, D).

В Pine Script v5 традиционный подход с использованием множества независимых переменных или простых массивов быстро превращается в трудноподдерживаемый код. Использование двумерных матриц позволяет элегантно хранить координаты точек и сдвигать их по мере появления новых пивотов. Для точной обработки баров в реальном времени и избежания перерисовок (repaint) полезно понимать, как работает Pine Script v5: Использование varip для точных расчетов внутри текущего бара.

Для оценки рыночного контекста и ликвидности перед входом по паттерну Гартли можно использовать Расчет и отрисовка Gamma Exposure (GEX) в Pine Script v5. А если вы разрабатываете комплексные торговые системы, объединяющие паттерны с сессионным анализом, рекомендуем ознакомиться с Реализацией стратегии ORB с учетом таймзон в Pine Script v5.

Исходный код

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

//@version=5
indicator('Gartley, Bat, Butterfly Matrix Detector', overlay=true, max_labels_limit=500, max_lines_limit=500)

// Входные параметры
pivot_len = input.int(5, 'Pivot Amplitude', minval=1)
err_tolerance = input.float(0.07, 'Ratio Tolerance', minval=0.01, maxval=0.2)

// Настройки цвета
color_gartley = input.color(color.green, 'Gartley Color')
color_bat = input.color(color.blue, 'Bat Color')
color_butterfly = input.color(color.red, 'Butterfly Color')

// Матрица для хранения последних 5 пивотов: [bar_index, price, is_high (1.0 или 0.0)]
var matrix pivots = matrix.new(5, 3, na)

// Поиск пивотов
p_high = ta.pivothigh(high, pivot_len, pivot_len)
p_low = ta.pivotlow(low, pivot_len, pivot_len)

// Функция обновления матрицы (сдвиг истории)
update_pivots(int idx, float val, float is_high) =>
    for i = 0 to 3
        matrix.set(pivots, i, 0, matrix.get(pivots, i + 1, 0))
        matrix.set(pivots, i, 1, matrix.get(pivots, i + 1, 1))
        matrix.set(pivots, i, 2, matrix.get(pivots, i + 1, 2))
    matrix.set(pivots, 4, 0, idx)
    matrix.set(pivots, 4, 1, val)
    matrix.set(pivots, 4, 2, is_high)

// Проверка заполненности матрицы
is_filled() =>
    filled = true
    for i = 0 to 4
        if na(matrix.get(pivots, i, 0))
            filled := false
            break
    filled

// Проверка соответствия пропорции Фибоначчи с учетом погрешности
check_ratio(float ratio, float target, float tolerance) =>
    math.abs(ratio - target) <= tolerance

// Логика обновления данных
if not na(p_high)
    update_pivots(bar_index - pivot_len, p_high, 1.0)
else if not na(p_low)
    update_pivots(bar_index - pivot_len, p_low, 0.0)

if (not na(p_high) or not na(p_low)) and is_filled()
    // Извлечение координат точек X, A, B, C, D
    x_bar  = int(matrix.get(pivots, 0, 0))
    x_val  = matrix.get(pivots, 0, 1)
    x_high = matrix.get(pivots, 0, 2) == 1.0

    a_bar  = int(matrix.get(pivots, 1, 0))
    a_val  = matrix.get(pivots, 1, 1)

    b_bar  = int(matrix.get(pivots, 2, 0))
    b_val  = matrix.get(pivots, 2, 1)

    c_bar  = int(matrix.get(pivots, 3, 0))
    c_val  = matrix.get(pivots, 3, 1)

    d_bar  = int(matrix.get(pivots, 4, 0))
    d_val  = matrix.get(pivots, 4, 1)

    // Проверка чередования пивотов (High-Low-High-Low-High или Low-High-Low-High-Low)
    is_valid_sequence = true
    for i = 0 to 3
        if matrix.get(pivots, i, 2) == matrix.get(pivots, i + 1, 2)
            is_valid_sequence := false
            break

    if is_valid_sequence
        xa = math.abs(a_val - x_val)
        ab = math.abs(b_val - a_val)
        bc = math.abs(c_val - b_val)
        cd = math.abs(d_val - c_val)
        xd = math.abs(d_val - x_val)

        b_ratio = ab / xa
        c_ratio = bc / ab
        d_ratio_xa = xd / xa

        string pattern_name = ''
        color pattern_color = color.white
        is_bullish = not x_high

        // 1. Паттерн Gartley
        if check_ratio(b_ratio, 0.618, err_tolerance) and (c_ratio >= 0.382 - err_tolerance and c_ratio <= 0.886 + err_tolerance) and check_ratio(d_ratio_xa, 0.786, err_tolerance)
            pattern_name := 'Gartley'
            pattern_color := color_gartley

        // 2. Паттерн Bat
        else if (b_ratio >= 0.382 - err_tolerance and b_ratio <= 0.500 + err_tolerance) and (c_ratio >= 0.382 - err_tolerance and c_ratio <= 0.886 + err_tolerance) and check_ratio(d_ratio_xa, 0.886, err_tolerance)
            pattern_name := 'Bat'
            pattern_color := color_bat

        // 3. Паттерн Butterfly
        else if check_ratio(b_ratio, 0.786, err_tolerance) and (c_ratio >= 0.382 - err_tolerance and c_ratio <= 0.886 + err_tolerance) and (d_ratio_xa >= 1.272 - err_tolerance and d_ratio_xa <= 1.618 + err_tolerance)
            pattern_name := 'Butterfly'
            pattern_color := color_butterfly

        if pattern_name != ''
            // Отрисовка основных линий паттерна
            line.new(x_bar, x_val, a_bar, a_val, color=pattern_color, width=2)
            line.new(a_bar, a_val, b_bar, b_val, color=pattern_color, width=2)
            line.new(b_bar, b_val, c_bar, c_val, color=pattern_color, width=2)
            line.new(c_bar, c_val, d_bar, d_val, color=pattern_color, width=2)
            
            // Отрисовка вспомогательных линий треугольников
            line.new(x_bar, x_val, b_bar, b_val, color=color.new(pattern_color, 70), style=line.style_dashed)
            line.new(b_bar, b_val, d_bar, d_val, color=color.new(pattern_color, 70), style=line.style_dashed)
            line.new(x_bar, x_val, d_bar, d_val, color=color.new(pattern_color, 50), style=line.style_dotted)

            // Вывод метки с названием паттерна
            label.new(d_bar, d_val, text=pattern_name + (is_bullish ? ' Bull' : ' Bear'), color=pattern_color, textcolor=color.white, style=is_bullish ? label.style_label_up : label.style_label_down)

Разбор параметров

  • Pivot Amplitude: Длина плеча для поиска локальных экстремумов (Pivot High/Low). Чем больше значение, тем более глобальные паттерны будет находить скрипт.
  • Ratio Tolerance: Допустимая погрешность отклонения от идеальных пропорций Фибоначчи. Значение 0.07 означает допуск в 7% в обе стороны.
  • Gartley / Bat / Butterfly Color: Настройки цвета линий и меток для каждого типа паттерна для удобства визуального анализа.

Как запустить

Для запуска скрипта выполните следующие шаги:

1. Откройте платформу TradingView и перейдите на любой интересующий вас график.

2. В нижней панели откройте вкладку Pine Editor.

3. Скопируйте предоставленный выше код и вставьте его в редактор, заменив стандартный шаблон.

4. Нажмите кнопку Добавить на график (Add to Chart) в правом верхнем углу редактора.

5. Скрипт автоматически разметит исторические паттерны и начнет отслеживать новые в режиме реального времени.

Оцените статью
FinFluct