High Low + BOS/Sweep aaa//@version=5
indicator("High Low + BOS/Sweep", overlay=true, max_lines_count=500, max_labels_count=500)
// Inputs (giữ nguyên các tuỳ chọn của bạn, chỉ bỏ input màu)
offTop = input.int(2, "Offset đỉnh", minval=0)
offBot = input.int(2, "Offset đáy", minval=0)
w = input.int(2, "Độ dày line", minval=1)
styleBosStr = input.string("Solid", "Kiểu line BOS", options= )
styleSweepStr = input.string("Dashed", "Kiểu line Sweep", options= )
showBosLabel = input.bool(true, "Hiện label BOS")
showSweepLabel = input.bool(true, "Hiện label Sweep")
bosLabelText = input.string("BOS", "Text BOS")
sweepLabelText = input.string("SWEEP", "Text Sweep")
labelSizeStr = input.string("tiny", "Kích thước label", options= )
// NEW: display toggles
showPivot = input.bool(true, "Hiện Pivot")
showBosSweep = input.bool(true, "Hiện BOS / Sweep")
// Convert styles / sizes
bosStyle = styleBosStr == "Dashed" ? line.style_dashed : styleBosStr == "Dotted" ? line.style_dotted : line.style_solid
sweepStyle = styleSweepStr == "Dashed" ? line.style_dashed : styleSweepStr == "Dotted" ? line.style_dotted : line.style_solid
lblSize = labelSizeStr == "small" ? size.small : labelSizeStr == "normal" ? size.normal : labelSizeStr == "large" ? size.large : size.tiny
// State vars
c = close
var int lastSignal = 0
var float sHigh = na
var int sHighBar = na
var float sLow = na
var int sLowBar = na
var float confHigh = na
var int confHighBar = na
var float confLow = na
var int confLowBar = na
var line highLine = na
var line lowLine = na
var label highLabel = na
var label lowLabel = na
// === Đánh dấu loại line: 0 = chưa có, 1 = Sweep, 2 = BOS ===
var int highLineType = 0
var int lowLineType = 0
// === Sweep tracking / pending ===
var bool pendingSweepUp = false
var bool pendingSweepDown = false
var int sweepDetectedBarUp = na
var float sweepTargetHighPrice = na
var int sweepTargetHighBar = na
var int sweepDetectedBarDown = na
var float sweepTargetLowPrice = na
var int sweepTargetLowBar = na
// === Track BOS pivots ===
var int lastBOSHighBar = na
var int lastBOSLowBar = na
// Track swing
if (lastSignal == -1) or (lastSignal == 0)
if na(sHigh) or high > sHigh
sHigh := high
sHighBar := bar_index
if (lastSignal == 1) or (lastSignal == 0)
if na(sLow) or low < sLow
sLow := low
sLowBar := bar_index
// Confirm pivot
condTop = c < low
condBot = c > high
isTop = condTop and (lastSignal != 1)
isBot = condBot and (lastSignal != -1)
// On pivot confirm
if isTop
confHigh := sHigh
confHighBar := sHighBar
highLine := na
highLabel := na
highLineType := 0
if showPivot
label.new(confHighBar, confHigh + syminfo.mintick * offTop, "●", xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, textcolor=color.red, size=size.small)
lastSignal := 1
sHigh := na
sHighBar := na
sLow := low
sLowBar := bar_index
if isBot
confLow := sLow
confLowBar := sLowBar
lowLine := na
lowLabel := na
lowLineType := 0
if showPivot
label.new(confLowBar, confLow - syminfo.mintick * offBot, "●", xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, textcolor=color.lime, size=size.small)
lastSignal := -1
sLow := na
sLowBar := na
sHigh := high
sHighBar := bar_index
// Raw sweep detection
rawSweepUp = not na(confHigh) and (na(lastBOSHighBar) or confHighBar != lastBOSHighBar) and high > confHigh and close <= confHigh
rawSweepDown = not na(confLow) and (na(lastBOSLowBar) or confLowBar != lastBOSLowBar) and low < confLow and close >= confLow
if rawSweepUp
pendingSweepUp := true
sweepDetectedBarUp := bar_index
sweepTargetHighPrice := confHigh
sweepTargetHighBar := confHighBar
if rawSweepDown
pendingSweepDown := true
sweepDetectedBarDown := bar_index
sweepTargetLowPrice := confLow
sweepTargetLowBar := confLowBar
// Check sweep validity
checkSweepValidUp() =>
isValid = true
if pendingSweepUp and not na(sweepDetectedBarUp)
maxOffset = bar_index - sweepDetectedBarUp
if maxOffset >= 0
for i = 0 to maxOffset
if close > sweepTargetHighPrice
isValid := false
isValid
checkSweepValidDown() =>
isValid = true
if pendingSweepDown and not na(sweepDetectedBarDown)
maxOffset = bar_index - sweepDetectedBarDown
if maxOffset >= 0
for i = 0 to maxOffset
if close < sweepTargetLowPrice
isValid := false
isValid
// BOS logic
bosUp = not na(confHigh) and c > confHigh
bosDown = not na(confLow) and c < confLow
if bosUp
pendingSweepUp := false
sweepDetectedBarUp := na
sweepTargetHighPrice := na
sweepTargetHighBar := na
lastBOSHighBar := confHighBar
if not na(highLine)
line.delete(highLine)
if not na(highLabel)
label.delete(highLabel)
highLineType := 2
if showBosSweep
highLine := line.new(confHighBar, confHigh, bar_index, confHigh, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=bosStyle)
if showBosLabel
midBar = math.floor((confHighBar + bar_index) / 2)
highLabel := label.new(midBar, confHigh, bosLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
if bosDown
pendingSweepDown := false
sweepDetectedBarDown := na
sweepTargetLowPrice := na
sweepTargetLowBar := na
lastBOSLowBar := confLowBar
if not na(lowLine)
line.delete(lowLine)
if not na(lowLabel)
label.delete(lowLabel)
lowLineType := 2
if showBosSweep
lowLine := line.new(confLowBar, confLow, bar_index, confLow, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=bosStyle)
if showBosLabel
midBar = math.floor((confLowBar + bar_index) / 2)
lowLabel := label.new(midBar, confLow, bosLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
// Sweep draw (pivot-in-between check)
sweepUpTriggered = false
sweepDownTriggered = false
if (isTop or isBot) and pendingSweepUp and not na(sweepTargetHighBar)
hasLowBetween = false
for i = sweepTargetHighBar to bar_index
if not na(confLowBar) and confLowBar == i
hasLowBetween := true
if checkSweepValidUp() and highLineType != 2 and hasLowBetween
if not na(highLine)
line.delete(highLine)
if not na(highLabel)
label.delete(highLabel)
highLineType := 1
if showBosSweep
highLine := line.new(sweepTargetHighBar, sweepTargetHighPrice, bar_index, sweepTargetHighPrice, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=sweepStyle)
if showSweepLabel
midBar = math.floor((sweepTargetHighBar + bar_index) / 2)
highLabel := label.new(midBar, sweepTargetHighPrice, sweepLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
pendingSweepUp := false
sweepDetectedBarUp := na
sweepTargetHighPrice := na
sweepTargetHighBar := na
sweepUpTriggered := true
if (isTop or isBot) and pendingSweepDown and not na(sweepTargetLowBar)
hasHighBetween = false
for i = sweepTargetLowBar to bar_index
if not na(confHighBar) and confHighBar == i
hasHighBetween := true
if checkSweepValidDown() and lowLineType != 2 and hasHighBetween
if not na(lowLine)
line.delete(lowLine)
if not na(lowLabel)
label.delete(lowLabel)
lowLineType := 1
if showBosSweep
lowLine := line.new(sweepTargetLowBar, sweepTargetLowPrice, bar_index, sweepTargetLowPrice, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=sweepStyle)
if showSweepLabel
midBar = math.floor((sweepTargetLowBar + bar_index) / 2)
lowLabel := label.new(midBar, sweepTargetLowPrice, sweepLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
pendingSweepDown := false
sweepDetectedBarDown := na
sweepTargetLowPrice := na
sweepTargetLowBar := na
sweepDownTriggered := true
// Alerts
alertcondition(isTop, "Top", "Top confirmed")
alertcondition(isBot, "Bot", "Bottom confirmed")
alertcondition(bosUp, "BOS Up", "Break of structure up")
alertcondition(bosDown, "BOS Down", "Break of structure down")
alertcondition(sweepUpTriggered, "Sweep Up", "Sweep đỉnh xuất hiện")
alertcondition(sweepDownTriggered, "Sweep Down", "Sweep đáy xuất hiện")
plot(na) // tránh lỗi
Göstergeler ve stratejiler
High Low + BOS/Sweep//@version=5
indicator("High Low + BOS/Sweep", overlay=true, max_lines_count=500, max_labels_count=500)
// Inputs (giữ nguyên các tuỳ chọn của bạn, chỉ bỏ input màu)
offTop = input.int(2, "Offset đỉnh", minval=0)
offBot = input.int(2, "Offset đáy", minval=0)
w = input.int(2, "Độ dày line", minval=1)
styleBosStr = input.string("Solid", "Kiểu line BOS", options= )
styleSweepStr = input.string("Dashed", "Kiểu line Sweep", options= )
showBosLabel = input.bool(true, "Hiện label BOS")
showSweepLabel = input.bool(true, "Hiện label Sweep")
bosLabelText = input.string("BOS", "Text BOS")
sweepLabelText = input.string("SWEEP", "Text Sweep")
labelSizeStr = input.string("tiny", "Kích thước label", options= )
// NEW: display toggles (giữ nguyên logic, bạn yêu cầu)
showPivot = input.bool(true, "Hiện Pivot")
showBosSweep = input.bool(true, "Hiện BOS / Sweep")
// Convert styles / sizes
bosStyle = styleBosStr == "Dashed" ? line.style_dashed : styleBosStr == "Dotted" ? line.style_dotted : line.style_solid
sweepStyle = styleSweepStr == "Dashed" ? line.style_dashed : styleSweepStr == "Dotted" ? line.style_dotted : line.style_solid
lblSize = labelSizeStr == "small" ? size.small : labelSizeStr == "normal" ? size.normal : labelSizeStr == "large" ? size.large : size.tiny
// State vars (khai báo riêng để tránh lỗi kiểu)
c = close
var int lastSignal = 0
var float sHigh = na
var int sHighBar = na
var float sLow = na
var int sLowBar = na
var float confHigh = na
var int confHighBar = na
var float confLow = na
var int confLowBar = na
var line highLine = na
var line lowLine = na
var label highLabel = na
var label lowLabel = na
// === Đánh dấu loại line: 0 = chưa có, 1 = Sweep, 2 = BOS ===
var int highLineType = 0
var int lowLineType = 0
// === Sweep tracking / pending ===
var bool pendingSweepUp = false
var bool pendingSweepDown = false
var int sweepDetectedBarUp = na
var float sweepTargetHighPrice = na
var int sweepTargetHighBar = na
var int sweepDetectedBarDown = na
var float sweepTargetLowPrice = na
var int sweepTargetLowBar = na
// === Track BOS pivots (pivot bar indexes that became BOS) ===
var int lastBOSHighBar = na
var int lastBOSLowBar = na
// Track swing while searching
if (lastSignal == -1) or (lastSignal == 0)
if na(sHigh) or high > sHigh
sHigh := high
sHighBar := bar_index
if (lastSignal == 1) or (lastSignal == 0)
if na(sLow) or low < sLow
sLow := low
sLowBar := bar_index
// Confirm pivot
condTop = c < low
condBot = c > high
isTop = condTop and (lastSignal != 1)
isBot = condBot and (lastSignal != -1)
// On pivot confirm (KHÔNG reset pendingSweep ở đây)
if isTop
confHigh := sHigh
confHighBar := sHighBar
highLine := na
highLabel := na
highLineType := 0
if showPivot
label.new(confHighBar, confHigh + syminfo.mintick * offTop, "●", xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, textcolor=color.red, size=size.small)
lastSignal := 1
sHigh := na
sHighBar := na
sLow := low
sLowBar := bar_index
if isBot
confLow := sLow
confLowBar := sLowBar
lowLine := na
lowLabel := na
lowLineType := 0
if showPivot
label.new(confLowBar, confLow - syminfo.mintick * offBot, "●", xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, textcolor=color.lime, size=size.small)
lastSignal := -1
sLow := na
sLowBar := na
sHigh := high
sHighBar := bar_index
// Raw sweep detection: nếu có râu quét pivot cũ (và đóng lại không vượt) -> đánh dấu pending và lưu pivot cũ
// loại trừ pivot đã từng là BOS (lastBOSHighBar / lastBOSLowBar)
rawSweepUp = not na(confHigh) and (na(lastBOSHighBar) or confHighBar != lastBOSHighBar) and high > confHigh and close <= confHigh
rawSweepDown = not na(confLow) and (na(lastBOSLowBar) or confLowBar != lastBOSLowBar) and low < confLow and close >= confLow
if rawSweepUp
pendingSweepUp := true
sweepDetectedBarUp := bar_index
sweepTargetHighPrice := confHigh
sweepTargetHighBar := confHighBar
if rawSweepDown
pendingSweepDown := true
sweepDetectedBarDown := bar_index
sweepTargetLowPrice := confLow
sweepTargetLowBar := confLowBar
// Functions: check sweep valid (no close crossing pivot from detection to now)
checkSweepValidUp() =>
isValid = true
if pendingSweepUp and not na(sweepDetectedBarUp) and not na(sweepTargetHighPrice)
maxOffset = bar_index - sweepDetectedBarUp
if maxOffset >= 0
for i = 0 to maxOffset
if close > sweepTargetHighPrice
isValid := false
isValid
checkSweepValidDown() =>
isValid = true
if pendingSweepDown and not na(sweepDetectedBarDown) and not na(sweepTargetLowPrice)
maxOffset = bar_index - sweepDetectedBarDown
if maxOffset >= 0
for i = 0 to maxOffset
if close < sweepTargetLowPrice
isValid := false
isValid
// BOS logic (như cũ) — nếu BOS xảy ra thì hủy pending sweep liên quan
bosUp = not na(confHigh) and c > confHigh
bosDown = not na(confLow) and c < confLow
if bosUp
// cancel pending sweep
pendingSweepUp := false
sweepDetectedBarUp := na
sweepTargetHighPrice := na
sweepTargetHighBar := na
// mark pivot as BOS (do not allow future sweep using same pivot)
lastBOSHighBar := confHighBar
// delete existing sweep display if present
if not na(highLine)
line.delete(highLine)
if not na(highLabel)
label.delete(highLabel)
// draw BOS (only if display enabled) — dùng màu mặc định: black
highLineType := 2
if showBosSweep
highLine := line.new(confHighBar, confHigh, bar_index, confHigh, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=bosStyle)
if showBosLabel
midBar = math.floor((confHighBar + bar_index) / 2)
highLabel := label.new(midBar, confHigh, bosLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
if bosDown
pendingSweepDown := false
sweepDetectedBarDown := na
sweepTargetLowPrice := na
sweepTargetLowBar := na
lastBOSLowBar := confLowBar
if not na(lowLine)
line.delete(lowLine)
if not na(lowLabel)
label.delete(lowLabel)
lowLineType := 2
if showBosSweep
lowLine := line.new(confLowBar, confLow, bar_index, confLow, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=bosStyle)
if showBosLabel
midBar = math.floor((confLowBar + bar_index) / 2)
lowLabel := label.new(midBar, confLow, bosLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
// === Sweep draw (with pivot-in-between check) ===
if (isTop or isBot) and pendingSweepUp and not na(sweepTargetHighBar)
hasLowBetween = false
// scan bars between sweepTargetHighBar and current bar to find ANY confirmed low pivot (confLowBar)
for i = sweepTargetHighBar to bar_index
if not na(confLowBar) and confLowBar == i
hasLowBetween := true
if checkSweepValidUp() and highLineType != 2 and hasLowBetween
// delete existing line if any
if not na(highLine)
line.delete(highLine)
if not na(highLabel)
label.delete(highLabel)
// mark as sweep
highLineType := 1
// draw sweep only if display enabled (màu mặc định: black)
if showBosSweep
highLine := line.new(sweepTargetHighBar, sweepTargetHighPrice, bar_index, sweepTargetHighPrice, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=sweepStyle)
if showSweepLabel
midBar = math.floor((sweepTargetHighBar + bar_index) / 2)
highLabel := label.new(midBar, sweepTargetHighPrice, sweepLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
// clear pending
pendingSweepUp := false
sweepDetectedBarUp := na
sweepTargetHighPrice := na
sweepTargetHighBar := na
if (isTop or isBot) and pendingSweepDown and not na(sweepTargetLowBar)
hasHighBetween = false
for i = sweepTargetLowBar to bar_index
if not na(confHighBar) and confHighBar == i
hasHighBetween := true
if checkSweepValidDown() and lowLineType != 2 and hasHighBetween
if not na(lowLine)
line.delete(lowLine)
if not na(lowLabel)
label.delete(lowLabel)
lowLineType := 1
if showBosSweep
lowLine := line.new(sweepTargetLowBar, sweepTargetLowPrice, bar_index, sweepTargetLowPrice, xloc=xloc.bar_index, extend=extend.none, color=color.black, width=w, style=sweepStyle)
if showSweepLabel
midBar = math.floor((sweepTargetLowBar + bar_index) / 2)
lowLabel := label.new(midBar, sweepTargetLowPrice, sweepLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=color.black, style=label.style_none, size=lblSize)
pendingSweepDown := false
sweepDetectedBarDown := na
sweepTargetLowPrice := na
sweepTargetLowBar := na
// Alerts
alertcondition(isTop, "Top", "Top confirmed")
alertcondition(isBot, "Bot", "Bottom confirmed")
alertcondition(bosUp, "BOS Up", "Break of structure up")
alertcondition(bosDown, "BOS Down", "Break of structure down")
plot(na) // tránh lỗi
Options Straddle Strategy Backtester 140% APR for 2025This script provides the most convenient manual tool for backtesting a straddle stagy in options.
The straddle is when you buy a call and a put option at the same price and the expiration date. You profit when the price movement at expiry (8 am UTC) in either directions surpass the price of the premium paid. The price of opening this straddle on ETH is always 1.6% of the current ETH price including fees.
In my example I use ETH options, I am buying a straddle at 8:30 UTC every day with the next day expiration date. In the script it looks like I am opening a long position on ETH at 8:30 and then close it the next days. We need to use 1 minute chart, chart time set to UTC for exact results and deep back testing function to go back in time.
Once the system generates a trade report - we need to download it and go to the list of trades sections, there we do the following:
1) remove all long entry lines leaving only long exit lines that have all the information we need.
2) We add one column that calculates the cost of premium for every trade: Position size*1.6%=cost of premium with fees.
3)We add a second column copying all Net PNL in USDT changing negative amounts to positive - since it doesn't matter for us which direction the move was towards.
The results are quite impressive: If you were buying straddles during 2025 that is not ended yet you will get 69% return on investment (11K paid in premiums, 19K return, 8K net profit). 2024 and 2025 combined: 53% (29 K, 45 K, and 15 profits).
Moreover, since you have the date of the trade in the table you can filter the results further to figure out if trading on some days is less profitable. Interestingly trades from Sun to Mon given are not profitable at -15% and most profitable days are Mon to Tue - 103%, Friday to Sat - 102 %. So if we remove Sun to Monday trades we will be at 89% for the first 221 days of the year or 140% APR.
Advanced CRSI with Buy/Sell SignalsThis is a custom indicator based on the Connor's RSI (CRSI) concept. It's designed to identify overbought and oversold conditions to generate potential buy and sell signals.
How it works: The indicator is a composite of three components:
RSI of Price: A standard RSI calculation on the closing price.
RSI of Up/Down Streaks: An RSI on consecutive up or down closes, which helps measure momentum.
Percentage Rank of ROC: This component measures the rate of change and is used to identify strong moves.
Features:
Plots the combined CRSI value.
Visualizes buy and sell signals directly on the chart using colored triangles.
Includes adjustable oversold and overbought levels for customization.
Provides alerts for potential trading signals.
Ideal for: Swing traders and day traders looking for an oscillator to confirm entry and exit points.
Rolling VWAPRolling VWAP with aggregated option. Very precise. uaqdhuauadhuahuduhauhdhuauhduhauhduhahuduhauhdhuad
VB Bots Watchlist 2025 — RangesOf course. Here is a complete Pine Script v6 indicator for TradingView that displays the On-Balance Volume (OBV) for a selectable list of the top 50 Binance coins by market capitalization.
You can copy and paste this code directly into your Pine Editor in TradingView.
Key Features:
Pine Script Version 6: Written in the latest version of Pine Script.
Dropdown Menu: Easily select which of the top 50 coins you want to see the OBV for from the indicator's settings.
Independent Data: The OBV is calculated for the selected coin, regardless of the chart you are currently viewing.
Clear Plot: Displays the OBV in a separate pane for easy analysis.
Black DragonUse the RSI bands; when the price touches the upper band, it tends to go down, and when the price touches the lower band, it tends to go up. Pay attention to enter a trade only when a reversal candle appears; suitable for scalping on the M15 timeframe.
Aggregated VWAP by Vibieaggregated vwap with lines and bands option. Autoslect option added. Very precise.
High volume bar by Vibiehigh volume bar - calculation based on Z-score. Very precise. Aggregated data. Adding autoselect soon.
High Low + BOS/Sweep 2//@version=5
indicator("High Low + BOS/Sweep (fixed pivot check)", overlay=true, max_lines_count=500, max_labels_count=500)
// Inputs
offTop = input.int(2, "Offset đỉnh", minval=0)
offBot = input.int(2, "Offset đáy", minval=0)
w = input.int(2, "Độ dày line", minval=1)
c_bos_up = input.color(color.red, "Màu BOS phá đỉnh")
c_bos_down = input.color(color.lime, "Màu BOS phá đáy")
c_sweep_up = input.color(color.orange, "Màu Sweep đỉnh")
c_sweep_down = input.color(color.aqua, "Màu Sweep đáy")
styleBosStr = input.string("Solid", "Kiểu line BOS", options= )
styleSweepStr = input.string("Dashed", "Kiểu line Sweep", options= )
showBosLabel = input.bool(true, "Hiện label BOS")
showSweepLabel = input.bool(true, "Hiện label Sweep")
bosLabelText = input.string("BOS", "Text BOS")
sweepLabelText = input.string("SWEEP", "Text Sweep")
labelSizeStr = input.string("tiny", "Kích thước label", options= )
// Convert styles / sizes
bosStyle = styleBosStr == "Dashed" ? line.style_dashed : styleBosStr == "Dotted" ? line.style_dotted : line.style_solid
sweepStyle = styleSweepStr == "Dashed" ? line.style_dashed : styleSweepStr == "Dotted" ? line.style_dotted : line.style_solid
lblSize = labelSizeStr == "small" ? size.small : labelSizeStr == "normal" ? size.normal : labelSizeStr == "large" ? size.large : size.tiny
// State vars
c = close
var int lastSignal = 0
var float sHigh = na
var int sHighBar = na
var float sLow = na
var int sLowBar = na
var float confHigh = na
var int confHighBar = na
var float confLow = na
var int confLowBar = na
var line highLine = na
var line lowLine = na
var label highLabel = na
var label lowLabel = na
// === Đánh dấu loại line: 0 = chưa có, 1 = Sweep, 2 = BOS ===
var int highLineType = 0
var int lowLineType = 0
// === Sweep tracking / pending ===
var bool pendingSweepUp = false
var bool pendingSweepDown = false
var int sweepDetectedBarUp = na
var float sweepTargetHighPrice = na
var int sweepTargetHighBar = na
var int sweepDetectedBarDown = na
var float sweepTargetLowPrice = na
var int sweepTargetLowBar = na
// === NEW: track BOS pivots ===
var int lastBOSHighBar = na
var int lastBOSLowBar = na
// Track swing
if (lastSignal == -1) or (lastSignal == 0)
if na(sHigh) or high > sHigh
sHigh := high
sHighBar := bar_index
if (lastSignal == 1) or (lastSignal == 0)
if na(sLow) or low < sLow
sLow := low
sLowBar := bar_index
// Confirm pivot
condTop = c < low
condBot = c > high
isTop = condTop and (lastSignal != 1)
isBot = condBot and (lastSignal != -1)
// On pivot confirm
if isTop
confHigh := sHigh
confHighBar := sHighBar
highLine := na
highLabel := na
highLineType := 0
label.new(confHighBar, confHigh + syminfo.mintick * offTop, "●", xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, textcolor=color.red, size=size.small)
lastSignal := 1
sHigh := na
sHighBar := na
sLow := low
sLowBar := bar_index
if isBot
confLow := sLow
confLowBar := sLowBar
lowLine := na
lowLabel := na
lowLineType := 0
label.new(confLowBar, confLow - syminfo.mintick * offBot, "●", xloc=xloc.bar_index, yloc=yloc.price, style=label.style_none, textcolor=color.lime, size=size.small)
lastSignal := -1
sLow := na
sLowBar := na
sHigh := high
sHighBar := bar_index
// Raw sweep detection
rawSweepUp = not na(confHigh) and (na(lastBOSHighBar) or confHighBar != lastBOSHighBar) and high > confHigh and close <= confHigh
rawSweepDown = not na(confLow) and (na(lastBOSLowBar) or confLowBar != lastBOSLowBar) and low < confLow and close >= confLow
if rawSweepUp
pendingSweepUp := true
sweepDetectedBarUp := bar_index
sweepTargetHighPrice := confHigh
sweepTargetHighBar := confHighBar
if rawSweepDown
pendingSweepDown := true
sweepDetectedBarDown := bar_index
sweepTargetLowPrice := confLow
sweepTargetLowBar := confLowBar
// Check sweep validity
checkSweepValidUp() =>
isValid = true
if pendingSweepUp and not na(sweepDetectedBarUp)
maxOffset = bar_index - sweepDetectedBarUp
if maxOffset >= 0
for i = 0 to maxOffset
if close > sweepTargetHighPrice
isValid := false
isValid
checkSweepValidDown() =>
isValid = true
if pendingSweepDown and not na(sweepDetectedBarDown)
maxOffset = bar_index - sweepDetectedBarDown
if maxOffset >= 0
for i = 0 to maxOffset
if close < sweepTargetLowPrice
isValid := false
isValid
// BOS logic
bosUp = not na(confHigh) and c > confHigh
bosDown = not na(confLow) and c < confLow
if bosUp
pendingSweepUp := false
sweepDetectedBarUp := na
sweepTargetHighPrice := na
sweepTargetHighBar := na
lastBOSHighBar := confHighBar
if not na(highLine)
line.delete(highLine)
if not na(highLabel)
label.delete(highLabel)
highLine := line.new(confHighBar, confHigh, bar_index, confHigh, xloc=xloc.bar_index, extend=extend.none, color=c_bos_up, width=w, style=bosStyle)
highLineType := 2
if showBosLabel
midBar = math.floor((confHighBar + bar_index) / 2)
highLabel := label.new(midBar, confHigh, bosLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=c_bos_up, style=label.style_none, size=lblSize)
if bosDown
pendingSweepDown := false
sweepDetectedBarDown := na
sweepTargetLowPrice := na
sweepTargetLowBar := na
lastBOSLowBar := confLowBar
if not na(lowLine)
line.delete(lowLine)
if not na(lowLabel)
label.delete(lowLabel)
lowLine := line.new(confLowBar, confLow, bar_index, confLow, xloc=xloc.bar_index, extend=extend.none, color=c_bos_down, width=w, style=bosStyle)
lowLineType := 2
if showBosLabel
midBar = math.floor((confLowBar + bar_index) / 2)
lowLabel := label.new(midBar, confLow, bosLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=c_bos_down, style=label.style_none, size=lblSize)
// === Sweep draw (with pivot-in-between check) ===
if (isTop or isBot) and pendingSweepUp and not na(sweepTargetHighBar)
hasLowBetween = false
for i = sweepTargetHighBar to bar_index
if not na(confLowBar) and confLowBar == i
hasLowBetween := true
if checkSweepValidUp() and highLineType != 2 and hasLowBetween
if not na(highLine)
line.delete(highLine)
if not na(highLabel)
label.delete(highLabel)
highLine := line.new(sweepTargetHighBar, sweepTargetHighPrice, bar_index, sweepTargetHighPrice, xloc=xloc.bar_index, extend=extend.none, color=c_sweep_up, width=w, style=sweepStyle)
if showSweepLabel
midBar = math.floor((sweepTargetHighBar + bar_index) / 2)
highLabel := label.new(midBar, sweepTargetHighPrice, sweepLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=c_sweep_up, style=label.style_none, size=lblSize)
highLineType := 1
pendingSweepUp := false
sweepDetectedBarUp := na
sweepTargetHighPrice := na
sweepTargetHighBar := na
if (isTop or isBot) and pendingSweepDown and not na(sweepTargetLowBar)
hasHighBetween = false
for i = sweepTargetLowBar to bar_index
if not na(confHighBar) and confHighBar == i
hasHighBetween := true
if checkSweepValidDown() and lowLineType != 2 and hasHighBetween
if not na(lowLine)
line.delete(lowLine)
if not na(lowLabel)
label.delete(lowLabel)
lowLine := line.new(sweepTargetLowBar, sweepTargetLowPrice, bar_index, sweepTargetLowPrice, xloc=xloc.bar_index, extend=extend.none, color=c_sweep_down, width=w, style=sweepStyle)
if showSweepLabel
midBar = math.floor((sweepTargetLowBar + bar_index) / 2)
lowLabel := label.new(midBar, sweepTargetLowPrice, sweepLabelText, xloc=xloc.bar_index, yloc=yloc.price, textcolor=c_sweep_down, style=label.style_none, size=lblSize)
lowLineType := 1
pendingSweepDown := false
sweepDetectedBarDown := na
sweepTargetLowPrice := na
sweepTargetLowBar := na
// Alerts
alertcondition(isTop, "Top", "Top confirmed")
alertcondition(isBot, "Bot", "Bottom confirmed")
alertcondition(bosUp, "BOS Up", "Break of structure up")
alertcondition(bosDown, "BOS Down", "Break of structure down")
plot(na) // tránh lỗi
SPY-2h (E.Trader) - Long-Only StrategySummary
Strategy on SPY, 2h timeframe (2000-2025).
Initial capital: 100,000 USD, 100% reinvest.
Long-only strategy with realistic commissions and slippage (Interactive Brokers: $0.005/share, 3 ticks).
Key results (2000-2025)
• Total P&L: +1,792,104 USD (+1,739.88%)
• CAGR: 11.4% (vs Buy & Hold: 6.7%) → ~1.7x higher annualized return
• Profit factor: 3.23
• Winning trades: 67.43%
• Max drawdown: 21.56%
• Time in the market: ~59% (trading days basis)
• Buy & Hold return: +358.61% → Strategy outperforms by ~4.8x
Strategy logic
• Restricted to SPY on ARCA, in 2h timeframe
• Long entries only (no shorts)
• Exploits two major biases: 1) trends and 2) overreactions
• Excludes very high VIX periods
• Implements calculated stop-losses
• Integrates commission and slippage to reflect real trading conditions (based on Interactive Brokers usage)
Focus 2008-2009 (financial crisis)
• Total P&L: +35,301 USD (+35.30%)
• Profit factor: 3.367
• Winning trades: 80%
• Max drawdown: 15.05%
Even at the height of 2008, the strategy remained profitable, while Buy & Hold was still showing a -22% loss two years later.
Focus 2020 (COVID crash)
• Total P&L: +22,463 USD (+22.46%)
• Profit factor: 4.152
• Winning trades: 72.73%
• Max drawdown: 9.91%
During the COVID mini-crash, the strategy still ended the year +22.46%, almost double Buy & Hold (+12.52%), with limited drawdown.
Observations
• Strong outperformance vs Buy & Hold with less exposure
• Robust across crises (2008, COVID-2020)
• Limited drawdowns, faster recoveries
Model validation and parameter weighting
To check robustness and avoid overfitting, I use a simple weighted-parameters ratio (explained in more detail here: Reddit post ).
In this strategy:
• 4 primary parameters (weight 1)
• 5 secondary parameters (weight 0.5)
• Weighted param count = 4×1 + 5×0.5 = 6.5
• Total trades = 267
• Ratio = 267 ÷ 6.5 ≈ 41
Since this ratio is well above the 25 threshold I usually apply, it appears the model is not overfitted according to my experience — especially given its consistent gains even through crises such as 2008 and COVID-2020.
Disclaimer
This is an educational backtest. It does not constitute investment advice.
Past performance does not guarantee future results. Use at your own risk.
Further notes
In practice, systematic strategies like this are usually executed through automation to avoid human bias and ensure consistency. For those interested, I share more about my general approach and related tools here (personal site): emailtrader.app
Srujan Naidu Strict EMA Exaggerated Touch-Free SignalGives a turn points in the market, combine with other indicators to increase win ratio
SMA-CrossOver This indicator is dedicated to the "Trader Overseas" channel.
It's a pullback trading strategy that the channel owner shares for free on YouTube.
Filter 1: Use the 200 SMA as an "Uptrend" or "Downtrend" filter.
Filter 2: When all SMAs line up,
to confirm "Uptrend" or "Downtrend."
Short-term MA = SMA14
Medium-term MA = SMA50 (with a buffer channel).
The example image shows an "Uptrend."
When all SMAs line up, there's a "Bull" signal.
(SMA21 crosses above SMA50.)
Strategy: Wait for an "ENTRY" when the price pulls back into the zone.
1. Short Pullback Zone = SMA14 - SMA50
2. Deep Pullback Zone = SMA50 + Buffer Channel
May be used in conjunction with Price Action as an additional filter.
Additional Explanation: "CrossOver" signals
"Bull" or "Bear" Signals indicate an "up" or "down" crossover of SMA21 and SMA50.
"Bull" or "Bear" signal may be used as "Exit" for the position trade.
But beware of false signals if the trend is sideways.
Each of the SMA can adjust value.
Probability Density Function (rus)KZ Indicator (Probability Density Function)
KZ estimates price move probabilities using a normal distribution model. It automatically detects trend direction, volatility level, and strength, then visualizes the likelihood of reaching an upside or downside target.
✅ Auto-adjusts for different timeframes
✅ Plots green (long) and red (short) probability zones
✅ Shows suggested target, stop-loss, and limit order
✅ Ideal for identifying high-probability entry zones
Advanced Version Available
An advanced version of the KZ script is available with:
🎯 Precise entry/exit signals
🕵️ Liquidity zone detection
🔄 Multi-timeframe signal confirmation
🛑 Dynamic stop-loss based on volatility
🔔 Built-in alerts for signal triggers
📩 DM me to get access to the advanced script version.
✅ Автоматически адаптируется под таймфрейм
✅ Показывает зелёную (лонг) и красную (шорт) области вероятности
✅ Отображает рекомендуемые цель, стоп-лосс и лимитный ордер
✅ Отлично подходит для поиска точек входа с высокой вероятностью
Доступна продвинутая версия скрипта KZ, включающая:
🎯 Точные сигналы входа/выхода
🕵️ Обнаружение зон ликвидности
🔄 Подтверждение сигналов с других таймфреймов
🛑 Динамический стоп-лосс на основе волатильности
🔔 Алерты на сигналы
EMA+HHV-ATR Trail By SrinuGreen “BUY: ” below bars.
Red “SELL: ” above bars.
Alerts also include the triggered close price.
Momentum ScannerThe scripts find the candles where high momentum is expected and a breakout trade can be executed
Combined Signal EMA + HHV-ATR Trail (Srinu)Green “BUY: ” below bars.
Red “SELL: ” above bars.
Alerts also include the triggered close price.
Cumulative Outperformance | viResearchCumulative Outperformance | viResearch
📈 Compare. Measure. Dominate.
Cumulative Outperformance | viResearch is a performance benchmarking tool designed for traders who want a deeper understanding of how their asset stacks up against a selected benchmark—such as BTC, SPX, or any TradingView-supported symbol—over time.
Built for high-level comparative analysis, this indicator plots the rolling relative performance of the asset vs. a benchmark, showing whether the asset is outperforming or underperforming in a clean, data-rich format.
🧠 Core Logic & Analytics
✔️ Rolling Returns → Tracks cumulative return over a custom period (default: 35 bars)
✔️ Benchmark Flexibility → Choose any ticker (e.g., INDEX:BTCUSD) as your benchmark
✔️ Custom Start Date → Isolate performance from a meaningful date (e.g., macro events)
✔️ Dynamic Outperformance Plot → See how much stronger or weaker your asset is
📊 Advanced Visualization
🎯 Outperformance Line → Color-coded performance differential between asset and benchmark
🎯 Zero Line Reference → Histogram-style centerline for clarity
🎯 Info Panel (Table) → Shows benchmark symbol, exact outperformance %, and status (Outperforming / Underperforming / Even)
🎯 Real-Time Labeling → Inline data label shows current performance gap directly on chart
🔔 Built-In Alert Engine
🔹 Fires alerts when your asset starts outperforming or underperforming
🔹 Uses once_per_bar_close logic to avoid intrabar noise
🔹 Ideal for monitoring passive investments or pair trading setups
👤 Ideal For:
📈 Macro analysts comparing assets post-event
⚖️ Relative strength traders or long/short pair strategists
💼 Fund managers evaluating performance attribution
🔍 Traders analyzing sector rotation or asset flows
✅ Summary
Cumulative Outperformance | viResearch is a precision benchmarking tool that enables traders to visually and quantitatively assess how an asset performs relative to another. Use it to track momentum divergence, build pair strategies, or confirm asset rotation dynamics.
Safety TradeOverview
Safety Trade plots a deterministic set of adaptive support levels anchored to 4H data and overlays them on any chart timeframe. The script does not use lookahead or future data. Line styles (color/width/type) are user-editable in the Style tab; logic parameters are fixed to keep results uniform across users.
What makes it different
All computations are centralized on 4H, then the finished values are displayed on lower or higher timeframes. This reduces parameter drift, simplifies cross-user comparisons, and avoids ambiguous “moving targets.”
Method (high level)
On 4H, a smoothed baseline is built from recent lowest lows using a moving average. From that baseline, LL2/LL3/LL4 are derived and smoothed on 4H as well. A deterministic mid-line between LL2 and LL3 is used internally (no bar-index tricks or animations). Five empirical extra levels are then computed between LL4 and LL3 using fixed multipliers: 5.33, 4.37, 3.52, 2.95, 2.30. These are not classic Fibonacci; they serve as research/visual guideposts only.
How to use (practical playbook)
Timeframe and confirmation: Values finalize on the 4H close. Confirm setups on 4H candles; use lower TFs only to fine-tune entries once a 4H condition is met.
Reading the levels: The LL4→LL3 corridor is an adaptive 4H support envelope. Level 1…Level 5 are non-linear subdivisions inside this corridor for staging partial exits, re-entries, and trailing stops. Basic bias: above LL3 with rising slope = bullish context; persistent 4H closes below LL4 with retests from below = bearish context.
Long setups:
• Rebound from LL4 (mean-reversion long): Wick through LL4, then a 4H close back above LL4. Entry next bar or on a small pullback; stop = LL4 − 0.5–1.0 × ATR(14, 4H). Targets: L5 → L4 → L3 (e.g., 30/30/40). After first take-profit move stop to breakeven, then trail under the next lower level.
• Retest of LL3 from above (trend-continuation long): Confirmed 4H close above LL3, then pullback holding LL3. Stop slightly below LL3 or below the retest swing low. Targets: structure highs or ladder via L3→L2→L1.
Short setup (mirror): 4H close below LL4, retest fails from below; stop above LL4; manage via structure/ATR and trail above swing highs or above the nearest level.
When to stand aside: High-impact news spikes; mid-corridor chop with no tests of LL4/LL3; before a decisive 4H close.
Confluence: Higher-TF market structure (D/1W), volume/OBV/MFI, and candle behavior right at LL4/LL3.
Risk: Keep per-trade risk small (e.g., 0.5–1%). Prefer partial take-profits over all-or-nothing. If volatility expands, widen stops slightly (ATR-based) and reduce size to keep risk constant.
Common mistakes: Treating lines as guaranteed reversal points; entering off a lower-TF touch without 4H confirmation; claiming performance on synthetic charts; fighting a strong down-slope below LL4.
Multi-timeframe behavior
On lower chart timeframes, values can shift intrabar until the current 4H candle closes. After the 4H close, values are fixed for that 4H segment. Lookahead is off.
What this is not
Not a strategy and not a signal generator. No claims about accuracy or ROI. Past performance does not guarantee future results.
Compatibility and scope
Pine v5, overlay, user-editable line styles. Works on any symbol/timeframe; all computations are centralized on 4H.
Changelog
v1.0 — Initial public release: 4H-anchored processing, no lookahead, user-editable styles, five empirical extra levels.
Disclaimer
For informational and educational purposes only. Not financial advice. Use at your own risk.
Double-Numbered Hexagon Price and Time Chart ⬢️ Double-Numbered Hexagon Price and Time Chart ⬢️
Overview
The Double-Numbered Hexagon Price and Time Chart is an advanced overlay indicator for TradingView that fuses William D. Gann’s geometric principles with modern charting tools. Inspired by the work of Patrick Mikula in Gann’s Scientific Methods Unveiled (Volumes 1 & 2), this tool reimagines Gann’s hexagonal number spirals—where market price and time unfold within a structured 360° framework.
This indicator constructs a dynamic, double-numbered hexagonal grid expanding from a central seed. Users can anchor from a price high or low , or override with a manual seed to start the chart from any desired value. As prices progress or regress from this origin, the chart plots swing pivots directly onto the hexagonal grid , allowing users to assess whether historical highs and lows align with key angles. The grid displays 12 angular spokes (0° to 330° in 30° steps) by default, and users can highlight any single angle , which applies a color-coded emphasis to both the spoke and its corresponding horizontal levels—helping reveal potential support, resistance, and geometric symmetry .
It supports automatic detection of pivots, live tracking of current price within the grid, and detailed display customizations—making it ideal for Gann-style geometric analysis, pivot-based strategies, and time/price harmonic research.
---
Key Features
* Hexagonal Spiral Structure: Constructs a grid of expanding rings from a central price seed, with each cell aligned to a 360° angular framework (in 30° increments).
* Anchor Customization: Seed from a bar's high/low using a selected timestamp, or override with a manual starting value.
* Increment/Decrement Control: Define step size for upward progression (positive) or downward regression (negative).
* Angle Highlighting and Lines: Select from 12 angles (0° to 330°) to highlight hexagon spokes and project price lines from the anchor.
* Swing Pivot Detection: Automatically identifies post-anchor highs/lows using `ta.pivothigh/low` logic with user-defined left/right bars.
* Real-Time Close Highlight: Dynamically marks the cell closest to the current close (unconfirmed bars).
* Display Customization: Control cell size, text size, table position, colors, and label visibility.
* Pivot Label Options: Show/hide labels for swing highs/lows with full color control.
* Rounding Precision: Set decimal places for all displayed values.
---
How to Use
1. Add to Chart: Apply the indicator as an overlay on your preferred symbol and timeframe.
2. Set the Anchor:
* Select anchor date/time using the calendar icon.
* Choose price source (High or Low).
* Set rounding to match instrument precision.
3. Configure Hexagon:
* Set number of rings to expand the grid.
* Define increment (positive or negative).
* Enable time index values for time-based sequencing.
4. Manual Override (Optional):
* Enable manual mode and input custom seed value.
5. Customize Display:
* Adjust cell and text sizes, table position, and color themes.
6. Angle Settings:
* Choose any angle (e.g., 90°) to highlight spokes and draw horizontal lines from anchor price.
7. Swing Pivots:
* Configure pivot detection using left/right bar settings.
* Toggle pivot label visibility.
8. Interpretation:
* Center cell = anchor price.
* Rings = stepped price levels.
* Spokes = geometric angles for support/resistance.
* Highlighted pivots = potential alignment zones.
* Real-time cell = current price’s position in the grid.
---
Methodology
The indicator uses hexagonal math to plot a spiral of price levels outward from a seed, calculated with degree-based geometry and coordinates. Pivots are identified using built-in TradingView functions and color-coded based on user settings. Angle highlights represent key 30° divisions for price projection.
This tool reinterprets Gann’s spiral and double-numbered techniques without astrological overlays, offering a modern and interactive way to explore time/price relationships geometrically.
---
Limitations and Notes
* Real-Time Behavior: Close highlight updates on unconfirmed bars; locks on candle close.
* Not a Signal Generator: This is a Gann research and visualization tool. Past confluences do not guarantee future outcomes. Use with proper strategy and risk management.
* Future Updates: More features may be added pending feedback and TradingView approval.
Srujan Naidu Triple Multi-Timeframe ADXTriple Multi-Timeframe ADX Indicator
This indicator displays three separate ADX (Average Directional Index) lines from different user-selected timeframes on a single pane, each with independently configurable length and smoothing. It enables traders to compare short-term, medium-term, and long-term market trend strengths visually and quickly.
MACD Split (Top/Bottom)📘 Script Explanation – MACD Split (Top/Bottom)
Purpose
Splits MACD into two separate panels for better visibility:
Top panel → MACD line (orange) & Signal line (black)
Bottom panel → Histogram (colored line) & Histogram EMA (black)
Color Rules for Histogram
Above 0 & Rising → Light Green
Above 0 & Falling → Dark Green
Below 0 & Falling → Dark Red
Below 0 & Rising → Light Red
Histogram EMA → Black
Zero Line
A gray dashed baseline is drawn at 0 for reference.
How to Use
Add the indicator twice.
Set the first one’s Mode = Top.
Set the second one’s Mode = Bottom.
Save as a template → next time, both panels load together.
Intraday Options Signals (CE / PE) – CleanIntraday Options Buy/Sell Indicator – Simple Explanation
This script is designed to help options traders (NIFTY / BANKNIFTY CE & PE) quickly see when big players might be entering or exiting intraday.
It uses concepts like displacement candles, liquidity sweeps, and Fair Value Gaps (FVGs), but keeps the output very simple: clear BUY / SELL signals.
✅ What it Shows
BUY CE (Call Option)
→ Green arrow/flag below the bar when conditions suggest bullish momentum + liquidity trap + gap.
BUY PE (Put Option)
→ Red arrow/flag above the bar when conditions suggest bearish momentum + liquidity trap + gap.
EXIT CE / EXIT PE
→ Small gray "X" appears when conditions say the current trade should be closed.
EOD EXIT
→ If intraday session ends (e.g., 3:30 PM), any open trade is auto-closed.
Background Tint
→ Green shading while in CE mode, Red shading while in PE mode. Makes it child-easy to see the current bias.
VWAP Line (Optional)
→ Silver line shows intraday volume-weighted average price. Exits may trigger if price crosses VWAP.
⚡ How It Works (Logic in simple words)
Detects strong bullish or bearish candles (big displacement).
Checks for Fair Value Gaps (imbalances), often used by institutions.
Looks for liquidity sweeps (traps) near swing highs/lows → signals big players’ stop hunts.
Combines these into BUY CE / BUY PE triggers with cooldown (to avoid over-trading).
Manages exits via VWAP, opposite signals, or end of day.
🎯 How to Use
Copy the code → paste into TradingView Pine Editor → click Add to chart.
Apply it on NIFTY / BANKNIFTY options charts (e.g., BANKNIFTY24SEP48000CE).
Works best on 1m to 15m intraday charts.
Watch for:
🚀 Green “BUY CE” arrow → buy CALL
🚀 Red “BUY PE” arrow → buy PUT
❌ Gray EXIT → close trade
🔔 Alerts
You can set TradingView alerts for:
BUY CE, BUY PE
EXIT CE, EXIT PE
End of Day exit
That way, you’ll get push notifications the moment a signal appears.
⚠️ Important Notes
This is NOT 100% accurate. No indicator is. It gives a framework to spot big player footprints (liquidity sweeps + FVGs).
Always backtest on Strategy Tester before using with real money.
Use it with good risk management (stop loss & position sizing).