Pine Script v5: Поиск паттерна ‘Три маленьких индейца’ с циклами for

Pine Script v5: Поиск паттерна 'Три маленьких индейца' с циклами for НАЛОГИ, ИП и САМОЗАНЯТОСТЬ
Подробное руководство по созданию скрипта Pine Script v5 для обнаружения паттерна 'Три маленьких индейца' (Three Little Indians) на графике с использованием циклов for для анализа исторических пивотов.
Суть: В этой статье мы разработаем скрипт на Pine Script v5, который использует циклы for для поиска и визуализации паттерна ‘Три маленьких индейца’ (Three Little Indians). Этот паттерн, состоящий из трех последовательных пиковых точек (минимумов или максимумов), часто сигнализирует о потенциальном развороте тренда.

Исходный код

Паттерн ‘Три маленьких индейца’ (Three Little Indians) — это ценовая формация, которая может указывать на истощение текущего тренда и потенциальный разворот. В бычьем варианте это три последовательных более высоких минимума после нисходящего тренда, а в медвежьем — три последовательных более низких максимума после восходящего тренда. Наш скрипт будет использовать встроенные функции Pine Script для определения пивотов, а затем применять циклы for для итерации по этим пивотам и проверки условий паттерна.

Для более глубокого понимания работы с паттернами в Pine Script, рекомендуем ознакомиться с нашей статьей Поиск паттернов Гартли, Bat и Butterfly на матрицах в Pine Script v5.


//@version=5
indicator("Three Little Indians Pattern", overlay=true)

// --- Входные параметры --- 
// Параметры для определения пивотов
i_lookback = input.int(20, "Pivot Lookback Bars", minval=5, maxval=100, tooltip="Количество баров для хранения истории пивотов.")
i_pivotStrength = input.int(2, "Pivot Strength (Left/Right Bars)", minval=1, maxval=10, tooltip="Количество баров слева и справа от пивота, которые должны быть ниже/выше для его определения.")

// Параметры для определения паттерна "Три индейца"
i_priceTolerancePct = input.float(1.5, "Price Tolerance % (Indians)", minval=0.1, maxval=10.0, step=0.1, tooltip="Максимально допустимое процентное отклонение между первым и третьим 'индейцем'.")
i_barTolerance = input.int(10, "Max Bar Distance (Indians)", minval=1, maxval=50, tooltip="Максимальное количество баров между первым и третьим 'индейцем'.")

// Параметры для определения тренда
i_trendLookback = input.int(50, "Trend Lookback Bars", minval=10, maxval=200, tooltip="Количество баров для расчета скользящей средней, используемой для определения текущего тренда.")

// Параметры отображения
i_showBullish = input.bool(true, "Show Bullish Patterns")
i_showBearish = input.bool(true, "Show Bearish Patterns")
i_bullishColor = input.color(color.new(color.lime, 0), "Bullish Color")
i_bearishColor = input.color(color.new(color.red, 0), "Bearish Color")

// --- Обнаружение пивотов --- 
// Используем ta.pivothigh/pivotlow для эффективного нахождения пивотов.
// Затем будем использовать циклы for для итерации по этим найденным пивотам.
ph = ta.pivothigh(i_pivotStrength, i_pivotStrength)
pl = ta.pivotlow(i_pivotStrength, i_pivotStrength)

// Храним данные пивотов (значение и bar_index) в массивах.
// Используем var для инициализации массивов только один раз.
var float[] pivotHighValues = array.new_float()
var int[] pivotHighIndices = array.new_int()
var float[] pivotLowValues = array.new_float()
var int[] pivotLowIndices = array.new_int()

// Добавляем новые пивоты в массивы и ограничиваем их размер.
if not na(ph)
    array.push(pivotHighValues, ph)
    array.push(pivotHighIndices, bar_index)
    if array.size(pivotHighValues) > i_lookback
        array.shift(pivotHighValues)
        array.shift(pivotHighIndices)

if not na(pl)
    array.push(pivotLowValues, pl)
    array.push(pivotLowIndices, bar_index)
    if array.size(pivotLowValues) > i_lookback
        array.shift(pivotLowValues)
        array.shift(pivotLowIndices)

// --- Определение тренда --- 
// Простая скользящая средняя для определения общего направления тренда.
ma = ta.sma(close, i_trendLookback)
isUptrend = close > ma and close[1] > ma[1] // Текущий и предыдущий бар выше MA
isDowntrend = close < ma and close[1] < ma[1] // Текущий и предыдущий бар ниже MA

