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