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

Setup Scanner [GBB]

setup scanner.pine

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

ares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 1 общих тегов! cycle-identifier.mq5MQL5 / MetaTrader 5 · 1 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 1 общих теговprecisionflowea.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

«Setup Scanner [GBB]» — индикатор TradingView на Pine Script v6, который отслеживает шесть типов технических сценариев на графике: восстановление VWAP, откат EMA (9/21), пробой и ретест, ликвидность свинга, расхождение RSI и пробой диапазона открытия. Для каждого сценария индикатор определяет формирование, открытие направления (длинная или короткая позиция) и отображает соответствующие маркеры, зоны риска и уровней целей на графике.

Встроенная торговая логика позволяет управлять несколькими одновременными сделками с настройками стопа и трёх уровней целей (TP1–TP3), а также отслеживать их исходы (стоп, достижение целей, истечение времени). Все сделки визуализируются с помощью коробок, линий и меток с возможностью затухания закрытых позиций.

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

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

НастройкаОписание
useVwap Включение сценария восстановления VWAP: цена проводит определённое количество баров по одну сторону от VWAP, затем закрывается обратно через него.
useEma Включение сценария отката EMA (9/21): цена в тренде по EMA 21/50 откатывает в зону EMA 9/21 и разворачивается.
useBrt Включение сценария «Пробой и ретест» (Break and retest): ожидание возврата к уровню пробитого swing после подтверждения.
useSweep Включение сценария ликвидности свинга: свеча вытягивает минимум/максимум за заданный период, затем закрывается обратно внутри.
useDiv Включение сценария расхождения RSI: подтверждение свинг-пивота расхождением с RSI через заданный интервал.
useOrb Включение сценария пробоя диапазона открытия (Opening Range Break): пробой верхней или нижней границы диапазона сессии.
stopAtr Расстояние стопа в единицах ATR от цены входа.
r1 Первый уровень цели (TP1) в единицах ATR от входа.
r2 Второй уровень цели (TP2) в единицах ATR от входа.
r3 Третий уровень цели (TP3) в единицах ATR от входа.
maxOpen Максимальное количество одновременно открытых сделок.
maxBars Количество баров после открытия сделки, по истечении которых она автоматически закрывается как истёкшая.
reentry Количество баров ожидания после закрытия сделки, прежде чем можно открыть новую. 0 означает мгновенный повторный вход.
oneWay Блокировка входов в противоположном направлении: при открытой длинной позиции короткие сигналы игнорируются и наоборот.
atrLen Длина периода для расчёта ATR (среднего истинного диапазона), используемого в качестве базовой единицы расстояний.
volMult Множитель объёма: объём бара должен превышать SMA20 объёма на заданное число раз. Фильтр применяется к VWAP reclaim, EMA pullback и liquidity sweep.
pvLen Длина периода для определения swing-пивотов (вершин и впадин), используемых в сценариях ретеста и расхождения.
showZones Отображение зон риска и целей (коробки и линии) для сделок на графике.
zoneLen Количество баров вперёд, на которые проецируется зона сделки от текущего бара.
keepTrades Максимальное количество одновременно отображаемых торговых рисунков на графике.
tblPos Позиция панели на графике: верхний правый, верхний левый, нижний правый, нижний левый или средний правый угол.
tblSize Размер текста на панели: 0 — крошечный, 1 — маленький, 2 — нормальный, 3 — большой.
showBoard Отображение столбцов с количеством срабатываний и процентом достижения TP1 на панели.
minSamp Минимальное количество срабатываний, при котором показатели на панели отображаются полным цветом; ниже — серые.
orSess Временной диапазон торговой сессии открытия (например, 0930-1600).
orTz Часовой пояс для определения торговой сессии открытия (например, America/New_York; для крипто 24/7 можно использовать UTC).
orMin Длина диапазона открытия в минутах — период, в течение которого формируется диапазон сессии.
vwapAway Минимальное количество баров, в течение которых цена должна находиться ниже VWAP, прежде чем пересечение через него считается восстановлением.
emaWindow Количество баров с момента касания EMA, в течение которого считается, что цена ещё «в зоне отката».
brtTol Допуск ретеста в единицах ATR — максимальное отклонение цены от уровня пробоя, при котором ретест считается действительным.
brtWindow Количество баров после пробоя, в течение которых ожидается ретест к уровню.
sweepLen Глубина поиска экстремумов для сценария ликвидности свинга (количество баров назад).
divGap Максимальный разрыв в барах между пивотами для подтверждения расхождения RSI.
cLong Цвет маркеров и элементов для длинных (бычьих) позиций.
cShort Цвет маркеров и элементов для коротких (медвежьих) позиций.
cForm Цвет маркеров формирующихся сигналов.
cEntry Цвет линии входа в сделку на графике.
labelMode Режим подписей сигналов: Full — полное название сценария, Short — сокращённое, Arrow only — только стрелка, Off — скрыть.
showOutcomes Отображение подписей исходов сделок: стоп, TP3 или истечение времени.
showTpLabels Отображение подписей TP1 и TP2 на баре при достижении соответствующих уровней.
showAllSig Отображение маркеров для всех срабатываний сценариев, включая те, которые не стали сделками из-за ограничения одновременных позиций.
liveLbl Размер подписей сигналов для открытых сделок (Tiny–Large).
liveWidth Толщина границы зоны риска для открытых сделок.
liveFill Насыщенность заливки зоны риска для открытых сделок (от 0 — прозрачная до 60 — плотная).
dimClosed Затухание визуальных элементов закрытых сделок на графике.
closedFade Степень затухания закрытых сделок (от 0 — без затухания до 95 — почти невидимо).
closedLbl Размер подписей для закрытых сделок (Off — скрыть, Tiny–Normal).
closedPill Фон (pill) для подписей исходов закрытых сделок. При выключении подписи отображаются как обычный текст.
outOff Смещение подписей исходов (стоп/TP3/истёк) от уровня в единицах ATR, чтобы они не перекрывали свечи.
Получить полный код

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

