Multi-Oscillator Divergence Scanner
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator_multi_oscillator_divergence_scanner_for_tradingview.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор «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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.