// --- Обнаружение паттерна с использованием циклов for --- 
var bool bullishPatternFound = false
var int[] bullishPatternIndices = array.new_int(3) // Индексы баров для 3-х индейцев
var float[] bullishPatternVals = array.new_float(3) // Значения цен для 3-х индейцев

var bool bearishPatternFound = false
var int[] bearishPatternIndices = array.new_int(3)
var float[] bearishPatternVals = array.new_float(3)

bullishPatternFound := false
bearishPatternFound := false

// Поиск бычьего паттерна "Три маленьких индейца" (три более высоких минимума после нисходящего тренда)
if i_showBullish and isDowntrend and array.size(pivotLowValues) >= 3
    // Итерируем в обратном порядке по сохраненным пивот-минимумам
    for i = array.size(pivotLowValues) - 1 to 2 // Необходимо как минимум 3 пивота
        L3_val = array.get(pivotLowValues, i)
        L3_idx = array.get(pivotLowIndices, i)

        L2_val = array.get(pivotLowValues, i - 1)
        L2_idx = array.get(pivotLowIndices, i - 1)

        L1_val = array.get(pivotLowValues, i - 2)
        L1_idx = array.get(pivotLowIndices, i - 2)

        // Проверяем условия:
        // 1. L1 < L2 < L3 (последовательные более высокие минимумы)
        // 2. Ценовая толерантность: L3 не слишком далеко от L1 по цене
        // 3. Временная толерантность: L3, L2, L1 находятся в пределах i_barTolerance баров друг от друга
        // 4. L3 является достаточно недавним пивотом (в пределах 2*i_pivotStrength баров от текущего)
        if L1_val < L2_val and L2_val < L3_val and
           math.abs(L3_val - L1_val) / L1_val * 100 <= i_priceTolerancePct and
           (L3_idx - L1_idx) <= i_barTolerance and
           (bar_index - L3_idx) <= i_pivotStrength * 2 // L3 достаточно недавний
            bullishPatternFound := true
            array.set(bullishPatternIndices, 0, L1_idx)
            array.set(bullishPatternIndices, 1, L2_idx)
            array.set(bullishPatternIndices, 2, L3_idx)
            array.set(bullishPatternVals, 0, L1_val)
            array.set(bullishPatternVals, 1, L2_val)
            array.set(bullishPatternVals, 2, L3_val)
            break // Паттерн найден, выходим из цикла

// Поиск медвежьего паттерна "Три маленьких индейца" (три более низких максимума после восходящего тренда)
if i_showBearish and isUptrend and array.size(pivotHighValues) >= 3
    // Итерируем в обратном порядке по сохраненным пивот-максимумам
    for i = array.size(pivotHighValues) - 1 to 2 // Необходимо как минимум 3 пивота
        H3_val = array.get(pivotHighValues, i)
        H3_idx = array.get(pivotHighIndices, i)

        H2_val = array.get(pivotHighValues, i - 1)
        H2_idx = array.get(pivotHighIndices, i - 1)

        H1_val = array.get(pivotHighValues, i - 2)
        H1_idx = array.get(pivotHighIndices, i - 2)

        // Проверяем условия:
        // 1. H1 > H2 > H3 (последовательные более низкие максимумы)
        // 2. Ценовая толерантность: H3 не слишком далеко от H1 по цене
        // 3. Временная толерантность: H3, H2, H1 находятся в пределах i_barTolerance баров друг от друга
        // 4. H3 является достаточно недавним пивотом (в пределах 2*i_pivotStrength баров от текущего)
        if H1_val > H2_val and H2_val > H3_val and
           math.abs(H3_val - H1_val) / H1_val * 100 <= i_priceTolerancePct and
           (H3_idx - H1_idx) <= i_barTolerance and
           (bar_index - H3_idx) <= i_pivotStrength * 2 // H3 достаточно недавний
            bearishPatternFound := true
            array.set(bearishPatternIndices, 0, H1_idx)
            array.set(bearishPatternIndices, 1, H2_idx)
            array.set(bearishPatternIndices, 2, H3_idx)
            array.set(bearishPatternVals, 0, H1_val)
            array.set(bearishPatternVals, 1, H2_val)
            array.set(bearishPatternVals, 2, H3_val)
            break // Паттерн найден, выходим из цикла

