Chimera [theUltimator5]In myth, the chimera is an “impossible” hybrid—lion, goat, and serpent fused into one—striking to look at and formidable in presence. The word has come to mean a beautiful, improbable union of parts that shouldn’t work together, yet do.
Chimera is a dual-mode market context tool that blends a multi-input oscillator with classic ADX/DI trend strength, plus optional multi-timeframe “gap-line” tracking. Use it to visualize regime (trend vs. range), momentum swings around an adaptive midline, and higher timeframe (HTF) reference levels that auto-terminate on touch/cross.
Modes
1) Oscillator view
A smoothed composite of five common inputs—RSI, MACD (oscillator), Bollinger position, Stochastic, and an ATR/DI-weighted bias. Each is normalized to a comparable 0–100 style scale, averaged, and plotted as a candle-style oscillator (short vs. long smoothing, wickless for clarity). A dynamic midline with standard-deviation bands frames neutral → bearish/bullish zones. Colors ramp from neutral to your chosen Oversold/Overbought endpoints; consolidation can override to white.
Here is a description of the (5) signals used to calculate the sentiment oscillator:
RSI (14): Measures recent momentum by comparing average gains vs. losses. High = strength after advances; low = weakness after declines. (Z-score normalized to 0–100.)
MACD oscillator (12/26/9): Uses the difference between MACD and its signal (histogram) to gauge momentum shifts. Positive = bullish tilt; negative = bearish. (Z-score normalized.)
Bollinger Bands position (20, 2): Locates price within the bands (0–100 from lower → upper). Near upper suggests strength/expansion; near lower suggests weakness/contraction. (Then normalized.)
Stochastic (14, 3, 3): Shows where the close sits within the recent high-low range, smoothed via %D. Higher values = closes near highs; lower = near lows. (Scaled 0–100.)
ATR/DI composite (14): Volatility-weighted directional bias: (+DI − −DI) amplified by ATR as a % of price and its relative average. Positive = bullish pressure with volatility; negative = bearish. (Rank/scale normalized.)
All five are normalized and averaged into one composite, then smoothed (short/long) and compared to an adaptive midline with bands.
2) ADX view
Shows ADX, +DI, –DI with user-defined High Threshold. Transparency and color shift with regime. When ADX is strong, a directional “fire/ice” gradient fills the area between ADX and the high threshold, biased toward the dominant DI; when ADX is weak, a soft white fade highlights low-trend conditions.
HTF gap-line tracking (optional; both modes)
Detects “gap-like” reference levels after weak-trend consolidation flips into a sudden DI jump.
Anchors a line at the event bar’s open and auto-terminates upon first touch/cross (tick-size tolerance).
Auto-selects up to three higher timeframes suited to your chart resolution and prints non-overlapping lines with labels like 1H / 4H / 1D. Lower-priority duplicates are suppressed to reduce clutter.
Confirmation / repaint notes
Signals and lines finalize on bar close of the relevant timeframe.
HTF elements update only on the HTF bar close. During a forming bar they may appear transiently.
Line removal finalizes after the bar that produced the touch/cross closes.
Visual cues & effects
Oscillator candles: Open/High = long smoothing; Low/Close = short smoothing (no wicks).
Adaptive bands: Midline ± StdDev Multiplier × stdev of the blended series.
Consolidation tint: Optional white backdrop/candles when the consolidation condition is true (balance + low ADX).
Breakout VFX (optional): With strong DI/ADX and Bollinger breaks, renders a subtle “fire” flare above upper-band thrusts or “ice” shelf below lower-band thrusts.
Inputs (high-level)
Visual Style: Oscillator or ADX.
General (Oscillator): Lookback Period, Short/Long Smoothing, Standard Deviation Multiplier.
Color (Oscillator): Oversold/Overbought colors for gradient endpoints.
Plot (Oscillator): Show Candles, Show Slow MA Line, Show Individual Component (RSI/MACD/BB/Stoch/ATR).
Table (Oscillator): Show Information Table & position (compact dashboard of component values + status).
ADX / Gaps / VFX (both modes): ADX High Threshold, Highlight Backgrounds, Show Gap Labels, Visual Overlay Effects, and color choices for current-TF & HTF lines.
HTF selection: Automatic ladder (3 tiers) based on your chart timeframe.
Alerts (built-in)
Buy Signal – Primary: Oscillator exits oversold.
Sell Signal – Primary: Oscillator exits overbought.
Gap Fill Line Created (Any TF)
Gap Fill Line Terminated (Any TF)
ADX Crossed ABOVE/BELOW Low Threshold
ADX Crossed ABOVE/BELOW High Threshold
Consolidation Started
Alerts evaluate on the close of the relevant timeframe.
How to read it (quick guide)
Pick your lens: Oscillator for blended momentum around an adaptive midline; ADX for trend strength and DI skew.
Watch extremes & mean re-entries (Oscillator): Approaches to the top/bottom band show persistent momentum; returns toward the midline show normalization.
Check regime (ADX): Below Low = low-trend; above High = strong trend, with “fire/ice” bias toward +DI/–DI.
Track gap lines: Fresh labels mark new reference levels; lines auto-remove on first interaction. HTF lines add context but finalize only on HTF close.
The uniqueness from this indicator comes from multiple areas:
1. A unique multi-timeframe algorithm detects gap fill zones and plots them on the chart.
2. Visual effects for both visual modes were hand crafted to provide a visually stunning and intuitive interface.
3. The algorithm to determine sentiment uses a unique blend of weight and sensitivity adjustment to create a plot with elastic upper and lower bounds based off historical volatility and price action.
Multitimeframe
Heikin-Ashi-Candles MTFHeikin-Ashi Higher Timeframe Candles
This indicator overlays higher-timeframe Heikin-Ashi candles (default: 5 minutes) onto a lower-timeframe chart (e.g., 1 minute). Instead of using standard candlesticks, it draws:
Semi-transparent rectangles to represent the candle bodies.
Vertical lines to represent wicks, centered on each body.
Key features:
Dynamic transparency: The current, still-forming higher-timeframe candle is plotted in green or red (depending on trend) with a separate, lighter transparency (default: 30) so you can easily distinguish it from completed candles.
Finalization on close: As soon as a higher-timeframe candle closes, its body and wicks update to the standard transparency level (default: 50), ensuring completed candles are visually distinct.
Customizable inputs: You can adjust
The higher timeframe (tf) for Heikin-Ashi calculations.
Body transparency for confirmed candles.
Transparency for unfinished candles.
Wick thickness.
Use case:
This is particularly useful for traders who analyze price action on lower timeframes but want to stay aware of the higher-timeframe Heikin-Ashi trend without switching charts. The fading effect on the active candle helps prevent confusion between fully formed candles and those still developing.
DZ/SZ - HFM by MamaRight-Empty Wick Zones (MTF) draws Supply/Demand zones from the remaining wick of adjacent opposite-color candles (Classic & Non-classic rules). Zones extend right only through empty space and stop at the first touching candle. Multi-TF scan (H1/H4/1D/1W/1M) with TF-colored boxes and labels showing Demand/Supply + H/L.
Demand (red → green, adjacent):
Classic: if the red candle’s lower wick is longer than the green’s → zone = (the “excess” red wick).
Non-classic: if the red’s lower wick is shorter or equal → zone = (use the longer green wick).
Supply (green → red, adjacent):
Classic: if the green candle’s upper wick is longer than the red’s → zone = (the “excess” green wick).
Non-classic: if the green’s upper wick is shorter or equal → zone = (use the longer red wick).
After a zone is created, the box extends right and terminates at the very first bar whose price range (body or wick) overlaps the zone → ensures the plotted area is genuinely right-empty.
What you see
Zone boxes with distinct colors per timeframe (e.g., H1/H4/1D/1W/1M).
Optional labels on each box: H4 Demand / H1 Supply, plus H/L prices of the zone.
Labels can sit at the left edge or follow the right edge of the box.
Inputs
Toggles: Demand Classic / Demand Non-classic / Supply Classic / Supply Non-classic.
Timeframes to scan: H1, H4, 1D, 1W, 1M.
Min zone thickness (price): minimum height of a zone (in price units).
Initial right extension (bars): initial box length; the script auto-cuts at the first touch.
Show labels / place labels at the right edge.
How to use (suggestion)
Use higher TF (e.g., 1D) for bias and lower TFs (H1/H4) for execution zones.
Keep only the rule set (Classic/Non-classic) that matches your playbook.
Treat zones as areas of interest—wait for your own confirmations (e.g., swing rejection, wick re-entry, structure shift, volume cues) and manage risk accordingly.
Notes
Because zones are sourced from higher TFs via request.security, the drawing can update intrabar; a zone is final once the source TF bar closes.
Min zone thickness uses price units (e.g., on XAUUSD, 1.00 ≈ $1).
This tool is an analytical aid, not financial advice or an entry/exit signal.
อินดิเคเตอร์ DZ/SZ - HFM by Mama ใช้หา Demand/Supply zone จาก “ไส้ที่เหลือ” ของ คู่แท่งสีตรงข้ามที่ติดกัน แล้ววาดเป็นกล่อง ยืดไปทางขวาเฉพาะช่วงที่ว่าง และ หยุดตรงแท่งแรกที่เข้ามาแตะโซน รองรับหลาย Timeframe (H1/H4/1D/1W/1M) พร้อมสีแยก TF และป้ายกำกับ Demand/Supply + H/L ของโซน
รายละเอียดการทำงาน (ไทย)
แนวคิดหลัก
Demand: เลือกคู่ แดง→เขียว ที่ “ติดกัน”
Classic: ถ้า ไส้ล่าง ของแท่งแดงยาวกว่าแท่งเขียว → โซน =
Non-classic: ถ้า ไส้ล่าง ของแท่งแดงสั้นกว่าหรือเท่าเขียว → โซน =
Supply: เลือกคู่ เขียว→แดง ที่ “ติดกัน”
Classic: ถ้า ไส้บน ของแท่งเขียวยาวกว่าแท่งแดง → โซน =
Non-classic: ถ้า ไส้บน ของแท่งเขียวสั้นกว่าหรือเท่าแดง → โซน =
เมื่อสร้างโซนแล้ว กล่องจะ ยืดทางขวา ไปเรื่อย ๆ และ หยุดทันทีเมื่อมีแท่งแรกที่ช่วงราคา (ไส้หรือตัวแท่ง) ทับซ้อนกับโซน ⇒ ได้ “พื้นที่ขวาว่าง” ตามโจทย์
สิ่งที่แสดงบนกราฟ
กล่องโซนสีตาม Timeframe (เช่น H1=ฟ้า, H4=เขียว, 1D=ส้ม, 1W=ม่วง, 1M=เทา)
Label ที่มุมกล่อง: H4 Demand / H1 Supply + ราคาของ High/Low ของโซน
(เลือกวาง ซ้าย หรือ ขอบขวา ของกล่องได้ในตั้งค่า)
ตัวเลือกสำคัญใน Settings
เปิด/ปิด: Demand Classic / Demand Non-classic / Supply Classic / Supply Non-classic
เลือก TF ที่จะสแกน: H1, H4, 1D, 1W, 1M
Min zone thickness (price): กำหนด “ความหนา” ขั้นต่ำของโซน (หน่วยเป็นราคา เช่น XAUUSD = ดอลลาร์)
Initial right extension (bars): ความยาวยืดเริ่มต้น (อินดี้จะตัดให้สั้นลงเองเมื่อมีแท่งมาแตะ)
แสดง Label บนโซน และ วาง Label ที่ขอบขวากล่อง
วิธีใช้แนะนำ
เลือก TF ที่ต้องการ (เช่น ให้ H1/H4 เป็นโซนเทรดละเอียด และ 1D ใช้กรองทิศ)
เปิดเฉพาะโหมด (Classic/Non-classic) ที่ตรงกับแนวคิดการเทรดของคุณ
ใช้โซนเป็นบริเวณ “สนใจ” แล้วรอพฤติกรรมราคา/สัญญาณยืนยันเสริม (เช่น สวิงกลับ, rejection wick, โวลลุ่ม, หรือโครงสร้างจบคลื่น)
หมายเหตุสำคัญ
อินดี้ใช้ข้อมูลข้าม TF; สัญญาณจาก TF สูง อาจเปลี่ยนระหว่างแท่งยังไม่ปิด (ลักษณะ intrabar update) โซนจะ “นิ่ง” เมื่อแท่งของ TF ต้นทาง ปิดแล้ว
หน่วยของ Min zone thickness เป็น หน่วยราคา ไม่ใช่ pips (XAUUSD: 1.00 = $1)
อินดี้ไม่ได้ให้สัญญาณเข้า–ออกอัตโนมัติ ควรใช้ร่วมกับแผนเทรดและการจัดการความเสี่ยง
BTCUSD Dual Thrust (1H)BTCUSD Dual Thrust (1H) — Indicator
Overview
The Dual Thrust is a classic breakout-type strategy designed to capture strong directional moves when markets show imbalance between buyers and sellers. This indicator adapts the method specifically for BTCUSD on the 1-Hour timeframe, showing dynamic Buy/Sell trigger levels and live signals.
Origin
The Dual Thrust system was originally introduced by Michael Vitucci and has been widely used in futures and high-volatility markets. It was designed as a day-trading breakout framework, where daily high/low and close data define the range for the next session’s trade triggers.
How it Works
Each new day, the indicator calculates a “breakout range” using daily price data.
Two trigger levels are projected from the daily open:
Buy Trigger: Open + Range × KUp
Sell Trigger: Open - Range × KDn
Range can be built from either:
Classic Dual Thrust formula: max(High - Close , Close - Low) over a lookback period, or
ATR-based range: for volatility-adaptive signals.
A LONG signal fires when price crosses above the Buy Trigger.
An EXIT signal fires when price crosses below the Sell Trigger.
Buy/Sell lines step forward across each intraday bar until recalculated at the next daily open.
Practical Use
Optimized for BTCUSD 1-Hour charts (crypto’s volatility provides stronger follow-through).
Use the Buy/Sell levels as dynamic breakout lines or as confluence with your own setups.
Alerts are built in, so you can receive notifications when a LONG or EXIT condition triggers.
Designed as an indicator only (not a backtest strategy).
Key Features
✅ Daily Buy/Sell trigger lines auto-calculated and forward-filled
✅ LONG / EXIT labels on signals
✅ Optional ATR mode for volatility regimes
✅ Optional bar coloring for easy visual scanning
✅ Alerts ready for live monitoring
⚡️ Tip: While this indicator highlights breakout opportunities, effectiveness can improve when combined with trend filters (e.g., 200-SMA) or when aligned with higher timeframe supply/demand zones.
Mayfair FX Scalper V-10 Price Action + SMC//@version=5
indicator("Mayfair FX Scalper V-10 Price Action + SMC", overlay=true)
// === INPUTS ===
rsiLength = input.int(14, title="RSI Length")
overbought = input.float(73, title="SELL Level")
oversold = input.float(31, title="BUY Level")
rsiSrc = input.source(open, title="RSI Source")
// === Color Inputs ===
entryLineColor = input.color(color.white, title="entry Label Color")
entryLabelColor = input.color(color.white, title="entry Lable Color")
slLineColor = input.color(color.red, title="Stop Loss Line Color")
slLabelColor = input.color(color.red, title="Stop Loss Label Color")
tpLineColor = input.color(color.blue, title="Take Profit Line Color")
tpLabelColor = input.color(color.blue, title="Take Profit Color")
entryTextColor = input.color(color.rgb(0, 0, 0) , title="entry Text Color")
slTextColor = input.color(color.white, title="Stop Lose Color")
tpTextColor = input.color(color.white, title="Take Profit Text Color")
//indicator("Author Info Display"
// Create table
var table infoTable = table.new(position.top_right, 2, 6, bgcolor=color.new(#000000, 1), border_width=1)
if barstate.islast
table.cell(infoTable, 0, 0, "Author:", text_color=color.white, text_size=size.small)
table.cell(infoTable, 1, 0, "MR WOW", text_color=color.rgb(255, 251, 0), text_size=size.large)
table.cell(infoTable, 0, 1, "YouTube:", text_color=color.white, text_size=size.small)
table.cell(infoTable, 1, 1, "www.youtube.com/@iammrwow", text_color=color.rgb(255, 251, 0), text_size=size.small)
table.cell(infoTable, 0, 3, "Website:", text_color=color.white, text_size=size.small)
table.cell(infoTable, 1, 3, "www.mrwowea.com", text_color=color.rgb(255, 251, 0), text_size=size.small)
// === RSI CALCULATION ===
rsi = ta.rsi(rsiSrc, rsiLength)
rawBuySignal = rsi < oversold
rawSellSignal = rsi > overbought
// === Confirmed Signals ===
isBullish = close > open
isBearish = close < open
newBuy = rawBuySignal and isBullish and close > open == false
newSell = rawSellSignal and isBearish and close < open == false
// === Trade State Variables ===
var bool inPosition = false
var bool isBuy = false
var float entryPrice = na
var float slPrice = na
var float tp1Price = na
var float tp2Price = na
var float tp3Price = na
var int entryBarIndex = na
var label labels = array.new()
var line lines = array.new()
// === Instrument & Timeframe SL/TP Setup ===
isGold = str.contains(syminfo.ticker, "XAU") or str.contains(syminfo.ticker, "GOLD")
instrumentType = syminfo.type == "crypto" ? "Crypto" : isGold ? "Gold" : syminfo.currency == "JPY" ? "JPY" : "Forex"
tf = timeframe.period
slPipsGold = tf == "1" ? 30 : tf == "3" ? 45 : tf == "5" ? 50 : tf == "15" ? 60 : 70
slPipsCrypto = tf == "1" ? 5 : tf == "3" ? 8 : tf == "5" ? 12 : tf == "15" ? 15 : 10
slPipsForex = tf == "1" ? 6 : tf == "3" ? 9 : tf == "5" ? 11 : tf == "15" ? 15 : 15
gold_slDist = 0.1 * slPipsGold
gold_tp1Dist = gold_slDist
gold_tp2Dist = gold_slDist * 2
gold_tp3Dist = gold_slDist * 3
pipSize = instrumentType == "Crypto" ? 1.0 : instrumentType == "Gold" or instrumentType == "JPY" ? 0.01 : 0.0001
slPips = instrumentType == "Crypto" ? slPipsCrypto : instrumentType == "Gold" ? slPipsGold : slPipsForex
slDist = slPips * pipSize
tp1Dist = slDist
tp2Dist = slDist * 2
tp3Dist = slDist * 3
// === Draw Line & Label ===
drawLine(y, txt, col, lblCol, extendToCurrent) =>
int lineEnd = extendToCurrent ? bar_index : entryBarIndex + 2
array.push(lines, line.new(entryBarIndex, y, lineEnd, y, color=col, width=2, extend=extend.none))
textCol = str.contains(txt, "Entry") ? entryTextColor : str.contains(txt, "Stop") ? slTextColor : tpTextColor
array.push(labels, label.new(lineEnd, y, txt, style=label.style_label_left, color=color.new(lblCol, 0), textcolor=textCol, size=size.small))
// === Check Exit ===
slHit = inPosition and ((isBuy and low <= slPrice) or (not isBuy and high >= slPrice))
tp3Hit = inPosition and ((isBuy and high >= tp3Price) or (not isBuy and low <= tp3Price))
shouldExit = slHit or tp3Hit
if shouldExit
for l in labels
label.delete(l)
array.clear(labels)
for ln in lines
line.delete(ln)
array.clear(lines)
inPosition := false
entryPrice := na
slPrice := na
tp1Price := na
tp2Price := na
tp3Price := na
entryBarIndex := na
// === Confirmed Signal with No Position ===
confirmedBuy = not inPosition and newBuy
confirmedSell = not inPosition and newSell
// === Signal Markers ===
plotshape(series=confirmedBuy, location=location.belowbar, color=color.rgb(33, 150, 243), style=shape.triangleup, text="BUY", textcolor=color.rgb(33, 150, 243))
plotshape(series=confirmedSell, location=location.abovebar, color=color.rgb(254, 254, 255), style=shape.triangledown, text="SELL", textcolor=color.rgb(239, 238, 247))
// === Entry Execution ===
if confirmedBuy or confirmedSell
entryPrice := close
entryBarIndex := bar_index
isBuy := confirmedBuy
inPosition := true
if isGold
slPrice := isBuy ? entryPrice - gold_slDist : entryPrice + gold_slDist
tp1Price := isBuy ? entryPrice + gold_tp1Dist : entryPrice - gold_tp1Dist
tp2Price := isBuy ? entryPrice + gold_tp2Dist : entryPrice - gold_tp2Dist
tp3Price := isBuy ? entryPrice + gold_tp3Dist : entryPrice - gold_tp3Dist
else
slPrice := isBuy ? entryPrice - slDist : entryPrice + slDist
tp1Price := isBuy ? entryPrice + tp1Dist : entryPrice - tp1Dist
tp2Price := isBuy ? entryPrice + tp2Dist : entryPrice - tp2Dist
tp3Price := isBuy ? entryPrice + tp3Dist : entryPrice - tp3Dist
drawLine(entryPrice, "Entry Price - After Candle Above Entry Price Then Place Trade: " + str.tostring(entryPrice), entryLineColor, entryLabelColor, false)
drawLine(slPrice, "Stop Loss: " + str.tostring(slPrice), slLineColor, slLabelColor, false)
drawLine(tp1Price, "(1:1) Take Profit: " + str.tostring(tp1Price), tpLineColor, tpLabelColor, false)
drawLine(tp2Price, "(2:1) Take Profit: " + str.tostring(tp2Price), tpLineColor, tpLabelColor, false)
drawLine(tp3Price, "(3:1) Take Profit: " + str.tostring(tp3Price), tpLineColor, tpLabelColor, false)
// === Update TP/SL Lines if Still in Trade ===
if inPosition and not (confirmedBuy or confirmedSell)
for ln in lines
line.delete(ln)
array.clear(lines)
for l in labels
label.delete(l)
array.clear(labels)
drawLine(entryPrice, "After Candle Closed Above Entry Line Buy & Below Sell :Entry Price-" + str.tostring(entryPrice), entryLineColor, entryLabelColor, true)
drawLine(slPrice, "Stop Loss: " + str.tostring(slPrice), slLineColor, slLabelColor, true)
drawLine(tp1Price, "(1:1) Take Profit: " + str.tostring(tp1Price), tpLineColor, tpLabelColor, true)
drawLine(tp2Price, "(2:1) Take Profit: " + str.tostring(tp2Price), tpLineColor, tpLabelColor, true)
drawLine(tp3Price, "(3:1) Take Profit: " + str.tostring(tp3Price), tpLineColor, tpLabelColor, true)
// === Bollinger Bands Inputs ===
bb_length = input.int(20, title="SMA & StdDev Length")
src = input.source(close, title="Source")
// === Bollinger Band Colors ===
color_upper_2_3 = input.color(color.new(#0db107, 64), title="Upper Band 2–3 Color")
color_upper_3_4 = input.color(color.new(#05c41f, 58), title="Upper Band 3–4 Color")
color_lower_2_3 = input.color(color.new(#bdbc9d, 80), title="Lower Band 2–3 Color")
color_lower_3_4 = input.color(color.new(#e9e6bf, 63), title="Lower Band 3–4 Color")
// === Bollinger Band Calculations ===
sma = ta.sma(src, bb_length)
stdev = ta.stdev(src, bb_length)
bb2_upper = sma + 2 * stdev
bb2_lower = sma - 2 * stdev
bb3_upper = sma + 3 * stdev
bb3_lower = sma - 3 * stdev
bb4_upper = sma + 4 * stdev
bb4_lower = sma - 4 * stdev
// === Hidden Plots for Fill ===
p_bb2_upper = plot(bb2_upper, color=na)
p_bb3_upper = plot(bb3_upper, color=na)
p_bb4_upper = plot(bb4_upper, color=na)
p_bb2_lower = plot(bb2_lower, color=na)
p_bb3_lower = plot(bb3_lower, color=na)
p_bb4_lower = plot(bb4_lower, color=na)
// === Band Zone Fills ===
fill(p_bb2_upper, p_bb3_upper, color=color_upper_2_3)
fill(p_bb3_upper, p_bb4_upper, color=color_upper_3_4)
fill(p_bb2_lower, p_bb3_lower, color=color_lower_2_3)
fill(p_bb3_lower, p_bb4_lower, color=color_lower_3_4)
//SMc
BULLISH_LEG = 1
BEARISH_LEG = 0
BULLISH = +1
BEARISH = -1
GREEN = #9c9c9c
RED = #9c9c9c
BLUE = #9c9c9c
GRAY = #ffffff
MONO_BULLISH = #b2b5be
MONO_BEARISH = #5d606b
HISTORICAL = 'Historical'
PRESENT = 'Present'
COLORED = 'Colored'
MONOCHROME = 'Monochrome'
ALL = 'All'
BOS = 'BOS'
CHOCH = 'CHoCH'
TINY = size.tiny
SMALL = size.small
NORMAL = size.normal
ATR = 'Atr'
RANGE = 'Cumulative Mean Range'
CLOSE = 'Close'
HIGHLOW = 'High/Low'
SOLID = '⎯⎯⎯'
DASHED = '----'
DOTTED = '····'
SMART_GROUP = 'Smart Money Concepts'
INTERNAL_GROUP = 'Real Time Internal Structure'
SWING_GROUP = 'Real Time Swing Structure'
BLOCKS_GROUP = 'Order Blocks'
EQUAL_GROUP = 'EQH/EQL'
GAPS_GROUP = 'Fair Value Gaps'
LEVELS_GROUP = 'Highs & Lows MTF'
ZONES_GROUP = 'Premium & Discount Zones'
modeTooltip = 'Allows to display historical Structure or only the recent ones'
styleTooltip = 'Indicator color theme'
showTrendTooltip = 'Display additional candles with a color reflecting the current trend detected by structure'
showInternalsTooltip = 'Display internal market structure'
internalFilterConfluenceTooltip = 'Filter non significant internal structure breakouts'
showStructureTooltip = 'Display swing market Structure'
showSwingsTooltip = 'Display swing point as labels on the chart'
showHighLowSwingsTooltip = 'Highlight most recent strong and weak high/low points on the chart'
showInternalOrderBlocksTooltip = 'Display internal order blocks on the chart Number of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart Number of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks It is recommended to use the cumulative mean range method when a low amount of data is available'
orderBlockMitigationTooltip = 'Select what values to use for order block mitigation'
showEqualHighsLowsTooltip = 'Display equal highs and equal lows on the chart'
equalHighsLowsLengthTooltip = 'Number of bars used to confirm equal highs and equal lows'
equalHighsLowsThresholdTooltip = 'Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows Lower values will return fewer but more pertinent results'
showFairValueGapsTooltip = 'Display fair values gaps on the chart'
fairValueGapsThresholdTooltip = 'Filter out non significant fair value gaps'
fairValueGapsTimeframeTooltip = 'Fair value gaps timeframe'
fairValueGapsExtendTooltip = 'Determine how many bars to extend the Fair Value Gap boxes on chart'
showPremiumDiscountZonesTooltip = 'Display premium, discount, and equilibrium zones on chart'
modeInput = input.string( HISTORICAL, 'Mode', group = SMART_GROUP, tooltip = modeTooltip, options = )
styleInput = input.string( COLORED, 'Style', group = SMART_GROUP, tooltip = styleTooltip,options = )
showTrendInput = input( false, 'Color Candles', group = SMART_GROUP, tooltip = showTrendTooltip)
showInternalsInput = input( true, 'Show Internal Structure', group = INTERNAL_GROUP, tooltip = showInternalsTooltip)
showInternalBullInput = input.string( ALL, 'Bullish Structure', group = INTERNAL_GROUP, inline = 'ibull', options = )
internalBullColorInput = input( GREEN, '', group = INTERNAL_GROUP, inline = 'ibull')
showInternalBearInput = input.string( ALL, 'Bearish Structure' , group = INTERNAL_GROUP, inline = 'ibear', options = )
internalBearColorInput = input( RED, '', group = INTERNAL_GROUP, inline = 'ibear')
internalFilterConfluenceInput = input( false, 'Confluence Filter', group = INTERNAL_GROUP, tooltip = internalFilterConfluenceTooltip)
internalStructureSize = input.string( TINY, 'Internal Label Size', group = INTERNAL_GROUP, options = )
showStructureInput = input( true, 'Show Swing Structure', group = SWING_GROUP, tooltip = showStructureTooltip)
showSwingBullInput = input.string( ALL, 'Bullish Structure', group = SWING_GROUP, inline = 'bull', options = )
swingBullColorInput = input( GREEN, '', group = SWING_GROUP, inline = 'bull')
showSwingBearInput = input.string( ALL, 'Bearish Structure', group = SWING_GROUP, inline = 'bear', options = )
swingBearColorInput = input( RED, '', group = SWING_GROUP, inline = 'bear')
swingStructureSize = input.string( SMALL, 'Swing Label Size', group = SWING_GROUP, options = )
showSwingsInput = input( false, 'Show Swings Points', group = SWING_GROUP, tooltip = showSwingsTooltip,inline = 'swings')
swingsLengthInput = input.int( 50, '', group = SWING_GROUP, minval = 10, inline = 'swings')
showHighLowSwingsInput = input( true, 'Show Strong/Weak High/Low',group = SWING_GROUP, tooltip = showHighLowSwingsTooltip)
showInternalOrderBlocksInput = input( true, 'Internal Order Blocks' , group = BLOCKS_GROUP, tooltip = showInternalOrderBlocksTooltip, inline = 'iob')
internalOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'iob')
showSwingOrderBlocksInput = input( false, 'Swing Order Blocks', group = BLOCKS_GROUP, tooltip = showSwingOrderBlocksTooltip, inline = 'ob')
swingOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'ob')
orderBlockFilterInput = input.string( 'Atr', 'Order Block Filter', group = BLOCKS_GROUP, tooltip = orderBlockFilterTooltip, options = )
orderBlockMitigationInput = input.string( HIGHLOW, 'Order Block Mitigation', group = BLOCKS_GROUP, tooltip = orderBlockMitigationTooltip, options = )
internalBullishOrderBlockColor = input.color(color.new(#808080, 80), 'Internal Bullish OB', group = BLOCKS_GROUP)
internalBearishOrderBlockColor = input.color(color.new(#808080, 80), 'Internal Bearish OB', group = BLOCKS_GROUP)
swingBullishOrderBlockColor = input.color(color.new(#808080, 80), 'Bullish OB', group = BLOCKS_GROUP)
swingBearishOrderBlockColor = input.color(color.new(#808080, 80), 'Bearish OB', group = BLOCKS_GROUP)
showEqualHighsLowsInput = input( true, 'Equal High/Low', group = EQUAL_GROUP, tooltip = showEqualHighsLowsTooltip)
equalHighsLowsLengthInput = input.int( 3, 'Bars Confirmation', group = EQUAL_GROUP, tooltip = equalHighsLowsLengthTooltip, minval = 1)
equalHighsLowsThresholdInput = input.float( 0.1, 'Threshold', group = EQUAL_GROUP, tooltip = equalHighsLowsThresholdTooltip, minval = 0, maxval = 0.5, step = 0.1)
equalHighsLowsSizeInput = input.string( TINY, 'Label Size', group = EQUAL_GROUP, options = )
showFairValueGapsInput = input( false, 'Fair Value Gaps', group = GAPS_GROUP, tooltip = showFairValueGapsTooltip)
fairValueGapsThresholdInput = input( true, 'Auto Threshold', group = GAPS_GROUP, tooltip = fairValueGapsThresholdTooltip)
fairValueGapsTimeframeInput = input.timeframe('', 'Timeframe', group = GAPS_GROUP, tooltip = fairValueGapsTimeframeTooltip)
fairValueGapsBullColorInput = input.color(color.new(#00ff68, 70), 'Bullish FVG' , group = GAPS_GROUP)
fairValueGapsBearColorInput = input.color(color.new(#ff0008, 70), 'Bearish FVG' , group = GAPS_GROUP)
fairValueGapsExtendInput = input.int( 1, 'Extend FVG', group = GAPS_GROUP, tooltip = fairValueGapsExtendTooltip, minval = 0)
showDailyLevelsInput = input( false, 'Daily', group = LEVELS_GROUP, inline = 'daily')
dailyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'daily', options = )
dailyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'daily')
showWeeklyLevelsInput = input( false, 'Weekly', group = LEVELS_GROUP, inline = 'weekly')
weeklyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'weekly', options = )
weeklyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'weekly')
showMonthlyLevelsInput = input( false, 'Monthly', group = LEVELS_GROUP, inline = 'monthly')
monthlyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'monthly', options = )
monthlyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'monthly')
showPremiumDiscountZonesInput = input( false, 'Premium/Discount Zones', group = ZONES_GROUP , tooltip = showPremiumDiscountZonesTooltip)
premiumZoneColorInput = input.color( RED, 'Premium Zone', group = ZONES_GROUP)
equilibriumZoneColorInput = input.color( GRAY, 'Equilibrium Zone', group = ZONES_GROUP)
discountZoneColorInput = input.color( GREEN, 'Discount Zone', group = ZONES_GROUP)
//---------------------------------------------------------------------------------------------------------------------}
//DATA STRUCTURES & VARIABLES
//---------------------------------------------------------------------------------------------------------------------{
// @type UDT representing alerts as bool fields
// @field internalBullishBOS internal structure custom alert
// @field internalBearishBOS internal structure custom alert
// @field internalBullishCHoCH internal structure custom alert
// @field internalBearishCHoCH internal structure custom alert
// @field swingBullishBOS swing structure custom alert
// @field swingBearishBOS swing structure custom alert
// @field swingBullishCHoCH swing structure custom alert
// @field swingBearishCHoCH swing structure custom alert
// @field internalBullishOrderBlock internal order block custom alert
// @field internalBearishOrderBlock internal order block custom alert
// @field swingBullishOrderBlock swing order block custom alert
// @field swingBearishOrderBlock swing order block custom alert
// @field equalHighs equal high low custom alert
// @field equalLows equal high low custom alert
// @field bullishFairValueGap fair value gap custom alert
// @field bearishFairValueGap fair value gap custom alert
type alerts
bool internalBullishBOS = false
bool internalBearishBOS = false
bool internalBullishCHoCH = false
bool internalBearishCHoCH = false
bool swingBullishBOS = false
bool swingBearishBOS = false
bool swingBullishCHoCH = false
bool swingBearishCHoCH = false
bool internalBullishOrderBlock = false
bool internalBearishOrderBlock = false
bool swingBullishOrderBlock = false
bool swingBearishOrderBlock = false
bool equalHighs = false
bool equalLows = false
bool bullishFairValueGap = false
bool bearishFairValueGap = false
// @type UDT representing last swing extremes (top & bottom)
// @field top last top swing price
// @field bottom last bottom swing price
// @field barTime last swing bar time
// @field barIndex last swing bar index
// @field lastTopTime last top swing time
// @field lastBottomTime last bottom swing time
type trailingExtremes
float top
float bottom
int barTime
int barIndex
int lastTopTime
int lastBottomTime
// @type UDT representing Fair Value Gaps
// @field top top price
// @field bottom bottom price
// @field bias bias (BULLISH or BEARISH)
// @field topBox top box
// @field bottomBox bottom box
type fairValueGap
float top
float bottom
int bias
box topBox
box bottomBox
// @type UDT representing trend bias
// @field bias BULLISH or BEARISH
type trend
int bias
// @type UDT representing Equal Highs Lows display
// @field l_ine displayed line
// @field l_abel displayed label
type equalDisplay
line l_ine = na
label l_abel = na
// @type UDT representing a pivot point (swing point)
// @field currentLevel current price level
// @field lastLevel last price level
// @field crossed true if price level is crossed
// @field barTime bar time
// @field barIndex bar index
type pivot
float currentLevel
float lastLevel
bool crossed
int barTime = time
int barIndex = bar_index
// @type UDT representing an order block
// @field barHigh bar high
// @field barLow bar low
// @field barTime bar time
// @field bias BULLISH or BEARISH
type orderBlock
float barHigh
float barLow
int barTime
int bias
// @variable current swing pivot high
var pivot swingHigh = pivot.new(na,na,false)
// @variable current swing pivot low
var pivot swingLow = pivot.new(na,na,false)
// @variable current internal pivot high
var pivot internalHigh = pivot.new(na,na,false)
// @variable current internal pivot low
var pivot internalLow = pivot.new(na,na,false)
// @variable current equal high pivot
var pivot equalHigh = pivot.new(na,na,false)
// @variable current equal low pivot
var pivot equalLow = pivot.new(na,na,false)
// @variable swing trend bias
var trend swingTrend = trend.new(0)
// @variable internal trend bias
var trend internalTrend = trend.new(0)
// @variable equal high display
var equalDisplay equalHighDisplay = equalDisplay.new()
// @variable equal low display
var equalDisplay equalLowDisplay = equalDisplay.new()
// @variable storage for fairValueGap UDTs
var array fairValueGaps = array.new()
// @variable storage for parsed highs
var array parsedHighs = array.new()
// @variable storage for parsed lows
var array parsedLows = array.new()
// @variable storage for raw highs
var array highs = array.new()
// @variable storage for raw lows
var array lows = array.new()
// @variable storage for bar time values
var array times = array.new()
// @variable last trailing swing high and low
var trailingExtremes trailing = trailingExtremes.new()
// @variable storage for orderBlock UDTs (swing order blocks)
var array swingOrderBlocks = array.new()
// @variable storage for orderBlock UDTs (internal order blocks)
var array internalOrderBlocks = array.new()
// @variable storage for swing order blocks boxes
var array swingOrderBlocksBoxes = array.new()
// @variable storage for internal order blocks boxes
var array internalOrderBlocksBoxes = array.new()
// @variable color for swing bullish structures
var swingBullishColor = styleInput == MONOCHROME ? MONO_BULLISH : swingBullColorInput
// @variable color for swing bearish structures
var swingBearishColor = styleInput == MONOCHROME ? MONO_BEARISH : swingBearColorInput
// @variable color for bullish fair value gaps
var fairValueGapBullishColor = styleInput == MONOCHROME ? color.new(MONO_BULLISH,70) : fairValueGapsBullColorInput
// @variable color for bearish fair value gaps
var fairValueGapBearishColor = styleInput == MONOCHROME ? color.new(MONO_BEARISH,70) : fairValueGapsBearColorInput
// @variable color for premium zone
var premiumZoneColor = styleInput == MONOCHROME ? MONO_BEARISH : premiumZoneColorInput
// @variable color for discount zone
var discountZoneColor = styleInput == MONOCHROME ? MONO_BULLISH : discountZoneColorInput
// @variable bar index on current script iteration
varip int currentBarIndex = bar_index
// @variable bar index on last script iteration
varip int lastBarIndex = bar_index
// @variable alerts in current bar
alerts currentAlerts = alerts.new()
// @variable time at start of chart
var initialTime = time
// we create the needed boxes for displaying order blocks at the first execution
if barstate.isfirst
if showSwingOrderBlocksInput
for index = 1 to swingOrderBlocksSizeInput
swingOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
if showInternalOrderBlocksInput
for index = 1 to internalOrderBlocksSizeInput
internalOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
// @variable source to use in bearish order blocks mitigation
bearishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : high
// @variable source to use in bullish order blocks mitigation
bullishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : low
// @variable default volatility measure
atrMeasure = ta.atr(200)
// @variable parsed volatility measure by user settings
volatilityMeasure = orderBlockFilterInput == ATR ? atrMeasure : ta.cum(ta.tr)/bar_index
// @variable true if current bar is a high volatility bar
highVolatilityBar = (high - low) >= (2 * volatilityMeasure)
// @variable parsed high
parsedHigh = highVolatilityBar ? low : high
// @variable parsed low
parsedLow = highVolatilityBar ? high : low
// we store current values into the arrays at each bar
parsedHighs.push(parsedHigh)
parsedLows.push(parsedLow)
highs.push(high)
lows.push(low)
times.push(time)
//---------------------------------------------------------------------------------------------------------------------}
//USER-DEFINED FUNCTIONS
//---------------------------------------------------------------------------------------------------------------------{
// @function Get the value of the current leg, it can be 0 (bearish) or 1 (bullish)
// @returns int
leg(int size) =>
var leg = 0
newLegHigh = high > ta.highest( size)
newLegLow = low < ta.lowest( size)
if newLegHigh
leg := BEARISH_LEG
else if newLegLow
leg := BULLISH_LEG
leg
// @function Identify whether the current value is the start of a new leg (swing)
// @param leg (int) Current leg value
// @returns bool
startOfNewLeg(int leg) => ta.change(leg) != 0
// @function Identify whether the current level is the start of a new bearish leg (swing)
// @param leg (int) Current leg value
// @returns bool
startOfBearishLeg(int leg) => ta.change(leg) == -1
// @function Identify whether the current level is the start of a new bullish leg (swing)
// @param leg (int) Current leg value
// @returns bool
startOfBullishLeg(int leg) => ta.change(leg) == +1
// @function create a new label
// @param labelTime bar time coordinate
// @param labelPrice price coordinate
// @param tag text to display
// @param labelColor text color
// @param labelStyle label style
// @returns label ID
drawLabel(int labelTime, float labelPrice, string tag, color labelColor, string labelStyle) =>
var label l_abel = na
if modeInput == PRESENT
l_abel.delete()
l_abel := label.new(chart.point.new(labelTime,na,labelPrice),tag,xloc.bar_time,color=color(na),textcolor=labelColor,style = labelStyle,size = size.small)
// @function create a new line and label representing an EQH or EQL
// @param p_ivot starting pivot
// @param level price level of current pivot
// @param size how many bars ago was the current pivot detected
// @param equalHigh true for EQH, false for EQL
// @returns label ID
drawEqualHighLow(pivot p_ivot, float level, int size, bool equalHigh) =>
equalDisplay e_qualDisplay = equalHigh ? equalHighDisplay : equalLowDisplay
string tag = 'EQL'
color equalColor = swingBullishColor
string labelStyle = label.style_label_up
if equalHigh
tag := 'EQH'
equalColor := swingBearishColor
labelStyle := label.style_label_down
if modeInput == PRESENT
line.delete( e_qualDisplay.l_ine)
label.delete( e_qualDisplay.l_abel)
e_qualDisplay.l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time ,na,level), xloc = xloc.bar_time, color = equalColor, style = line.style_dotted)
labelPosition = math.round(0.5*(p_ivot.barIndex + bar_index - size))
e_qualDisplay.l_abel := label.new(chart.point.new(na,labelPosition,level), tag, xloc.bar_index, color = color(na), textcolor = equalColor, style = labelStyle, size = equalHighsLowsSizeInput)
// @function store current structure and trailing swing points, and also display swing points and equal highs/lows
// @param size (int) structure size
// @param equalHighLow (bool) true for displaying current highs/lows
// @param internal (bool) true for getting internal structures
// @returns label ID
getCurrentStructure(int size,bool equalHighLow = false, bool internal = false) =>
currentLeg = leg(size)
newPivot = startOfNewLeg(currentLeg)
pivotLow = startOfBullishLeg(currentLeg)
pivotHigh = startOfBearishLeg(currentLeg)
if newPivot
if pivotLow
pivot p_ivot = equalHighLow ? equalLow : internal ? internalLow : swingLow
if equalHighLow and math.abs(p_ivot.currentLevel - low ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot, low , size, false)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := low
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.bottom := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastBottomTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel < p_ivot.lastLevel ? 'LL' : 'HL', swingBullishColor, label.style_label_up)
else
pivot p_ivot = equalHighLow ? equalHigh : internal ? internalHigh : swingHigh
if equalHighLow and math.abs(p_ivot.currentLevel - high ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot,high ,size,true)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := high
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.top := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastTopTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel > p_ivot.lastLevel ? 'HH' : 'LH', swingBearishColor, label.style_label_down)
// @function draw line and label representing a structure
// @param p_ivot base pivot point
// @param tag test to display
// @param structureColor base color
// @param lineStyle line style
// @param labelStyle label style
// @param labelSize text size
// @returns label ID
drawStructure(pivot p_ivot, string tag, color structureColor, string lineStyle, string labelStyle, string labelSize) =>
var line l_ine = line.new(na,na,na,na,xloc = xloc.bar_time)
var label l_abel = label.new(na,na)
if modeInput == PRESENT
l_ine.delete()
l_abel.delete()
l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time,na,p_ivot.currentLevel), xloc.bar_time, color=structureColor, style=lineStyle)
l_abel := label.new(chart.point.new(na,math.round(0.5*(p_ivot.barIndex+bar_index)),p_ivot.currentLevel), tag, xloc.bar_index, color=color(na), textcolor=structureColor, style=labelStyle, size = labelSize)
// @function delete order blocks
// @param internal true for internal order blocks
// @returns orderBlock ID
deleteOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
for in orderBlocks
bool crossedOderBlock = false
if bearishOrderBlockMitigationSource > eachOrderBlock.barHigh and eachOrderBlock.bias == BEARISH
crossedOderBlock := true
if internal
currentAlerts.internalBearishOrderBlock := true
else
currentAlerts.swingBearishOrderBlock := true
else if bullishOrderBlockMitigationSource < eachOrderBlock.barLow and eachOrderBlock.bias == BULLISH
crossedOderBlock := true
if internal
currentAlerts.internalBullishOrderBlock := true
else
currentAlerts.swingBullishOrderBlock := true
if crossedOderBlock
orderBlocks.remove(index)
// @function fetch and store order blocks
// @param p_ivot base pivot point
// @param internal true for internal order blocks
// @param bias BULLISH or BEARISH
// @returns void
storeOrdeBlock(pivot p_ivot,bool internal = false,int bias) =>
if (not internal and showSwingOrderBlocksInput) or (internal and showInternalOrderBlocksInput)
array a_rray = na
int parsedIndex = na
if bias == BEARISH
a_rray := parsedHighs.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.max())
else
a_rray := parsedLows.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.min())
orderBlock o_rderBlock = orderBlock.new(parsedHighs.get(parsedIndex), parsedLows.get(parsedIndex), times.get(parsedIndex),bias)
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
if orderBlocks.size() >= 100
orderBlocks.pop()
orderBlocks.unshift(o_rderBlock)
// @function draw order blocks as boxes
// @param internal true for internal order blocks
// @returns void
drawOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
orderBlocksSize = orderBlocks.size()
if orderBlocksSize > 0
maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput
array parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize))
array b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes
for in parsedOrdeBlocks
orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor)
box b_ox = b_oxes.get(index)
b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow))
b_ox.set_border_color( internal ? na : orderBlockColor)
b_ox.set_bgcolor( orderBlockColor)
// @function detect and draw structures, also detect and store order blocks
// @param internal true for internal structures or order blocks
// @returns void
displayStructure(bool internal = false) =>
var bullishBar = true
var bearishBar = true
if internalFilterConfluenceInput
bullishBar := high - math.max(close, open) > math.min(close, open - low)
bearishBar := high - math.max(close, open) < math.min(close, open - low)
pivot p_ivot = internal ? internalHigh : swingHigh
trend t_rend = internal ? internalTrend : swingTrend
lineStyle = internal ? line.style_dashed : line.style_solid
labelSize = internal ? internalStructureSize : swingStructureSize
extraCondition = internal ? internalHigh.currentLevel != swingHigh.currentLevel and bullishBar : true
bullishColor = styleInput == MONOCHROME ? MONO_BULLISH : internal ? internalBullColorInput : swingBullColorInput
if ta.crossover(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BEARISH ? CHOCH : BOS
if internal
currentAlerts.internalBullishCHoCH := tag == CHOCH
currentAlerts.internalBullishBOS := tag == BOS
else
currentAlerts.swingBullishCHoCH := tag == CHOCH
currentAlerts.swingBullishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BULLISH
displayCondition = internal ? showInternalsInput and (showInternalBullInput == ALL or (showInternalBullInput == BOS and tag != CHOCH) or (showInternalBullInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBullInput == ALL or (showSwingBullInput == BOS and tag != CHOCH) or (showSwingBullInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bullishColor,lineStyle,label.style_label_down,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BULLISH)
p_ivot := internal ? internalLow : swingLow
extraCondition := internal ? internalLow.currentLevel != swingLow.currentLevel and bearishBar : true
bearishColor = styleInput == MONOCHROME ? MONO_BEARISH : internal ? internalBearColorInput : swingBearColorInput
if ta.crossunder(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BULLISH ? CHOCH : BOS
if internal
currentAlerts.internalBearishCHoCH := tag == CHOCH
currentAlerts.internalBearishBOS := tag == BOS
else
currentAlerts.swingBearishCHoCH := tag == CHOCH
currentAlerts.swingBearishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BEARISH
displayCondition = internal ? showInternalsInput and (showInternalBearInput == ALL or (showInternalBearInput == BOS and tag != CHOCH) or (showInternalBearInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBearInput == ALL or (showSwingBearInput == BOS and tag != CHOCH) or (showSwingBearInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bearishColor,lineStyle,label.style_label_up,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BEARISH)
// @function draw one fair value gap box (each fair value gap has two boxes)
// @param leftTime left time coordinate
// @param rightTime right time coordinate
// @param topPrice top price level
// @param bottomPrice bottom price level
// @param boxColor box color
// @returns box ID
fairValueGapBox(leftTime,rightTime,topPrice,bottomPrice,boxColor) => box.new(chart.point.new(leftTime,na,topPrice),chart.point.new(rightTime + fairValueGapsExtendInput * (time-time ),na,bottomPrice), xloc=xloc.bar_time, border_color = boxColor, bgcolor = boxColor)
// @function delete fair value gaps
// @returns fairValueGap ID
deleteFairValueGaps() =>
for in fairValueGaps
if (low < eachFairValueGap.bottom and eachFairValueGap.bias == BULLISH) or (high > eachFairValueGap.top and eachFairValueGap.bias == BEARISH)
eachFairValueGap.topBox.delete()
eachFairValueGap.bottomBox.delete()
fairValueGaps.remove(index)
// @function draw fair value gaps
// @returns fairValueGap ID
drawFairValueGaps() =>
= request.security(syminfo.tickerid, fairValueGapsTimeframeInput, [close , open , time , high , low , time , high , low ],lookahead = barmerge.lookahead_on)
barDeltaPercent = (lastClose - lastOpen) / (lastOpen * 100)
newTimeframe = timeframe.change(fairValueGapsTimeframeInput)
threshold = fairValueGapsThresholdInput ? ta.cum(math.abs(newTimeframe ? barDeltaPercent : 0)) / bar_index * 2 : 0
bullishFairValueGap = currentLow > last2High and lastClose > last2High and barDeltaPercent > threshold and newTimeframe
bearishFairValueGap = currentHigh < last2Low and lastClose < last2Low and -barDeltaPercent > threshold and newTimeframe
if bullishFairValueGap
currentAlerts.bullishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentLow,last2High,BULLISH,fairValueGapBox(lastTime,currentTime,currentLow,math.avg(currentLow,last2High),fairValueGapBullishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentLow,last2High),last2High,fairValueGapBullishColor)))
if bearishFairValueGap
currentAlerts.bearishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentHigh,last2Low,BEARISH,fairValueGapBox(lastTime,currentTime,currentHigh,math.avg(currentHigh,last2Low),fairValueGapBearishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentHigh,last2Low),last2Low,fairValueGapBearishColor)))
// @function get line style from string
// @param style line style
// @returns string
getStyle(string style) =>
switch style
SOLID => line.style_solid
DASHED => line.style_dashed
DOTTED => line.style_dotted
// @function draw MultiTimeFrame levels
// @param timeframe base timeframe
// @param sameTimeframe true if chart timeframe is same as base timeframe
// @param style line style
// @param levelColor line and text color
// @returns void
drawLevels(string timeframe, bool sameTimeframe, string style, color levelColor) =>
= request.security(syminfo.tickerid, timeframe, [high , low , time , time],lookahead = barmerge.lookahead_on)
float parsedTop = sameTimeframe ? high : topLevel
float parsedBottom = sameTimeframe ? low : bottomLevel
int parsedLeftTime = sameTimeframe ? time : leftTime
int parsedRightTime = sameTimeframe ? time : rightTime
int parsedTopTime = time
int parsedBottomTime = time
if not sameTimeframe
int leftIndex = times.binary_search_rightmost(parsedLeftTime)
int rightIndex = times.binary_search_rightmost(parsedRightTime)
array timeArray = times.slice(leftIndex,rightIndex)
array topArray = highs.slice(leftIndex,rightIndex)
array bottomArray = lows.slice(leftIndex,rightIndex)
parsedTopTime := timeArray.size() > 0 ? timeArray.get(topArray.indexof(topArray.max())) : initialTime
parsedBottomTime := timeArray.size() > 0 ? timeArray.get(bottomArray.indexof(bottomArray.min())) : initialTime
var line topLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var line bottomLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var label topLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}H',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
var label bottomLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}L',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
topLine.set_first_point( chart.point.new(parsedTopTime,na,parsedTop))
topLine.set_second_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
topLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
bottomLine.set_first_point( chart.point.new(parsedBottomTime,na,parsedBottom))
bottomLine.set_second_point(chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
bottomLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
// @function true if chart timeframe is higher than provided timeframe
// @param timeframe timeframe to check
// @returns bool
higherTimeframe(string timeframe) => timeframe.in_seconds() > timeframe.in_seconds(timeframe)
// @function update trailing swing points
// @returns int
updateTrailingExtremes() =>
trailing.top := math.max(high,trailing.top)
trailing.lastTopTime := trailing.top == high ? time : trailing.lastTopTime
trailing.bottom := math.min(low,trailing.bottom)
trailing.lastBottomTime := trailing.bottom == low ? time : trailing.lastBottomTime
// @function draw trailing swing points
// @returns void
drawHighLowSwings() =>
var line topLine = line.new(na, na, na, na, color = swingBearishColor, xloc = xloc.bar_time)
var line bottomLine = line.new(na, na, na, na, color = swingBullishColor, xloc = xloc.bar_time)
var label topLabel = label.new(na, na, color=color(na), textcolor = swingBearishColor, xloc = xloc.bar_time, style = label.style_label_down, size = size.tiny)
var label bottomLabel = label.new(na, na, color=color(na), textcolor = swingBullishColor, xloc = xloc.bar_time, style = label.style_label_up, size = size.tiny)
rightTimeBar = last_bar_time + 20 * (time - time )
topLine.set_first_point( chart.point.new(trailing.lastTopTime, na, trailing.top))
topLine.set_second_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_text( swingTrend.bias == BEARISH ? 'Strong High' : 'Weak High')
bottomLine.set_first_point( chart.point.new(trailing.lastBottomTime, na, trailing.bottom))
bottomLine.set_second_point(chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_point( chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_text( swingTrend.bias == BULLISH ? 'Strong Low' : 'Weak Low')
// @function draw a zone with a label and a box
// @param labelLevel price level for label
// @param labelIndex bar index for label
// @param top top price level for box
// @param bottom bottom price level for box
// @param tag text to display
// @param zoneColor base color
// @param style label style
// @returns void
drawZone(float labelLevel, int labelIndex, float top, float bottom, string tag, color zoneColor, string style) =>
var label l_abel = label.new(na,na,text = tag, color=color(na),textcolor = zoneColor, style = style, size = size.small)
var box b_ox = box.new(na,na,na,na,bgcolor = color.new(zoneColor,80),border_color = color(na), xloc = xloc.bar_time)
b_ox.set_top_left_point( chart.point.new(trailing.barTime,na,top))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,bottom))
l_abel.set_point( chart.point.new(na,labelIndex,labelLevel))
// @function draw premium/discount zones
// @returns void
drawPremiumDiscountZones() =>
drawZone(trailing.top, math.round(0.5*(trailing.barIndex + last_bar_index)), trailing.top, 0.95*trailing.top + 0.05*trailing.bottom, 'Premium', premiumZoneColor, label.style_label_down)
equilibriumLevel = math.avg(trailing.top, trailing.bottom)
drawZone(equilibriumLevel, last_bar_index, 0.525*trailing.top + 0.475*trailing.bottom, 0.525*trailing.bottom + 0.475*trailing.top, 'Equilibrium', equilibriumZoneColorInput, label.style_label_left)
drawZone(trailing.bottom, math.round(0.5*(trailing.barIndex + last_bar_index)), 0.95*trailing.bottom + 0.05*trailing.top, trailing.bottom, 'Discount', discountZoneColor, label.style_label_up)
//---------------------------------------------------------------------------------------------------------------------}
//MUTABLE VARIABLES & EXECUTION
//---------------------------------------------------------------------------------------------------------------------{
parsedOpen = showTrendInput ? open : na
candleColor = internalTrend.bias == BULLISH ? swingBullishColor : swingBearishColor
plotcandle(parsedOpen,high,low,close,color = candleColor, wickcolor = candleColor, bordercolor = candleColor)
if showHighLowSwingsInput or showPremiumDiscountZonesInput
updateTrailingExtremes()
if showHighLowSwingsInput
drawHighLowSwings()
if showPremiumDiscountZonesInput
drawPremiumDiscountZones()
if showFairValueGapsInput
deleteFairValueGaps()
getCurrentStructure(swingsLengthInput,false)
getCurrentStructure(5,false,true)
if showEqualHighsLowsInput
getCurrentStructure(equalHighsLowsLengthInput,true)
if showInternalsInput or showInternalOrderBlocksInput or showTrendInput
displayStructure(true)
if showStructureInput or showSwingOrderBlocksInput or showHighLowSwingsInput
displayStructure()
if showInternalOrderBlocksInput
deleteOrderBlocks(true)
if showSwingOrderBlocksInput
deleteOrderBlocks()
if showFairValueGapsInput
drawFairValueGaps()
if barstate.islastconfirmedhistory or barstate.islast
if showInternalOrderBlocksInput
drawOrderBlocks(true)
if showSwingOrderBlocksInput
drawOrderBlocks()
lastBarIndex := currentBarIndex
currentBarIndex := bar_index
newBar = currentBarIndex != lastBarIndex
if barstate.islastconfirmedhistory or (barstate.isrealtime and newBar)
if showDailyLevelsInput and not higherTimeframe('D')
drawLevels('D',timeframe.isdaily,dailyLevelsStyleInput,dailyLevelsColorInput)
if showWeeklyLevelsInput and not higherTimeframe('W')
drawLevels('W',timeframe.isweekly,weeklyLevelsStyleInput,weeklyLevelsColorInput)
if showMonthlyLevelsInput and not higherTimeframe('M')
drawLevels('M',timeframe.ismonthly,monthlyLevelsStyleInput,monthlyLevelsColorInput)
//---------------------------------------------------------------------------------------------------------------------}
//ALERTS
//---------------------------------------------------------------------------------------------------------------------{
alertcondition(currentAlerts.internalBullishBOS, 'Internal Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.internalBullishCHoCH, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.internalBearishBOS, 'Internal Bearish BOS', 'Internal Bearish BOS formed')
alertcondition(currentAlerts.internalBearishCHoCH, 'Internal Bearish CHoCH', 'Internal Bearish CHoCH formed')
alertcondition(currentAlerts.swingBullishBOS, 'Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.swingBullishCHoCH, 'Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.swingBearishBOS, 'Bearish BOS', 'Bearish BOS formed')
alertcondition(currentAlerts.swingBearishCHoCH, 'Bearish CHoCH', 'Bearish CHoCH formed')
alertcondition(currentAlerts.internalBullishOrderBlock, 'Bullish Internal OB Breakout', 'Price broke bullish internal OB')
alertcondition(currentAlerts.internalBearishOrderBlock, 'Bearish Internal OB Breakout', 'Price broke bearish internal OB')
alertcondition(currentAlerts.swingBullishOrderBlock, 'Bullish Swing OB Breakout', 'Price broke bullish swing OB')
alertcondition(currentAlerts.swingBearishOrderBlock, 'Bearish Swing OB Breakout', 'Price broke bearish swing OB')
alertcondition(currentAlerts.equalHighs, 'Equal Highs', 'Equal highs detected')
alertcondition(currentAlerts.equalLows, 'Equal Lows', 'Equal lows detected')
alertcondition(currentAlerts.bullishFairValueGap, 'Bullish FVG', 'Bullish FVG formed')
alertcondition(currentAlerts.bearishFairValueGap, 'Bearish FVG', 'Bearish FVG formed')
//---------------------------------------------------------------------------------------------------------------------}
TPO Levels [VAH/POC/VAL] with Poor H/L, Single Prints & NPOCs### 🎯 Advanced Market Profile & Key Level Analysis
This script is a unique and comprehensive technical analysis tool designed to help traders understand market structure, value, and key liquidity levels using the principles of **Auction Market Theory** and **Market Profile**.
This script is unique (and shouldn't be censored) because :
It allows large history of levels to be displayed
Accurate as possible tick size
Doesn't draw a profile but only the actual levels
Supports multi-timeframe levels even on the daily mode giving macro context
There is no indicator out there that does it
While these concepts are universal, this indicator was built primarily for the dynamic, 24/7 nature of the **cryptocurrency market**. It helps you move beyond simple price action to understand *why* the market is moving, which is especially crucial in the volatile crypto space.
### ## 📊 The Concepts Behind the Calculations
To use this script effectively, it's important to understand the core concepts it is built upon. The entire script is self-contained and does not require other indicators.
* **What is Market Profile?**
Market Profile is a unique charting technique that organizes price and time data to reveal market structure. It's built from **Time Price Opportunities (TPOs)**, which are 30-minute periods of market activity. By stacking these TPOs, the script builds a distribution, showing which price levels were most accepted (heavily traded) and which were rejected (lightly traded) during a session.
* **What is the Value Area (VA)?**
The Value Area is the heart of the profile. It represents the price range where **70%** of the session's trading volume occurred. This is considered the "fair value" zone where both buyers and sellers were in general agreement.
* **Point of Control (POC):** The single price level with the most TPOs. This was the most accepted or "fairest" price of the session and acts as a gravitational line for price.
* **Value Area High (VAH):** The upper boundary of the 70% value zone.
* **Value Area Low (VAL):** The lower boundary of the 70% value zone.
VAH and VAL are dynamic support and resistance levels. Trading outside the previous session's value area can signal the start of a new trend.
***
### ## 📈 Key Features Explained
This script automatically calculates and displays the following critical market-generated information:
* **Multi-Timeframe Market Profile**
Automatically draws Daily, Weekly, and Monthly profiles, allowing you to analyze market structure across different time horizons. The script preserves up to 20 historical sessions to provide deep market context.
* **Naked Point of Control (nPOC)**
A "Naked" POC is a Point of Control from a previous session that has **not** been revisited by price. These levels often act as powerful magnets for price, representing areas of unfinished business that the market may seek to retest. The script tracks and displays Daily, Weekly, and Monthly nPOCs until they are touched.
* **Single Prints (Imbalance Zones)**
A Single Print is a price level where only one TPO traded during the session's development. This signifies a rapid, aggressive price move and an imbalanced market. These areas, like gaps in a traditional chart, are frequently revisited as the market seeks to "fill in" these thin parts of the profile.
* **Poor Structure (Unfinished Auctions)**
A **Poor High** or **Poor Low** occurs when the top or bottom of a profile is flat, with two or more TPOs at the extreme price. This suggests that the auction in that direction was weak and inconclusive. These weak structures often signal a high probability that price will eventually break that high or low.
***
### ## 💡 How to Use This Indicator
This tool is not a signal generator but an analytical framework to improve your trading decisions.
1. **Determine Market Context:** Start by asking: Is the current price trading *inside* or *outside* the previous session's Value Area?
* **Inside VA:** The market is in a state of balance or range-bound. Look for trades between the VAH and VAL.
* **Outside VA:** The market is in a state of imbalance and may be starting a trend. Look for continuation or acceptance of prices outside the prior value.
2. **Identify Key Levels:**
* Use historical **nPOCs** as potential profit targets or areas to watch for a price reaction.
* Treat historical **VAH** and **VAL** levels as significant support and resistance zones.
* Note where **Single Prints** are. These are often price magnets that may get "filled" in the future.
3. **Spot Weakness:**
* A **Poor High** suggests weak resistance that may be easily broken.
* A **Poor Low** suggests weak support, signaling a potential for a continued move lower if broken.
***
### ## ⚙️ Customization & Crypto Presets
The indicator is highly customizable, allowing you to change colors, transparency, the number of historical sessions, and more.
To help traders get started quickly, the indicator includes **built-in layout presets** specifically calibrated for major cryptocurrencies: ** BINANCE:BTCUSDT.P , BINANCE:ETHUSDT.P , and BINANCE:SOLUSDT.P **. These presets automatically adjust key visual parameters to better suit the unique price characteristics and volatility of each asset, providing an optimized view right out of the box.
***
### ## ⚠️ Disclaimer
This indicator is a tool for market analysis and should not be interpreted as direct buy or sell signals. It provides information based on historical price action, which does not guarantee future results. Trading involves significant risk, and you should always use proper risk management. This script is designed for use on standard chart types (e.g., Candlesticks, Bar) and may produce misleading information on non-standard charts.
Optimized SMC Dashboard - by MinkyJuiceSMC - all in one
all SMC confluences are included, fully automated and customisable
enjoy, made by MinkyJuice
No Turd Burglars, please
ICT Silver Bullet Zones (All Sessions, Custom Labels)CT Silver Bullet Zones
This indicator is designed for traders who follow the ICT *Silver Bullet* concept.
It automatically marks the **Silver Bullet window** (10:00–11:00 by default) across the **London, New York AM, New York PM, and Asia sessions**, with customizable settings for each session.
### Features:
* Separate adjustable time windows for **London, NY AM, NY PM, and Asia Silver Bullet sessions**.
* Colored session boxes with individual **opacity controls**.
* **Session labels placed at the top** of each zone, with customizable text size, color, and background opacity.
* Works on all timeframes and highlights only the Silver Bullet trading windows.
This tool is meant to help traders quickly identify ICT Silver Bullet opportunities in all major sessions without manual plotting.
Set & Forget – AlexG Club – ChecklistThe Set & Forget – AlexG Club – Checklist is built to help traders apply the well-known Set and Forget strategy from the famous AlexG (falexg) and the G-Club community.
This indicator displays a clear, on-chart checklist table of trading confluences. Each confluence adds to a total score, making it easier to objectively evaluate whether a trade setup aligns with the AlexG / G-Club strategy.
✅ Features:
• Customizable confluence checklist (trend alignment, S/R levels, candlestick signals, momentum, etc.)
• Automatic scoring system to calculate the Set & Forget readiness of a trade
• Clean table visualization on your chart
• Flexible thresholds — you decide how many confluences equal a strong setup
🚀 How to Use:
Add the indicator to your chart.
Adjust the confluences to reflect your own AlexG / G-Club inspired checklist.
Use the total score to validate trades before you pull the trigger.
⚠️ Disclaimer: This indicator is for educational purposes only. It is not financial advice and does not guarantee profitability. Always manage your risk and test before using live.
RMA Smoothed RSIRMA Smoothed RSI
Description:
An enhanced RSI built for cleaner intraday and swing reads. It applies RMA smoothing to damp noise.
How It Works
RSI (RMA-Smoothed):
Computes classic RSI from price changes and smooths the result with an additional RMA (user-controlled 3–7, where 5 is the sweet spot). This reduces whipsaw while preserving shifts in momentum.
How to Interpret
50 Midline = Bias Filter: Above 50 favors strength; below 50 favors weakness.
RSI vs RSI-MA Crosses: Cross up can precede thrust or mean-revert toward 50; cross down the opposite.
Inputs
Length: RSI period (default 14).
Source: Price source for RSI (default Close).
Smoothing: RMA smoothing length on RSI (3–7; default 3; 5 sweet spot).
Calculate Divergence: Toggle to compute pivots/divergences and enable alerts.
Moving Average Type: None, SMA, EMA, WMA, VWMA (default EMA).
MA Length: Length of the RSI-based MA (separate from RSI length).
Best For
Traders who want a cleaner RSI read without losing responsiveness.
Scalpers timing momentum shifts around the 50 line and MA crosses.
Swing traders using divergences as early reversal context.
Pro Tips
For fast intraday charts, start with Length 14, Smoothing 3–5, and EMA as the RSI-MA.
Use 50 reclaims/rejections as a simple regime filter.
Combine divergence labels with volume surges, key S/R, or volatility tools (e.g., BBW/TTM squeeze) to time entries.
Divergence alerts fire only if Calculate Divergence is enabled—keep it on if you rely on signals.
Chanpreet Moving AveragesChanpreet Moving Averages
by Chanpreet Singh
This script plots up to four customizable moving averages (SMA, EMA, SMMA/RMA, WMA, VWMA).
You can adjust:
Moving average type
Source (close, open, hl2, etc.)
Length
Color
An optional input lets you select a higher or custom timeframe for the moving averages (e.g., daily MA on a 1-hour chart). If left empty, the script calculates them on the current chart timeframe, so the lines scale and move naturally when zooming or panning.
This tool is designed for educational and visualization purposes, helping traders see trend direction and potential areas of dynamic support/resistance.
⚠️ Disclaimer: This script does not provide financial advice or trading signals. Use it at your own risk. Always do your own research before making trading decisions.
Multi-Strategy Trading Screener SummaryI only combined famous scripts, all thanks to wonderful scripts and community out there .
ThankYou !
------
Core Architecture
Multi-Symbol Analysis: Tracks up to 5 configurable tickers simultaneously
Multi-Timeframe Support: Each symbol can use different timeframes
Real-Time Dashboard: Color-coded table displaying all signals and analysis
Trend Validation: All signals include trend alignment confirmation
Integrated Trading Strategies
1. Breaker Blocks (Order Blocks)
Detects institutional order blocks using swing analysis
Tracks when blocks are broken and become "breaker blocks"
Monitors retests of broken levels
Shows trend alignment (✓ aligned, ⚠️ misaligned)
2. Chandelier Exit
ATR-based trend-following exit system
Provides BUY/SELL signals based on dynamic stop levels
Uses configurable ATR multiplier and lookback period
3. Smart Money Breakout
Channel breakout detection with volatility normalization
Identifies accumulation/distribution phases
Generates persistent BUY/SELL signals on breakouts
4. Trendline Breakout
Dynamic trendline detection using pivot highs/lows
Calculates trendline slopes and breakout points
Provides BUY signals on upward breaks, SELL on downward breaks
Dashboard Columns Explained
Symbol: Ticker being analyzed
Trend: Overall SuperTrend direction (🟢 UP / 🔴 DOWN / ⚪ FLAT)
Timeframe: Analysis timeframe with clock icon
Breaker Block: Type (Bullish/Bearish) with trend alignment indicator
Status: Price position relative to breaker block (Inside/Approaching/Far)
Retests: Number of times the broken level was retested (indicates level strength)
Volume: Volume associated with the order block formation
Chandelier: BUY/SELL signals from Chandelier Exit strategy
Smart Money: BUY/SELL signals from breakout detection
Trendline: BUY/SELL signals from trendline breakouts
Key Features
No HOLD States: All signals show definitive BUY (🟢) or SELL (🔴) only
Persistent Signals: Signals remain active until opposite conditions trigger
Color Coding: Visual distinction between bullish (green) and bearish (red) signals
Trend Alignment: Enhanced accuracy through trend confirmation logic
This screener provides a comprehensive view of market conditions across multiple strategies, helping identify high-probability trading opportunities when signals align.
Multi-Timeframe Candle Color Dashboard (ฺBy WutTrader)// This description should be added to the script's information section on TradingView.
//
// === คู่มือการใช้งาน: Multi-Timeframe Candle Color Dashboard ===
//
// **ภาพรวม:**
// อินดิเคเตอร์นี้แสดงสีของแท่งเทียนจากหลายไทม์เฟรม (M1, M5, M15, M30, H1, H4, D1) บนหน้าจอเดียว
// เพื่อช่วยให้คุณเห็นภาพรวมของแนวโน้มในแต่ละช่วงเวลาได้อย่างรวดเร็ว
//
// - **🟢 สีเขียว:** แสดงว่าแท่งเทียนเป็นขาขึ้น (Bullish) ตามจำนวนแท่งที่กำหนด
// - **🔴 สีแดง:** แสดงว่าแท่งเทียนเป็นขาลง (Bearish) ตามจำนวนแท่งที่กำหนด
// - **⚪ สีเทา:** แสดงว่ายังไม่มีทิศทางที่ชัดเจน
//
// **วิธีการใช้งาน:**
// 1. **การดูสัญญาณ:** ใช้ Dashboard เพื่อยืนยันว่าหลายไทม์เฟรมมีแนวโน้มไปในทิศทางเดียวกัน
// - **ตัวอย่าง:** หากคุณกำลังดูชาร์ต M5 แล้วพบว่า M15, M30 และ H1 เป็นสีเขียวทั้งหมด
// แสดงว่ามีแนวโน้มขาขึ้นที่แข็งแกร่งในภาพรวม ซึ่งอาจเป็นจังหวะที่ดีสำหรับการเข้าซื้อ
// 2. **การตั้งค่า:** คุณสามารถปรับแต่งการแสดงผลได้ในเมนู "Settings"
// - **Global Settings:** เลือกเปิด/ปิดการแสดงผลของแต่ละไทม์เฟรมที่คุณต้องการ
// - **Dashboard Style:** เลือกว่าจะให้ Dashboard แสดงผลเป็นแนวตั้ง (Vertical) หรือแนวนอน (Horizontal)
// - **Color Settings:** ปรับสีสำหรับแนวโน้มขาขึ้น (Bullish) และขาลง (Bearish) ได้ตามใจชอบ
//
// **การตั้งค่าการแจ้งเตือน (Alert):**
// อินดิเคเตอร์นี้รองรับการแจ้งเตือนเมื่อทุกไทม์เฟรมที่คุณเปิดใช้งานเป็นสีเขียวทั้งหมด
// 1. ไปที่เมนู "Alert" (รูปกระดิ่ง) ที่ด้านบนของ TradingView
// 2. ตั้งค่า "Condition" เป็นชื่ออินดิเคเตอร์นี้: `Multi-Timeframe Candle Color Dashboard`
// 3. ตั้งค่า "Condition" เป็น `Bullish Alert`
// 4. ตั้งค่า "Frequency" เป็น `Once Per Bar Close`
//
// === User Manual: Multi-Timeframe Candle Color Dashboard ===
//
// **Overview:**
// This indicator displays the candle color from multiple timeframes (M1, M5, M15, M30, H1, H4, D1) on a single screen,
// helping you to quickly see the trend direction across different time periods.
//
// - **🟢 Green:** Indicates that candles are bullish for the specified number of lookback bars.
// - **🔴 Red:** Indicates that candles are bearish for the specified number of lookback bars.
// - **⚪ Gray:** Indicates a neutral or undefined trend.
//
// **How to Use:**
// 1. **Signal Confirmation:** Use the dashboard to confirm that multiple timeframes are moving in the same direction.
// - **Example:** If you are on an M5 chart and see that the M15, M30, and H1 timeframes are all green,
// it suggests a strong overall bullish momentum, which could be a good entry signal.
// 2. **Settings:** You can customize the display in the "Settings" menu.
// - **Global Settings:** Select which timeframes you want to show or hide.
// - **Dashboard Style:** Choose between a vertical or horizontal layout for the dashboard.
// - **Color Settings:** Adjust the colors for bullish and bearish trends to your preference.
//
// **Setting up an Alert:**
// This indicator supports an alert when all enabled timeframes turn completely green.
// 1. Go to the "Alert" menu (bell icon) at the top of TradingView.
// 2. Set the "Condition" to the name of this indicator: `Multi-Timeframe Candle Color Dashboard`.
// 3. Set the "Condition" to `Bullish Alert`.
// 4. Set the "Frequency" to `Once Per Bar Close`.
Signal Generator: HTF EMA Momentum + MACDSignal Generator: HTF EMA Momentum + MACD
What this script does
This indicator combines a higher-timeframe EMA trend filter with a MACD crossover on the chart’s timeframe. The goal is to make MACD signals more selective by checking whether they occur in the same direction as the broader trend.
How it works
- On the higher timeframe, two EMAs are calculated (short and long). Their difference is used as a simple momentum measure.
- On the chart timeframe, the MACD is calculated. Crossovers are then filtered with two conditions:
1.They must align with the higher-timeframe EMA trend.
2.They must occur beyond a small “zero band” threshold, with a minimum distance between MACD and signal lines.
- When both conditions are met, the script can plot BUY or SELL labels. ATR is used only to shift labels up or down for visibility.
Visuals and alerts
- Histogram bars show whether higher-timeframe EMA momentum is rising or falling.
- MACD main and signal lines are plotted with optional scaling.
- Dotted lines show the zero band region.
- Optional large BUY/SELL labels appear when conditions are confirmed on the previous bar.
- Alerts can be enabled for these signals; they trigger once per bar close.
Notes and limitations
- Higher-timeframe values are only confirmed once the higher-timeframe candle has closed.
- Scaling factors affect appearance only, not the logic.
- This is an open-source study intended as a learning and charting tool. It does not provide financial advice or guarantee performance.
Market Bias [Mario]Indicator Description: Market Bias
Core Objective and Philosophy
The Market Bias indicator is designed not as a simple signal generator, but as a comprehensive tool for trend analysis and directional bias assessment. Its primary purpose is to provide traders with a clear, at-a-glance understanding of the market's direction across multiple timeframes. By visualizing the alignment of trends, it helps traders make more informed decisions, ensuring they are trading in harmony with the broader market momentum rather than against it. This is a tool for strategic positioning, not for providing blind buy or sell commands.
How It Works: The Core Mechanic
The indicator's logic is based on the relationship between two configurable moving averages (MAs): a Fast MA (defaulting to a 9-period EMA) and a Slow MA (defaulting to a 21-period SMA). The market bias on any given timeframe is determined as follows:
Bullish Bias: When the Fast MA is trading above the Slow MA, it indicates positive, upward momentum.
Bearish Bias: When the Fast MA is trading below the Slow MA, it indicates negative, downward momentum.
Users have full control to customize the type (SMA, EMA, WMA, etc.) and length of each moving average to fit their specific trading style and the asset being analyzed.
Key Feature: The Higher Timeframe (HTF) Bias Table
This is the most powerful feature of the indicator and its main reason for existence. It displays a simple, color-coded table in the corner of the chart, showing the real-time bias for the Daily (D), 4-Hour (4H), and 1-Hour (1H) timeframes.
Purpose: The HTF table solves a critical problem for traders: losing sight of the bigger picture. A trader on a 15-minute chart might see a setup to go long, but if the 4H and Daily charts are strongly bearish, that trade is fighting a powerful current and has a lower probability of success.
Application: By checking this table, a trader can instantly verify if their intended trade direction is aligned with the higher timeframe trends. The ideal scenario is "confluence," where the bias is the same across all key timeframes (e.g., D, 4H, and 1H are all Bullish), giving the trader a strong conviction to only look for long entries.
On-Chart Visual Aids
To support the analysis on the current chart, the indicator provides several visual aids:
Moving Average Plots: Both the Fast and Slow MAs are drawn directly on the chart, allowing traders to see their interaction with price in real-time.
Color-Coded Bars: To make the current trend immediately obvious, the chart's price bars can be colored. Green bars signify a bullish bias (Fast > Slow), while red bars signify a bearish bias (Fast < Slow).
Crossover Markers (Optional): While the indicator is not a signal provider, it can optionally display "Buy" (up arrow) and "Sell" (down arrow) markers when the MAs cross. These should not be interpreted as direct trade signals. Instead, they serve as alerts that the market momentum may be shifting on the current timeframe. They are best used as points of interest or for confirming a thesis that is already supported by the HTF bias.
Summary
In essence, the Market Bias indicator is a decision-support tool. It encourages a disciplined, top-down approach to trading.
Use the HTF Table first to establish your strategic directional bias for the day or week.
Use the on-chart MAs and colored bars to analyze the trend on your preferred trading timeframe.
Use the optional crossover markers only as a final confirmation or timing tool, ensuring they align with the dominant bias established by the higher timeframes.
Multi-Timeframe Candle Color Dashboard (Closed Bars Only) V.2Pine Script
// This description should be added to the script's information section on TradingView.
//
// === คู่มือการใช้งาน: Multi-Timeframe Candle Color Dashboard ===
//
// **ภาพรวม:**
// อินดิเคเตอร์นี้แสดงสีของแท่งเทียนจากหลายไทม์เฟรม (M1, M5, M15, M30, H1, H4, D1) บนหน้าจอเดียว
// เพื่อช่วยให้คุณเห็นภาพรวมของแนวโน้มในแต่ละช่วงเวลาได้อย่างรวดเร็ว
//
// - **🟢 สีเขียว:** แสดงว่าแท่งเทียนเป็นขาขึ้น (Bullish) ตามจำนวนแท่งที่กำหนด
// - **🔴 สีแดง:** แสดงว่าแท่งเทียนเป็นขาลง (Bearish) ตามจำนวนแท่งที่กำหนด
// - **⚪ สีเทา:** แสดงว่ายังไม่มีทิศทางที่ชัดเจน
//
// **วิธีการใช้งาน:**
// 1. **การดูสัญญาณ:** ใช้ Dashboard เพื่อยืนยันว่าหลายไทม์เฟรมมีแนวโน้มไปในทิศทางเดียวกัน
// - **ตัวอย่าง:** หากคุณกำลังดูชาร์ต M5 แล้วพบว่า M15, M30 และ H1 เป็นสีเขียวทั้งหมด
// แสดงว่ามีแนวโน้มขาขึ้นที่แข็งแกร่งในภาพรวม ซึ่งอาจเป็นจังหวะที่ดีสำหรับการเข้าซื้อ
// 2. **การตั้งค่า:** คุณสามารถปรับแต่งการแสดงผลได้ในเมนู "Settings"
// - **Global Settings:** เลือกเปิด/ปิดการแสดงผลของแต่ละไทม์เฟรมที่คุณต้องการ
// - **Dashboard Style:** เลือกว่าจะให้ Dashboard แสดงผลเป็นแนวตั้ง (Vertical) หรือแนวนอน (Horizontal)
// - **Color Settings:** ปรับสีสำหรับแนวโน้มขาขึ้น (Bullish) และขาลง (Bearish) ได้ตามใจชอบ
//
// **การตั้งค่าการแจ้งเตือน (Alert):**
// อินดิเคเตอร์นี้รองรับการแจ้งเตือนเมื่อทุกไทม์เฟรมที่คุณเปิดใช้งานเป็นสีเขียวทั้งหมด
// 1. ไปที่เมนู "Alert" (รูปกระดิ่ง) ที่ด้านบนของ TradingView
// 2. ตั้งค่า "Condition" เป็นชื่ออินดิเคเตอร์นี้: `Multi-Timeframe Candle Color Dashboard`
// 3. ตั้งค่า "Condition" เป็น `Bullish Alert`
// 4. ตั้งค่า "Frequency" เป็น `Once Per Bar Close`
//
// === User Manual: Multi-Timeframe Candle Color Dashboard ===
//
// **Overview:**
// This indicator displays the candle color from multiple timeframes (M1, M5, M15, M30, H1, H4, D1) on a single screen,
// helping you to quickly see the trend direction across different time periods.
//
// - **🟢 Green:** Indicates that candles are bullish for the specified number of lookback bars.
// - **🔴 Red:** Indicates that candles are bearish for the specified number of lookback bars.
// - **⚪ Gray:** Indicates a neutral or undefined trend.
//
// **How to Use:**
// 1. **Signal Confirmation:** Use the dashboard to confirm that multiple timeframes are moving in the same direction.
// - **Example:** If you are on an M5 chart and see that the M15, M30, and H1 timeframes are all green,
// it suggests a strong overall bullish momentum, which could be a good entry signal.
// 2. **Settings:** You can customize the display in the "Settings" menu.
// - **Global Settings:** Select which timeframes you want to show or hide.
// - **Dashboard Style:** Choose between a vertical or horizontal layout for the dashboard.
// - **Color Settings:** Adjust the colors for bullish and bearish trends to your preference.
//
// **Setting up an Alert:**
// This indicator supports an alert when all enabled timeframes turn completely green.
// 1. Go to the "Alert" menu (bell icon) at the top of TradingView.
// 2. Set the "Condition" to the name of this indicator: `Multi-Timeframe Candle Color Dashboard`.
// 3. Set the "Condition" to `Bullish Alert`.
// 4. Set the "Frequency" to `Once Per Bar Close`.
Levels, EMS, Volume etc.This is a comprehensive trading indicator that combines three main analysis tools:
EMA System — a set of 12 exponential moving averages with color trend indication.
Consolidation — detects and highlights price accumulation zones with breakout alerts.
S/R Levels — identifies key support and resistance levels across different timeframes, shows their strength, and displays them in a table.
Additionally, it includes a volume histogram and a notification system for important chart events. All these features help traders analyze trends and identify potential entry and exit points.
Это комплексный торговый индикатор, который объединяет три основных инструмента анализа:
EMA-система — набор из 12 экспоненциальных скользящих средних с цветовой индикацией тренда.
Консолидация — определяет и выделяет зоны накопления цены с оповещениями о пробоях.
Уровни S/R — находит ключевые уровни поддержки и сопротивления на разных таймфреймах, показывает их силу и выводит в таблицу.
Дополнительно включает гистограмму объёмов и систему уведомлений о важных событиях на графике. Всё это помогает трейдерам анализировать тренды, определять потенциальные точки входа и выхода.
Financials - Quick OverviewDisplays key quarterly financial metrics including EPS, Sales, P/E ratio, and Return on Equity (RoE) in a compact, easy-to-read table directly on the chart. Perfect for quick fundamental analysis and trend tracking.
TRI - Multi-Timeframe BIASTRI - MULTI-TIMEFRAME BIAS INDICATOR
DESCRIPTION:
Advanced multi-timeframe bias indicator that analyzes market sentiment across
5 different timeframes (15m, 1h, 4h, 1d, 1w) using adaptive technical analysis.
Provides clear directional bias signals to help determine market momentum.
KEY FEATURES:
ADAPTIVE PARAMETERS: Uses different EMA lengths and weights for each timeframe
EMA TREND ANALYSIS: Fast/slow EMA crossovers with slope analysis for momentum
RSI MOMENTUM: Adaptive overbought/oversold levels based on timeframe
ADX STRENGTH: Directional movement confirmation with DI+/DI- analysis
COMPOSITE SCORING: Weighted combination of trend, momentum, and strength
TIMEFRAME ANALYSIS:
15m: EMA9/21 + High momentum weight (45%) - Ultra-responsive for scalping
1h: EMA21/50 + Medium momentum weight (35%) - Balanced for day trading
4h: EMA50/200 + Lower momentum weight (25%) - Swing trading focus
1d: EMA50/200 + Trend focused (55%) - Position trading signals
1w: EMA50/200 + Maximum trend weight (60%) - Long-term bias
BIAS SIGNALS:
STRONG BULLISH/BEARISH: Score ≥ 0.5 - Very strong directional momentum
BULLISH/BEARISH: Score ≥ 0.25 - Clear directional signals
WEAK BULLISH/BEARISH: Score ≥ 0.1 - Mild directional bias
NEUTRAL: Score < 0.1 - No clear directional preference
ALERTS:
Major Bullish/Bearish: When 4H and 1D timeframes align
High confidence signals for strategic decision making
USAGE:
Higher timeframes (1d, 1w) show primary market direction
Lower timeframes (15m, 1h) provide entry timing
Look for alignment across multiple timeframes for stronger signals
Use confidence levels to assess signal reliability
TECHNICAL COMPONENTS:
Exponential Moving Averages (EMA) for responsive trend detection
Relative Strength Index (RSI) for momentum analysis
Average Directional Index (ADX) with DI+/DI- for trend strength
Volume ratio confirmation for signal validation
Adaptive thresholds optimized for each timeframe's characteristics
Weekly Session DividerThis indicator plots vertical divider lines at the start of each new weekly trading session (Sunday 8 PM ET / Monday 00:00 UTC in crypto).
It helps traders quickly spot the opening point of every weekly candle when viewing intraday charts.
Features:
Automatically detects the start of a new week using TradingView’s weekly time stamps.
Customizable line color, width, and style (solid, dashed, dotted).
Only displays on intraday timeframes to keep higher-timeframe charts clean.
Extends divider lines above and below the current chart for easy visibility.
Use case:
Great for crypto and futures traders who want to align intraday trading setups with higher-timeframe weekly opens, track session-to-session structure, or mark where the market’s new weekly trend may begin.
PIPSTA - MAGICPIPSTA-MAGIC 🪄: Complete Trading Framework for Market Precision
PIPSTA-MAGIC 🪄 is a premium all-in-one trading system designed for traders who demand a structured, multi-dimensional approach to the markets. Built with advanced volatility modeling, settlement-based price tracking, trend filters, and layered trade execution logic, MAGIC empowers traders to stay aligned with institutional flows while managing risk with clarity.
This system blends statistical volatility tools, settlement pivots, trend confirmation, and smart entry/exit mechanics into a single, easy-to-read framework. Whether you are day trading futures, swing trading forex, or analyzing equities, PIPSTA-MAGIC helps you filter noise, detect high-probability setups, and manage trades with precision.
🔑 Key Features
1. Info Panel & Trade Dashboard
On-chart Info Panel displays system name and core parameters.
Integrated P/L Table automatically tracks Entry, Stop Loss, Targets, and Live Position Metrics.
Fully customizable panel size and position (top, bottom, center, left, right).
2. Settlement & Volatility Framework
Daily Settlement Levels act as institutional reference anchors.
Standard Deviation Bands (±0.5, ±0.7, ±1.0 SD) auto-calculated from annualized volatility.
Real-time recalculation on new sessions ensures accurate market positioning.
Labels and dynamic plotting highlight volatility thresholds for intraday and swing trading.
3. Trade Setup Engine
Configurable Trade Buffer for precise entries.
Multi-target system with up to 3 profit-taking levels and stop-loss control.
Entry, target, and stop lines plotted directly on chart for visual clarity.
Auto-updating trade table with RR and live P/L.
4. VWAP Integration
Supports Daily, Weekly, and Monthly VWAP.
VWAP dynamically color-coded (bullish/bearish bias).
Filters out weak trades by ensuring entries align with institutional average pricing.
5. Trend & Moving Average Filters
Up to 3 customizable MAs (SMA, EMA, SMMA, WMA, VWMA) with dynamic color shifts.
EMA ribbon (6 layers) for deeper trend strength confirmation.
Bullish Trend: when all MAs stack above baseline.
Bearish Trend: when all MAs stack below baseline.
6. Smart Trade Conditions
Multi-factor entry confirmation:
RSI momentum crossover (fast vs. slow).
Price Volume Trend (PVT) confirmation.
Supertrend-style directional filter with dynamic ATR stops.
Close vs. Settlement alignment for institutional confirmation.
Long/Short triggers only fire when all conditions align, reducing false signals.
7. Risk & Volatility Control
Auto-calculates annualized historical volatility (HV).
Adjusts trade targets and risk buffers based on time-to-expiry or intraday volatility.
Ensures stops/targets scale with market conditions, not fixed pip/tick values.
🎯 How Traders Can Use It
Institutional Anchors → Use Settlement + VWAP + Volatility bands as key decision zones.
Trend Bias → Confirm direction with EMA/MAs and color-coded trend stack.
Trade Setup → Wait for RSI + PVT + directional filter alignment.
Execution & Management → Follow plotted Entry/SL/Targets, track progress in the live table.
Scalability → Works seamlessly across Forex, Futures, Commodities, and Indices.
👤 Best Suited For
Day traders seeking volatility-based setups with strong trade management.
Swing traders who rely on settlement anchors & volatility scaling.
Systematic traders who want structured, rules-based execution.
Advanced traders looking to merge price action with statistical volatility.
⚡ Why PIPSTA-MAGIC?
Unlike typical indicators that focus on a single tool (MA, RSI, or VWAP), PIPSTA-MAGIC 🪄 combines volatility science, institutional reference points, and multi-layer trade confirmation into one robust system. This creates a holistic trading framework that adapts across assets and timeframes while giving traders professional-grade execution clarity.
📌 In short:
PIPSTA-MAGIC is your institutional-grade, volatility-aware, and risk-managed trade execution system — helping you trade like a professional with clear rules, adaptive levels, and disciplined management.