← К каталогу
Исходный код · ID 4210

Multi-Oscillator Divergence Scanner

indicator_multi_oscillator_divergence_scanner_for_tradingview.pine

Похожие материалы по тегам

xauusd_gold_perfect.mq4MQL4 / MetaTrader 4 · 2 общих теговtm sniper pro.pineTradingView · 2 общих теговsniper pro.mq5MQL5 / MetaTrader 5 · 2 общих теговpro +.pineTradingView · 2 общих теговofada_gold_trader_v230.mq5MQL5 / MetaTrader 5 · 2 общих теговmulti strategy algo combined by enigma mode.pineTradingView · 2 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Индикатор «Multi-Oscillator Divergence Scanner» предназначен для обнаружения расхождений между ценой и набором технических осцилляторов на графике TradingView. Он рассчитывает семь классических индикаторов — RSI, MACD, Стохастик, CCI, OBV, MFI и Momentum — и автоматически ищет регулярные и скрытые расхождения в точках пивотов высоких и низких ценовых уровней.

Результаты отображаются в виде линий, графических меток и зон реакции на графике. В отдельном панельном окне строится составной осциллятор, нормализованный к шкале 0–100, с уровнями перекупленности и перепроданности. Дашборд на графике показывает последний сигнал, давление и текущие значения каждого осциллятора.

Индикатор поддерживает условные оповещения TradingView для четырёх типов расхождений и сильного сигнала. Пользователь может настраивать количество отображаемых расхождений, минимальное совпадение осцилляторов, порог силы сигнала, визуальные цвета и расположение элементов на графике.

Настройки программы

НастройкаОписание
pivL Левый длина пивота — Количество баров слева от текущего бара, используемое для обнаружения пивота.
pivR Правая длина пивота — Количество баров справа от текущего бара, необходимое для подтверждения пивота.
keepDivs Количество сохранённых расхождений — Максимальное количество расхождений, отображаемых на графике. Более старые рисунки удаляются.
useRsi Использовать RSI — Включает или отключает индикатор Relative Strength Index в расчёте расхождений.
rsiLen Длина RSI — Период расчёта индикатора Relative Strength Index.
useMacd Использовать MACD — Включает или отключает индикатор MACD в расчёте расхождений.
macdFast Быстрый период MACD — Период быстрой скользящей средней в индикаторе MACD.
macdSlow Медленный период MACD — Период медленной скользящей средней в индикаторе MACD.
macdSig Сигнальный период MACD — Период сигнальной линии в индикаторе MACD.
useStoch Использовать Стохастик — Включает или отключает индикатор Stochastic Oscillator в расчёте расхождений.
stochLen Длина Стохастик — Период расчёта индикатора Stochastic Oscillator.
useCci Использовать CCI — Включает или отключает индикатор Commodity Channel Index в расчёте расхождений.
cciLen Длина CCI — Период расчёта индикатора Commodity Channel Index.
useObv Использовать OBV — Включает или отключает индикатор On Balance Volume в расчёте расхождений.
useMfi Использовать MFI — Включает или отключает индикатор Money Flow Index в расчёте расхождений.
mfiLen Длина MFI — Период расчёта индикатора Money Flow Index.
useMom Использовать Momentum — Включает или отключает индикатор Momentum в расчёте расхождений.
momLen Длина Momentum — Период расчёта индикатора Momentum.
showComp Показать составной осциллятор — Отображает составной осциллятор в отдельном подграфике.
normLen Период нормализации — Период нормализации для приведения значений неограниченных осцилляторов к шкале 0–100 в составеном индикаторе.
obLvl Уровень перекупленности — Уровень, выше которого составной осциллятор считается перекупленным.
osLvl Уровень перепроданности — Уровень, ниже которого составной осциллятор считается перепроданным.
showMarks Отмечать бары расхождений в панели — Отображает графические метки на панели осциллятора в местах расхождений.
showPaneLines Рисовать линии расхождений на составном — Рисует соединительные линии между точками расхождений на графике составного осциллятора.
showReg Регулярные расхождения (разворот) — Отображает регулярные расхождения (разворотные) на графике.
showHid Скрытые расхождения (продолжение) — Отображает скрытые расхождения (продолжение тренда) на графике.
minConf Минимальное совпадение осцилляторов — Минимальное количество осцилляторов, которые должны показать расхождение одновременно, чтобы сигнал отображался.
strongTh Порог сильного сигнала — Количество совпадающих осцилляторов, при котором расхождение считается сильным и выделяется специальным цветом.
showZones Показать зоны реакции — Отображает зоны реакции цены вокруг точек расхождений.
zoneAtr Высота зоны (коэффициент ATR) — Коэффициент высоты зоны реакции относительно Average True Range.
zoneExt Продление зоны (бары) — Количество баров горизонтального продления зоны реакции.
bullCol Цвет бычьих сигналов — Цвет графических элементов и меток бычьих расхождений.
bearCol Цвет медвежьих сигналов — Цвет графических элементов и меток медвежьих расхождений.
goldCol Цвет сильного сигнала — Цвет для выделения сильных расхождений с высоким уровнем совпадения осцилляторов.
silvCol Цвет нейтрального сигнала — Цвет для нейтральных (неактивных) элементов, например, зон реакции после срабатывания.
markPivots Отмечать найденные пивоты на цене — Отображает графические отметки найденных пивотов на ценовом графике.
showDash Показать дашборд — Отображает информационную панель дашборда на графике.
dashPos Позиция дашборда — Расположение панели дашборда на графике.
dashSize Размер текста дашборда — Размер текста в панели дашборда.
showVals Показывать текущие значения осцилляторов — Показывает текущие числовые значения каждого осциллятора в дашборде.
dashTitleBg Фон заголовка дашборда — Цвет фона заголовочной полосы дашборда.
dashBg Фон дашборда — Фон панели дашборда на графике.
dashFrame Цвет рамки дашборда — Цвет рамки панели дашборда.
dashGrid Цвет сетки дашборда — Цвет линий сетки внутри панели дашборда.
dashHeadTxt Цвет заголовка дашборда — Цвет текста заголовка в панели дашборда.
dashBodyTxt Цвет основного текста дашборда — Цвет основного текста в панели дашборда.
dashMuteTxt Цвет приглушённого текста дашборда — Цвет приглушённого (второстепенного) текста в дашборде.
Получить полный код