// --- Отображение паттернов --- 
if bullishPatternFound
    line.new(array.get(bullishPatternIndices, 0), array.get(bullishPatternVals, 0),
             array.get(bullishPatternIndices, 1), array.get(bullishPatternVals, 1),
             color=i_bullishColor, width=2, style=line.style_solid, xloc=xloc.bar_index)
    line.new(array.get(bullishPatternIndices, 1), array.get(bullishPatternVals, 1),
             array.get(bullishPatternIndices, 2), array.get(bullishPatternVals, 2),
             color=i_bullishColor, width=2, style=line.style_solid, xloc=xloc.bar_index)
    label.new(array.get(bullishPatternIndices, 2), array.get(bullishPatternVals, 2),
              "3LI Bull", color=i_bullishColor, textcolor=color.white, style=label.style_label_up, xloc=xloc.bar_index)

if bearishPatternFound
    line.new(array.get(bearishPatternIndices, 0), array.get(bearishPatternVals, 0),
             array.get(bearishPatternIndices, 1), array.get(bearishPatternVals, 1),
             color=i_bearishColor, width=2, style=line.style_solid, xloc=xloc.bar_index)
    line.new(array.get(bearishPatternIndices, 1), array.get(bearishPatternVals, 1),
             array.get(bearishPatternIndices, 2), array.get(bearishPatternVals, 2),
             color=i_bearishColor, width=2, style=line.style_solid, xloc=xloc.bar_index)
    label.new(array.get(bearishPatternIndices, 2), array.get(bearishPatternVals, 2),
              "3LI Bear", color=i_bearishColor, textcolor=color.white, style=label.style_label_down, xloc=xloc.bar_index)

// Для отладки можно отображать сами пивоты
// plotshape(ph, "Pivot High", shape.triangledown, location.abovebar, color.red, size=size.tiny)
// plotshape(pl, "Pivot Low", shape.triangleup, location.belowbar, color.green, size=size.tiny)

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

  • Pivot Lookback Bars: Определяет максимальное количество последних пивотов, которые скрипт будет хранить в памяти для анализа. Чем больше значение, тем глубже история, но и больше потребление памяти.
  • Pivot Strength (Left/Right Bars): Задает количество баров слева и справа от потенциального пивота, которые должны быть ниже (для максимума) или выше (для минимума), чтобы точка была признана пивотом. Большее значение делает пивоты более значимыми, но менее частыми.
  • Price Tolerance % (Indians): Максимально допустимое процентное отклонение цены между первым и третьим 'индейцем' в паттерне. Это помогает отфильтровать паттерны, где пивоты слишком сильно расходятся по цене.
  • Max Bar Distance (Indians): Максимальное количество баров, которое может разделять первый и третий 'индеец' в паттерне. Это гарантирует, что паттерн формируется в относительно короткий промежуток времени.
  • Trend Lookback Bars: Количество баров, используемых для расчета простой скользящей средней (SMA), которая определяет текущий тренд. Паттерн 'Три маленьких индейца' является разворотным, поэтому важно определить предшествующий тренд.
  • Show Bullish Patterns: Включение/отключение отображения бычьих паттернов на графике.
  • Show Bearish Patterns: Включение/отключение отображения медвежьих паттернов на графике.
  • Bullish Color: Цвет линий и метки для бычьего паттерна.
  • Bearish Color: Цвет линий и метки для медвежьего паттерна.

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

Чтобы использовать этот скрипт в TradingView, выполните следующие шаги:

  1. Откройте TradingView и перейдите в редактор Pine Script (обычно находится в нижней части экрана).
  2. Убедитесь, что выбран Pine Script v5. Если нет, измените версию в настройках редактора.
  3. Скопируйте весь предоставленный выше код и вставьте его в редактор Pine Script, заменив любой существующий код.
  4. Нажмите кнопку 'Добавить на график' (Add to Chart).
  5. Скрипт появится на вашем графике, автоматически обнаруживая и отображая паттерны 'Три маленьких индейца' в соответствии с заданными параметрами. Вы можете настроить параметры через меню настроек индикатора на графике.

Для автоматизации торговых стратегий на основе обнаруженных паттернов, вы можете интегрировать Pine Script с внешними платформами, такими как Finandy, используя вебхуки. Подробнее об этом читайте в нашей статье Интеграция Pine Script v5 с Finandy через вебхуки. Также, для более продвинутого анализа рынка, рассмотрите возможность использования индикаторов, таких как Gamma Exposure, о котором мы писали в статье Расчет и отрисовка Gamma Exposure (GEX) в Pine Script v5.

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