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. Скрипт автоматически разметит исторические паттерны и начнет отслеживать новые в режиме реального времени.