Поиск по коду файла

indicator("Multi-Oscillator Divergence Scanner", overlay = false, max_lines_count = 500, max_labels_count = 500, max_boxes_count = 500)

grpP = "Pivot Detection"
pivL     = input.int(5, "Pivot Left Length", minval = 2, maxval = 30, group = grpP)
pivR     = input.int(5, "Pivot Right Length", minval = 2, maxval = 30, group = grpP, tooltip = "Bars required to confirm a swing. Divergences print this many bars after the pivot by design, which keeps signals fixed once drawn.")
keepDivs = input.int(12, "Divergences To Keep", minval = 2, maxval = 40, group = grpP, tooltip = "Older divergence drawings beyond this count are deleted so the chart stays clean and the auto-scale stays anchored to current price.")

grpO = "Oscillator Engines"
useRsi   = input.bool(true, "Relative Strength Index", inline = "o1", group = grpO)
rsiLen   = input.int(14, "", minval = 2, inline = "o1", group = grpO)
useMacd  = input.bool(true, "Moving Average Convergence Divergence", inline = "o2", group = grpO)
macdFast = input.int(12, "", minval = 2, inline = "o2", group = grpO)
macdSlow = input.int(26, "", minval = 3, inline = "o2", group = grpO)
macdSig  = input.int(9, "", minval = 2, inline = "o2", group = grpO)
useStoch = input.bool(true, "Stochastic Oscillator", inline = "o3", group = grpO)
stochLen = input.int(14, "", minval = 2, inline = "o3", group = grpO)
useCci   = input.bool(true, "Commodity Channel Index", inline = "o4", group = grpO)
cciLen   = input.int(20, "", minval = 2, inline = "o4", group = grpO)
useObv   = input.bool(true, "On Balance Volume", inline = "o5", group = grpO)
useMfi   = input.bool(true, "Money Flow Index", inline = "o6", group = grpO)
mfiLen   = input.int(14, "", minval = 2, inline = "o6", group = grpO)
useMom   = input.bool(true, "Momentum", inline = "o7", group = grpO)
momLen   = input.int(10, "", minval = 2, inline = "o7", group = grpO)

grpC = "Composite Oscillator Pane"
showComp = input.bool(true, "Show Composite Oscillator", group = grpC)
normLen  = input.int(100, "Normalization Lookback", minval = 20, maxval = 500, group = grpC, tooltip = "Lookback used to map the unbounded engines (Convergence Divergence, On Balance Volume, Momentum) onto the 0 to 100 scale.")
obLvl    = input.float(80, "Overbought Level", minval = 50, maxval = 100, group = grpC)
osLvl    = input.float(20, "Oversold Level", minval = 0, maxval = 50, group = grpC)
showMarks = input.bool(true, "Mark Divergence Bars In Pane", group = grpC)
showPaneLines = input.bool(true, "Draw Divergence Lines On Composite", group = grpC)