indicator("Setup Scanner [GBB]", "GBB Setup", overlay = true,
          max_boxes_count = 500, max_lines_count = 500, max_labels_count = 500)

const int N_SETUPS = 6

const int S_VWAP  = 0   // VWAP reclaim
const int S_EMA   = 1   // EMA pullback
const int S_BRT   = 2   // Break and retest
const int S_SWEEP = 3   // Liquidity sweep reversal
const int S_DIV   = 4   // RSI divergence
const int S_ORB   = 5   // Opening range break

const int ST_OFF     = 0
const int ST_DORMANT = 1
const int ST_FORMING = 2
const int ST_LONG    = 3
const int ST_SHORT   = 4

setupName(int sid) =>
    switch sid
        S_VWAP  => "VWAP reclaim"
        S_EMA   => "EMA pullback"
        S_BRT   => "Break and retest"
        S_SWEEP => "Liquidity sweep"
        S_DIV   => "RSI divergence"
        S_ORB   => "Opening range"
        => "?"

var string GS = "Setups"
bool useVwap  = input.bool(true,  "VWAP reclaim",         group = GS)
bool useEma   = input.bool(true,  "EMA pullback (9/21)",  group = GS)
bool useBrt   = input.bool(true,  "Break and retest",     group = GS)
bool useSweep = input.bool(true,  "Liquidity sweep",      group = GS)
bool useDiv   = input.bool(true,  "RSI divergence",       group = GS)
bool useOrb   = input.bool(true,  "Opening range break",  group = GS)

var string GT = "Trade plan"
float stopAtr  = input.float(1.2, "Stop distance (ATR)",  minval = 0.2, step = 0.1, group = GT)
float r1       = input.float(1.0, "TP1 (R)",              minval = 0.2, step = 0.1, group = GT)
float r2       = input.float(2.0, "TP2 (R)",              minval = 0.2, step = 0.1, group = GT)
float r3       = input.float(3.0, "TP3 (R)",              minval = 0.2, step = 0.1, group = GT)
int   maxOpen  = input.int(1,     "Max concurrent trades", minval = 1, maxval = 5, group = GT)
int   maxBars  = input.int(60,    "Give up after N bars",  minval = 5, group = GT)
int   reentry  = input.int(0,     "Re-entry cooldown (bars)", minval = 0, group = GT,
     tooltip = "Bars to wait after any trade resolves before a new one may open. " +
               "0 keeps every signal, which is why stops cluster back-to-back on impulse bars. " +
               "Changing this changes the scoreboard, so reset counts when you adjust it.")
bool  oneWay   = input.bool(true, "Block opposite-direction entries", group = GT,
     tooltip = "While a long is open, ignore short signals and vice versa.")

var string GF = "Filters"
int   atrLen   = input.int(14,   "ATR length",             minval = 2,  group = GF)
float volMult  = input.float(1.0,"Volume must exceed x SMA20", minval = 0, step = 0.1, group = GF)
int   pvLen    = input.int(5,    "Swing pivot length",     minval = 2,  group = GF)

