Filter Ribbon1. Indicator Name
Filter Ribbon
2. One-line Introduction
A trend visualization ribbon that uses linear regression and directional scoring to highlight bullish and bearish strength with intuitive color gradients.
3. General Overview
Filter Ribbon is a minimalistic yet powerful trend visualization tool that leverages linear regression slope ordering to determine directional momentum. It analyzes the ordering of regression values over a defined lookback period and quantifies how consistently the price has been trending upward or downward.
Using a pairwise comparison system, it calculates a trend "score" and compares this to a configurable threshold to determine if a bullish, bearish, or neutral condition exists.
The result is a color-coded ribbon that sits over the chart, changing hue and opacity based on both the direction and strength of the trend. The stronger the directional alignment, the more opaque the ribbon becomes, offering traders a fast, intuitive way to assess market sentiment at a glance.
It also includes an optional linear regression line to further help visualize the central trend.
This indicator is best used in trend-following systems or as a dynamic background layer when combined with signal-based strategies.
Thanks to its efficient design and protected logic, Filter Ribbon offers high-performance visualization without compromising strategy integrity.
4. Key Advantages
🌈 Visual Trend Heatmap
Dynamic color ribbon gives real-time visual feedback on both trend direction and strength.
🔢 Quantified Trend Scoring
Calculates a mathematically sound trend score using pairwise linear regression comparisons.
⚖️ Adjustable Sensitivity
Users can tune lookback and threshold parameters to fit different asset classes and timeframes.
📉 Smooth Ribbon Effect
Plots upper/lower bands around regression line with smooth filling for a professional chart look.
🎯 Precise Trend Confirmation
Acts as a confidence layer for other entry/exit signals by confirming broader trend bias.
🔒 Secure and Minimal Codebase
Core logic is embedded securely with minimal exposure, reducing risk of replication or misuse.
📘 Indicator User Guide
📌 Basic Concept
Filter Ribbon determines trend direction and intensity by comparing the order of linear regression values over time.
It forms a ribbon on the chart that changes color based on trend direction and opacity based on trend strength.
This makes it ideal for identifying clear trending periods vs. uncertain consolidations.
⚙️ Settings Explained
Lookback Period: Number of bars for scoring the trend direction (higher = smoother trend)
Range Tolerance (%): Determines how aggressive the trend classification is (lower = stricter)
Regression Length: Period for calculating the base linear regression line
Ribbon Colors: Customize colors for bullish and bearish conditions
📈 Bullish Timing Example
Ribbon color is green and becomes increasingly opaque
Regression line slopes upward and price remains above it
Can be used as trend confirmation for long trades
📉 Bearish Timing Example
Ribbon color is red with higher opacity
Price consistently below the regression line
Useful for confirming short trade setups or avoiding long entries
🧪 Recommended Use Cases
Combine with breakout indicators to validate if the breakout aligns with broader trend
Use in swing or trend-following strategies as a background filter
Helps filter out trades during unclear, sideways market conditions
🔒 Precautions
Not a signal generator on its own — meant for trend context only
Ribbon may lag slightly during sudden trend reversals; best used with reactive entry tools
Always test ribbon parameters on your specific market/timeframe before applying live
Avoid using solely in low-volatility or flat markets — sensitivity may require tuning
+++
ממוצעים נעים
Triple EMA/SMA + crossoverA powerful 3-in-1 Moving Average system — clean, customizable, and built for real-time clarity.
This indicator combines three fully customizable moving averages into a single tool, giving you a complete view of trend behavior, momentum strength, and market structure — all in one compact and intuitive display.
Whether you prefer EMA or SMA, this script lets you switch seamlessly and adapt instantly to any trading style.
⸻
✅ Key Features
🔹 Three Moving Averages, One Indicator
Instead of cluttering your chart with multiple separate MAs, this script intelligently groups:
• MA1
• MA2
• MA3
…into a single, elegant indicator with unified settings and consistent visuals.
Each MA has its own:
• Length
• Rising/Falling/Flat dynamic color system
• Customizable colors
• Trend-based logic
This makes your chart cleaner, faster to read, and much more powerful.
⸻
🔹 Select Your MA Type
Switch all three MAs at once:
• EMA
• SMA
Perfect for testing different interpretations of trend behavior.
⸻
🔹 Advanced Trend Coloring
Each MA automatically adapts its color based on whether it is:
• Rising (uptrend)
• Falling (downtrend)
• Flat (consolidation / low momentum)
You decide the colors for each state — and for each MA individually.
⸻
🔹 MA Crossover Bar Highlights
When MA1 crosses MA2, the script highlights the exact bar with:
• White for bullish crossovers
• Purple for bearish crossovers
This makes trend shifts and potential reversals instantly visible, directly on price bars.
⸻
🔹 Source Flexibility
All three MAs can use any source series:
• Close, Open, HL2, HLC3, OHLC4, etc.
• Or any other series available on your chart
This gives you much more flexibility than standard MA indicators.
⸻
🔹 Beautiful, Clean & Fully Customizable
Every color — rising, falling, flat, crossover — can be changed.
All plots are clearly named (MA1, MA2, MA3) for easier control in the Style panel.
This script brings together:
• clarity
• flexibility
• and clean design
…into a compact, professional-grade indicator.
⸻
🎯 Why this Indicator Helps
You get the full power of three trend tools at once — but without the chart clutter.
Use it to:
• Spot early trend reversals
• Track short/mid/long-term structure simultaneously
• Identify momentum shifts in real time
• Visualize crossovers instantly
• Keep your chart clean and readable
It’s ideal for scalpers, day traders, swing traders, and anyone who wants a powerful yet simple way to read market conditions.
⸻
⚠️ Disclaimer
This script is for educational purposes only and does not constitute financial advice. Always do your own research before trading.
⸻
EMA Position AlertDescription
EMA Position Alert is a comprehensive trend analysis tool designed to help traders instantly identify the market's direction and strength relative to key Exponential Moving Averages (EMAs). By combining visual trend lines with a real-time data dashboard, this indicator provides a clear snapshot of the current price action across short, medium, and long-term horizons.
Whether you are a scalper looking for short-term momentum or a swing trader identifying major trend reversals, this tool simplifies the complex relationship between price and moving averages.
Key Features
1. Multi-EMA System The indicator plots four essential EMAs commonly used by institutional and retail traders:
EMA 21: Short-term trend/momentum.
EMA 55: Medium-term trend.
EMA 100: Major support/resistance level.
EMA 200: Long-term trend filter.
Visual Aid: The EMA lines change transparency automatically. They appear brighter/solid when the price is above them (bullish) and more transparent/faded when the price is below them (bearish).
2. Real-Time Information Dashboard A customizable table (displayed in the top-right corner) provides live data for the current bar:
Status: Clearly indicates if the price is "Above ▲" (Bullish) or "Below ▼" (Bearish) for each specific EMA.
Distance (%): Calculates the percentage distance between the current closing price and each EMA. This is crucial for identifying overextended moves (mean reversion opportunities) or tight consolidation.
Overall Trend Summary:
Strong ★★: Price is above all EMAs (21, 55, 100, 200).
Building ★: Price is above the long-term EMAs (55, 100, 200) but may be testing the short-term trend.
Weak ▼: Price is below all EMAs.
Ranging: Mixed signals (price is sandwiched between EMAs).
3. Custom Alerts Never miss a move. The script comes with built-in alert conditions compatible with TradingView's alert system:
Breakout Alerts: Trigger an alert when price crosses above specific EMAs (21, 55, 100, or 200).
Strong Trend Alert: Trigger an alert when the price successfully holds above all EMAs, signaling a strong bullish phase.
Settings
Show Status Table: Toggle the dashboard on or off.
Table Transparency: Adjust the background opacity of the dashboard to fit your chart theme.
Line Width: Adjust the thickness of the EMA lines for better visibility.
How to Use
Trend Following: Look for the "Strong ★★" status in the dashboard. When the price is above all EMAs and the EMAs are fanning out, it indicates a strong uptrend.
Pullbacks: If the trend is "Strong" but the price drops to test the EMA 21 or EMA 55, look for support bounces.
Mean Reversion: Watch the Distance %. If the distance becomes historically large, the price may be overextended and due for a correction back to the mean.
Consolidation: When the status shows "Ranging" and the Distance % is very low (near 0.00%), a breakout move is likely imminent.
Triple 9 Bias filter Triple 9 Bias – Precision Multi-Timeframe Directional Filter
Technical Overview
The Triple 9 Bias is a precision multi-timeframe directional filter built exclusively for 5-minute (and lower) trading.
It stacks three EMA-9 trend directions (4H + 1H + 15m) as Primary confluence and uses only the 4H RSI-14 as Secondary confirmation.
Integrity Check: Zero repaint · Zero lookahead · Works identically on any chart timeframe.
The Trading Rule (Simple)
Long Trades: Only trade longs when all three EMA-9s are UP + 4H RSI > 50
Short Trades: Only trade shorts when all three EMA-9s are DOWN + 4H RSI < 50
Otherwise — stand aside.
Display Components
A. Plotted Higher-Timeframe EMAs (No Repainting)
All values are pulled from closed higher-timeframe bars.
4H EMA 9 (Red step-line)
1H EMA 9 (Purple step-line)
15m EMA 9 (Orange step-line)
B. Locked Dashboard (Bottom-Right)
Clean table split into Primary and Secondary sections for instant bias reading.
Colour Logic:
🟢 Lime = UP / BUY
🔴 Red = DOWN / SELL
Background Logic:
Full Green: Only when all three EMA-9s are UP
Full Red: Only when all three EMA-9s are DOWN
Gray: Otherwise = no trade
Indicator Breakdown
3.1. Primary Confluence – EMA 9 Slope
4H EMA 9 direction (compared 10 bars back)
1H EMA 9 direction (compared 6 bars back)
15m EMA 9 direction (compared 6 bars back)
3.2. Secondary Confluence
4H RSI-14 vs 50 level (BUY if >50, SELL if <50)
High-Probability Signal: When Primary = all three “UP” and Secondary = “BUY” → highest-probability bullish bias (and vice-versa for bearish).
MACD Divergence auto displayed on chart, with alertsMACD Pivot Divergence Detector
This tool identifies MACD histogram divergences based on confirmed pivot highs and lows.
Instead of comparing swing points on the MACD line, this script focuses specifically on the histogram, which measures momentum shifts between MACD and Signal.
How it works
The script detects confirmed pivots using a two-bar swing structure.
When price breaks above a previous pivot high, the script compares the MACD histogram value at that pivot to the current histogram value:
• If price makes a higher high while the histogram makes a lower high, a potential bearish divergence is marked.
The reverse logic is applied for bullish divergence when price breaks below a pivot low.
What makes this script unique
It uses pivot-confirmed histogram values, not lookback-based divergence.
It evaluates divergence only at actual highs/lows, reducing false positives.
It marks divergence directly on the candles for visual clarity.
Alert conditions are included for automated detection.
How to use
Bullish signals may highlight potential momentum loss in downtrends; bearish signals may highlight momentum loss near highs. Divergence does not guarantee reversal and should be combined with broader context, structure, or trend analysis.
Price Action - EMA ClusterAligned with Al Brooks' multi-timeframe analysis in his series, this plots three EMA20 lines on 5m charts: current (line), 15m (stepline), and 60m (stepline). Visible only on 5m timeframe for clarity. EMAs act as dynamic trend channels—price above signals bull bias, below bear. Test extremes: Pullbacks to EMA often offer second-leg entries in trends. Customize colors for better visualization of always-in direction.
EP CPR Future CPR + 4 MA
1. CPR Trend Direction(Bias):
Bullish: If the current day's price is trading above the TC, it suggests a strong bullish trend where the CPR acts as a support zone.
Bearish: If the current day's price is trading below the BC, it suggests a strong bearish trend where the CPR acts as a resistance zone.
Range-Bound/Consolidation: If the price is trading within the CPR lines, it indicates a lack of clear directional bias and suggests a likely sideways or accumulation phase.
2. Moving average Trend Identification
Uptrend: If the price is above a moving average (and the MA line is sloping up), it confirms a bullish trend.
Downtrend: If the price is below a moving average (and the MA line is sloping down), it confirms a bearish trend.
Crossovers (Trading Signals)
A popular strategy involves using two moving averages—a short-term MA (e.g., 50-period) and a long-term MA (e.g., 200-period).
Golden Cross (Bullish Signal): Occurs when the shorter-term MA crosses above the longer-term MA.
Death Cross (Bearish Signal): Occurs when the shorter-term MA crosses below the longer-term MA.
Strict Weekly 50/200 WMA Signals True Weekly Only-Strict Weekly 50/200 WMA Signals True Weekly Only => also on other time frames than weekly (like daily, etc.) always indicates the indicators based on the weekly chart
-especially useful for Crypto
-gives buy and sell signals when the 200 WMA or the 50 WMA are crossed
-typically above the 50 WMA indicates a bull market
-reaching below the 200 WMA indicates a bear market and typically for investors with a longer time frame (>2-4 years) a good entry point
Naveen Prabhu with EMA//@version=6
indicator('Naveen Prabhu with EMA', overlay = true, max_labels_count = 500, max_lines_count = 500, max_boxes_count = 500)
a = input(2, title = 'Key Vaule. \'This changes the sensitivity\'')
c = input(5, title = 'ATR Period')
h = input(false, title = 'Signals from Heikin Ashi Candles')
BULLISH_LEG = 1
BEARISH_LEG = 0
BULLISH = +1
BEARISH = -1
GREEN = #089981
RED = #F23645
BLUE = #2157f3
GRAY = #878b94
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( false, '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( false, '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( false, '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( true, '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(GREEN, 80), 'Internal Bullish OB', group = BLOCKS_GROUP)
internalBearishOrderBlockColor = input.color(color.new(#f77c80, 80), 'Internal Bearish OB', group = BLOCKS_GROUP)
swingBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Bullish OB', group = BLOCKS_GROUP)
swingBearishOrderBlockColor = input.color(color.new(#b22833, 80), 'Bearish OB', group = BLOCKS_GROUP)
showEqualHighsLowsInput = input( false, '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)
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 trailingExtremes
float top
float bottom
int barTime
int barIndex
int lastTopTime
int lastBottomTime
type fairValueGap
float top
float bottom
int bias
box topBox
box bottomBox
type trend
int bias
type equalDisplay
line l_ine = na
label l_abel = na
type pivot
float currentLevel
float lastLevel
bool crossed
int barTime = time
int barIndex = bar_index
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)
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
startOfNewLeg(int leg) => ta.change(leg) != 0
startOfBearishLeg(int leg) => ta.change(leg) == -1
startOfBullishLeg(int leg) => ta.change(leg) == +1
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)))
getStyle(string style) =>
switch style
SOLID => line.style_solid
DASHED => line.style_dashed
DOTTED => line.style_dotted
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))
higherTimeframe(string timeframe) => timeframe.in_seconds() > timeframe.in_seconds(timeframe)
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
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')
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)
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)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = barmerge.lookahead_off) : close
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop , 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? math.min(nz(xATRTrailingStop ), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? math.max(nz(xATRTrailingStop ), src - nLoss) : iff_2
pos = 0
iff_3 = src > nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? -1 : nz(pos , 0)
pos := src < nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
//---------------------------------------------------------------------------------------------------------------------}
//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')
alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')
plotshape(buy, title = 'Buy', text = 'Buy', style = shape.labelup, location = location.belowbar, color = color.new(color.green, 0), textcolor = color.new(color.white, 0), size = size.tiny)
plotshape(sell, title = 'Sell', text = 'Sell', style = shape.labeldown, location = location.abovebar, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), size = size.tiny)
//--------------------------------------------------------------------------------------
// EMA ADDITIONS (Editable)
//--------------------------------------------------------------------------------------
ema5Len = input.int(5, "5 EMA Length", minval = 1)
ema9Len = input.int(9, "9 EMA Length", minval = 1)
ema5 = ta.ema(src, ema5Len)
ema9 = ta.ema(src, ema9Len)
plot(ema5, "EMA 5", color = color.red, linewidth = 2)
plot(ema9, "EMA 9", color = color.blue, linewidth = 2)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
BTC GOD — DEFINITIVE BTC MULTI INDICATORBTC GOD — The Ultimate Bitcoin Cycle Indicator (2025 Edition)
The one indicator every serious BTC holder and trader has been waiting for.
A single script that perfectly combines the 5 most powerful and accurate Bitcoin indicators ever created — all 100 % official versions:
- Official Pi Cycle Top (LookIntoBitcoin) → in 2013, 2017 & 2021 (3/3 hits)
- Official MVRV Z-Score (Glassnode / LookIntoBitcoin) → every major bottom (2015, 2018–19, 2022)
- Dynamic Bull/Bear background (red bear-market when price drops X % from cycle ATH + monthly RSI filter)
- Monthly Golden/Death Cross (50-month EMA vs 200-week EMA) → huge, unmistakable signals
- SuperTrend + 200-week EMA + 50-month EMA
- Cycle ATH/ATL tracking with flashing alert in the table when new highs/lows are made
- Exact days to/from the next halving + optimal accumulation zone (200–750 days post-halving)
- Fully customizable inputs for experienced traders
Zero repainting. Zero errors. Works on every timeframe.
This is the indicator used by people who truly understand Bitcoin’s 4-year cycles.
If you could only keep ONE Bitcoin indicator for the rest of your life… this would be it.
Save it, test it, and you’ll instantly see why it’s called BTC GOD.
Built with love and obsession for Bitcoin cycles.
Last update: November 2025
13 / 26 / 52 SMA Overlay13 / 26 / 52 SMA Overlay showing how short term is performing relative to long term.
Sequential MACD 0.5+ & MA Cloud StrategyThis indicator provides sequential buy and sell signals based on a robust set of trend-following and momentum conditions:
Buy Signal Logic:
Momentum: Both the MACD line and the Signal line are above the 0.5 threshold, indicating strong bullish momentum.
Crossover: A bullish MACD crossover (MACD above Signal line) has occurred near the zero line, suggesting the start of a new, healthy momentum wave.
Trend Filter (4H TF): The current price must be above the 21 and 50 EMAs on the 4-hour timeframe.
Price Action: The current candle must be green (closing higher than open).
Sequential Logic: A buy signal is only generated if a position is not already active.
Sell Signal Logic:
Momentum Reversal: MACD line is below the Signal line (negative histogram).
Price Action: The current candle must be red.
MA Cloud: The price is below the 9 and 21 EMA Cloud.
Sequential Logic: A sell signal is only generated if a buy signal was previously active.
This comprehensive filter system aims to capture strong, confirmed moves while avoiding noisy signals against higher-timeframe trends.
EMA & MA Alert Strategies8 Trading Strategies for Alerts:
Strategy 1: EMA Golden Cross / Death Cross
EMA1 crosses above EMA2 → bullish momentum
EMA1 crosses below EMA2 → bearish momentum
Stronger: EMA1 crosses EMA3
Strategy 2: MA Golden Cross / Death Cross
MA1 crosses above MA2 → trend reversal up
MA1 crosses below MA2 → trend reversal down
Strategy 3: EMA Alignment (Trend Direction)
Bullish: EMA1 > EMA2 > EMA3 (uptrend)
Bearish: EMA1 < EMA2 < EMA3 (downtrend)
Alerts when alignment changes
Strategy 4: Price vs EMA (Support/Resistance)
Price breaks above EMA2/EMA3 → bullish breakout
Price breaks below EMA2/EMA3 → bearish breakdown
Strategy 5: EMA vs MA Crossover
EMA1 crosses above MA1 → momentum exceeds trend
EMA2 crosses above MA2 → stronger momentum signal
Strategy 6: Pullback to EMA (Buy the Dip)
Price pulls back to EMA2/EMA3 and bounces → buy signal
Useful for entry during uptrends
Strategy 7: EMA Squeeze/Expansion
EMAs converging → potential breakout
EMAs expanding → trend acceleration
Strategy 8: Multi-Timeframe Confirmation
Price above all EMAs and MAs → strong uptrend
Price below all EMAs and MAs → strong downtrend
EMA 5-13-21-34-55-89-144-233Fibo sayıları olan 5-13-21-34-55-89 -144-233 dan oluşan EMA'ları göstermek için hazırlanmıştır.
Z-Fusion Oscillator | Lyro RSThe Z-Fusion Oscillator converts five momentum indicators into Z-scores and blends them into one normalized signal that adapts across markets.
By combining normalization, smoothing, and divergence detection, users can easily identify when momentum is accelerating, weakening, reversing, or entering extreme zones
🔶 USAGE
The Z-Fusion Oscillator is designed to give traders a unified reading of market momentum—removing the noise of comparing tools that normally run on different scales.
By transforming RSI, MACD histogram, Stochastic, Momentum, and Rate of Change into Z-scores, this tool standardizes all inputs, making trend strength and shifts easier to interpret.
A dual-line system (fast Z-fusion line + slower baseline) highlights turning points, while overbought/oversold bands and “X-marks” help traders spot exhaustion and potential reversals.
🔹 Unified Momentum Structure
The indicator’s core strength comes from combining five Z-scored signals into one average.
Which makes momentum behavior more consistent across assets, reduces false extremes, and highlights true shifts in trend conviction.
🔹 Divergence Detection
The tool includes fully integrated divergence detection:
Regular Bullish Divergence: Price makes a lower low while Z-Fusion forms a higher low.
Regular Bearish Divergence: Price makes a higher high while Z-Fusion forms a lower high
Bullish and bearish divergences are marked directly on the oscillator with labels and colored pivot connections, making hidden momentum shifts obvious.
🔹 Visual Extremes
Two sets of upper and lower Z-score thresholds help identify:
Extreme overbought surges
Extreme oversold drops
Reversal zones
Potential exhaustion conditions
Background coloring reinforces when the oscillator moves beyond major levels, helping traders quickly assess momentum pressure.
🔹 Detecting Momentum Anomalies
Z-scores allow the oscillator to highlight when market momentum behaves abnormally relative to its own recent history.
For example:
The oscillator reaching +1 or –1 after an extended trend may indicate a climax.
A sharp Z-score reversal within an extreme zone can signal a trend exhaustion or a corrective move.
Divergences often appear earlier due to normalization smoothing out indicator noise.
This makes the Z-Fusion Oscillator particularly useful for spotting subtle shifts in trend direction that traditional indicators may miss.
🔶 DETAILS
🔹 Composite Z-Score Framework
Each momentum tool is smoothed, normalized, and transformed:
RSI → EMA-smoothed, Z-scored
MACD histogram → Z-scored
Stochastic → EMA + SMA smoothing, then Z-scored
Momentum → EMA-smoothed, Z-scored
Rate of Change → EMA-smoothed, Z-scored
These are averaged into one composite Z-score to provide a consistent reading across assets and market conditions.
🔹 Fusion Trend Lines
Two lines serve as the core signal:
Fast Line (savg) – reacts quicker to trend changes
Slow Line (savg2) – acts as a baseline filter
Crossovers between these lines highlight momentum shifts, while their color reflects trend bias.
🔹 Overbought/Oversold Zones
Two upper and two lower Z-score thresholds define “zones”:
Upper zones highlight overheated momentum or potential bearish reversals
Lower zones highlight depressed momentum or potential bullish reversals
Filled regions and background colors help visually confirm extreme conditions.
🔹 Pivot-Based Divergence Engine
The script includes filtered pivot detection with customizable look-backs and range limits to ensure divergences are meaningful, not noise-driven.
🔶 SETTINGS
🔹 Indicator Settings
Source — Price series used for all calculations.
Z-Score Length — Lookback period for Z-score normalization.
Z-Score MA Length — Smoothing length for the fusion signal lines.
Overbought/Oversold Levels — Four customizable threshold lines.
Color Palette — Choose from preset themes or define custom colors.
🔹 RSI
Length — RSI calculation period.
EMA Smoothing Length — Smooths RSI before Z-score conversion.
🔹 MACD
Fast Length — Fast EMA length.
Slow Length — Slow EMA length.
Signal Line Length — MACD signal smoothing.
🔹 Stochastic
%K Length — Main stochastic length.
EMA Smoothing — Smooths %K for stability.
%D Length — Smoothing for the signal line.
🔹 Momentum
Length — Momentum lookback.
EMA Smoothing — Smooths momentum before Z-scoring.
🔹 Rate of Change
Length — ROC lookback.
EMA Smoothing — Smooths ROC values.
🔹 Divergence
Enable/Disable Divergence Detection — Toggle divergence engine.
Pivot Left/Right Lookback — Defines pivot detection sensitivity.
Detection Range Limits — Controls allowable range for divergence.
Bull/Bear Colors & Styling — Customize divergence visualization.
🔶 SUMMARY
The Z-Fusion Oscillator combines multiple momentum signatures into a single normalized signal, enabling traders to:
Identify reversals early
Detect momentum exhaustion
Spot bullish and bearish divergences
Track overbought/oversold conditions
Visualize trend strength with clarity
Whether you're a swing trader, intraday analyst, or trend-reversal hunter, the Z-Fusion Oscillator provides a powerful and adaptive way to read momentum.
3-EMA Ribbon Scalping System 3-EMA Ribbon Scalping System V2 - Trading Guide
Overview
This indicator combines a triple EMA ribbon with VWAP, RSI, and volume analysis to catch high-probability scalping setups for short pip hunting on highly liquid Forex pairs such as EUR/USD
The Core Strategy
The system waits for three conditions to align before firing a signal:
1. EMA Stack** - The 8/13/21 EMAs must be properly stacked (bullish: 8>13>21, bearish: 8<13<21)
2. VWAP Position** - Price needs to be on the right side of VWAP for the trade direction
3. Pullback Entry** - Price pulls back to test the fast EMA while maintaining the trend structure
When these line up with proper RSI readings and a volume spike, you get your entry signal.
Reading the Signals
LONG Entries
Triggered when:
- EMAs are bullishly stacked (green background)
- Price is above VWAP
- We get a pullback to the 8 EMA that holds
- RSI is between 40-70 (momentum present but not overbought)
- Volume exceeds the 20-period average by 1.2x
SHORT Entries
Mirror opposite conditions:
- Bearish EMA stack (red background)
- Price below VWAP
- Rejection at the 8 EMA
- RSI between 30-60
- Volume confirmation present
Risk Management Built In (freely adjustable to match your own approach when it comes to taking risk)
Each signal automatically calculates:
- Stop Loss: 1x ATR from entry
- Target 1: 1:1 risk/reward ratio
- *arget 2: 2:1 risk/reward ratio
You can display these as lines or labels, or turn them off entirely if you prefer your own levels.
Quick Setup Tips
Start with the default settings - they work well on most timeframes from 1-minute to 1-hour charts. The sweet spot for scalping is typically the 3-minute or 5-minute timeframe.
The info panel in the top right gives you a quick market snapshot without cluttering your chart:
- Trend direction
- VWAP position
- RSI value
- Volume status
- Current signal state
If you're getting too many signals, increase the "Min Bars Between Signals" to filter out choppy action. For cleaner charts during analysis, you can toggle off individual components like the ribbon, backgrounds, or signals.
Tips for Live Trading
1. Don't chase - Wait for price to come to the 8 EMA, not the other way around
2. Volume matters - That volume spike filter catches the moves with real momentum behind them
3. Respect the trend - The EMA stack keeps you trading with the flow, not against it
4. Use multiple timeframes - Check a higher timeframe for overall bias before taking signals
The indicator includes alerts that fire with exact entry, stop, and target levels - perfect for quick execution or logging trades.
Remember, this is a scalping system designed for active trading. It works best in trending markets with good volatility. During ranging or low-volume periods, consider sitting on your hands or reducing position size. Trade at your own risk, I created this solely for educational purposes!
Customization Options
Display Settings
- Show/hide EMA ribbon
- Toggle entry signals
- Background colors with adjustable opacity
- Info panel size options
- VWAP visibility
Technical Parameters
- EMA Settings: Adjustable lengths for fast (8), medium (13), and slow (21) EMAs
- RSI Settings: Customizable overbought/oversold levels and momentum thresholds
- Volume Settings: Multiplier for volume confirmation and MA length
- Risk Management: ATR multiplier for stops, customizable R:R ratios
Nearly everything is adjustable, but the defaults are solid. Focus on reading the market structure first before tweaking settings.
Visual Features
Background Colors
- Green: Bullish trend (EMAs stacked bullishly)
- Red: Bearish trend (EMAs stacked bearishly)
- Gray: Neutral/choppy conditions
Signal Styles
Choose between:
- Text labels
- Arrow markers
- Both combined
Stop Loss & Take Profit Display
Three modes available:
- None: No SL/TP visualization
- Current: Shows lines for active trade
- Labels: Displays small labels at price levels
Best Markets & Timeframes
Optimal Markets:
- Forex pairs (especially majors)
- Stock indices
- Liquid cryptocurrencies
- High-volume stocks
Alert System
Comprehensive alerts include:
- Entry signal notification
- Exact entry price
- Stop loss level with pip distance
- Take profit levels with pip distances
- Trade direction and symbol
Important Notes
- This is a "momentum-based scalping system" - not suitable for ranging markets
- Best results come from pairing with your understanding of key levels and market context
- The volume filter helps avoid false signals during low-liquidity periods
- Consider overall market conditions and news events before trading
Version Info
3-EMA Ribbon Scalping System
- Refined entry logic
- Improved visual clarity
- Enhanced risk management tools
- Optimized performance tracking
Multi EMA (Tintin)The indicator contain 200ema, 50ema and 200ema in 30min (dashed)
Buy only when price cut above 200 ema in 30 min
Đại Ka 3 ATR BandsĐại Ka 3 ATR Bands – The ultimate single-slot indicator that replaces three separate ATR plots.
Designed specifically for ICT/SMC traders in 2025:
• Light red band (±0.5 ATR) → fake moves, Judas Swing, Turtle Soup zone
• Gray band (±1.0 ATR) → normal price action
• Light green band (±2.0 ATR) → real displacement zone → Silver Bullet, SFT, high-probability entries
How to use:
– Price stuck inside red band → expect reversal/fakeout
– Price breaks and closes outside green band + volume spike → enter aggressively in that direction (85%+ win-rate inside Killzones)
Default ATR(14), subtle fills for instant visual filtering of real vs fake moves.
Perfect companion for Order Blocks, FVG, Breaker Blocks and NY/London Killzones.
Free forever – coded with love by Đại Ka & Vietnamese ICT crew.
Multiple Cross Signals (Predictive)The indicator calculates and displays the Golden/Death Cross signals and the buy/sell signals from the following oscillators on the chart:
MACD (Moving Average Convergence Divergence)
RSI (Relative Strength Index)
Stochastic (Stochastic Oscillator)
In addition to the actual cross signals (shown with arrows), it incorporates two key features:
Cross Prediction (Predictive): Identifies when the oscillator lines (MACD, RSI, Stochastic) are very close and converging towards a cross, suggesting that a real signal might occur soon.
False Signal Detection: Attempts to identify when an initial buy/sell signal fails when the low/high of the signal candle is broken within a confirmation period.
NICHI Beta (NuwenPham's Ichimoku)# **NuwenPham’s Ichimoku (NICHI)**
**Version BETA.251123a.3.1.2 – Pine Script v6**
**Author:** NuwenPham
**Forked from:** Donovan Wall
**Contributors:** Claude (Anthropic)
**License:** MPL 2.0
---
# **Overview**
**NICHI (Nuwen’s Ichimoku)** is a next-generation Ichimoku system that merges the classical Hosoda Ichimoku with a modular adaptive-smoothing engine, enhanced Kumo logic, directional trend counters, and multi-mode bar coloring.
The indicator includes **two completely separate Ichimoku engines**:
* **Standard Ichimoku** – Traditional Donchian-based Tenkan, Kijun, Senkou A/B, and Chikou
* **Advanced Ichimoku** – Fully customizable Ichimoku using 15+ moving-average filters and enhanced logic
NICHI is designed for modern markets—especially **futures and volatile instruments** (NG, CL, ES, NQ, crypto).
---
# **Key Features**
## **1. Dual Ichimoku Systems**
* **Standard Mode:**
Classic Donchian Ichimoku with Tenkan, Kijun, Senkou A/B, and Chikou.
Clean, faithful implementation.
* **Advanced Mode:**
Every Ichimoku line uses a **selected smoothing filter** (EMA, KAMA, FRAMA, Hull, McGinley, etc.).
Includes directional persistence tracking, enhanced cloud logic, and adaptive bar coloring.
---
## **2. Advanced Filter Engine (15+ Smooth Types)**
Use any of the following for Tenkan, Kijun, Senkou B, or Chikou:
* EMA
* DEMA
* SMA
* SMMA (RMA)
* WMA
* VWMA
* Hull MA
* ALMA
* LSMA (Linear Regression)
* McGinley Dynamic
* KAMA
* FRAMA
* COVWMA
* Moving Median
* 50th Percentile (Nearest Rank)
This transforms Ichimoku into an **adaptive trend system**.
---
## **3. Enhanced Cloud (Kumo) Modeling**
* Independent forward offsets for Span A & Span B
* Cloud colors adapt based on strength, direction, and filter behavior
* Cloud thickness reflects volatility
* Neutral cloud state available when spans disagree
---
## **4. Directional Persistence Counters**
NICHI tracks the **trend streak** of each main component:
* Tenkan rising/falling
* Kijun rising/falling
* Span A rising/falling
* Span B rising/falling
These counters make cloud and line colors more accurate and stable.
---
## **5. Regime-Based Bar Coloring (3 Modes)**
NICHI includes three built-in trading frameworks:
### **Mode 1: Kumo-Based**
Bar color reflects price relative to the cloud:
* Green = Above Kumo
* Red = Below Kumo
* Orange = Inside Kumo
Ideal for **trend-following** and **market regime detection**.
---
### **Mode 2: Tenkan/Kijun-Based**
Bar color reflects momentum structure:
* Green = Price above both Tenkan & Kijun
* Red = Price below both
Designed for **momentum entries and TK breakouts**.
---
### **Mode 3: Chikou-Based**
Bars reflect historical confirmation:
* Green = Chikou > price (offset period)
* Red = Chikou < price
Excellent for **confirmation-first strategies** where accuracy matters most.
---
## **6. Multi-MA Overlay System**
Up to **four optional moving averages**:
* SMA, EMA, SMMA, WMA, HMA, VWMA
* Independent lengths, widths, colors
* Useful for bias, confluence, trend filters
Default: **SMA 200** enabled.
---
## **7. TK Cross Signals**
Both systems show TK crosses:
* Standard TK Cross (classic)
* Advanced TK Cross (filtered version)
Crosses appear with clear markers for entry/exit logic.
---
# **How to Use NICHI**
## **1. Choose Your Engine**
* **Standard:** Clean, classic Ichimoku
* **Advanced:** Adaptive, filter-driven Ichimoku
* **Both:** Comparative analysis
---
## **2. Select Your Filter Type (Advanced Mode)**
Suggested filters:
| Market | Filter Type | Notes |
| ---------------- | ---------------- | -------------------------- |
| Natural Gas (NG) | KAMA or FRAMA | Handles extreme volatility |
| Crude Oil (CL) | McGinley Dynamic | Smooths spikes |
| ES / NQ | SMMA or WMA | Balanced response |
| Crypto | Hull or ALMA | Handles momentum bursts |
| FX | EMA or SMMA | Classic, stable |
---
## **3. Choose a Bar-Color Strategy**
* **Kumo-Based:** Trend following
* **TK-Based:** Momentum and breakouts
* **Chikou-Based:** Highest confirmation/accuracy
Each strategy is valid and intentionally distinct.
---
## **4. Reading the Cloud**
* **Bullish Cloud:** Span A > Span B
* **Bearish Cloud:** Span A < Span B
* **Neutral Cloud:** Disagreement between spans
* **Thick Cloud:** High volatility / stronger structure
* **Thin Cloud:** Weak trend / potential twist
---
## **5. Entry & Exit Concepts**
### **Entries**
* **Momentum Entry:** TK cross with price above the cloud
* **Reversal Entry:** TK cross before a cloud twist
* **Confirmation Entry:** Chikou breaks cleanly above/below past price
### **Exits**
* Price falling through Kijun
* Re-entering the cloud
* Opposite TK cross
* Cloud flipping against position
---
# **Recommended Trading Approaches**
## **Kumo-Based Trend Strategy**
* Long above cloud, short below
* Avoid signals inside cloud
Best for swing/position trading.
---
## **TK-Based Momentum Strategy**
* Enter on Tenkan/Kijun breakout
* Bar color confirms momentum
* Cloud filter optional but helps
Great for high-velocity markets.
---
## **Chikou-Based Confirmation Strategy**
* Enter only when Chikou confirms structure
* Highest accuracy, fewest trades
* Ideal for volatile markets (NG, CL)
---
# **Closing Notes**
NICHI is a **research-grade Ichimoku framework** designed to handle modern volatility where traditional Ichimoku often fails.
It supports scalpers, swing traders, and system developers alike.
Experiment with:
* Filter types
* Cloud offsets
* Bar-color modes
* MA overlays
to match your strategy and market.
Simple Moving Averages (5, 10, 20, 60, 120, 200SMA for different time frames.
Covers 5, 10, 20, 60, 120, 200 sma units
Alg0 ۞ Hal0 Triple EMA BlastFully customizable and stand-alone comprehensive indicator for scalping and short-term trading.
Cheers!
A۞H






