grpD = "Divergence Types & Strength"
showReg  = input.bool(true, "Regular Divergences (Reversal)", group = grpD)
showHid  = input.bool(true, "Hidden Divergences (Continuation)", group = grpD)
minConf  = input.int(2, "Minimum Oscillator Confluence", minval = 1, maxval = 7, group = grpD, tooltip = "How many oscillators must diverge at the same pivot before anything is drawn.")
strongTh = input.int(4, "Strong Signal Threshold", minval = 2, maxval = 7, group = grpD, tooltip = "Confluence count at which a signal is upgraded to Strong and highlighted in the accent color.")

grpZ = "Reaction Zones"
showZones = input.bool(true, "Show Reaction Zones", group = grpZ)
zoneAtr   = input.float(0.75, "Zone Height (Average True Range Ratio)", step = 0.05, minval = 0.1, group = grpZ)
zoneExt   = input.int(20, "Zone Extension (Bars)", minval = 5, maxval = 100, group = grpZ)

grpV = "Chart Visuals"
bullCol    = input.color(#26d0ce, "Bullish Color", group = grpV)
bearCol    = input.color(#f7567c, "Bearish Color", group = grpV)
goldCol    = input.color(#e8b64c, "Strong Signal Color", group = grpV)
silvCol    = input.color(#9aa7b8, "Neutral Color", group = grpV)
markPivots = input.bool(true, "Mark Scanned Pivots On Price", group = grpV)

grpT = "Dashboard"
showDash   = input.bool(true, "Show Dashboard", group = grpT)
dashPos    = input.string("Top Right", "Position", options = ["Top Right", "Top Left", "Bottom Right", "Bottom Left"], group = grpT)
dashSize   = input.string("Small", "Text Size", options = ["Tiny", "Small", "Normal", "Large"], group = grpT)
showVals   = input.bool(true, "Show Live Oscillator Values", group = grpT)
dashTitleBg = input.color(color.new(#16233a, 0), "Title Band", group = grpT)
dashBg      = input.color(color.new(#0d1522, 15), "Background", group = grpT)
dashFrame   = input.color(color.new(#9aa7b8, 55), "Frame", group = grpT)
dashGrid    = input.color(color.new(#9aa7b8, 90), "Grid", group = grpT)
dashHeadTxt = input.color(color.new(#e8b64c, 0), "Header Text", group = grpT)
dashBodyTxt = input.color(color.new(#eef2f7, 5), "Body Text", group = grpT)
dashMuteTxt = input.color(color.new(#9aa7b8, 15), "Muted Text", group = grpT)

rsiV = ta.rsi(close, rsiLen)
[macdM, macdS, macdHist] = ta.macd(close, macdFast, macdSlow, macdSig)
stochV = ta.sma(ta.stoch(close, high, low, stochLen), 3)
cciV = ta.cci(hlc3, cciLen)
obvV = ta.obv
obvSma = ta.sma(obvV, 20)
mfiV = ta.mfi(hlc3, mfiLen)
momV = ta.mom(close, momLen)
atr  = ta.atr(14)

nMac = ta.stoch(macdHist, macdHist, macdHist, normLen)
nObv = ta.stoch(obvV, obvV, obvV, normLen)
nMom = ta.stoch(momV, momV, momV, normLen)
nCci = math.min(100, math.max(0, 50 + cciV * 0.25))

compArr = array.from(rsiV, nMac, stochV, nCci, nObv, mfiV, nMom)
enArrC  = array.from(useRsi, useMacd, useStoch, useCci, useObv, useMfi, useMom)
float sumN = 0.0
int   cntN = 0
for i = 0 to 6
    if enArrC.get(i) and not na(compArr.get(i))
        sumN += compArr.get(i)
        cntN += 1
comp = cntN > 0 ? sumN / cntN : na

compCol = color.from_gradient(nz(comp, 50), osLvl, obLvl, bearCol, bullCol)
pComp = plot(showComp ? comp : na, "Composite Oscillator", color = compCol, linewidth = 2)
pMid  = plot(showComp ? 50 : na, "Midline", color = color.new(#9aa7b8, 75), linewidth = 1)
fill(pComp, pMid, color = color.new(compCol, 82), title = "Composite Fill")
hOb  = hline(80, "Overbought Guide", color = color.new(#f7567c, 65), linestyle = hline.style_dashed)
hOs  = hline(20, "Oversold Guide", color = color.new(#26d0ce, 65), linestyle = hline.style_dashed)
hTop = hline(100, "Scale Top", color = color.new(#9aa7b8, 100))
hBot = hline(0, "Scale Bottom", color = color.new(#9aa7b8, 100))
fill(hOb, hTop, color = color.new(#f7567c, 93), title = "Overbought Band")
fill(hOs, hBot, color = color.new(#26d0ce, 93), title = "Oversold Band")

plNow = ta.pivotlow(low, pivL, pivR)
phNow = ta.pivothigh(high, pivL, pivR)

var float pLowPrev     = na
var int   pLowPrevBar  = na
var float pHighPrev    = na
var int   pHighPrevBar = na
var array<float> oscLowPrev  = array.new<float>(7, na)
var array<float> oscHighPrev = array.new<float>(7, na)
var array<int>   lastDir     = array.new<int>(7, 0)
var float compLowPrev  = na
var float compHighPrev = na

var array<line>  dLines = array.new<line>()
var array<line>  oLines = array.new<line>()
var array<label> dLabs  = array.new<label>()
var array<box>   dZones = array.new<box>()
var array<int>   dZDirs = array.new<int>()

var string lastSig = "—"
var float pressure = 0.0

f_rep(string s, int n) =>
    out = ""
    if n > 0
        for i = 1 to n
            out += s
    out

bool evBullR = false
bool evBullH = false
bool evBearR = false
bool evBearH = false
int  evBullRCnt = 0
int  evBearRCnt = 0
int  bullAdd = 0
int  bearAdd = 0

if not na(plNow) and barstate.isconfirmed
    pb = bar_index - pivR
    cv = array.from(rsiV[pivR], macdHist[pivR], stochV[pivR], cciV[pivR], obvV[pivR], mfiV[pivR], momV[pivR])
    en = array.from(useRsi, useMacd, useStoch, useCci, useObv, useMfi, useMom)
    nm = array.from("RSI", "MACD", "Stochastic", "CCI", "OBV", "MFI", "Momentum")
    cvC = comp[pivR]
    if not na(pLowPrev)
        cntR = 0
        cntH = 0
        txtR = ""
        txtH = ""
        for i = 0 to 6
            if en.get(i) and not na(oscLowPrev.get(i)) and not na(cv.get(i))
                if plNow < pLowPrev and cv.get(i) > oscLowPrev.get(i)
                    cntR += 1
                    txtR += (txtR == "" ? "" : " · ") + nm.get(i)
                    lastDir.set(i, 1)
                if plNow > pLowPrev and cv.get(i) < oscLowPrev.get(i)
                    cntH += 1
                    txtH += (txtH == "" ? "" : " · ") + nm.get(i)
                    lastDir.set(i, 1)
        if showReg and cntR >= minConf
            evBullR := true
            evBullRCnt := cntR
            bullAdd += cntR
            strong = cntR >= strongTh
            head = strong ? "Strong Bullish Divergence" : "Bullish Divergence"
            lastSig := head + " ×" + str.tostring(cntR)
            dLines.push(line.new(pLowPrevBar, pLowPrev, pb, plNow, color = color.new(strong ? goldCol : bullCol, 10), width = 1 + math.min(cntR - 1, 2), force_overlay = true))
            if showPaneLines and not na(compLowPrev) and not na(cvC)
                oLines.push(line.new(pLowPrevBar, compLowPrev, pb, cvC, color = color.new(strong ? goldCol : bullCol, 10), width = 1 + math.min(cntR - 1, 2)))
            dLabs.push(label.new(pb, plNow, "▲ " + head + "  " + f_rep("◆", cntR) + "\n" + txtR, style = label.style_label_up, color = color.new(strong ? goldCol : bullCol, strong ? 0 : 12), textcolor = #06222b, size = size.small, force_overlay = true))
            if showZones
                dZones.push(box.new(pb, plNow + atr * zoneAtr, pb + zoneExt, plNow - atr * 0.25, border_color = color.new(strong ? goldCol : bullCol, 55), bgcolor = color.new(strong ? goldCol : bullCol, 86), force_overlay = true))
                dZDirs.push(1)
        if showHid and cntH >= minConf
            evBullH := true
            bullAdd += cntH
            lastSig := "Hidden Bullish Divergence ×" + str.tostring(cntH)
            dLines.push(line.new(pLowPrevBar, pLowPrev, pb, plNow, color = color.new(bullCol, 40), width = 1 + math.min(cntH - 1, 2), style = line.style_dashed, force_overlay = true))
            if showPaneLines and not na(compLowPrev) and not na(cvC)
                oLines.push(line.new(pLowPrevBar, compLowPrev, pb, cvC, color = color.new(bullCol, 40), width = 1 + math.min(cntH - 1, 2), style = line.s

Показано первые 50% кода (символов: 15652)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 565,20₽ ≈ $19.13