OPEN-SOURCE SCRIPT
Scalp - Victor Trader

//version=6
indicator("Scalp Fluxo Simples v6 — OP1/OP2/OP3", overlay=true, max_labels_count=500)
// === Inputs básicos ===
lenVol = input.int(50, "Janela do Volume", minval=10)
zVolThr = input.float(2.2,"Z-score mínimo p/ Clímax", step=0.1)
imbThr = input.float(0.65,"Desequilíbrio |Δ|/Vol", step=0.01)
sweepLookbk = input.int(20, "Lookback p/ Varredura", minval=5)
wickMult = input.float(1.0,"Pavio dominante vs Corpo (x)", step=0.1)
confirmClose = input.bool(true, "Confirmar só no fechamento? (anti-repaint)")
cooldownBars = input.int(8, "Cooldown OP1 (barras mínimas entre OP1)", minval=0)
// --- OP2 (reteste) ---
useOP2 = input.bool(true, "Ativar OP2 (reteste da zona)?")
retestBars = input.int(8, "Janela p/ reteste (barras após OP1)", minval=1)
// --- OP3 (confirmação do candle seguinte) ---
useOP3 = input.bool(true, "Ativar OP3 (confirmação do candle seguinte)?")
// === Funções utilitárias ===
zscore(src, len) =>
m = ta.sma(src, len)
s = ta.stdev(src, len)
s := s == 0.0 ? 1e-10 : s
(src - m) / s
// === Proxy de delta (tick rule) ===
chg = close - close[1]
delta = volume * math.sign(chg)
// === Clímax de volume ===
zVol = zscore(volume, lenVol)
climax = zVol >= zVolThr
// === Pavio dominante ===
body = math.abs(close - open)
topWick = high - math.max(open, close)
botWick = math.min(open, close) - low
topDom = topWick > body * wickMult
botDom = botWick > body * wickMult
// === Desequilíbrio ===
imbalance = math.abs(delta) / math.max(volume, 1.0)
buyImb = imbalance >= imbThr and delta > 0
sellImb = imbalance >= imbThr and delta < 0
// === Sweeps ===
prevHH = ta.highest(high, sweepLookbk)[1]
prevLL = ta.lowest(low, sweepLookbk)[1]
sweepHigh = high > prevHH
sweepLow = low < prevLL
okBar = not confirmClose or barstate.isconfirmed
// === OP1 (sinal raiz) ===
topOP1_raw = climax and buyImb and sweepHigh and topDom and okBar
bottomOP1_raw = climax and sellImb and sweepLow and botDom and okBar
// Cooldown OP1
var int lastTopOP1 = na
var int lastBotOP1 = na
topOP1 = topOP1_raw and (na(lastTopOP1) or bar_index - lastTopOP1 > cooldownBars)
bottomOP1 = bottomOP1_raw and (na(lastBotOP1) or bar_index - lastBotOP1 > cooldownBars)
if topOP1
lastTopOP1 := bar_index
if bottomOP1
lastBotOP1 := bar_index
// === Guardar ZONAS do pavio do OP1 para OP2 ===
var float lastTopZoneLow = na
var float lastTopZoneHigh = na
var int lastTopBar = na
var float lastBotZoneLow = na
var float lastBotZoneHigh = na
var int lastBotBar = na
if topOP1
lastTopZoneLow := math.max(open, close)
lastTopZoneHigh := high
lastTopBar := bar_index
if bottomOP1
lastBotZoneLow := low
lastBotZoneHigh := math.min(open, close)
lastBotBar := bar_index
// === OP2 (reteste da zona do pavio dentro de N barras) ===
topOP2 = useOP2 and not na(lastTopBar) and bar_index > lastTopBar and (bar_index - lastTopBar <= retestBars) and high >= lastTopZoneLow and low <= lastTopZoneHigh and close < open and okBar
bottomOP2 = useOP2 and not na(lastBotBar) and bar_index > lastBotBar and (bar_index - lastBotBar <= retestBars) and high >= lastBotZoneLow and low <= lastBotZoneHigh and close > open and okBar
// === OP3 (confirmação do candle seguinte) ===
topOP3 = useOP3 and topOP1[1] and close < low[1] and okBar
bottomOP3 = useOP3 and bottomOP1[1] and close > high[1] and okBar
// === Plots ===
plotshape(series=topOP1, title="TOP OP1", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, text="TOP1")
plotshape(series=topOP2, title="TOP OP2", style=shape.triangledown, location=location.abovebar, color=color.maroon, size=size.small, text="TOP2")
plotshape(series=topOP3, title="TOP OP3", style=shape.triangledown, location=location.abovebar, color=color.orange, size=size.small, text="TOP3")
plotshape(series=bottomOP1, title="FND OP1", style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.small, text="FND1")
plotshape(series=bottomOP2, title="FND OP2", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, text="FND2")
plotshape(series=bottomOP3, title="FND OP3", style=shape.triangleup, location=location.belowbar, color=color.teal, size=size.small, text="FND3")
// === Alertas ===
alertcondition(condition=topOP1, title="TOP OP1", message="TOP OP1 (clímax+sweep+pavio)")
alertcondition(condition=topOP2, title="TOP OP2", message="TOP OP2 (reteste da zona)")
alertcondition(condition=topOP3, title="TOP OP3", message="TOP OP3 (confirmação)")
alertcondition(condition=bottomOP1, title="FND OP1", message="FND OP1 (clímax+sweep+pavio)")
alertcondition(condition=bottomOP2, title="FND OP2", message="FND OP2 (reteste da zona)")
alertcondition(condition=bottomOP3, title="FND OP3", message="FND OP3 (confirmação)")
indicator("Scalp Fluxo Simples v6 — OP1/OP2/OP3", overlay=true, max_labels_count=500)
// === Inputs básicos ===
lenVol = input.int(50, "Janela do Volume", minval=10)
zVolThr = input.float(2.2,"Z-score mínimo p/ Clímax", step=0.1)
imbThr = input.float(0.65,"Desequilíbrio |Δ|/Vol", step=0.01)
sweepLookbk = input.int(20, "Lookback p/ Varredura", minval=5)
wickMult = input.float(1.0,"Pavio dominante vs Corpo (x)", step=0.1)
confirmClose = input.bool(true, "Confirmar só no fechamento? (anti-repaint)")
cooldownBars = input.int(8, "Cooldown OP1 (barras mínimas entre OP1)", minval=0)
// --- OP2 (reteste) ---
useOP2 = input.bool(true, "Ativar OP2 (reteste da zona)?")
retestBars = input.int(8, "Janela p/ reteste (barras após OP1)", minval=1)
// --- OP3 (confirmação do candle seguinte) ---
useOP3 = input.bool(true, "Ativar OP3 (confirmação do candle seguinte)?")
// === Funções utilitárias ===
zscore(src, len) =>
m = ta.sma(src, len)
s = ta.stdev(src, len)
s := s == 0.0 ? 1e-10 : s
(src - m) / s
// === Proxy de delta (tick rule) ===
chg = close - close[1]
delta = volume * math.sign(chg)
// === Clímax de volume ===
zVol = zscore(volume, lenVol)
climax = zVol >= zVolThr
// === Pavio dominante ===
body = math.abs(close - open)
topWick = high - math.max(open, close)
botWick = math.min(open, close) - low
topDom = topWick > body * wickMult
botDom = botWick > body * wickMult
// === Desequilíbrio ===
imbalance = math.abs(delta) / math.max(volume, 1.0)
buyImb = imbalance >= imbThr and delta > 0
sellImb = imbalance >= imbThr and delta < 0
// === Sweeps ===
prevHH = ta.highest(high, sweepLookbk)[1]
prevLL = ta.lowest(low, sweepLookbk)[1]
sweepHigh = high > prevHH
sweepLow = low < prevLL
okBar = not confirmClose or barstate.isconfirmed
// === OP1 (sinal raiz) ===
topOP1_raw = climax and buyImb and sweepHigh and topDom and okBar
bottomOP1_raw = climax and sellImb and sweepLow and botDom and okBar
// Cooldown OP1
var int lastTopOP1 = na
var int lastBotOP1 = na
topOP1 = topOP1_raw and (na(lastTopOP1) or bar_index - lastTopOP1 > cooldownBars)
bottomOP1 = bottomOP1_raw and (na(lastBotOP1) or bar_index - lastBotOP1 > cooldownBars)
if topOP1
lastTopOP1 := bar_index
if bottomOP1
lastBotOP1 := bar_index
// === Guardar ZONAS do pavio do OP1 para OP2 ===
var float lastTopZoneLow = na
var float lastTopZoneHigh = na
var int lastTopBar = na
var float lastBotZoneLow = na
var float lastBotZoneHigh = na
var int lastBotBar = na
if topOP1
lastTopZoneLow := math.max(open, close)
lastTopZoneHigh := high
lastTopBar := bar_index
if bottomOP1
lastBotZoneLow := low
lastBotZoneHigh := math.min(open, close)
lastBotBar := bar_index
// === OP2 (reteste da zona do pavio dentro de N barras) ===
topOP2 = useOP2 and not na(lastTopBar) and bar_index > lastTopBar and (bar_index - lastTopBar <= retestBars) and high >= lastTopZoneLow and low <= lastTopZoneHigh and close < open and okBar
bottomOP2 = useOP2 and not na(lastBotBar) and bar_index > lastBotBar and (bar_index - lastBotBar <= retestBars) and high >= lastBotZoneLow and low <= lastBotZoneHigh and close > open and okBar
// === OP3 (confirmação do candle seguinte) ===
topOP3 = useOP3 and topOP1[1] and close < low[1] and okBar
bottomOP3 = useOP3 and bottomOP1[1] and close > high[1] and okBar
// === Plots ===
plotshape(series=topOP1, title="TOP OP1", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, text="TOP1")
plotshape(series=topOP2, title="TOP OP2", style=shape.triangledown, location=location.abovebar, color=color.maroon, size=size.small, text="TOP2")
plotshape(series=topOP3, title="TOP OP3", style=shape.triangledown, location=location.abovebar, color=color.orange, size=size.small, text="TOP3")
plotshape(series=bottomOP1, title="FND OP1", style=shape.triangleup, location=location.belowbar, color=color.lime, size=size.small, text="FND1")
plotshape(series=bottomOP2, title="FND OP2", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, text="FND2")
plotshape(series=bottomOP3, title="FND OP3", style=shape.triangleup, location=location.belowbar, color=color.teal, size=size.small, text="FND3")
// === Alertas ===
alertcondition(condition=topOP1, title="TOP OP1", message="TOP OP1 (clímax+sweep+pavio)")
alertcondition(condition=topOP2, title="TOP OP2", message="TOP OP2 (reteste da zona)")
alertcondition(condition=topOP3, title="TOP OP3", message="TOP OP3 (confirmação)")
alertcondition(condition=bottomOP1, title="FND OP1", message="FND OP1 (clímax+sweep+pavio)")
alertcondition(condition=bottomOP2, title="FND OP2", message="FND OP2 (reteste da zona)")
alertcondition(condition=bottomOP3, title="FND OP3", message="FND OP3 (confirmação)")
Script open-source
In pieno spirito TradingView, il creatore di questo script lo ha reso open-source, in modo che i trader possano esaminarlo e verificarne la funzionalità. Complimenti all'autore! Sebbene sia possibile utilizzarlo gratuitamente, ricorda che la ripubblicazione del codice è soggetta al nostro Regolamento.
Declinazione di responsabilità
Le informazioni ed i contenuti pubblicati non costituiscono in alcun modo una sollecitazione ad investire o ad operare nei mercati finanziari. Non sono inoltre fornite o supportate da TradingView. Maggiori dettagli nelle Condizioni d'uso.
Script open-source
In pieno spirito TradingView, il creatore di questo script lo ha reso open-source, in modo che i trader possano esaminarlo e verificarne la funzionalità. Complimenti all'autore! Sebbene sia possibile utilizzarlo gratuitamente, ricorda che la ripubblicazione del codice è soggetta al nostro Regolamento.
Declinazione di responsabilità
Le informazioni ed i contenuti pubblicati non costituiscono in alcun modo una sollecitazione ad investire o ad operare nei mercati finanziari. Non sono inoltre fornite o supportate da TradingView. Maggiori dettagli nelle Condizioni d'uso.