Исходный код
Представляем вашему вниманию качественный индикатор дивергенций, разработанный на Pine Script v5. Этот скрипт предназначен для автоматического обнаружения бычьих и медвежьих дивергенций между ценой актива и показаниями осциллятора Стохастик. Дивергенции являются мощным сигналом потенциального разворота тренда, поскольку они указывают на расхождение между направлением движения цены и импульсом, измеряемым осциллятором.
Индикатор использует функцию ta.pivotlow() и ta.pivothigh() для определения значимых ценовых пивотов (минимумов и максимумов). Затем он сравнивает эти ценовые пивоты с соответствующими значениями осциллятора Стохастик в те же моменты времени. Для хранения и сравнения последних двух релевантных пивотов используются массивы (array.new), что позволяет эффективно отслеживать условия дивергенции. Обнаруженные дивергенции визуализируются на графике с помощью линий и текстовых меток (‘BULL’ для бычьих, ‘BEAR’ для медвежьих).
Этот инструмент может стать ценным дополнением к вашей торговой стратегии, помогая выявлять потенциальные точки входа и выхода. Например, в сочетании с такими концепциями, как Order Blocks с проверкой объема, дивергенции могут усилить сигналы разворота. Также, для управления рисками, вы можете рассмотреть использование продвинутых методов, таких как Трейлинг-стоп по теням свечей с ATR.
//@version=5
indicator("Divergence Indicator (Price vs Stochastic)", overlay=true, max_lines_count=500)
// --- Inputs ---
stochKLength = input.int(14, "Stochastic %K Length", minval=1)
stochDLength = input.int(3, "Stochastic %D Length", minval=1)
stochSmooth = input.int(3, "Stochastic Smoothing", minval=1)
pivotLookback = input.int(5, "Pivot Lookback Bars", minval=1, tooltip="Количество баров до и после для определения пивота цены/осциллятора.")
divergenceLookback = input.int(50, "Divergence Lookback Bars", minval=1, tooltip="Максимальное количество баров между двумя пивотами для обнаружения дивергенции.")
// --- Stochastic Calculation ---
k = ta.sma(ta.stoch(close, high, low, stochKLength), stochSmooth)
d = ta.sma(k, stochDLength)
// --- Store last two relevant pivots for divergence ---
// Мы храним значение цены, индекс бара и значение Стохастика на этом индексе бара.
type PivotData = record
var PivotData[] bullishPricePivots = array.new() // Хранит минимумы цены и соответствующие значения Стохастика
var PivotData[] bearishPricePivots = array.new() // Хранит максимумы цены и соответствующие значения Стохастика
// Функция для добавления пивота в массив и поддержания его размера
addPivot(arr, priceVal, barIdx, stochVal) =>
// Убедимся, что не добавляем дубликаты пивотов, если ta.pivotlow/high возвращает значение для того же bar_index несколько раз
if array.size(arr) > 0 and array.get(arr, array.size(arr) - 1).barIdx == barIdx
array.set(arr, array.size(arr) - 1, PivotData.new(priceVal, barIdx, stochVal))
else
array.push(arr, PivotData.new(priceVal, barIdx, stochVal))
// Храним только два последних пивота для сравнения
if array.size(arr) > 2
array.shift(arr)
// Обнаруживаем ценовые пивоты и сохраняем соответствующие значения Стохастика
// ta.pivotlow/high возвращает значение на bar_index - pivotLookback.
// Таким образом, фактический индекс бара пивота — это bar_index - pivotLookback.
// А значение Стохастика на этом пивотном баре — это k[pivotLookback].
if not na(ta.pivotlow(low, pivotLookback, pivotLookback))
addPivot(bullishPricePivots, low[pivotLookback], bar_index - pivotLookback, k[pivotLookback])
if not na(ta.pivothigh(high, pivotLookback, pivotLookback))
addPivot(bearishPricePivots, high[pivotLookback], bar_index - pivotLookback, k[pivotLookback])
// --- Обнаружение дивергенций ---
// Бычья дивергенция: Цена делает более низкий минимум (LL), Стохастик делает более высокий минимум (HL)
if array.size(bullishPricePivots) >= 2
currentPivot = array.get(bullishPricePivots, 1)
prevPivot = array.get(bullishPricePivots, 0)
// Проверяем LL в цене и HL в Стохастике
isPriceLL = currentPivot.priceVal < prevPivot.priceVal
isStochHL = currentPivot.stochVal > prevPivot.stochVal
// Проверяем, находятся ли пивоты в пределах периода lookback
isWithinLookback = (currentPivot.barIdx - prevPivot.barIdx) <= divergenceLookback
if isPriceLL and isStochHL and isWithinLookback
line.new(x1=prevPivot.barIdx, y1=prevPivot.priceVal, x2=currentPivot.barIdx, y2=currentPivot.priceVal,
color=color.green, width=2, style=line.style_solid, xloc=xloc.bar_index, extend=extend.none)
plotshape(currentPivot.barIdx, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, text="BULL", textcolor=color.white)
// Медвежья дивергенция: Цена делает более высокий максимум (HH), Стохастик делает более низкий максимум (LH)
if array.size(bearishPricePivots) >= 2
currentPivot = array.get(bearishPricePivots, 1)
prevPivot = array.get(bearishPricePivots, 0)
// Проверяем HH в цене и LH в Стохастике
isPriceHH = currentPivot.priceVal > prevPivot.priceVal
isStochLH = currentPivot.stochVal < prevPivot.stochVal
// Проверяем, находятся ли пивоты в пределах периода lookback
isWithinLookback = (currentPivot.barIdx - prevPivot.barIdx) <= divergenceLookback
if isPriceHH and isStochLH and isWithinLookback
line.new(x1=prevPivot.barIdx, y1=prevPivot.priceVal, x2=currentPivot.barIdx, y2=currentPivot.priceVal,
color=color.red, width=2, style=line.style_solid, xloc=xloc.bar_index, extend=extend.none)
plotshape(currentPivot.barIdx, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, text="BEAR", textcolor=color.white)
// --- Отображение Стохастика в отдельной панели ---
plot(k, title="%K", color=color.blue, display=display.pane_and_data)
plot(d, title="%D", color=color.orange, display=display.pane_and_data)
hline(80, "Overbought", color=color.gray, linestyle=hline.style_dotted, display=display.pane_and_data)
hline(20, "Oversold", color=color.gray, linestyle=hline.style_dotted, display=display.pane_and_data)
Разбор параметров
Stochastic %K Length: Длина периода для расчета %K линии Стохастика. Стандартное значение — 14.Stochastic %D Length: Длина периода для сглаживания %K линии, чтобы получить %D линию. Стандартное значение — 3.Stochastic Smoothing: Дополнительное сглаживание для %K линии перед расчетом %D. Стандартное значение — 3.Pivot Lookback Bars: Количество баров, которые используются для определения пивота (минимума или максимума). Например, значение 5 означает, что бар считается пивотом, если он является самым высоким/низким среди 5 предыдущих и 5 последующих баров.Divergence Lookback Bars: Максимальное количество баров между двумя пивотами (текущим и предыдущим), чтобы дивергенция считалась действительной. Это предотвращает обнаружение дивергенций между слишком отдаленными друг от друга точками.
Как запустить
Чтобы добавить этот индикатор на ваш график в TradingView, выполните следующие шаги:
- Откройте TradingView и перейдите на любой график.
- Нажмите кнопку 'Pine Script' в нижней части экрана, чтобы открыть редактор Pine Script.
- Удалите весь существующий код в редакторе.
- Скопируйте предоставленный выше исходный код и вставьте его в редактор Pine Script.
- Нажмите кнопку 'Добавить на график' (Add to Chart) в правом верхнем углу редактора.
Индикатор появится на вашем графике, автоматически определяя и отображая бычьи и медвежьи дивергенции. Вы можете настроить параметры индикатора, нажав на значок шестеренки рядом с его названием на графике.
Для дальнейшего изучения возможностей Pine Script и создания более сложных торговых систем, рекомендуем ознакомиться с нашими статьями, например, о Python Screener для Pin Bar с аномальным объемом, что может быть полезно для фильтрации сигналов дивергенции на разных активах.