var string GD = "Display"
bool  showZones = input.bool(true,  "Draw trade zones",    group = GD)
int   zoneLen   = input.int(6,      "Project zone N bars ahead", minval = 1, group = GD,
     tooltip = "An open trade's zone extends from entry to the current bar, plus this much " +
               "projection. It stops growing when the trade resolves.")
int   keepTrades= input.int(8,      "Keep last N drawings",minval = 1, maxval = 40, group = GD)
string tblPos   = input.string("Top right", "Panel position",
     options = ["Top right","Top left","Bottom right","Bottom left","Middle right"], group = GD)
int   tblSize   = input.int(1, "Panel text size (0 tiny – 3 large)", minval = 0, maxval = 3, group = GD)

var string GC = "Scoreboard"
bool  showBoard = input.bool(true, "Show scoreboard columns", group = GC)
int   minSamp   = input.int(10,    "Grey out below N samples", minval = 1, group = GC)

var string GO = "Opening range"
string orSess   = input.session("0930-1600", "Session",     group = GO)
string orTz     = input.string("America/New_York", "Timezone", group = GO,
     tooltip = "Use UTC for 24h crypto and set the session to your chosen anchor.")
int    orMin    = input.int(15, "Range length (minutes)", minval = 1, group = GO)

var string GX = "Setup tuning"
int   vwapAway  = input.int(6,    "VWAP: min bars below before reclaim", minval = 1, group = GX)
int   emaWindow = input.int(3,    "EMA: bars since touch",   minval = 1, group = GX)
float brtTol    = input.float(0.3,"Retest tolerance (ATR)",  minval = 0.05, step = 0.05, group = GX)
int   brtWindow = input.int(20,   "Retest window (bars)",    minval = 2, group = GX)
int   sweepLen  = input.int(20,   "Sweep lookback",          minval = 5, group = GX)
int   divGap    = input.int(60,   "Divergence max pivot gap",minval = 5, group = GX)

color cLong  = input.color(#00E39A, "Long",    group = GD, inline = "col")
color cShort = input.color(#FF3B6B, "Short",   group = GD, inline = "col")
color cForm  = input.color(#FFB020, "Forming", group = GD, inline = "col")
color cEntry = input.color(#9BA4B0, "Entry",   group = GD, inline = "col")

string labelMode = input.string("Short", "Signal labels",
     options = ["Full","Short","Arrow only","Off"], group = GD)
bool showOutcomes = input.bool(true, "Show outcome tags (stop / TP3 / expired)", group = GD)
bool showTpLabels = input.bool(false, "Also label TP1 / TP2 on the bar", group = GD,
     tooltip = "Off: a filled target promotes its ladder line to solid instead. " +
               "On: adds a text tag at the hit bar, which will overlap candles on a dense chart.")
bool showAllSig   = input.bool(false, "Mark blocked signals too", group = GD,
     tooltip = "Off: only signals that actually opened a trade get a marker. " +
               "On: every setup fire is marked, including ones skipped by the concurrency limit.")

var string GL = "Live trade appearance"
string liveLbl   = input.string("Small", "Signal label size",
     options = ["Tiny","Small","Normal","Large"], group = GL)
int    liveWidth = input.int(2, "Zone border width", minval = 1, maxval = 4, group = GL)
int    liveFill  = input.int(16, "Risk zone fill strength", minval = 0, maxval = 60, group = GL,
     tooltip = "Higher fills the risk box more solidly. The reward box is kept lighter " +
               "so the two never compete.")

var string GK = "Closed trade appearance"
bool   dimClosed  = input.bool(true, "Fade closed trades", group = GK)
int    closedFade = input.int(55, "Fade strength", minval = 0, maxval = 95, group = GK,
     tooltip = "0 leaves resolved trades as bright as the live one. 95 makes them nearly invisible. " +
               "Filled targets always fade less than unfilled ones so you can still read how far each trade got.")
string closedLbl  = input.string("Tiny", "Label size",
     options = ["Off","Tiny","Small","Normal"], group = GK)
bool   closedPill = input.bool(false, "Keep pill background", group = GK,
     tooltip = "Off: resolved labels drop to plain text, which is much quieter on a busy chart.")

float  outOff     = input.float(0.6, "Outcome tag offset (ATR)", minval = 0, step = 0.1, group = GK,
     tooltip = "Pushes the stop / TP3 / expired tag away from the candles. " +
               "0 restores the old anchored-at-level look.")

fadeT(int liveT) =>
    math.min(99, liveT + math.round((99 - liveT) * closedFade / 100.0))

fadeKeep(int liveT) =>
    math.min(99, liveT + math.round((99 - liveT) * closedFade / 200.0))

lblSize(string s) =>
    switch s
        "Tiny"   => size.tiny
        "Small"  => size.small
        "Normal" => size.normal
        "Large"  => size.large
        => size.tiny

setupTag(int sid) =>
    switch sid
        S_VWAP  => "VWAP"
        S_EMA   => "EMA"
        S_BRT   => "B&R"
        S_SWEEP => "SWEEP"
        S_DIV   => "DIV"
        S_ORB   => "ORB"
        => "?"

float atr    = ta.atr(atrLen)
float ema9   = ta.ema(close, 9)
float ema21  = ta.ema(close, 21)
float ema50  = ta.ema(close, 50)
float rsiV   = ta.rsi(close, 14)
float volMa  = ta.sma(volume, 20)
bool  volOk  = volMult <= 0 or na(volume) or na(volMa) or volume >= volMa * volMult

float vwapV  = ta.vwap(hlc3)

bool bullBar = close > open
bool bearBar = close < open
bool ready   = barstate.isconfirmed and not na(atr) and atr > 0

var int belowRun = 0
var int aboveRun = 0

bool vwapValid = useVwap and not na(vwapV)

bool vwapCrossUp = ta.crossover(close, vwapV)
bool vwapCrossDn = ta.crossunder(close, vwapV)

if not na(vwapV)
    belowRun := close < vwapV ? belowRun + 1 : 0
    aboveRun := close > vwapV ? aboveRun + 1 : 0

bool sVwapL = vwapValid and ready and vwapCrossUp and nz(belowRun[1]) >= vwapAway and volOk
bool sVwapS = vwapValid and ready and vwapCrossDn and nz(aboveRun[1]) >= vwapAway and volOk

bool sVwapForm = vwapValid and not sVwapL and not sVwapS and
     ((nz(belowRun) >= vwapAway and close > close[1] and vwapV - close < atr * 0.4) or
      (nz(aboveRun) >= vwapAway and close < close[1] and close - vwapV < atr * 0.4))

bool trendUp = ema21 > ema50 and ema50 > ema50[3]
bool trendDn = ema21 < ema50 and ema50 < ema50[3]

bool touchedUp = ta.barssince(low  <= ema21) <= emaWindow
bool touchedDn = ta.barssince(high >= ema21) <= emaWindow

bool sEmaL = useEma and ready and trendUp and touchedUp and close > ema9 and bullBar and close > high[1] and volOk
bool sEmaS = useEma and ready and trendDn and touchedDn and close < ema9 and bearBar and close < low[1]  and volOk

bool sEmaForm = useEma and not sEmaL and not sEmaS and
     ((trendUp and low  <= ema21 and close < ema9) or
      (trendDn and high >= ema21 and close > ema9))

float phV = ta.pivothigh(high, pvLen, pvLen)
float plV = ta.pivotlow(low,  pvLen, pvLen)

var float brtHiLvl  = na
var bool  brtHiBrk  = false
var int   brtHiBar  = na
var float brtHiPend = na
var float brtLoLvl  = na
var bool  brtLoBrk  = false
var int   brtLoBar  = na
var float brtLoPend = na

brtBusy(bool brk, int brkBar) =>
    brk and not na(brkBar) and bar_index - brkBar <= brtWindow

if not na(phV)
    if brtBusy(brtHiBrk, brtHiBar)
        brtHiPend := phV
    else
        brtHiLvl  := phV
        brtHiBrk  := false
        brtHiPend := na
if not na(plV)
    if brtBusy(brtLoBrk, brtLoBar)
        brtLoPend := plV
    else
        brtLoLvl  := plV
        brtLoBrk  := false
        brtLoPend := na

if not na(brtHiLvl) and not brtHiBrk and close > brtHiLvl
    brtHiBrk := true
    brtHiBar := bar_index
if not na(brtLoLvl) and not brtLoBrk and close < brtLoLvl
    brtLoBrk := true
    brtLoBar := bar_index

bool brtLiveL = useBrt and brtBusy(brtHiBrk, brtHiBar) and bar_index > brtHiBar
bool brtLiveS = useBrt and brtBusy(brtLoBrk, brtLoBar) and bar_index > brtLoBar

bool sBrtL = brtLiveL and ready and low  <= brtHiLvl + atr * brtTol and close > brtHiLvl and bullBar
bool sBrtS = brtLiveS and ready and high >= brtLoLvl - atr * brtTol and close < brtLoLvl and bearBar

if sBrtL
    brtHiBrk := false
if sBrtS
    brtLoBrk := false

if not brtBusy(brtHiBrk, brtHiBar) and not na(brtHiPend)
    brtHiLvl  := brtHiPend
    brtHiBrk  := false
    brtHiPend := na
if not brtBusy(brtLoBrk, brtLoBar) and not na(brtLoPend)
    brtLoLvl  := brtLoPend
    brtLoBrk  := false
    brtLoPend := na

bool sBrtForm = (brtLiveL or brtLiveS) and not sBrtL and not sBrtS

float swLo = ta.lowest(low,  sweepLen)[1]
float swHi = ta.highest(high, sweepLen)[1]

bool sSweepL = useSweep and ready and not na(swLo) and low  < swLo and close > swLo and bullBar and
     (close - low)  > (high - close) and volOk
bool sSweepS = useSweep and ready and not na(swHi) and high > swHi and close < swHi and bearBar and
     (high - close) > (close - low)  and volOk

bool sSweepForm = useSweep and not sSweepL and not sSweepS and
     ((not na(swLo) and low < swLo) or (not na(swHi) and high > swHi))

var float lastPlP = na
var float lastPlR = na
var int   lastPlB = na
var float lastPhP = na
var float lastPhR = na
var int   lastPhB = na

bool divL = false
bool divS = false

if not na(plV)
    float curP = plV
    float curR = rsiV[pvLen]
    if not na(lastPlP) and bar_index - lastPlB <= divGap
        divL := curP < lastPlP and curR > lastPlR
    lastPlP := curP
    lastPlR := curR
    lastPlB := bar_index

if not na(phV)
    float curP = phV
    float curR = rsiV[pvLen]
    if not na(lastPhP) and bar_index - lastPhB <= divGap
        divS := curP > lastPhP and curR < lastPhR
    lastPhP := curP
    lastPhR := curR
    lastPhB := bar_index

bool sDivL = useDiv and ready and divL
bool sDivS = useDiv and ready and divS
var table wm = table.new(position.bottom_right, 1, 1)
if barstate.isfirst
    table.cell(wm, 0, 0, "Join Telegram @free_fx_pro", text_color = color.new(color.gray, 70), text_size = size.large)

bool inSess  = not na(time(timeframe.period, orSess, orTz))
bool newSess = inSess and not inSess[1]

var float orH     = na
var float orL     = na
var bool  orDone  = false
var bool  orFired = false
var int   orStart = na

if newSess
    orH     := high
    orL     := low
    orDone  := false
    orFired := false
    orStart := time
else if inSess and not orDone
    if not na(orStart) and (time - orStart) >= orMin * 60000
        orDone := true
    else
        orH := math.max(nz(orH, high), high)
        orL := math.min(nz(orL, low),  low)

bool sOrbL = useOrb and ready and inSess and orDone and not orFired and not na(orH) and close > orH
bool sOrbS = useOrb and ready and inSess and orDone and not orFired and not na(orL) and close < orL

if sOrbL or sOrbS
    orFired := true

bool sOrbForm = useOrb and inSess and orDone and not orFired

plot(useOrb and inSess and orDone ? orH : na, "OR high", color.new(cForm, 30), 1, plot.style_linebr)
plot(useOrb and inSess and orDone ? orL : na, "OR low",  color.new(cForm, 30), 1, plot.style_linebr)

longSig(int sid) =>
    switch sid
        S_VWAP  => sVwapL
        S_EMA   => sEmaL
        S_BRT   => sBrtL
        S_SWEEP => sSweepL
        S_DIV   => sDivL
        S_ORB   => sOrbL
        => false

shortSig(int sid) =>
    switch sid
        S_VWAP  => sVwapS
        S_EMA   => sEmaS
        S_BRT   => sBrtS
        S_SWEEP => sSweepS
        S_DIV   => sDivS
        S_ORB   => sOrbS
        => false

formSig(int sid) =>
    switch sid
        S_VWAP  => sVwapForm
        S_EMA   => sEmaForm
        S_BRT   => sBrtForm
        S_SWEEP => sSweepForm
        S_DIV   => false
        S_ORB   => sOrbForm
        => false

enabled(int sid) =>
    switch sid
        S_VWAP  => useVwap
        S_EMA   => useEma
        S_BRT   => useBrt
        S_SWEEP => useSweep
        S_DIV   => useDiv
        S_ORB   => useOrb
        => false

type Trade
    int 

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

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

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

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

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

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

Стоимость полного кода
2 028,30₽ ≈ $24.78