Market Momentum in Premium & Discount-Delta @MaxMaserati 3.0Market Delta Momentum in Premium & Discount-Delta @MaxMaserati 3.0
══════════════════════════════════════════════════════
Overview
The MMPD 3.0 indicator is an advanced momentum oscillator that combines market structure analysis with institutional order flow concepts. It transforms price action into a normalized 0-100 scale, identifying premium and discount zones where institutional traders typically operate, while simultaneously tracking momentum through specialized body close candles and multi-timeframe synchronization.
This indicator is designed for traders who want to:
══════════════════════════════════════════════════════
Identify high-probability reversal zones using premium/discount analysis
Track momentum divergence between price and the MMPD oscillator
Recognize institutional rejection and acceptance zones
Synchronize multiple timeframes for confluence-based trading decisions
Core Methodology
══════════════════════════════════════════════════════
MMPD Calculation
The Market Delta Momentum indicator uses a proprietary calculation that:
Normalizes price position within a specific period range (0-100 scale)
Applies double smoothing to filter noise
Calculates a balance line (similar to a moving average) to determine bullish/bearish momentum
The relationship between the MMPD line and balance line creates directional candles
Key Zones:
══════════════════════════════════════════════════════
90-100: Extreme Premium (Institutional Selling Zone)
80-90: High Premium (Caution Zone)
65-80: Premium (Bullish Bias)
50-65: Light Premium (Neutral-Bullish)
35-50: Light Discount (Neutral-Bearish)
20-35: Discount (Bearish Bias)
10-20: High Discount (Institutional Buying Zone)
0-10: Extreme Discount (High Probability Buy Zone)
MMM 3.0 Body Close Logic BC and the MMPD 3.0 Body Close Logic MBC
══════════════════════════════════════════════════════
1️⃣ Body Close Analysis (BC & MBC)
Price Body Close (BC)
Bullish BC: Price closes above the previous high AND closes above its open (green candle showing aggressive buying)
Bearish BC: Price closes below the previous low AND closes below its open (red candle showing aggressive selling)
No Body Close (NBC): All other candles - representing consolidation, pause, or loss of momentum
MMPD Body Close (MBC)
Bullish MBC: MMPD closes higher than previous MMPD structure (continuation or reversal momentum)
Bearish MBC: MMPD closes lower than previous MMPD structure (continuation or reversal momentum)
MNBC: MMPD No Body Close - weak or ranging MMPD momentum
BC + MBC Confirmation
When Price BC and MMPD MBC align in the same direction, it signals high-conviction momentum:
Deep Green: Bullish BC + Bullish MBC (Strongest Bullish Signal)
Pale Green: Bullish BC only (Moderate Bullish Signal)
Deep Red: Bearish BC + Bearish MBC (Strongest Bearish Signal)
Pale Pink: Bearish BC only (Moderate Bearish Signal)
2️⃣ Momentum Synchronization System
The indicator compares MBC (MMPD Body Close) momentum against BC (Price Body Close) momentum to identify divergence and synchronization:
Synchronized States:
BULLISH+: High volatility bullish synchronization (BC+MBC aligned, high ATR)
BULLISH-: Low volatility bullish synchronization (BC+MBC aligned, low ATR)
BEARISH+: High volatility bearish synchronization (BC+MBC aligned, high ATR)
BEARISH-: Low volatility bearish synchronization (BC+MBC aligned, low ATR)
SYNCHRONIZED: Both MMPD and Price moving together (standard bullish or bearish move)
Divergence States (Reversal Warnings):
MMPD FAST | PRICE SLOW: MMPD showing strong directional MBC candles while Price shows NBC (pause/consolidation) - Reversal Warning!
If MMPD is bullish MBC but Price is NBC → Potential Bearish Reversal
If MMPD is bearish MBC but Price is NBC → Potential Bullish Reversal
Status Indicators:
BULL / BEAR: Standard synchronized moves
BULL+ / BEAR+: High volatility synchronized moves (aggressive trending)
BULL- / BEAR-: Low volatility synchronized moves (grinding trends)
POT. BULL / POT. BEAR: Potential reversal zones (divergence detected)
BALANCED: Neutral conditions, no clear momentum alignment which is price efficiency
3️⃣ Premium/Discount Breakout Markers
🔴 Red Circle Dots (Premium Exit)
Appears when MMPD closes below 80 after being completely in the 80-100 extreme premium zone
Signals institutional distribution complete, potential reversal or correction
🟢 Green Circle Dots (Discount Exit)
Appears when MMPD closes above 20 after being completely in the 0-20 extreme discount zone
Signals institutional accumulation complete, potential rally or reversal
🔴 Red Squares (Premium Rejection)
Appears on the first candle that fails to touch 80-100 after a Bullish MBC touched that zone
Indicates rejection of premium pricing, bearish signal
🟢 Green Squares (Discount Rejection)
Appears on the first candle that fails to touch 0-20 after a Bearish MBC touched that zone
Indicates rejection of discount pricing, bullish signal
🔻 Red Triangles Down (Bearish Midline Rejection)
Signals potential bearish Resumption
🔺 Green Triangles Up (Bullish Midline Bounce)
Signals potential Bullish Resumption
4️⃣ Multi-Timeframe Dashboard with Candle time to close
The MTF table displays:
6 customizable timeframes (default: 5min, 15min, 1H, 4H, Daily, Weekly)
Premium/Discount Status with color-coded zones for each timeframe
Time to Close (T2C): Live countdown timer for each timeframe candle close
Red warning color when the candle closing time is imminent
4H timeframe auto-detects exchange-specific session starts (ES, NQ, CL, GC, etc.)
Momentum Sync Status: Shows the current synchronization state between MMPD and Price across the chart timeframe
Color Coding:
Premium zones: Green/Cyan colors
Discount zones: Purple/Magenta colors
Intensity increases with extremeness (darker = more extreme)
5️⃣ Delta MMPD Alternative View
Toggle between two oscillator calculations:
MMPD: Original MMPD
Delta MMPD: Volume-weighted delta calculation emphasizing buying/selling pressure
TIPS
══════════════════════════════════════════════════════
Use Multi-Timeframe Confluence: The strongest signals occur when multiple timeframes align in premium/discount zones
Wait for Body Close Confirmation: BC+MBC alignment = highest probability setups
Respect Momentum Sync Warnings: "MMPD FAST | PRICE SLOW" is a critical reversal warning
Trade Premium → Discount or Discount → Premium: Mean reversion from extremes offers best risk/reward
Combine with Price Action: MMPD is a momentum oscillator - always confirm with price structure (support/resistance, trendlines, chart patterns)
Educational Notes
══════════════════════════════════════════════════════
What is Premium/Discount Pricing?
Institutional traders operate based on value zones:
Premium: Price is expensive relative to recent range - institutions distribute (sell)
Discount: Price is cheap relative to recent range - institutions accumulate (buy)
Fair Value (50 line): Equilibrium pricing where institutions pause
MMM 3.0 Body Close Approach Importance
══════════════════════════════════════════════════════
BC (Body Close): Shows price commitment and aggressivity
NBC (No Body Close): Shows indecision, consolidation, or loss of momentum
Consecutive BC candles = strong momentum
NBC candles breaking BC sequence = momentum loss → potential reversal
Momentum Synchronization Theory
══════════════════════════════════════════════════════
When MMPD (momentum) moves aggressively but Price shows NBC (pause), it indicates:
Momentum exhaustion
Smart money distribution/accumulation
Imminent reversal as retail traders get trapped
⚠️ Disclaimer
This indicator is for educational purposes only. Past performance does not guarantee future results. Always practice proper risk management and never risk more than you can afford to lose. Trading involves substantial risk of loss. The creator assumes no responsibility for trading losses incurred using this indicator.
ค้นหาในสคริปต์สำหรับ "bear"
Market Structure Trailing Stop MTF [Inspired by LuxAlgo]# Market Structure Trailing Stop MTF
**OPEN-SOURCE SCRIPT**
*208k+ views on original · Modified for MTF Support*
This indicator is a direct adaptation of the renowned **Market Structure Trailing Stop** by **LuxAlgo** (original script: [Market Structure Trailing Stop ]()). The core logic remains untouched, providing dynamic trailing stops based on market structure breaks (CHoCH/BOS). The **only modification** is the addition of **Multi-Timeframe (MTF) support**, allowing users to apply the trailing stops and structures from **higher timeframes (HTF)** directly on their current chart. This enhances usability for traders analyzing cross-timeframe confluence without switching charts.
**Special thanks to LuxAlgo** for releasing this powerful open-source tool under CC BY-NC-SA 4.0. Your contributions to the TradingView community have inspired countless traders—grateful for the solid foundation!
## 🔶 How the Script Works: A Deep Dive
At its heart, this indicator detects **market structure shifts** (bullish or bearish breaks of swing highs/lows) and uses them to generate **adaptive trailing stops**. These stops trail the price while protecting profits and acting as dynamic support/resistance levels. The MTF enhancement pulls this logic from user-specified higher timeframes, overlaying HTF structures and stops on the lower timeframe chart for seamless multi-timeframe analysis.
### Core Logic (Unchanged from LuxAlgo's Original)
1. **Pivot Detection**:
- Uses `ta.pivothigh()` and `ta.pivotlow()` with a user-defined lookback (`length`) to identify swing highs (PH) and lows (PL).
- Coordinates (price `y` and bar index/time `x`) are stored in persistent variables (`var`) for tracking recent pivots.
2. **Market Structure Detection**:
- **Bullish Structure (BOS/CHoCH)**: Triggers when `close > recent PH` (break above swing high).
- If `resetOn = 'CHoCH'`, resets only on major shifts (Change of Character); otherwise, on all breaks.
- Sets trend state `os = 1` (bullish) and highlights the break with a horizontal line (dashed for CHoCH, dotted for BOS).
- Initializes trailing stop at the local minimum (lowest low since the pivot) using a backward loop: `btm = math.min(low , btm)`.
- **Bearish Structure**: Triggers when `close < recent PL`, mirroring the bullish logic (`os = -1`, local maximum for stop).
- Structure state `ms` tracks the break type (1 for bull, -1 for bear, 0 neutral), resetting based on user settings.
3. **Trailing Stop Calculation**:
- Tracks **trailing max/min**:
- On new bull structure: Reset `max = close`.
- On new bear: Reset `min = close`.
- Otherwise: `max = math.max(close, max)` / `min = math.min(close, min)`.
- **Stop Adjustment** (the "trailing" magic):
- On fresh structure: `ts = btm` (bull) or `top` (bear).
- In ongoing trend: Increment/decrement by a percentage of the max/min change:
- Bull: `ts += (max - max ) * (incr / 100)`
- Bear: `ts += (min - min ) * (incr / 100)`
- This creates a **ratcheting effect**: Stops move favorably with the trend but never against it, converging toward price at a controlled rate.
- **Visuals**:
- Plots `ts` line colored by trend (teal for bull, red for bear).
- Fills area between `close` and `ts` (orange on retracements).
- Draws structure lines from pivot to break point.
4. **Edge Cases**:
- Variables like `ph_cross`/`pl_cross` prevent multiple triggers on the same pivot.
- Neutral state (`ms = 0`) preserves prior `max/min` until a new structure.
### MTF Enhancement (Our Addition)
- **request.security() Integration**:
- Wraps the entire core function `f()` in a security call for each timeframe (`tf1`, `tf2`).
- Returns HTF values (e.g., `ts1`, `os1`, structure times/prices) to the chart's context.
- Uses `lookahead=barmerge.lookahead_off` for accurate historical repainting-free data.
- Structures are drawn using `xloc.bar_time` to align HTF lines precisely on the LTF chart.
- **Multi-Output Handling**:
- Separate plots/fills/lines for each TF (e.g., `plot_ts1`, `plot_ts2`).
- Colors and toggles per TF to distinguish HTF1 (e.g., teal/red) from HTF2 (e.g., blue/maroon).
- **Benefits**: Spot HTF bias on LTF entries, e.g., enter longs only if both TF1 (1H) and TF2 (4H) show bullish `os=1`.
This keeps the script lightweight—**no repainting, max 500 lines**, and fully compatible with LuxAlgo's original behavior when TFs are set to the chart's timeframe.
## 🔶 SETTINGS
### Core Parameters
- **Pivot Lookback** (`length = 14`): Bars left/right for pivot detection. Higher = smoother structures, fewer signals; lower = more noise.
- **Increment Factor %** (`incr = 100`): Speed of stop convergence (0-∞). 100% = full ratchet (mirrors max/min exactly); <100% = slower trail, reduces whipsaws.
- **Reset Stop On** (`'CHoCH'`): `'CHoCH'` = Reset only on major reversals (dashed lines); `'All'` = Reset on every BOS/CHoCH (tighter stops).
### MTF Support
- **Timeframe 1** (`tf1 = ""`): HTF for first set (e.g., "1H"). Empty = current chart.
- **Timeframe 2** (`tf2 = ""`): Second HTF (e.g., "4H"). Enables dual confluence.
### Display Toggles
- **Show Structures** (`true`): Draws horizontal lines for breaks (per TF colors).
- **Show Trailing Stop TF1/TF2** (`true`): Plots the stop line.
- **Show Fill TF1/TF2** (`true`): Area fill between close and stop.
### Candle Coloring (Optional)
- **Color Candles** (`false`): Enables custom `plotcandle` for body/wick/border.
- **Candle Color Based On TF** (`"None"`): `"TF1"`, `"TF2"`, or none. Colors bull trend green, bear red.
- **Candle Colors**: Separate inputs for bull/bear body, wick, border (e.g., solid green body, transparent wick).
### Alerts
- **Enable MS Break Alerts** (`false`): Notifies on structure breaks (bull/bear per TF) **only on bar close** (`barstate.isconfirmed` + `alert.freq_once_per_bar_close`).
- **Enable Stop Hit Alerts** (`false`): Triggers on stop breaches (long/short per TF), using `ta.crossunder/crossover`.
### Colors
- **TF1 Colors**: Bullish (teal), Bearish (red), Retracement (orange).
- **TF2 Colors**: Bullish (blue), Bearish (maroon), Retracement (orange).
- **Area Transparency** (`80`): Fill opacity (0-100).
## 🔶 USAGE
Trailing stops shine in **trend-following strategies**:
- **Entries**: Use structure breaks as signals (e.g., long on bullish BOS from HTF1).
- **Exits**: Trail stops for profit-locking; alert on hits for automation.
- **Confluence**: Overlay HTF1 (e.g., 1H) for bias, HTF2 (e.g., Daily) for major levels—enter LTF only on alignment.
- **Risk Management**: Lower `incr` avoids early stops in chop; reset on `'All'` for aggressive trailing.
! (i.imgur.com)
*HTF1 shows bullish structure (teal line), trailing stop ratchets up—long entry confirmed on LTF pullback.*
! (i.imgur.com)
*TF1 (blue) bearish, TF2 (red) neutral—avoid shorts until alignment.*
! (i.imgur.com)
*Colored based on TF1 trend: Green bodies on bull `os=1`.*
Pro Tip: Test on demo—pair with LuxAlgo's other tools like Smart Money Concepts for full structure ecosystem.
## 🔶 DETAILS: Mathematical Breakdown
On bullish break:
- Local min: `btm = ta.lowest(n - ph_x)` (optimized loop equivalent).
- Stop init: `ts = btm`.
- Update: `Δmax = max - max `, `ts_new = ts + Δmax * (incr/100)`.
Bearish mirrors with `Δmin` (negative, so decrements `ts`).
In MTF: HTF `time` aligns lines via `line.new(htf_time, level, current_time, level, xloc.bar_time)`.
No logs/math libs needed—pure Pine v5 efficiency.
## Disclaimer
This is for educational purposes. Not financial advice. Backtest thoroughly. Original by LuxAlgo—modify at your risk. See TradingView's (www.tradingview.com). Licensed under CC BY-NC-SA 4.0 (attribution to LuxAlgo required).
Velocity Pressure Index | AlphaNattVelocity Pressure Index (VPI) | AlphaNatt
A sophisticated momentum oscillator that combines price velocity analysis with volume pressure dynamics to identify high-probability trading opportunities.
📊 KEY FEATURES
Dual Analysis System: Merges price velocity measurement with volume pressure analysis for comprehensive market momentum assessment
Dynamic Normalization: Automatically scales values between -100 and +100 for consistent readings across all market conditions
Adaptive Zones: Self-adjusting overbought/oversold levels based on recent price history
Multi-Layer Confirmation: Combines momentum, acceleration, and crossover signals for robust trade identification
Volume-Weighted Pressure: Differentiates between bullish and bearish volume to gauge true market sentiment
📈 HOW IT WORKS
The VPI calculates price velocity using linear regression of price changes, then weights this velocity by the difference between bullish and bearish volume pressure. This creates a momentum reading that accounts for both price movement speed and the volume conviction behind it.
Signal Generation:
Price velocity is measured over the specified period
Volume is separated into bullish (close > open) and bearish (close < open) pressure
Velocity is amplified or dampened based on volume pressure differential
The resulting index is normalized to oscillate between -100 and +100
A signal line smooths the oscillator for crossover detection
🎯 TRADING SIGNALS
Long Signals (Cyan #00F1FF):
Strong Bull: VPI > Signal with positive momentum and acceleration
Crossover Bull: VPI crosses above signal while above oversold zone
Divergence: Price makes lower low while VPI makes higher low
Short Signals (Magenta #FF019A):
Strong Bear: VPI < Signal with negative momentum and deceleration
Crossover Bear: VPI crosses below signal while below overbought zone
Divergence: Price makes higher high while VPI makes lower high
⚙️ CUSTOMIZABLE PARAMETERS
Velocity Settings:
Velocity Period (14): Lookback for price velocity calculation
Pressure Period (21): Volume analysis window
Smoothing Factor (3): Final oscillator smoothing
Signal Configuration:
Signal Type: Choose between SMA, EMA, or DEMA
Signal Length (9): Signal line smoothing period
Normalization Period (50): Range calculation window
Dynamic Zones:
Zone Lookback (100): Period for adaptive overbought/oversold calculation
Percentiles: 80th/20th percentiles for dynamic zones
📐 VISUAL COMPONENTS
Main Oscillator: Color-coded line showing current momentum state
Signal Line: White line for crossover detection
Momentum Histogram: Shows velocity differential at 50% scale
Dynamic Zones: Self-adjusting overbought/oversold bands
Extreme Levels: ±50 dotted lines marking extreme conditions
Background Shading: Subtle highlighting of overbought/oversold regions
💡 USAGE TIPS
Trend Trading: Use strong bull/bear signals in trending markets for continuation entries
Range Trading: Focus on crossovers near extreme zones for reversal trades
Divergence Trading: Watch for price/oscillator divergences at market extremes
Multi-Timeframe: Combine with higher timeframe VPI for directional bias
Volume Confirmation: Stronger signals occur with aligned volume pressure
⚠️ BEST PRACTICES
The VPI works best in liquid markets with reliable volume data. For optimal results, combine with price action analysis and use appropriate risk management. The indicator is most effective during trending conditions but can identify reversals when divergences occur at extremes.
🔔 ALERTS AVAILABLE
VPI Long/Short Signals
Bullish/Bearish Crossovers
Extreme Overbought/Oversold Conditions
Version 6 | Pine Script™ | © AlphaNatt
Vector Sniper Pro What it is
Vector Sniper (Simplified) is a single, original algorithm that flags impulsive “vector” moves only when volatility, volume, and structure align. It is not a mashup of other indicators; everything below is computed from raw OHLCV with a small, transparent ruleset.
⸻
Core idea (signal = force × participation × context)
1. Force (Volatility):
• We z-score true range: trZ = (ATR(1) - SMA(ATR(1), N)) / StDev(ATR(1), N).
• A move must exceed a user-set Volatility Z-Score.
2. Participation (Volume):
• We z-score raw volume: volZ = (Vol - SMA(Vol, N)) / StDev(Vol, N).
• Volume must also exceed a Volume Z-Score.
3. Context (Structure, Body, Imbalance, Traps):
• Body% filter: real body / range ≥ Min Body %.
• Delta-volume proxy: (bullVol − bearVol) / volume, where bullVol = volume*(close−low)/range and bearVol = volume*(high−close)/range. We require positive imbalance for bulls, negative for bears.
• Structure break (optional): price must take out the prior N-bar high/low.
• Trap detection (optional): spring/upthrust patterns defined by lower-low/upper-high followed by a close back inside.
If the above align, you get a Bull Vector (green) or Bear Vector (red). “Extreme” vectors require the same conditions at a higher multiple (Ext Mult).
⸻
Noise control (pre-signal gate)
Before a vector is allowed, a pre-signal score (0–7) must pass:
• Checks include spring/upthrust, no-supply/no-demand, imbalance, volume > average, VWAP side alignment, EMA trend alignment, proximity to structure break, and candle direction.
• You choose a minimum score, persistence (must occur ≥N times inside last M bars), cooldown after a pass, and hysteresis vs the opposite side.
This prevents one-off blips and keeps signals directional.
⸻
Optional confluence
• VWAP alignment: require price on the correct side and VWAP slope with it.
• EMA filter: require EMA trend agreement.
• HTF bias (optional): compare HTF close vs HTF EMA on a selected timeframe.
• Implemented with request.security and no look-ahead; bias updates when the higher timeframe bar closes.
⸻
Visuals & alerts
• Candle colors (5 total):
• Green = Bull Vector, Red = Bear Vector.
• Blue = Pre-Bull, Orange = Pre-Bear.
• Gray = Neutral.
• Markers (optional): diamonds = “Extreme” vectors; small triangles = pre-signals.
• Built-in alerts: Bull Vector, Bear Vector, Extreme Bull/Bear, Pre-Bull, Pre-Bear.
• Add from: Alerts → Condition → this script → choose event.
⸻
How to use (practical)
1. Start with defaults. Turn on VWAP and EMA filters; add HTF bias if you want fewer but cleaner signals.
2. Hunt for alignment: Pre-signal (blue/orange) → Vector (green/red) in the same direction.
3. Use your own risk model for entries/exits; the script does not place orders or compute stops/targets.
⸻
Inputs (plain English)
• ATR/Volume Periods & Z-Scores: sensitivity to volatility/participation.
• Extreme Multiplier: threshold for “Extreme” vectors.
• Structure Break (bars) & Traps: contextual confirms.
• Pre-signal gate: Min Score, Persistence (N in last M), Cooldown, Opposite-side lockout.
• Confluence: VWAP side, EMA trend, optional HTF bias (timeframe + EMA length).
• Visuals: candle painting and markers.
⸻
Design notes / limitations
• Signals evaluate on bar close. Intrabar they can form and cancel; for consistency, trade on closed bars.
• HTF bias is derived from closed HTF bars; no future data is used.
• This is an indicator, not financial advice. Backtest forward and manage risk.
⸻
Why this isn’t a “mashup”:
All components are purposeful and documented: z-score volatility + z-score volume (force & participation), body% and delta-volume (quality), structure & traps (context), and a scored, persistent pre-filter with VWAP/EMA/HTF alignment (noise control).
Smart Money Precision Structure [BullByte]Smart Money Precision Structure
Advanced Market Structure Analysis Using Institutional Order Flow Concepts
---
OVERVIEW
Smart Money Precision Structure (SMPS) is a comprehensive market analysis indicator that combines six analytical frameworks to identify high-probability market structure patterns. The indicator uses multi-dimensional scoring algorithms to evaluate market conditions through institutional order flow concepts, providing traders with professional-grade market analysis.
---
PURPOSE AND ORIGINALITY
Why This Indicator Was Developed
• Addresses the gap between retail and institutional analysis methods
• Consolidates multiple analysis techniques that professionals use separately
• Automates complex market structure evaluation into actionable insights
• Eliminates the need for multiple indicators by providing comprehensive analysis
What Makes SMPS Original
• Six-Layer Confluence System - Unique combination of market regime, structure, volume flow, momentum, price action, and adaptive filtering
• Institutional Pattern Recognition - Identifies smart money accumulation and distribution patterns
• Adaptive Intelligence - Parameters automatically adjust based on detected market conditions
• Real-Time Market Scoring - Proprietary algorithm rates market quality from 0-100%
• Structure Break Detection - Advanced pivot analysis identifies trend reversals early
---
HOW IT WORKS - TECHNICAL METHODOLOGY
1. Market Regime Analysis Engine
The indicator evaluates five core market dimensions:
• Volatility Score - Measures current volatility against 50-period historical baseline
• Trend Score - Analyzes alignment between 8, 21, and 50-period EMAs
• Momentum Score - Combines RSI divergence with MACD signal alignment
• Structure Score - Evaluates pivot point formation clarity
• Efficiency Score - Calculates directional movement efficiency ratio
These scores combine to classify markets into five regimes:
• TRENDING - Strong directional movement with aligned indicators
• RANGING - Sideways movement with mixed directional signals
• VOLATILE - Elevated volatility with unpredictable price swings
• QUIET - Low volatility consolidation periods
• TRANSITIONAL - Market shifting between different regimes
2. Market Structure Analysis
Advanced pivot point analysis identifies:
• Higher Highs and Higher Lows for bullish structure
• Lower Highs and Lower Lows for bearish structure
• Structure breaks when established patterns fail
• Dynamic support and resistance from recent pivot points
• Key level proximity detection using ATR-based buffers
3. Volume Flow Decoding
Institutional activity detection through:
• Volume surge identification when volume exceeds 2x average
• Buy versus sell pressure analysis using price-volume correlation
• Flow strength measurement through directional volume consistency
• Divergence detection between volume and price movements
• Institutional threshold alerts when unusual volume patterns emerge
4. Multi-Period Momentum Synthesis
Weighted momentum calculation across four timeframes:
• 1-period momentum weighted at 40%
• 3-period momentum weighted at 30%
• 5-period momentum weighted at 20%
• 8-period momentum weighted at 10%
Result smoothed with 6-period EMA for noise reduction.
5. Price Action Quality Assessment
Each bar evaluated for:
• Range quality relative to 20-period average
• Body-to-range ratio for directional conviction
• Wick analysis for rejection pattern identification
• Pattern recognition including engulfing and hammer formations
• Sequential price movement analysis
6. Adaptive Parameter System
Parameters automatically adjust based on detected regime:
• Trending markets reduce sensitivity and confirmation requirements
• Volatile markets increase filtering and require additional confirmations
• Ranging markets maintain neutral settings
• Transitional markets use moderate adjustments
---
COMPLETE SETTINGS GUIDE
Section 1: Core Analysis Settings
Analysis Sensitivity (0.3-2.0)
• Default: 1.0
• Lower values require stronger price movements
• Higher values detect more subtle patterns
• Scalpers use 0.8-1.2, swing traders use 1.5-2.0
Noise Reduction Level (2-7)
• Default: 4
• Controls filtering of false patterns
• Higher values reduce pattern frequency
• Increase in volatile markets
Minimum Move % (0.05-0.50)
• Default: 0.15%
• Sets minimum price movement threshold
• Adjust based on instrument volatility
• Forex: 0.05-0.10%, Stocks: 0.15-0.25%, Crypto: 0.20-0.50%
High Confirmation Mode
• Default: True (Enabled)
• Requires all technical conditions to align
• Reduces frequency but increases reliability
• Disable for more aggressive pattern detection
Section 2: Market Regime Detection
Enable Regime Analysis
• Default: True (Enabled)
• Activates market environment evaluation
• Essential for adaptive features
• Keep enabled for best results
Regime Analysis Period (20-100)
• Default: 50 bars
• Determines regime calculation lookback
• Shorter for responsive, longer for stable
• Scalping: 20-30, Swing: 75-100
Minimum Market Clarity (0.2-0.8)
• Default: 0.4
• Quality threshold for pattern generation
• Higher values require clearer conditions
• Lower for more patterns, higher for quality
Adaptive Parameter Adjustment
• Default: True (Enabled)
• Enables automatic parameter optimization
• Adjusts based on market regime
• Highly recommended to keep enabled
Section 3: Market Structure Analysis
Enable Structure Validation
• Default: True (Enabled)
• Validates patterns against support/resistance
• Confirms trend structure alignment
• Essential for reliability
Structure Analysis Period (15-50)
• Default: 30 bars
• Period for structure pattern analysis
• Affects support/resistance calculation
• Match to your trading timeframe
Minimum Structure Alignment (0.3-0.8)
• Default: 0.5
• Required structure score for valid patterns
• Higher values need stronger structure
• Balance with desired frequency
Section 4: Analysis Configuration
Minimum Strength Level (3-5)
• Default: 4
• Minimum confirmations for pattern display
• 5 = Maximum reliability, 3 = More patterns
• Beginners should use 4-5
Required Technical Confirmations (4-6)
• Default: 5
• Number of aligned technical factors
• Higher = fewer but better patterns
• Works with High Confirmation Mode
Pattern Separation (3-20 bars)
• Default: 8 bars
• Minimum bars between patterns
• Prevents clustering and overtrading
• Increase for cleaner charts
Section 5: Technical Filters
Momentum Validation
• Default: True (Enabled)
• Requires momentum alignment
• Filters counter-trend patterns
• Essential for trend following
Volume Confluence Analysis
• Default: True (Enabled)
• Requires volume confirmation
• Identifies institutional participation
• Critical for reliability
Trend Direction Filter
• Default: True (Enabled)
• Only shows patterns with trend
• Reduces counter-trend signals
• Disable for reversal hunting
Section 6: Volume Flow Analysis
Institutional Activity Threshold (1.2-3.5)
• Default: 2.0
• Multiplier for unusual volume detection
• Lower finds more institutional activity
• Stock: 2.0-2.5, Forex: 1.5-2.0, Crypto: 2.5-3.5
Volume Surge Multiplier (1.8-4.5)
• Default: 2.5
• Defines significant volume increases
• Adjust per instrument characteristics
• Higher for stocks, lower for forex
Volume Flow Period (12-35)
• Default: 18 bars
• Smoothing for volume analysis
• Shorter = responsive, longer = smooth
• Match to timeframe used
Section 7: Analysis Frequency Control
Maximum Analysis Points Per Hour (1-5)
• Default: 3
• Limits pattern frequency
• Prevents overtrading
• Scalpers: 4-5, Swing traders: 1-2
Section 8: Target Level Configuration
Target Calculation Method
• Default: Market Adaptive
• Three modes available:
- Fixed: Uses set point distances
- Dynamic: ATR-based calculations
- Market Adaptive: Structure-based levels
Minimum Target/Risk Ratio (1.0-3.0)
• Default: 1.5
• Minimum acceptable reward vs risk
• Higher filters lower probability setups
• Professional standard: 1.5-2.0
Fixed Mode Settings:
• Fixed Target Distance: 50 points default
• Fixed Invalidation Distance: 30 points default
• Use for consistent instruments
Dynamic Mode Settings:
• Dynamic Target Multiplier: 1.8x ATR default
• Dynamic Invalidation Multiplier: 1.0x ATR default
• Adapts to volatility automatically
Market Adaptive Settings:
• Use Structure Levels: True (default)
• Structure Level Buffer: 0.1% default
• Places levels at actual support/resistance
Section 9: Visual Display Settings
Color Theme Options
• Professional (Teal/Red)
- Bullish: Teal (#26a69a)
- Bearish: Red (#ef5350)
- Neutral: Gray (#78909c)
- Best for: Traditional traders, clean appearance
• Dark (Neon Green/Pink)
- Bullish: Neon Green (#00ff88)
- Bearish: Hot Pink (#ff0044)
- Neutral: Dark Gray (#333333)
- Best for: Dark theme users, high contrast
• Light (Green/Red Classic)
- Bullish: Green (#4caf50)
- Bearish: Red (#f44336)
- Neutral: Light Gray (#9e9e9e)
- Best for: Light backgrounds, traditional colors
• Vibrant (Cyan/Magenta)
- Bullish: Cyan (#00ffff)
- Bearish: Magenta (#ff00ff)
- Neutral: Medium Gray (#888888)
- Best for: High visibility, modern appearance
Dashboard Position
• Options: Top Left, Top Right, Bottom Left, Bottom Right, Middle Left, Middle Right
• Default: Top Right
• Choose based on chart layout preference
Dashboard Size
• Full: Complete information display (desktop)
• Mobile: Compact view for small screens
• Default: Full
Analysis Display Style
• Arrows : Simple directional markers
• Labels : Detailed text information
• Zones : Colored areas showing pattern regions
• Default: Labels (most informative)
Display Options:
• Display Analysis Strength: Shows star rating
• Display Target Levels: Shows target/invalidation lines
• Display Market Regime: Shows regime in pattern labels
---
HOW TO USE SMPS - DETAILED GUIDE
Understanding the Dashboard
Top Row - Header
• SMPS Dashboard title
• VALUE column: Current readings
• STATUS column: Condition assessments
Market Regime Row
• Shows: TRENDING, RANGING, VOLATILE, QUIET, or TRANSITIONAL
• Color coding: Green = Favorable, Red = Caution
• Status: FAVORABLE or CAUTION trading conditions
Market Score Row
• Percentage from 0-100%
• Above 60% = Strong conditions
• 40-60% = Moderate conditions
• Below 40% = Weak conditions
Structure Row
• Direction: BULLISH, BEARISH, or NEUTRAL
• Status: INTACT or BREAK
• Orange BREAK indicates structure failure
Volume Flow Row
• Direction: BUYING or SELLING
• Intensity: STRONG or WEAK
• Color indicates dominant pressure
Momentum Row
• Numerical momentum value
• Positive = Upward pressure
• Negative = Downward pressure
Volume Status Row
• INST = Institutional activity detected
• HIGH = Above average volume
• NORM = Normal volume levels
Adaptive Mode Row
• ACTIVE = Parameters adjusting
• STATIC = Fixed parameters
• Shows required confirmations
Analysis Level Row
• Minimum strength level setting
• Pattern separation in bars
Market State Row
• Current analysis: BULLISH, BEARISH, NEUTRAL
• Shows analysis price level when active
T:R Ratio Row
• Current target to risk ratio
• GOOD = Meets minimum requirement
• LOW = Below minimum threshold
Strength Row
• BULL or BEAR dominance
• Numerical strength value 0-100
Price Row
• Current price
• Percentage change
Last Analysis Row
• Previous pattern direction
• Bars since last pattern
Reading Pattern Signals
Bullish Structure Pattern
• Upward triangle or "Bullish Structure" label
• Star rating shows strength (★★★★★ = strongest)
• Green line = potential target level
• Red dashed line = invalidation level
• Appears below price bars
Bearish Structure Pattern
• Downward triangle or "Bearish Structure" label
• Star rating indicates reliability
• Green line = potential target level
• Red dashed line = invalidation level
• Appears above price bars
Pattern Strength Interpretation
• ★★★★★ = 6 confirmations (exceptional)
• ★★★★☆ = 5 confirmations (strong)
• ★★★☆☆ = 4 confirmations (moderate)
• ★★☆☆☆ = 3 confirmations (minimum)
• Below minimum = filtered out
Visual Elements on Chart
Lines and Levels:
• Gray Line = 21 EMA trend reference
• Green Stepline = Dynamic support level
• Red Stepline = Dynamic resistance level
• Green Solid Line = Active target level
• Red Dashed Line = Active invalidation level
Pattern Markers:
• Triangles = Arrow display mode
• Text Labels = Label display mode
• Colored Boxes = Zone display mode
Target Completion Labels:
• "Target" = Price reached target level
• "Invalid" = Pattern invalidated by price
---
RECOMMENDED USAGE BY TIMEFRAME
1-Minute Charts (Scalping)
• Sensitivity: 0.8-1.2
• Noise Reduction: 3-4
• Pattern Separation: 3-5 bars
• High Confirmation: Optional
• Best for: Quick intraday moves
5-Minute Charts (Precision Intraday)
• Sensitivity: 1.0 (default)
• Noise Reduction: 4 (default)
• Pattern Separation: 8 bars
• High Confirmation: Enabled
• Best for: Day trading
15-Minute Charts (Short Swing)
• Sensitivity: 1.0-1.5
• Noise Reduction: 4-5
• Pattern Separation: 10-12 bars
• High Confirmation: Enabled
• Best for: Intraday swings
30-Minute to 1-Hour (Position Trading)
• Sensitivity: 1.5-2.0
• Noise Reduction: 5-7
• Pattern Separation: 15-20 bars
• Regime Period: 75-100
• Best for: Multi-day positions
Daily Charts (Swing Trading)
• Sensitivity: 1.8-2.0
• Noise Reduction: 6-7
• Pattern Separation: 20 bars
• All filters enabled
• Best for: Long-term analysis
---
MARKET-SPECIFIC SETTINGS
Forex Pairs
• Minimum Move: 0.05-0.10%
• Institutional Threshold: 1.5-2.0
• Volume Surge: 1.8-2.2
• Target Mode: Dynamic or Market Adaptive
Stock Indices (ES, NQ, YM)
• Minimum Move: 0.10-0.15%
• Institutional Threshold: 2.0-2.5
• Volume Surge: 2.5-3.0
• Target Mode: Market Adaptive
Individual Stocks
• Minimum Move: 0.15-0.25%
• Institutional Threshold: 2.0-2.5
• Volume Surge: 2.5-3.5
• Target Mode: Dynamic
Cryptocurrency
• Minimum Move: 0.20-0.50%
• Institutional Threshold: 2.5-3.5
• Volume Surge: 3.0-4.5
• Target Mode: Dynamic
• Increase noise reduction
---
PRACTICAL APPLICATION EXAMPLES
Example 1: Strong Trending Market
Dashboard Reading:
• Market Regime: TRENDING
• Market Score: 75%
• Structure: BULLISH, INTACT
• Volume Flow: BUYING, STRONG
• Momentum: +0.45
Interpretation:
• Strong uptrend environment
• Institutional buying present
• Look for bullish patterns as continuation
• Higher probability of success
• Consider using lower sensitivity
Example 2: Range-Bound Conditions
Dashboard Reading:
• Market Regime: RANGING
• Market Score: 35%
• Structure: NEUTRAL
• Volume Flow: SELLING, WEAK
• Momentum: -0.05
Interpretation:
• No clear direction
• Low opportunity environment
• Patterns are less reliable
• Consider waiting for regime change
• Or switch to a range-trading approach
Example 3: Structure Break Alert
Dashboard Reading:
• Previous: BULLISH structure
• Current: Structure BREAK
• Volume: INST flag active
• Momentum: Shifting negative
Interpretation:
• Trend reversal potentially beginning
• Institutional participation detected
• Watch for bearish pattern confirmation
• Adjust bias accordingly
• Increase caution on long positions
Example 4: Volatile Market
Dashboard Reading:
• Market Regime: VOLATILE
• Market Score: 45%
• Adaptive Mode: ACTIVE
• Confirmations: Increased to 6
Interpretation:
• Choppy conditions
• Parameters auto-adjusted
• Fewer but higher quality patterns
• Wider stops may be needed
• Consider reducing position size
Below are a few chart examples of the Smart Money Precision Structure (SMPS) indicator in action.
• Example 1 – Bullish Structure Detection on SOLUSD 5m
• Example 2 – Bearish Structure Detected with Strong Confluence on SOLUSD 5m
---
TROUBLESHOOTING GUIDE
No Patterns Appearing
Check these settings:
• High Confirmation Mode may be too restrictive
• Minimum Strength Level may be too high
• Market Clarity threshold may be too high
• Regime filter may be blocking patterns
• Try increasing sensitivity
Too Many Patterns
Adjust these settings:
• Enable High Confirmation Mode
• Increase Minimum Strength Level to 5
• Increase Pattern Separation
• Reduce Sensitivity below 1.0
• Enable all technical filters
Dashboard Shows "CAUTION"
This indicates:
• Market conditions are unfavorable
• Regime is RANGING or QUIET
• Market score is low
• Consider waiting for better conditions
• Or adjust expectations accordingly
Patterns Not Reaching Targets
Consider:
• Market may be choppy
• Volatility may have changed
• Try Dynamic target mode
• Reduce target/risk ratio requirement
• Check if regime is VOLATILE
---
ALERTS CONFIGURATION
Alert Message Format
Alerts include:
• Pattern type (Bullish/Bearish)
• Strength rating
• Market regime
• Analysis price level
• Target and invalidation levels
• Strength percentage
• Target/Risk ratio
• Educational disclaimer
Setting Up Alerts
• Click Alert button on TradingView
• Select SMPS indicator
• Choose alert frequency
• Customize message if desired
• Alerts fire on pattern detection
---
DATA WINDOW INFORMATION
The Data Window displays:
• Market Regime Score (0-100)
• Market Structure Bias (-1 to +1)
• Bullish Strength (0-100)
• Bearish Strength (0-100)
• Bull Target/Risk Ratio
• Bear Target/Risk Ratio
• Relative Volume
• Momentum Value
• Volume Flow Strength
• Bull Confirmations Count
• Bear Confirmations Count
---
BEST PRACTICES AND TIPS
For Beginners
• Start with default settings
• Use High Confirmation Mode
• Focus on TRENDING regime only
• Paper trade first
• Learn one timeframe thoroughly
For Intermediate Users
• Experiment with sensitivity settings
• Try different target modes
• Use multiple timeframes
• Combine with price action analysis
• Track pattern success rate
For Advanced Users
• Customize per instrument
• Create setting templates
• Use regime information for bias
• Combine with other indicators
• Develop systematic rules
---
IMPORTANT DISCLAIMERS
• This indicator is for educational and informational purposes only
• Not financial advice or a trading system
• Past performance does not guarantee future results
• Trading involves substantial risk of loss
• Always use appropriate risk management
• Verify patterns with additional analysis
• The author is not a registered investment advisor
• No liability accepted for trading losses
---
VERSION NOTES
Version 1.0.0 - Initial Release
• Six-layer confluence system
• Adaptive parameter technology
• Institutional volume detection
• Market regime classification
• Structure break identification
• Real-time dashboard
• Multiple display modes
• Comprehensive settings
## My Final Thoughts
Smart Money Precision Structure represents an advanced approach to market analysis, bringing institutional-grade techniques to retail traders through intelligent automation and multi-dimensional evaluation. By combining six analytical frameworks with adaptive parameter adjustment, SMPS provides comprehensive market intelligence that single indicators cannot achieve.
The indicator serves as an educational tool for understanding how professional traders analyze markets, while providing practical pattern detection for those seeking to improve their technical analysis. Remember that all trading involves risk, and this tool should be used as part of a complete analysis approach, not as a standalone trading system.
- BullByte
Six Meridian Divine Swords [theUltimator5]The Six Meridian Divine Sword is a legendary martial arts technique in the classic wuxia novel “Demi-Gods and Semi-Devils” (天龙八部) by Jin Yong (金庸). The technique uses powerful internal energy (qi) to shoot invisible sword-like energy beams from the six meridians of the hand. Each of the six fingers/meridians corresponds to a “sword,” giving six different sword energies.
The Six Meridian Divine Swords indicator is a compact “signal dashboard” that fuses six classic indicators (fingers)—MACD, KDJ, RSI, LWR (Williams %R), BBI, and MTM—into one pane. Each row is a traffic-light dot (green/bullish, red/bearish, gray/neutral). When all six align, the script draws a confirmation line (“All Bullish” or “All Bearish”). It’s designed for quick consensus reads across trend, momentum, and overbought/oversold conditions.
How to Read the Dashboard
The pane has 6 horizontal rows (explained in depth later):
MACD
KDJ
RSI
LWR (Larry Williams %R)
BBI (Bull & Bear Index)
MTM (Momentum)
Each tick in the row is a dot, with sentiment identified by a color.
Green = bullish condition met
Red = bearish condition met
Gray = inside a neutral band (filtering chop), shown when Use Neutral (Gray) Colors is ON
There are two lines that track the dots on the top or bottom of the pane.
All Bullish Signal Line: appears only if all 6 are strongly bullish (default color = white)
All Bearish Signal Line: appears only if all 6 are strongly bearish (default color = fuchsia)
The Six Meridians (Indicators) — What They Mean:
1) MACD — Trend & Momentum
What it is: A trend-following momentum indicator based on the relationship between two moving averages (typically 12-EMA and 26-EMA)
Logic used: Classic MACD line (EMA12−EMA26) vs its 9-EMA signal.
Bullish: MACD > Signal and |MACD−Signal| > Neutral Threshold
Bearish: MACD < Signal and |diff| > threshold
Neutral: |diff| ≤ threshold
Why: Small crosses can whipsaw. The neutral band ignores tiny separations to reduce noise.
Inputs: Fast/Slow/Signal lengths, Neutral Threshold.
2) KDJ — Stochastic with J-line boost
What it is: A variation of the stochastic oscillator popular in Chinese trading systems
Logic used: K = SMA(Stochastic, smooth), D = SMA(K, smooth), J = 3K − 2D.
Bullish: K > D and |K−D| > 2
Bearish: K < D and |K−D| > 2
Neutral: |K−D| ≤ 2
Why: K–D separation filters tiny wiggles; J offers an “extreme” early-warning context in the value label.
Inputs: Length, Smoothing.
3) RSI — Momentum balance (0–100)
What it is: A momentum oscillator measuring speed and magnitude of price changes (0–100)
Logic used: RSI(N).
Bullish: RSI > 50 + Neutral Zone
Bearish: RSI < 50 − Neutral Zone
Neutral: Between those bands
Why: Centerline/adaptive bands (around 50) give a directional bias without relying on fixed 70/30.
Inputs: Length, Neutral Zone (± around 50).
4) LWR (Williams %R) — Overbought/Oversold
What it is: An oscillator similar to stochastic, measuring how close the close is to the high-low range over N periods
Logic used: %R over N bars (0 to −100).
Bullish: %R > −50 + Neutral Zone
Bearish: %R < −50 − Neutral Zone
Neutral: Between those bands
Why: Uses a centered band around −50 instead of only −20/−80, making it act like a directional filter.
Inputs: Length, Neutral Zone (± around −50).
5) BBI (Bull & Bear Index) — Smoothed trend bias
What it is: A composite moving average, essentially the average of several different moving averages (often 3, 6, 12, 24 periods)
Logic used: Average of 4 SMAs (3/6/12/24 by default):
BBI = (MA3 + MA6 + MA12 + MA24) / 4
Bullish: Close > BBI and |Close−BBI| > 0.2% of BBI
Bearish: Close < BBI and |diff| > threshold
Neutral: |diff| ≤ threshold
Why: Multiple MAs blended together reduce single-MA whipsaw. A dynamic 0.2% band ignores tiny drift.
Inputs: 4 lengths (default 3/6/12/24). Threshold is auto-scaled at 0.2% of BBI.
6) MTM (Momentum) — Rate of change in price
What it is: A simple measure of rate of change
Logic used: MTM = Close − Close
Bullish: MTM > 0.5% of Close
Bearish: MTM < −0.5% of Close
Neutral: |MTM| ≤ threshold
Why: A percent-based gate adapts across prices (e.g., $5 vs $500) and mutes insignificant moves.
Inputs: Length. Threshold auto-scaled to 0.5% of current Close.
Display & Inputs You Can Tweak
🎨 Use Neutral (Gray) Colors
ON (default): 3-color mode with clear “no-trade”/“weak” states.
OFF: classic binary (green/red) without neutral filtering.
Linton Price Targets(R)Linton Price Targets
A groundbreaking new way of projecting price targets and when they will be met in the future.
Point and figure charts have largely fallen out of favour in recent decades with the birth of personal computing and electronic data services. Few software systems calculate them correctly, and the technique is seen as outdated and difficult for the newcomer to technical analysis to understand. Linton Price Targets takes the point and figure methodology for producing vertical count targets and applies them to time-based charts that are much more widely used for technical analysis.
To place Point and figure price targets on a time-based chart, we first need to relate the conditions that produce the vertical count targets. Vertical Targets are only generated with uninterrupted moves off a high or a low point in prices. A pullback of at least 3 boxes locks the thrust column and therefore the price target. A move of at least one box above (in the case of an upside target off a low) or one box below (downside off a high) ‘activates’ the price target. Here the buyers and sellers respectively are confirmed. Conversely a move below the base of an upside target column, or above the top of a downside column ‘negates’ the vertical target. In this case, the buyers and sellers have been superseded by subsequent events.
Projecting Price
The price projection following the point and figure 3-Box method is relatively straightforward. The standard projection used is twice the original move from the top of the initial thrust level. This derives from the 3-Box construction devised by Cohen, whereby the initial thrust count is a third of the overall price count projection. But there is no reason to limit the Target Price Factor to the value to 2. A value of 1 could be used in the case of consolidation patten where the move out of the pattern is roughly equivalent to the move into the pattern. A value of 1.618 could be used for Fibonacci Retracements or Extensions or a value of 2 x log, can be used to deal with increasing box (unit) sizes as price changes.
Projecting Time
Projecting a potential price target with is relatively straight forward. Determining a time in the future when such a price target will be met is more of a challenge. This has been seen as one of the major drawbacks of point and figure charts for decades. Because there is no time axis on a Point and figure chart, there is no saying when a count projection target will be met.
For the Time to Target, we need to consider potential methodologies such as:
1. Price to Time Ratio – t units of price for every x units of time – ie $1 every 2 days
2. Thrust Angle Factor – a factor x the initial trust angle for the target angle
3. Time to Activation Factor – time to target is x the time taken for a target to activate
4. Follow the Price – track prices as the progress to target and adjust time to target accordingly
5. Historical Average Slope – historical average price time average for last n targets
Considering the Price to Time Ratio method, Chart 1 below shows a chart of the price targets for the US stock Applied Materials with a Unit size of $1. The targets are projected Log Scale 2x the initial thrust. From this chart we see that the target prices are reached later than the projection predicted. This means that we need to consider a lesser slope. Chart 2 below shows the same chart with the slope now adjusted to $1 every three days. This chart shows that recent targets for Applied Materials have been approximately met with this slope. Therefore, this is a better slope to use in this instance.
Chart 1 - Applied Materials (unit size $1) - target projection slope $1 every 2 days
Chart 2 - Applied Materials (unit size $1) - target projection slope $1 every 3 days
Chart 3 - Applied Materials (unit size $1) - target projection slope 1/2 initial thrust slope
The second method of projecting price targets assumes the time that a price target will be reached is directly related to the speed of the initial thrust, which generates the target. Chart 3 shows the same security as in the previous examples but using this method with an angle of slope which is half the initial thrust angle. The factor can also be altered with this method to best fit the data. In the previous examples (Charts 1 & 2) we see the slope of each of the targets is constant. Using the Thrust Angle Factor method, different buying and selling thrust angles produces different target slopes.
A third possible projection method assumes that the longer a price target takes to activate, the longer it takes for a target to be reached. The argument goes that the pullback from the initial thrust is more of a consolidation phase rather than a sharp reaction and therefore, the potential overall move will take longer. Chart 4 shows this method. Again, we see that, due to the varying times of price targets to activate, the slopes of the targets are not uniform as in Method 1 which uses a consistent price to time slope.
Chart 4: Applied Materials (unit size $1) – target projection x times the time taken for target to activate.
Chart 5: Applied Materials (unit size $1) – target projection readjusts with new price information
A fourth method for predicting when in the future that a price target might be met adjusts the slope of the targets from the activation point as new price information arrives. With multiple targets activated at different points on the chart, this method also produces price targets of different slopes. Because targets are readjusted with every new price, it is best to set this method to ignore the last x bars in order to spot any divergence from the targets. Chart 5 shows this methodology.
Chart 6 shows a method where the average slope of price over time is taken for the previous n targets that are achieved and used as the slope for projecting targets into the future. While the slopes for upward and downward targets can be separately adjusted with the previous methods mentioned, this method automatically calculates the different slope speeds of upside and downside targets.
Chart 6: Applied Materials (unit size $1) – target projection based on the average slope of the last x targets.
Multiple Price Targets
As with Point and figure count targets, multiple price targets point to the same price or price level increases the likelihood of price targets being met. This is known as ‘clustering’. Now with the ability to project price targets to a future date on a chart, it is not only possible to see clustering of the price of multiple targets, but also clustering of times targets may be met. This can lead to a ‘cluster zone’, an area of price and time in the future that multiple targets may be met. Chart 7 shows an example of this.
Chart 7: Applied Materials (unit size $1) – target zone of future price and time of multiple targets
Achievement and Non-Achievement of Price Targets and Prevailing Trend
Point and figure targets are approximate and are more often than not, not met precisely. They are regularly not achieved or exceeded, but this provides valuable information in itself. Upside price targets that are achieved or exceeded shows bullish confirmation, whereas these targets not being achieved indicates a degree of bearishness. Conversely, downside price targets achieved or exceeded is bearish confirmation and such targets not achieved is an indication of inherent bullishness.
Unsurprisingly, price targets are normally achieved or exceeded in line with the prevailing trend. Upside price targets should be given more weight in uptrends, while downside ones may only serve as a temporary moment for caution, because they are counter-trend. Downside Targets will carry more weight in downtrends. It is also often the case that the last target in line with the prevailing trend is never met as the trend changes and a new set of targets in the opposite direction are generated with the new reversal of trend. Active price targets in both directions are often an early sign of this. This is particularly true with multiple targets in the new trend direction verses one lone target in the previous trend direction. This lone target is likely to be negated, clearly signalling the new trend direction is taking hold.
Activation and Negation of Price Targets
An upside price target is only activated when prices rise a further than a full price unit above the top of the initial uninterrupted buying thrust in prices from a low. A low is defined by a price level at least one full price unit below a previous recent low. The pullback downwards of at least three price units ‘locks’ the initial thrust that generates the upside price target. Here the bulls buying from the bottom have been confirmed.
A downside price target is only activated when prices fall further than a full price unit below the bottom of the initial uninterrupted selling thrust in prices from a high. A high is defined by a price level at least one full price unit above a previous recent high. The pullback upwards of at least three price units ‘locks’ the initial thrust that generates the downside price target. Here the bears selling from the top have been confirmed.
A target is valid once the column is locked with the pullback of at least three units, but it should not be considered as active until the price breaks through the activation level. An unactivated target serves as advance notice that a target is in place and will become active once the activation price level is broken.
An upside price target is negated if prices fall below the bottom of the initial uninterrupted buying thrust in prices. In this instance the bulls have been beaten by the bears. Conversely, a downside price target is negated if prices rise above the top of the initial uninterrupted Selling thrust in prices. Here the bears selling from the top have been beaten by the bulls.
It is important to note the difference between a target that is activated first and then negated and a target that was never activated and negated first. Research shows that normally more than half of all negated targets were never activated and wouldn’t have been taken. Taking the prevailing trend into account further reduces the number of negated targets that would have been taken at the activation point.
Evaluating a Target as Price Progress
Because Linton Price targets can be evaluated with subsequent new price information with the passage of time, it becomes possible to see more easily, than on a point and figure chart, when a target might be failing. The ideas of activation, negation, and achievement of price targets are understood in point and figure charting and apply similarly here to time-based charts. But the ability to now see prices diverging from the target path presents us with some potential new states of a target. In the case of an upside target, if prices fall away or wander sideways from a target path this alerts us to the fact that the prices on their way to the target may be ‘exhausting’. If we fall or wander back below the target activation level, this implies the previous resistance level off the thrust high has not managed to become a new support level for the price. Consequently, we may consider that the target has been ‘de-activated’. If we fall further below the low of the pullback low point, this previous support level also failed to hold and this is providing us with an early warning that the target is quite possibly ‘failing.’ If prices are moving towards the target as expected, we can say the target is ‘in train.’ This is particularly appropriate for multiple targets that run parallel using the first price/time slope prediction method where the targets look like ‘train tracks.’
Improbable Targets
Occasionally an improbable target a long way from the price will be generated. This is particularly true using a log scale projection. Beware of a target that points to a very large change in price. This is especially true of a lone target. It is also quite likely that the unit size has been set too small where a bigger unit size may not produce a target at all.
Longer term charts
Point and figure charts have always meant to be constructed with tick data. The point and figure methodology reduces this down to just the ticks that create a new box on the chart. Long tick data price histories are typically expensive and hard to come by. This can also be an overwhelming amount data to store and analyse, particularly in the case of very liquid instruments such as a major currency pair. For intraday charts, one minute data will normally suffice. But these histories may not be long enough either and it may be necessary to use a 60-minute chart.
It is also possible to construct point and figure charts using high/low data or even open-high-low-close data making some assumptions based on a rising or falling candle, on which came first, the high or the low. The targets will be impacted accordingly.
When it comes to longer term charts such as weekly or monthly charts it is unlikely that these time frames would be used for point and figure charts. The construction method already filters the data. But when it comes to long-term time based charts it becomes necessary to look at weekly or monthly data.
You will also see that long term price upside targets are generated that are not on the daily chart. This is because daily the movements will not provide the same uninterrupted buying thrusts as with the monthly data. The daily pullbacks are effectively ignored when using monthly data. The other advantage is the unit size is now months so we can say that the target slope equates to 1% of price every month for a 1 to 1 slope for example. Using weekly or monthly data to construct the price targets is a significant departure from the traditional point and figure charting method.
Time-Based Charts Are Easier to Understand Than Point and Figure Charts
In recent years, the vast majority of people carrying out technical analysis of charts do not use the point and figure charts. This is partly because very few software systems draw them correctly and do not calculate the price targets. Newcomers to technical analysis find point and figure charts hard to understand.
Combining With Other Techniques
Using point and figure charts has also often meant the need to switch between different chart types for the same instrument. Time-based charts allow for a vast set of technical analysis time-series based techniques to be married with Linton Price Targets. Having different sets of analysis on the same chart can increase the power of the analysis without having to swap between different chart types.
Linton Price Targets builds on the technical analysis body of knowledge developed over the past 100 years by bringing an old, largely lost, technique into the modern age.
The main advantages of Linton Price Targets are:
• The ability to have price targets on time-based charts.
• It is now possible to ascertain when in the future a price target may be met.
• With the passage of time, it becomes clearer if a target track is being followed.
• The targets can be applied to longer-term time-based charts.
• Time-series based analysis techniques can be used on the same chart as the targets.
• The targets are much easier to understand for the newcomer to technical analysis.
BVB dominance bars
Hello everyone, this is my first indicator. these candles shows you who's in control. I like to think its some what close to heikin ashi candles as it shows you the Trend but doesn't average it out. also shows you when there is indecision. please read the instructions on how it works. its not a stand alone strategy. but adds value to your own strategy.
📖 How It Works
The BvB Dominance Bars indicator is a visual tool that colors candles based on market control—whether bulls or bears are in charge. It uses a custom metric comparing the price's relationship to a smoothed moving average (EMA), then normalizes that difference over time to express relative bullish or bearish pressure.
Here’s the breakdown:
Bulls vs Bears Logic:
A short-term EMA (default: 14-period) is used to establish a midpoint reference.
Bull Pressure is calculated as how far the high is above this EMA.
Bear Pressure is how far the low is below this EMA.
These are normalized over a lookback period (default: 120 bars) to produce percentile scores (0–100) for both bulls and bears.
Dominance & Color Coding:
The indicator compares normalized bull and bear scores.
Candles are color-coded based on:
Bright Lime: Strong Bull Dominance (with high confidence)
Soft Lime/Yellow: Moderate Bull Control
Bright Red: Strong Bear Dominance
Soft Red/Yellow: Moderate Bear Control
Gray: Neutral/Low conviction
Optional Live Label:
A small floating label shows who has control: “Bull Control,” “Bear Control,” or “Neutral.”
🧠 How to Use It (Example Strategy)
The BvB Dominance Bars indicator is not a standalone buy/sell signal but a market sentiment overlay. It’s most effective when combined with your own strategy, like price action or trend-following tools.
Here’s an example use case:
🧪 Reversal Confirmation Strategy
Objective: Catch high-probability reversals during key kill zones or supply/demand levels.
Setup:
Mark your key support/resistance zones using your standard method (e.g., FVGs, liquidity sweeps, or ICT PD arrays).
Wait for price to reach one of these zones.
Watch candle colors from the BvB Dominance Bars:
If you expect a bullish reversal, wait for a transition from red/gray candles to lime green or bright lime (bullish dominance taking over).
If you expect a bearish reversal, look for a change from green/gray to red or bright red.
Entry Filter:
Only enter if the dominant color holds for 2+ candles.
Avoid trades when candles are gray or yellow (indecision/neutral).
Exit Option:
Exit if dominance shifts against you (e.g., from lime to red), or use structure-based stops.
⚙️ Settings You Can Adjust:
BvB Period: Controls how fast EMA responds.
Bars Back: Determines how long the normalization looks back.
Thresholds: Influence how strong the dominance must be to change candle color.
✅ Best Used When:
You already have a bias and just want a confirmation of sentiment.
You're trading intraday and want a feel for shifting momentum without relying on noisy indicators.
You want a clean, color-coded overlay to help filter out fakeouts and indecision.
Multiple (12) Strong Buy/Sell Signals + Momentum
Indicator Manual: "Multiple (12) Strong Buy/Sell Signals + Momentum"
This indicator is designed to identify strong buy and sell signals based on 12 configurable conditions, which include a variety of technical analysis methods such as trend-following indicators, pattern recognition, volume analysis, and momentum oscillators. It allows for customizable alerts and visual cues on the chart. The indicator helps traders spot potential entry and exit points by displaying buy and sell signals based on the selected conditions.
Key Observations:
• The script integrates multiple indicators and pattern recognition methods to provide comprehensive buy/sell signals.
• Trend-based indicators like EMAs and MACD are combined with pattern recognition (flags, triangles) and momentum-based signals (RSI, ADX, and volume analysis).
• User customization is a core feature, allowing adjustments to the conditions and thresholds for more tailored signals.
• The script is designed to be responsive to market conditions, with multiple conditions filtering out noise to generate reliable signals.
________________________________________
Key Features:
1. 12 Combined Buy/Sell Signal Conditions: This indicator incorporates a diverse set of conditions based on trend analysis, momentum, and price patterns.
2. Minimum Conditions Input: You can adjust the threshold of conditions that need to be met for the buy/sell signals to appear.
3. Alert Customization: Set alert thresholds for both buy and sell signals.
4. Dynamic Visualization: Buy and sell signals are shown as triangles on the chart, with momentum signals highlighted as circles.
________________________________________
Detailed Description of the 12 Conditions:
1. Exponential Moving Averages (EMA):
o Conditions: The indicator uses EMAs with periods 3, 8, and 13 for quick trend-following signals.
o Bullish Signal: EMA3 > EMA8 > EMA13 (Bullish stack).
o Bearish Signal: EMA3 < EMA8 < EMA13 (Bearish stack).
o Reversal Signal: The crossing over or under of these EMAs can signify trend reversals.
2. MACD (Moving Average Convergence Divergence):
o Fast MACD (2, 7, 3) is used to confirm trends quickly.
o Bullish Signal: When the MACD line crosses above the signal line.
o Bearish Signal: When the MACD line crosses below the signal line.
3. Donchian Channel:
o Tracks the highest high and lowest low over a given period (default 20).
o Breakout Signal: Price breaking above the upper band is bullish; breaking below the lower band is bearish.
4. VWAP (Volume-Weighted Average Price):
o Above VWAP: Bullish condition (price above VWAP).
o Below VWAP: Bearish condition (price below VWAP).
5. EMA Stacking & Reversal:
o Tracks the order of EMAs (3, 8, 13) to confirm strong trends and reversals.
o Bullish Reversal: EMA3 < EMA8 < EMA13 followed by a crossing to bullish.
o Bearish Reversal: EMA3 > EMA8 > EMA13 followed by a crossing to bearish.
6. Bull/Bear Flags:
o Bull Flag: Characterized by a strong price movement (flagpole) followed by a pullback and breakout.
o Bear Flag: Similar to Bull Flag but in the opposite direction.
7. Triangle Patterns (Ascending and Descending):
o Detects ascending and descending triangles using pivot highs and lows.
o Ascending Triangle: Higher lows and flat resistance.
o Descending Triangle: Lower highs and flat support.
8. Volume Sensitivity:
o Identifies price moves with significant volume increases.
o High Volume: When current volume is significantly above the moving average volume (set to 1.2x of the average).
9. Momentum Indicators:
o RSI (Relative Strength Index): Confirms overbought and oversold levels with thresholds set at 65 (overbought) and 35 (oversold).
o ADX (Average Directional Index): Confirms strong trends when ADX > 28.
o Momentum Up: Momentum is upward with strong volume and bullish RSI/ADX conditions.
o Momentum Down: Momentum is downward with strong volume and bearish RSI/ADX conditions.
10. Bollinger & Keltner Squeeze:
o Squeeze Condition: A contraction in both Bollinger Bands and Keltner Channels indicates low volatility, signaling a potential breakout.
o Squeeze Breakout: Price breaking above or below the squeeze bands.
11. 3 Consecutive Candles Condition:
o Bullish: Price rises for three consecutive candles with higher highs and lows.
o Bearish: Price falls for three consecutive candles with lower highs and lows.
12. Williams %R and Stochastic RSI:
o Williams %R: A momentum oscillator with signals when the line crosses certain levels.
o Stochastic RSI: Provides overbought/oversold levels with smoother signals.
o Combined Signals: You can choose whether to require both WPR and StochRSI to signal a buy/sell.
________________________________________
User Inputs (Inputs Tab):
1. Minimum Conditions for Buy/Sell:
o min_conditions: Number of conditions required to trigger a buy/sell signal on the chart (1 to 12).
o Alert_min_conditions: User-defined alert threshold (how many conditions must be met before an alert is triggered).
2. Donchian Channel Settings:
o Show Donchian: Toggle visibility of the Donchian channel.
o Donchian Length: The length of the Donchian Channel (default 20).
3. Bull/Bear Flag Settings:
o Bull Flag Flagpole Strength: ATR multiplier to define the strength of the flagpole.
o Bull Flag Pullback Length: Length of pullback for the bull flag pattern.
o Bull Flag EMA Length: EMA length used to confirm trend during bull flag pattern.
Similar settings exist for Bear Flag patterns.
4. Momentum Indicators:
o RSI Length: Period for calculating the RSI (default 9).
o RSI Overbought: Overbought threshold for the RSI (default 65).
o RSI Oversold: Oversold threshold for the RSI (default 35).
5. Bollinger/Keltner Squeeze Settings:
o Squeeze Width Threshold: The maximum width of the Bollinger and Keltner Bands for squeeze conditions.
6. Stochastic RSI Settings:
o Stochastic RSI Length: The period for calculating the Stochastic RSI.
7. WPR Settings:
o WPR Length: Period for calculating Williams %R (default 14).
________________________________________
User Inputs (Style Tab):
1. Signal Plotting:
o Control the display and colors of the buy/sell signals, momentum indicators, and pattern signals on the chart.
o Buy/Sell Signals: Can be customized with different colors and shapes (triangle up for buys, triangle down for sells).
o Momentum Signals: Custom circle placement for momentum-up or momentum-down signals.
2. Donchian Channel:
o Show Donchian: Toggle visibility of the Donchian upper, lower, and middle bands.
o Band Colors: Choose the color for each band (upper, lower, middle).
________________________________________
How to Use the Indicator:
1. Adjust Minimum Conditions: Set the minimum number of conditions that must be met for a signal to appear. For example, set it to 5 if you want only stronger signals.
2. Set Alert Threshold: Define the number of conditions needed to trigger an alert. This can be different from the minimum conditions for visual signals.
3. Customize Appearance: Modify the colors and styles of the signals to match your preferences.
________________________________________
Conclusion:
This comprehensive trading indicator uses a combination of trend-following, pattern recognition, and momentum-based conditions to help you spot potential buy and sell opportunities. By adjusting the input settings, you can fine-tune it to match your specific trading strategy, making it a versatile tool for different market conditions.
Signal Reliability Based on Condition Count
The reliability of the buy/sell signals increases as more conditions are met. Here's a breakdown of the probabilities:
1. 1-3 Conditions Met: Lower Probability
o Signals that meet only 1-3 conditions tend to have lower reliability and are considered less probable. These signals may represent false positives or weaker market movements, and traders should approach them with caution.
2. 4 Conditions Met: More Reliable Signal
o When 4 conditions are met, the signal becomes more reliable. This indicates that multiple indicators or market patterns are aligning, increasing the likelihood of a valid buy/sell opportunity. While not foolproof, it's a stronger indication that the market may be moving in a particular direction.
3. 5-6 Conditions Met: Strong Signal
o A signal meeting 5-6 conditions is considered a strong signal. This indicates a well-confirmed move, with several technical indicators and market factors aligning to suggest a higher probability of success. These are the signals that traders often prioritize.
4. 7+ Conditions Met: Rare and High-Confidence Signal
o Signals that meet 7 or more conditions are rare and should be considered high-confidence signals. These represent a significant alignment of multiple factors, and while they are less frequent, they are highly reliable when they do occur. Traders can be more confident in acting on these signals, but they should still monitor market conditions for confirmation.
________________________________________
You can adjust the number of conditions as needed, but this breakdown should give a clear structure on how the signal strength correlates with the number of conditions met!
Uptrick: Oscillator SpectrumUptrick: Oscillator Spectrum is a versatile trading tool designed to bring together multiple aspects of technical analysis—oscillators, momentum signals, divergence checks, correlation insights, and more—into one script. It includes customizable overlays and alert conditions intended to address a wide range of market conditions and trading styles.
Developed in Pine Script™, Uptrick: Oscillator Spectrum represents an extended version of the classic Ultimate Oscillator concept. It consolidates short-, medium-, and long-term momentum readings, applies correlation analysis across different symbols, and offers optional table-based metrics to provide traders with a more structured overview of potential trade setups. Whether used alongside your existing charts or as a standalone toolkit, it aims to build on and enhance the functionality of the standard Ultimate Oscillator.
### A Few Key Features
- Momentum Insights: Multiple timeframes for oscillators, plus buy/sell signal modes for flexible identification of overbought/oversold situations or crossovers.
- Divergence Detection: Automated checks for bullish/bearish divergences, aiming to help traders spot potential shifts in momentum.
- Correlation Meter: A visual histogram summarizing how selected assets are collectively trending. It is useful for tracking the bigger market picture.
- Gradient Overlays & Bar Coloring: Dynamic color transitions designed to emphasize changes in momentum, trend shifts, and overall sentiment without cluttering the chart.
- Money Flow Tracker: Tracks the flow of money into and out of the market using a smoothed Money Flow Index (MFI). Highlights overbought/oversold conditions with dynamic bar coloring and visual gradient fills, helping traders assess volume-driven sentiment shifts.
- Advanced Table Metrics: An optional table showing return on investment (ROI), collateral risk, and other contextual metrics for supported assets.
- Alerts & Automation: Configurable alerts covering divergence events, crossing of critical levels, and more, helping to keep traders informed of developments in real time.
### Intended Usage
- For Multiple Markets: Works on various markets (cryptocurrencies, forex pairs, stocks) to deliver a consistent view of momentum, potential entry/exit signals, and correlation.
- Adaptable Trading Styles: With customizable input settings, you can enable or disable specific features to align with your preferred strategies—intraday scalping, swing trading, or position holding.
By combining these elements under one indicator, Uptrick: Oscillator Spectrum allows traders to streamline analysis workflows, helping them stay focused on interpreting market moves and making informed decisions rather than juggling multiple scripts.
Purpose
Purpose of the “Uptrick: Oscillator Spectrum” Indicator
The “Uptrick: Oscillator Spectrum” indicator is intended to bring together several technical analysis elements into one tool. It combines oscillator-based momentum readings across different lookback periods, checks for potential divergences, provides optional buy/sell signal triggers, and offers correlation-based insights across multiple symbols. Additionally, it includes features such as bar coloring, gradient visualization, and user-configurable alerts to help highlight various market conditions.
By consolidating these functions, the script aims to help users systematically observe changing momentum, identify when prices reach user-defined overbought or oversold levels, detect when oscillator movements diverge from price, and examine whether different assets are aligning or diverging in their trends. The indicator also allows for optional advanced metric tables, which can supply further context on risk, ROI calculations, or other factors for supported assets. Overall, the script’s purpose is to organize multiple layers of technical analysis so that users have a structured way to evaluate potential trade opportunities and market behavior.
## Usage Guide
Below is an outline of how you can utilize the various components and features of Uptrick: Oscillator Spectrum in your charting workflow.
---
### 1. Using the Core Oscillator
- Basic View: By default, the script calculates a multi-timeframe oscillator (commonly displayed as the “Ultimate Oscillator”). This oscillator combines short-, medium-, and long-term measurements of buying pressure and true range.
- Overbought/Oversold Zones: You can configure thresholds (e.g., 70 for overbought, 30 for oversold) to help identify potential turning points. When the oscillator crosses these levels, it may indicate that price is extended in one direction.
- You can use the colors of the main oscillator to help you take short-term trades as well: cyan : Buy , red: Sell
- Alerts: If you enable alerts, the indicator can notify you when the oscillator crosses above or below your chosen overbought/oversold boundaries or when you get buy/sell signals.
---
### 2. Buy/Sell Signals in Overlay Modes
Uptrick: Oscillator Spectrum provides several signal modes and a choice between overlay true and overlay false or both. Additionally, you can pick which “line” (data source) the script uses to generate signals. This is set in the “Line to Analyze” dropdown, which includes Oscillator, HMA of Oscillator, and Moving Average. The following sections describe how each piece fits together.
---
#### Line to Analyze - Overlay Flase: Oscillator / HMA of Oscillator / Moving Average
1. Oscillator
- The core momentum reading, reflecting short-, medium-, and long-term periods combined.
2. HMA of Oscillator
- Applies a Hull Moving Average to the oscillator, creating a smoother but still responsive curve.
- Signals will be derived from this smoothed line. Some traders find it filters out minor fluctuations while remaining quicker to react than standard averages.
3. Moving Average
- Uses a user-selected MA type (SMA, EMA, WMA, etc.) over the oscillator values, rather than the raw oscillator itself.
- Tends to be more stable than the raw oscillator, but might delay signals more depending on the chosen MA settings.
---
#### Signal Modes
Regardless of which line you choose to analyze, you can use one of the following seven signal modes in overlay being true:
1. Overbought/Oversold (Pyramiding)
- What It Does:
- Buy signal when the chosen line crosses below the oversold threshold.
- Sell signal when it crosses above the overbought threshold.
- Pyramiding:
- Allows multiple triggers within the same overbought/oversold event.
2. Overbought/Oversold (Non Pyramiding)
- What It Does:
- Same thresholds but only one signal per oversold or overbought event.
- Use Case:
- Prevents repeated signals and chart clutter.
3. Smoothed MA Middle Crossover
- What It Does:
- Uses an MA defined by the user.
- Buy when crossing above the midpoint (50), Sell when crossing below.
- Use Case:
- Generates fewer signals, focusing on broader momentum shifts. There is no pyramiding.
In this image ,for example, the VWMA is used with length of 14 to identify buy sell signals.
4. Crossing Above Overbought/Below Oversold (Non Pyramiding)
- What It Does:
- Buy occurs if the line exits oversold territory by crossing back above it.
- Sell occurs if the line exits overbought territory by crossing back below it.
- Non Pyramiding:
- Restricts repeated signals until conditions reset.
5. Crossing Above Overbought/Below Oversold (Pyramiding)
- What It Does:
- Same thresholds, but allows multiple signals if the line repeatedly dips in and out of overbought or oversold.
- Use Case:
- More frequent entries/exits for active traders.
6. Divergence (Non Pyramiding)
- What It Does:
- Identifies bullish or bearish divergences using the chosen line vs. price.
- Buy for bullish divergence (higher low on the line vs. lower low on price), Sell for bearish divergence.
- Single Trigger:
- Only one signal per identified divergence event. (non pyramiding)
7. Divergence (Pyramiding)
- What It Does:
- Same divergence logic but triggers multiple times if the script sees repeated divergence in the same direction.
- Use Case:
- Could suit traders who layer positions during sustained divergence scenarios.
#### Overlay Modes: True vs. False
1. Overlay True
- Buy/sell arrows or labels plot directly on the main price chart, often at or near candlesticks.
- Bar Coloring:
- Can turn the candlestick bars green (buy) or red (sell), with intensity reflecting signal recency if bar coloring is enabled for this mode. (read below.)
- Advantage:
- Everything (price, signals, bar colors) is in one spot, making it straightforward to associate signals with current market action. You can adjust the periods of the main oscillator or lookback periods of divergences or overbought/oversold thresholds, to play around with your signals.
2. Overlay False
- Signal Placement:
- Signals appear in a sub-window or oscillator panel, leaving the main price chart uncluttered.
- Bar Coloring:
- You may still enable bar colors on the main chart (green for buy, red for sell) if desired.
- Alternatively, you can keep them neutral if you prefer a completely separate display of signals.
- Advantage:
- Clear separation of price action from signals, useful for cleaner charts or if using multiple overlay-based tools.
At the bottom are the signals for overlay being false and on the chart are the signals for overlay being true:
#### Bar Color Adjustments
1. Coloring Logic
- Bars typically go green on buy signals, red on sell signals.
- The opacity or brightness can vary to indicate signal freshness. When a new signal is formed, the color gets brighter. When there is no signal for a longer period of time, then the color slowly fades.
2. Enabling Bar Coloring
- In the indicator’s settings, turn on Bar Coloring.
- Choose “Signals Overlay True” or “Signals Overlay False” from the “Color should depend on:” dropdown, depending on which overlay approach you want to drive your bar colors. You can also chose the cloud fill in overlay false, correlation meter and smoothed HMA to color bars. Read more below:
### Bar Color Options:
When you enable bar coloring in Uptrick: Oscillator Spectrum, you can select which component or signal logic drives the color changes. Below are the five available choices:
---
#### Option 1: Overlay True Signals
- What It Does:
- Uses signals generated under the Overlay True mode to color the bars on your main chart.
- If a buy signal is triggered, bars turn green. If a sell signal occurs, bars turn red.
- Color Intensity:
- Bars appear brighter (more opaque) immediately after a new signal fires, then gradually fade over subsequent bars if no new signal appears.
---
#### Option 2: Overlay False Signals
- What It Does:
- Links bar coloring to signals generated when Overlay False mode is active.
- Buy/sell labels typically plot in a separate sub-window instead of the main chart, but your price bars can still change color based on these signals.
- Color Intensity:
- Similar to Overlay True, new buy/sell signals yield stronger color intensity, which fades over time.
- Use Case:
- Helps maintain a clean main chart (with signals off-chart) while still providing an immediate color-coded indication of a buy or sell state.
- Particularly useful if you prefer less clutter from signal markers on your price chart yet still want a visual representation of signal timing.
In this example normal divergence Pyramiding Signals are used in the overlay being true and the signals in overlay false are signals that analyze the HMA. This can help clear out noise (using a combo of both).
Option 3: Money Flow Tracker
What It Does:
The Money Flow Tracker uses the Money Flow Index (MFI), a volume-weighted oscillator, to measure the strength of money flowing into or out of an asset. The script smooths the raw MFI data using an EMA for a more responsive and visually intuitive output.
The feature also includes dynamic color gradients and bar coloring that highlight whether money flow is positive or negative.
Green Fill/Bar Color: Indicates positive money flow, suggesting potential accumulation.
Red Fill/Bar Color: Indicates negative money flow, signaling potential distribution.
Overbought and oversold thresholds are dynamically emphasized with transparency, making it easier to identify high-confidence zones.
Use Case:
Ideal for traders focusing on volume-driven sentiment to identify turning points or confirm existing trends.
Suitable for assessing broader market conditions when used alongside other indicators like oscillators or correlation analysis.
Provides additional clarity in spotting areas of accumulation or distribution, making it a valuable complement to price action and momentum studies.
---
#### Option 4: Correlation Meter
- What It Does:
- Colors the bars based on the indicator’s Correlation Meter output. The script checks multiple chosen tickers and sums up how many are trending positively or negatively.
- If the meter indicates an overall bullish bias (e.g., more than three assets in uptrend), bars turn green; if it’s bearish, bars turn red.
- Trend Readings:
- The correlation meter typically plots a histogram of bullish/neutral/bearish states. The bar color option links your chart’s candlestick coloring to that higher-level market sentiment.
- Use Case:
- Useful for traders wanting a quick visual prompt of whether the broader market (or a selection of related assets) is bullish or bearish at any given time.
- Helps avoid signals that conflict with the market majority.
#### Option 5: Smoothed HMA
- What It Does:
- Bar colors are driven by the slope or state of the Hull Moving Average (HMA) of the oscillator, rather than individual buy/sell triggers or correlation data.
- If the HMA indicates a strong upward slope (possibly darkening), bars may turn green; if the slope is downward (purple in the HMA line), bars turn red.
- Use Case:
- Ideal for those who focus on momentum continuity rather than discrete signals like overbought/oversold or divergence.
- May help identify smoother, more sustained moves, as the HMA filters out minor oscillations.
---
### 3. Using the Hull Moving Average (HMA) of the Oscillator
- HMA Calculation: You can enable a dedicated Hull Moving Average (HMA) for the oscillator. This creates a smoother line of the same underlying momentum reading, typically responding more quickly than classic moving averages.
- Color Intensity: As the HMA sustains an uptrend or downtrend, the script can adjust the line’s color. When slope momentum persists in one direction, the color appears more opaque. This intensification can hint that the existing direction may be well-established.
- Reversal Potential: If you observe the HMA color shifting or darkening after multiple bars of slope in the same direction, it may indicate increasing momentum. Conversely, a sudden flattening or change in color can be a clue that momentum is waning.
---
### 4. Moving Average Overlays & Gradient Cloud
- Oscillator MA: The script allows you to apply moving average types (SMA, EMA, SMMA, WMA, or VWMA) to the core oscillator, rather than to price. This can smooth out noise in the oscillator, potentially highlighting more consistent momentum shifts.
- Gradient Cloud: You can also enable a cloud in overlay true between two moving averages (for instance, a Hull MA and a Double EMA) on the price chart. The cloud fills with different colors, depending on which MA is above the other. This can provide a quick visual reference to bullish or bearish areas.
---
### 5. Divergence Detection
- Bullish & Bearish Divergence: By toggling “Calculate Divergence,” the script looks for oscillator pivots that contrast with price pivots (e.g., price making a lower low while the oscillator makes a higher low).
- A divergence is when the price makes an opposite pivot to the indicator value. E.g. Price makes lower low but indicator does higher low - This suggests a bullish divergence. THe opposite is for a bearish divergence.
- Visual Labels: When a divergence is found, labels (such as “Bull” or “Bear”) appear on the oscillator. This helps you see if the oscillator’s momentum patterns differ from the price movement.
- Filtering Signals: You can combine divergence signals with other features like overbought/oversold or the HMA slope to refine potential entries or exits.
---
### 6. Correlation & Multi-Ticker Analysis
- Correlation Meter: You can select up to five tickers in the settings. The script calculates a slope-based metric for each, then combines those metrics to show an overall bullish or bearish tendency (displayed as a histogram).
- Bar Coloring & Overlay: If you activate correlation-based bar coloring, it will reflect the broader trend alignment among the selected assets, potentially indicating when most are trending in the same direction.
- Use Case: If you trade multiple markets, the correlation histogram can help you quickly see if several major assets support the same market bias or are diverging from one another.
—
### 7. Money Flow Tracker
Money Flow Calculation: The Money Flow Tracker calculates the Money Flow Index (MFI) based on price and volume data, factoring in buying pressure and selling pressure. The output is smoothed using a low-lag EMA to reduce noise and enhance usability.
Visual Features:
Dynamic Gradient Fill:
The space between the smoothed MFI line and the midline (set at 50) is filled with a gradient.
Above 50: Green gradient, with intensity increasing as the MFI moves further above the midline.
Below 50: Red gradient, with intensity increasing as the MFI moves further below the midline.
This gradient provides a clear visual representation of money flow strength and direction, making it easier to assess sentiment shifts at a glance.
Overbought/Oversold Levels: Default thresholds are set at 70 (overbought) and 30 (oversold). When the MFI crosses these levels, it signals potential reversals or trend continuations.
Bar Coloring:
Bars turn green for positive money flow and red for negative money flow.
Color intensity fades over time, ensuring recent signals stand out while older ones remain visible without dominating the chart.
Alerts:
Alerts are triggered when the Money Flow Tracker crosses into overbought or oversold zones, keeping traders informed of critical conditions without constant monitoring.
Practical Applications:
Trend Confirmation: Use the Money Flow Tracker alongside the oscillator or HMA to confirm trends or identify potential reversals.
Volume-Based Reversal Signals: Spot turning points where price action aligns with shifts in money flow direction.
Sentiment Analysis: Gauge whether market participants are accumulating (positive flow) or distributing (negative flow) assets, offering an additional layer of insight into price movement.
(Space for an example chart: “Money Flow Tracker with gradient fills and overbought/oversold levels”)
### 8. Putting It All Together
- Combining Signals: A practical approach might be to watch for a bullish divergence in the oscillator, confirm it with a shift in the HMA slope color, and then wait for the price to be near or below oversold conditions. The correlation histogram may further confirm if the broader market is also leaning bullish at that time.
- Visual Cues: Bar coloring adds another layer, making your chart easier to interpret at a glance. You can also set alerts to ensure you don’t miss key events like divergences, crossovers, or moving average flips.
- Flexibility: Not every feature needs to be used simultaneously. You might opt to focus on divergences and overbought/oversold signals, or you could emphasize the correlation histogram and bar colors. The settings let you enable or disable each module to suit your style.
---
### 9. Tips for Customization
- Adjust Periods: Shorter periods can yield more signals but also more noise. Longer periods may provide steadier, but fewer, signals.
- Set Appropriate Alert Conditions: Only alert on events most relevant to your strategy to avoid overload.
- Explore Different MAs: Depending on the instrument, some moving average types may give a smoother or more responsive indication.
- Monitor Risk Management: As with any tool, these signals do not guarantee performance, so consider position sizing and stop-loss strategies.
---
By toggling and experimenting with the features described above—buy/sell signals, divergences, moving averages, dynamic gradient clouds, and correlation analysis—you can tailor Uptrick: Oscillator Spectrum to your specific trading approach. Each module is designed to give you a clearer, structured view of potential momentum shifts, overbought or oversold states, and the alignment or divergence of multiple assets.
## Features Explanation
Below is a detailed overview of key features in Uptrick: Oscillator Spectrum. Each component is designed to provide different angles of market analysis, allowing you to customize the tool to your preferences.
---
### 1. Main Oscillator
- Purpose: The primary oscillator in this script merges short-, medium-, and long-term views of buying pressure and true range into a single line.
- Calculation: It weights each period’s contribution (e.g., a heavier focus on the short period if desired) and normalizes the result on a 0–100 scale, where higher readings may suggest more robust momentum. (like from the classic Ultimate Oscillator)
- Practical Use:
- Traders can watch for overbought/oversold conditions at user-defined thresholds (e.g., 70/30).
- It can also provide a straightforward momentum reading for those who prefer to see if momentum is rising, falling, or leveling off.
---
### 2. HMA of the Smoothed Oscillator
- What It Is: A Hull Moving Average (HMA) applied to the main oscillator values. The HMA is often more responsive than standard MAs, offering smoother lines while preserving relatively quick reaction to changes.
- How It Works:
- The script takes the oscillator’s output and processes it through a Hull MA calculation.
- The HMA’s slope and color can change more dynamically, highlighting sharper momentum shifts.
- Why It’s Useful:
- By smoothing out minor fluctuations, the HMA can highlight trends in the oscillator’s trajectory.
- If you see an extended run in the HMA slope, it may indicate a more persistent trend in momentum.
- Color Intensity:
- As the HMA continues in one direction for several bars, the script can intensify the color, signaling stronger or more sustained momentum in that direction.
- Sudden changes in color or slope can signal the start of a new momentum swing.
---
### 3. Gradient Fill
This script uses two gradient-based visual elements:
1. Shining/Layered Gradient on the Main Oscillator
- Purpose: Adds multiple layers around the oscillator line (above and below) to emphasize slope changes and highlight how quickly the oscillator is moving up or down.
- Color Changes:
- When the oscillator rises, it uses a color scheme (e.g., aqua/blue) that intensifies as the slope grows.
- When the oscillator declines, it uses a distinct color (e.g., red/pink).
- User Benefit: Makes it easier to see at a glance if momentum is accelerating or decelerating, beyond just the numerical reading.
2. Dynamic Cloud Fill (Between MAs)
- Purpose: Allows you to plot two moving averages (for example, a short-term Hull MA and a longer-term DEMA) and fill the area between them with a color gradient.
- Bullish vs. Bearish:
- When the short MA is above the long MA, the cloud might appear in a greenish hue.
- When the short MA is below the long MA, the cloud can switch to red or another color.
- Transparency/Intensity:
- The fill can get more opaque if the difference between the two MAs is large, indicating a stronger trend but a higher probability of a reversal.
- User Benefit: Helps visualize changes in trend or momentum across multiple time horizons, all within a single chart overlay.
---
### 4. Correlation Meter & Symbol Inputs
- What It Is: This feature looks at multiple user-selected symbols (e.g., BTC, ETH, BNB, etc.) and computes each symbol’s short-term slope. It then aggregates these slopes into an overall “trend” score.
- Inputs Configuration:
1. Ticker Inputs: You can specify up to five different tickers.
2. Timeframe: Decide whether to pull data from different chart timeframes for each symbol.
3. Slope Calculation: The script may compute, for instance, a 5-period SMA minus a 20-period SMA to gauge if each symbol is trending up or down.
- Market Trend Histogram:
- Displays a column that goes above/below zero depending on how many symbols are bullish or bearish.
- If more than three (out of five) symbols are bullish, the histogram can show a green bar at +1; if fewer than three are bullish, it can show red at –1.
- How to Use:
- Quick Glance: Lets you know if most correlated assets are aligning or diverging.
- Bar Coloring (Optional): If enabled, your main chart’s bars can reflect the aggregated correlation, turning green or red depending on the meter’s reading.
---
### 5. Advanced Metrics Table
- What It Is: An optional table displaying additional metrics for several cryptocurrencies (or any symbols you define).
- Metrics Included:
1. ROI (30D): Calculates return relative to the lowest price in a 30-day period.
2. Collateral Risk: Uses standard deviation to assess volatility (higher risk if standard deviation is large).
3. Liquidity Recovery: A rolling average of volume, aiming to show how liquidity flows might recover over time.
4. Weakening (Rate of Change): Reflects how quickly price is changing compared to previous bars.
5. Monetary Bias (SMA): A simple average of recent prices. If price is below this SMA, it might be seen as undervalued relative to the short term.
6. Risk Phase: Categorizes risk as low, medium, or high based on the standard deviation figure.
7. DCA Signal: Suggests “Accumulate” or “Do Not Accumulate” by checking if the current price is below or above the SMA.
- Why It’s Useful:
- Offers a concise view of multiple assets in one place—helpful for portfolio-level insight.
- DCA (Dollar-Cost Averaging) suggestions can guide longer-term strategies, while volatility (collateral risk) helps gauge how aggressive the price swings might be.
---
### 6. Other Vital Aspects
- Alerts & Notifications:
- The script can trigger alerts for various conditions—crossovers, divergence detections, overbought/oversold transitions, or correlation-based signals.
- Useful for automating watchlists or ensuring you don’t miss a key setup while away from the screen.
- Customization:
- Each module (oscillator settings, divergence detection, correlation meter, advanced metrics table, etc.) can be enabled or disabled based on your preferences.
- You can fine-tune parameters (e.g., periods, smoothing lengths, alert triggers) to align the indicator with different trading styles—scalping, swing, or position trading.
- Combining Features:
- One might watch the main oscillator for momentum extremes, confirm via the HMA slope, check if correlation supports the same bias, and look at the table for risk-phase validation.
- This multi-layer approach can help develop a more structured and informed trading view.
(Space for an example chart: “A fully configured layout showing oscillator, HMA, gradient cloud, correlation meter, and table all in use.”)
7. Money Flow Tracker
Purpose: The Money Flow Tracker adds a volume-based perspective to the indicator suite by incorporating the Money Flow Index (MFI), which assesses buying and selling pressure over a defined period. By smoothing the MFI using an exponential moving average (EMA), the feature highlights the directional flow of capital into and out of the market with greater clarity and reduced noise.
Dynamic Gradient Visualization:
The Money Flow Tracker enhances visual analysis with gradient fills that reflect the MFI’s relationship to the midline (50).
Above 50: A green gradient emerges, intensifying as the MFI moves higher, indicating stronger positive money flow.
Below 50: A red gradient appears, with deeper shades signifying increasing selling pressure.
Transparency dynamically adjusts based on the MFI’s proximity to the midline, making high-confidence zones (closer to 0 or 100) visually distinct.
Directional Sensitivity:
The Tracker emphasizes the importance of overbought (above 70) and oversold (below 30) zones. These thresholds help traders identify when an asset might be overextended, signaling potential reversals or trend continuations.
The inclusion of a midline (50) as a neutral zone helps gauge shifts between accumulation (money flowing in) and distribution (money flowing out).
Bar Integration:
By enabling bar coloring linked to the Money Flow Tracker, traders can visualize its impact directly on price bars.
Green bars reflect positive money flow (above 50), signaling bullish conditions.
Red bars indicate negative money flow (below 50), highlighting bearish sentiment.
Intensity adjustments ensure that recent signals are more visually prominent, while older signals gradually fade for a clean, non-cluttered chart.
Key Advantages:
Volume-Informed Context: Traditional oscillators often focus solely on price; the Money Flow Tracker incorporates volume, adding a crucial dimension for analyzing market behavior.
Adaptive Filtering: The EMA-smoothing feature ensures that sudden, insignificant spikes in volume don’t trigger false signals, providing a clearer and more actionable representation of money flow trends.
Early Warning System: Divergences between price movement and the Money Flow Tracker’s trends can signal potential turning points, helping traders anticipate reversals before they occur.
Practical Use Cases:
Trend Confirmation: Pair the Money Flow Tracker with the oscillator or HMA to confirm bullish or bearish trends. For example, a rising oscillator with positive money flow indicates strong buying interest.
Identifying Entry/Exit Zones: Use overbought/oversold conditions as entry/exit points, particularly when combined with other features like divergence detection.
Market Sentiment Analysis: The Tracker’s ability to dynamically assess buying and selling pressure provides a clear picture of market sentiment, helping traders adjust their strategies to align with broader trends.
By understanding these features—main oscillator readings, the HMA’s smoothing capabilities, gradient-based visual highlights, correlation insights, advanced metrics, and the money flow tracker—you can tailor Uptrick: Oscillator Spectrum to your specific needs, whether you’re focusing on quick trades, longer-term market moves, or broad portfolio health.
Originality of the “Uptrick: Oscillator Spectrum” Indicator
While it includes elements of standard momentum analysis, Uptrick: Oscillator Spectrum sets itself apart by adding an array of features that broaden the typical oscillator’s scope:
1. Slope Coloring & Layered Gradient Effects
- Beyond just plotting a single line, the indicator visually highlights momentum shifts using color changes and gradient fills.
- As the oscillator’s slope becomes steeper or flatter, these gradients intensify or fade, helping users see at a glance when momentum is accelerating, slowing, or reversing.
2. Mean Reversion & Divergence Detection
- The script offers optional logic for marking potential mean reversion points (e.g., overbought/oversold crossovers) and flagging divergences between price and the oscillator line.
- These divergence signals come with adjustable lookback parameters, giving traders control over how recent or extended the pivots should be for detection.
- This functionality can reveal subtle momentum discrepancies that a basic oscillator might overlook.
3. Integrated Multi-Asset Correlation Meter
- In addition to monitoring a single symbol, the indicator can fetch data for multiple tickers. It aggregates each symbol’s slope into a histogram showing whether the broader market (or a group of assets) leans bullish or bearish.
- This cross-market insight moves beyond standard “one-symbol, one-oscillator” usage, adding a bigger-picture perspective in one tool.
4. Advanced Metrics Table
- Users can enable a table that covers ROI calculations, volatility-based risk (“Collateral Risk”), liquidity checks, DCA signals, and more.
- Rather than just seeing an oscillator value, traders can view additional metrics for selected assets in one place, helping them judge overall market conditions or assess multiple instruments simultaneously.
5. Flexible Overlay & Bar Coloring
- Signals can be displayed directly on the price chart (Overlay True) or in a sub-window (Overlay False).
- Bars themselves may change color (e.g., green for bullish or red for bearish) according to different rules—signals, dynamic cloud fill, correlation meter states, etc.
- This adaptability allows traders to keep the chart as simple or as info-rich as they prefer.
6. Custom Smoothing Options & HMA Extensions
- The oscillator can be processed further with a Hull Moving Average (HMA) to reduce noise while still reacting quickly to market changes.
- Slope-based coloring on the HMA provides an additional layer of visual feedback, which is not common in a standard oscillator.
By blending traditional momentum checks with slope-based color feedback, mean reversion triggers, divergence signals, correlation analysis, and an optional metrics table, Uptrick: Oscillator Spectrum offers a more rounded approach than a typical oscillator. It integrates multiple market insights—both visual and analytical—into one script, giving users a broader toolkit for studying potential reversals, gauging momentum strength, and assessing multi-asset trends.
## Conclusion
Uptrick: Oscillator Spectrum brings together multiple layers of analysis—oscillator momentum, divergence detection, correlation insights, HMA smoothing, and more—into one adaptable toolkit. It aims to streamline your charting process by offering meaningful visual cues (such as gradient fills and bar color shifts), advanced tables for broader market data, and flexible alerts to keep you informed of potential setups.
Traders can choose the specific features that suit their style, whether they prefer to focus on raw oscillator signals, multi-ticker correlation, or smooth trend cues from the HMA. By centralizing these different methods in one place, Uptrick: Oscillator Spectrum can help users build more structured approaches to spotting trend shifts and extended conditions, while also remaining compatible with additional analysis techniques.
---
### Disclaimer
This script is provided for informational purposes only and does not constitute financial or investment advice. Past performance is not indicative of future results, and all trading involves risk. You should carefully consider your objectives, risk tolerance, and financial situation before making any trading decisions.
AI Momentum [YinYang]Overview:
AI Momentum is a kernel function based momentum Indicator. It uses Rational Quadratics to help smooth out the Moving Averages, this may give them a more accurate result. This Indicator has 2 main uses, first it displays ‘Zones’ that help you visualize the potential movement areas and when the price is out of bounds (Overvalued or Undervalued). Secondly it creates signals that display the momentum of the current trend.
The Zones are composed of the Highest Highs and Lowest lows turned into a Rational Quadratic over varying lengths. These create our Rational High and Low zones. There is however a second zone. The second zone is composed of the avg of the Inner High and Inner Low zones (yellow line) and the Rational Quadratic of the current Close. This helps to create a second zone that is within the High and Low bounds that may represent momentum changes within these zones. When the Rationalized Close crosses above the High and Low Zone Average it may signify a bullish momentum change and vice versa when it crosses below.
There are 3 different signals created to display momentum:
Bullish and Bearish Momentum. These signals display when there is current bullish or bearish momentum happening within the trend. When the momentum changes there will likely be a lull where there are neither Bullish or Bearish momentum signals. These signals may be useful to help visualize when the momentum has started and stopped for both the bulls and the bears. Bullish Momentum is calculated by checking if the Rational Quadratic Close > Rational Quadratic of the Highest OHLC4 smoothed over a VWMA. The Bearish Momentum is calculated by checking the opposite.
Overly Bullish and Bearish Momentum. These signals occur when the bar has Bullish or Bearish Momentum and also has an Rationalized RSI greater or less than a certain level. Bullish is >= 57 and Bearish is <= 43. There is also the option to ‘Factor Volume’ into these signals. This means, the Overly Bullish and Bearish Signals will only occur when the Rationalized Volume > VWMA Rationalized Volume as well as the previously mentioned factors above. This can be useful for removing ‘clutter’ as volume may dictate when these momentum changes will occur, but it can also remove some of the useful signals and you may miss the swing too if the volume just was low. Overly Bullish and Bearish Momentum may dictate when a momentum change will occur. Remember, they are OVERLY Bullish and Bearish, meaning there is a chance a correction may occur around these signals.
Bull and Bear Crosses. These signals occur when the Rationalized Close crosses the Gaussian Close that is 2 bars back. These signals may show when there is a strong change in momentum, but be careful as more often than not they’re predicting that the momentum may change in the opposite direction.
Tutorial:
As we can see in the example above, generally what happens is we get the regular Bullish or Bearish momentum, followed by the Rationalized Close crossing the Zone average and finally the Overly Bullish or Bearish signals. This is normally the order of operations but isn’t always how it happens as sometimes momentum changes don’t make it that far; also the Rationalized Close and Zone Average don’t follow any of the same math as the Signals which can result in differing appearances. The Bull and Bear Crosses are also quite sporadic in appearance and don’t generally follow any sort of order of operations. However, they may occur as a Predictor between Bullish and Bearish momentum, signifying the beginning of the momentum change.
The Bull and Bear crosses may be a Predictor of momentum change. They generally happen when there is no Bullish or Bearish momentum happening; and this helps to add strength to their prediction. When they occur during momentum (orange circle) there is a less likely chance that it will happen, and may instead signify the exact opposite; it may help predict a large spike in momentum in the direction of the Bullish or Bearish momentum. In the case of the orange circle, there is currently Bearish Momentum and therefore the Bull Cross may help predict a large momentum movement is about to occur in favor of the Bears.
We have disabled signals here to properly display and talk about the zones. As you can see, Rationalizing the Highest Highs and Lowest Lows over 2 different lengths creates inner and outer bounds that help to predict where parabolic movement and momentum may move to. Our Inner and Outer zones are great for seeing potential Support and Resistance locations.
The secondary zone, which can cross over and change from Green to Red is also a very important zone. Let's zoom in and talk about it specifically.
The Middle Zone Crosses may help deduce where parabolic movement and strong momentum changes may occur. Generally what may happen is when the cross occurs, you will see parabolic movement to the High / Low zones. This may be the Inner zone but can sometimes be the outer zone too. The hard part is sometimes it can be a Fakeout, like displayed with the Blue Circle. The Cross doesn’t mean it may move to the opposing side, sometimes it may just be predicting Parabolic movement in a general sense.
When we turn the Momentum Signals back on, we can see where the Fakeout occurred that it not only almost hit the Inner Low Zone but it also exhibited 2 Overly Bearish Signals. Remember, Overly bearish signals mean a momentum change in favor of the Bulls may occur soon and overly Bullish signals mean a momentum change in favor of the Bears may occur soon.
You may be wondering, well what does “may occur soon” mean and how do we tell?
The purpose of the momentum signals is not only to let you know when Momentum has occurred and when it is still prevalent. It also matters A LOT when it has STOPPED!
In this example above, we look at when the Overly Bullish and Bearish Momentum has STOPPED. As you can see, when the Overly Bullish or Bearish Momentum stopped may be a strong predictor of potential momentum change in the opposing direction.
We will conclude our Tutorial here, hopefully this Indicator has been helpful for showing you where momentum is occurring and help predict how far it may move. We have been dabbling with and are planning on releasing a Strategy based on this Indicator shortly.
Settings:
1. Momentum:
Show Signals: Sometimes it can be difficult to visualize the zones with signals enabled.
Factor Volume: Factor Volume only applies to Overly Bullish and Bearish Signals. It's when the Volume is > VWMA Volume over the Smoothing Length.
Zone Inside Length: The Zone Inside is the Inner zone of the High and Low. This is the length used to create it.
Zone Outside Length: The Zone Outside is the Outer zone of the High and Low. This is the length used to create it.
Smoothing length: Smoothing length is the length used to smooth out our Bullish and Bearish signals, along with our Overly Bullish and Overly Bearish Signals.
2. Kernel Settings:
Lookback Window: The number of bars used for the estimation. This is a sliding value that represents the most recent historical bars. Recommended range: 3-50.
Relative Weighting: Relative weighting of time frames. As this value approaches zero, the longer time frames will exert more influence on the estimation. As this value approaches infinity, the behavior of the Rational Quadratic Kernel will become identical to the Gaussian kernel. Recommended range: 0.25-25.
Start Regression at Bar: Bar index on which to start regression. The first bars of a chart are often highly volatile, and omission of these initial bars often leads to a better overall fit. Recommended range: 5-25.
If you have any questions, comments, ideas or concerns please don't hesitate to contact us.
HAPPY TRADING!
Dee_MeterHere's how you can effectively use the Dee Meter indicator:
1. **Understanding the Basics**:
- Dee Meter evaluates the market sentiment across various sectors.
- It calculates the overall market trend and presents it in percentage form through a line graph.
2. **Indicator Results**:
- When you add the Dee Meter indicator to your chart, you'll notice two key results: Bull and Bear percentages, along with a line graph.
- The Bull percentage reflects the strength of bullish (positive) sentiment, while the Bear percentage indicates bearish (negative) sentiment.
- For example, if the Bull percentage is 55% and the Bear percentage is 45%, it signifies that the bulls currently have a stronger influence in the market.
3. **Interpreting Percentages**:
- Utilize the Bull and Bear percentages to craft your analysis strategy.
- A high Bull percentage in a bullish market suggests strong bullish momentum.
- In the case of a bullish trend showing signs of weakening (e.g., a double top pattern), monitor the Bull and Bear percentages for early reversal indications.
- A decrease in the Bull percentage and an increase in the Bear percentage could hint at a potential market reversal.
4. **Line Graph Analysis**:
- The line graph visually depicts the strength of bulls (green line) and bears (red line) over time.
- During a bullish trend, the green line rises while the red line remains lower, indicating bullish strength.
- Conversely, during a bearish trend, the red line climbs higher, indicating bearish dominance.
5. **Cross Over and Cross Under**:
- Cross-over and cross-under scenarios occur when the market abruptly reverses direction.
- For instance, in a bullish market that suddenly turns bearish, the red line could cross above the green line, indicating increased bearish power.
- In a bearish market that experiences a sudden influx of buying activity, the green line might cross above the red line, signifying strong buying interest.
6. **Applying the Indicator**:
- Use the Dee Meter to build your own trading strategies and make informed decisions.
- Keep an eye on changes in Bull and Bear percentages to identify shifts in market sentiment.
- Monitor line graph movements to assess the relative strength of bulls and bears.
In summary, the Dee Meter indicator is a valuable tool for assessing market sentiment and confirming trends in the Indian market. By understanding and utilizing the Bull and Bear percentages, line graph analysis, and cross-over/cross-under scenarios, you can develop effective trading strategies and trade with greater confidence.
RedK EVEREX - Effort Versus Results ExplorerRedK EVEREX is an experimental indicator that explores "Volume Price Analysis" basic concepts and Wyckoff law "Effort versus Result" - by inspecting the relative volume (effort) and the associated (relative) price action (result) for each bar - showing the analysis as an easy to read "stacked bands" visual. From that analysis, we calculate a "Relative Rate of Flow" - an easy to use +100/-100 oscilator that can be used to trigger a signal when a bullish or bearish mode is detected for a certain user-selected length of bars.
Basic Concepts of VPA
-------------------------------
(The topics of VPA & Wyckoff Effort vs Results law are too comprehensive to cover here - So here's just a very basic summary - please review these topics in detail in various sources available here in TradingView or on the web)
* Volume Price Analysis (VPA) is the examination of the number of shares or contracts of a security that have been traded in a given period, and the associated price movement. By analyzing trends in volume in conjunction with price movements, traders can determine the significance of changes in price and what may unfold in the near future.
* Oftentimes, high volumes of trading can infer a lot about investors’ outlook on a market or security. A significant price increase along with a significant volume increase, for example, could be a credible sign of a continued bullish trend or a bullish reversal. Adversely, a significant price decrease with a significant volume increase can point to a continued bearish trend or a bearish trend reversal.
* Incorporating volume into a trading decision can help an investor to have a more balanced view of all the broad market factors that could be influencing a security’s price, which helps an investor to make a more informed decision.
* Wyckoff's law "Effort versus results" dictates that large effort is expected to be accompanied with big results - which means that we should expect to see a big price move (result) associated with a large relative volume (effort) for a certain trading period (bar).
* The way traders use this concept in chart analysis is to mainly look for imbalances or invalidation. for example, when we observe a large relative volume that is associated with very limited price change - that should trigger an early flag/warning sign that the current price trend is facing challenges and may be an early sign of "reversal" - this applies in both bearish and bullish conditions. on the other hand, when price starts to trend in a certain direction and that's associated with increasing volume, that can act as kind of validation, or a confirmation that the market supports that move.
How does EVEREX work
---------------------------------
* EVEREX inspects each bar and calculates a relative value for volume (effort) and "strength of price movement" (result) compared to a specified lookback period. The results are then visualized as stacked bands - the lower band represents the relative volume, the upper band represents the relative price strength - with clear color coding for easier analysis.
* The scale of the band is initially set to 100 (each band can occupy up to 50) - and that can be changed in the settings to 200 or 400 - mainly to allow a "zoom in" on the bands.
* Reading the resulting stacked bands makes it easier to see "balanced" volume/price action (where both bands are either equally strong, or equally weak), or when there's imbalance between volume and price (for example, a compression bar will show with high volume band and very small/tiny price action band) - another favorite pattern in VPA is the "Ease of Move", which will show as a relatively small volume band associated with a large "price action band" (either bullish or bearish) .. and so on.
* a bit of a techie piece: why the use of a custom "Normalize()" function to calculate "relative" values in EVEREX?
When we evaluate a certain value against an average (for example, volume) we need a mechanism to deal with "super high" values that largely exceed that average - I also needed a mechanism that mimics how a trader looks at a volume bar and decides that this volume value is super low, low, average, above average, high or super high -- the issue with using a stoch() function, which is the usual technique for comparing a data point against a lookback average, is that this function will produce a "zero" for low values, and cause a large distortion of the next few "ratios" when super large values occur in the data series - i researched multiple techniques here and decided to use the custom Normalize() function - and what i found is, as long as we're applying the same formula consistently to the data series, since it's all relative to itself, we can confidently use the result. Please feel free to play around with this part further if you like - the code is commented for those who would like to research this further.
* Overall, the hope is to make the bar-by-bar analysis easier and faster for traders who apply VPA concepts in their trading
What is RROF?
--------------------------
* Once we have the values of relative volume and relative price strength, it's easy from there to combine these values into a moving index that can be used to track overall strength and detect reversals in market direction - if you think about it this a very similar concept to a volume-weighted RSI. I call that index the "Relative Rate of Flow" - or RROF (cause we're not using the direct volume and price values in the calculation, but rather relative values that we calculated with the proprietary "Normalize" function in the script.
* You can show RROF as a single or double-period - and you can customize it in terms of smoothing, and signal line - and also utilize the basic alerts to get notified when a change in strength from one side to the other (bullish vs bearish) is detected
* In the chart above, you can see how the RROF was able to detect change in market condition from Bearsh to Bullish - then from Bullish to Bearish for TSLA with good accuracy.
Other Usage Options in EVEREX
------------------------------------
* I wrote EVEREX with a lot of flexibility and utilization in mind, while focusing on a clean and easy to use visual - EVEREX should work with any time frame and any instrument - in instruments with no volume data, only price data will be used.
* You can completely hide the "EVEREX bands" and use EVEREX as a single or dual period strength indicator (by exposing the Bias/Sentiment plot which is hidden by default) -
here's how this setup would look like - in this mode, you will basically be using EVEREX the same way you're using a volume-weighted RSI
* or you can hide the bias/sentiment, and expose the Bulls & Bears plots (using the indicator's "Style" tab), and trade it like a Bull/Bear Pressure Index like this
* you can choose Moving Average type for most plot elements in EVEREX, including how to deal with the Lookback averaging
* you can set EVEREX to a different time frame than the chart
* did i mention basic alerts in this v1.0 ?? There's room to add more VPA-specific alerts in future version (for example, when Ease-of-Move or Compression bars are detected...etc) - let me know if the comments what you want to see
Final Thoughts
--------------------
* EVEREX can be used for bar-by-bar VPA analysis - There are so much literature out there about VPA and it's highly recommended that traders read more about what VPA is and how it works - as it adds an interesting (and critical) dimension to technical analysis and will improve decision making
* RROF is a "strength indicator" - it does not track price values (levels) or momentum - as you will see when you use it, the price can be moving up, while the RROF signal line starts moving down, reflecting decreasing strength (or otherwise, increasing bear strength) - So if you incorporate EVEREX in your trading you will need to use it alongside other momentum and price value indicators (like MACD, MA's, Trend Channels, Support & Resistance Lines, Fib / Donchian..etc) - to use for trade confirmation
Bar metrics / quantifytools— Overview
Rather than eyeball evaluating bullishness/bearishness in any given bar, bar metrics allow a quantified approach using three basic fundamental data points: relative close, relative volatility and relative volume. These data points are visualized in a discreet data dashboard form, next to all real-time bars. Each value also has a dot in front, representing color coded extremes in the values.
Relative close represents position of bar's close relative to high and low, high of bar being 100% and low of bar being 0%. Relative close indicates strength of bulls/bears in a given bar, the higher the better for bulls, the lower the better for bears. Relative volatility (bar range, high - low) and relative volume are presented in a form of a multiplier, relative to their respective moving averages (SMA 20). A value of 1x indicates volume/volatility being on par with moving average, 2x indicates volume/volatility being twice as much as moving average and so on. Relative volume and volatility can be used for measuring general market participant interest, the "weight of the bar" as it were.
— Features
Users can gauge past bar metrics using lookback via input menu. Past bars, especially recent ones, are helpful for giving context for current bar metrics. Lookback bars are highlighted on the chart using a yellow box and metrics presented on the data dashboard with lookback symbols:
To inspect bar metric data and its implications, users can highlight bars with specified bracket values for each metric:
When bar highlighter is toggled on and desired bar metric values set, alert for the specified combination can be toggled on via alert menu. Note that bar highlighter must be enabled in order for alerts to function.
— Visuals
Bar metric dots are gradient colored the following way:
Relative volatility & volume
0x -> 1x / Neutral (white) -> Light (yellow)
1x -> 1.7x / Light (yellow) -> Medium (orange)
1.7x -> 2.4x / Medium (orange) -> Heavy (red)
Relative close
0% -> 25% / Heavy bearish (red) -> Light bearish (dark red)
25% -> 45% / Light bearish (dark red) -> Neutral (white)
45% - 55% / Neutral (white)
55% -> 75% / Neutral (white) -> Light bullish (dark green)
75% -> 100% / Light bullish (dark green) -> Heavy bullish (green)
All colors can be adjusted via input menu. Label size, label distance from bar (offset) and text format (regular/stealth) can be adjusted via input menu as well:
— Practical guide
As interpretation of bar metrics is highly contextual, it is especially important to use other means in conjunction with the metrics. Levels, oscillators, moving averages, whatever you have found useful for your process. In short, relative close indicates directional bias and relative volume/volatility indicates "weight" of directional bias.
General interpretation
High relative close, low relative volume/volatility = mildly bullish, bias up/consolidation
High relative close, medium relative volume/volatility = bullish, bias up
High relative close, high relative volume/volatility = exuberantly bullish, bias up/down depending on context
Medium relative close, low relative volume/volatility = noise, no bias
Medium relative close, medium to high relative volume/volatility = indecision, further evidence needed to evaluate bias
Low relative close, low relative volume/volatility = mildly bearish, bias down/consolidation
Low relative close, medium relative volume/volatility = bearish, bias down
Low relative close, high relative volume/volatility = exuberantly bearish, bias down/up depending on context
Nuances & considerations
As to relative close, it's important to note that each bar is a trading range when viewed on a lower timeframe, ES 1W vs. ES 4H:
When relative close is high, bulls were able to push price to range high by the time of close. When relative close is low, bears were able to push price to range low by the time of close. In other words, bulls/bears were able to gain the upper hand over a given trading range, hinting strength for the side that made the final push. When relative close is around middle range (40-60%), it can be said neither side is clearly dominating the range, hinting neutral/indecision bias from a relative close perspective.
As to relative volume/volatility, low values (less than ~0.7x) imply bar has low market participant interest and therefore is likely insignificant, as it is "lacking weight". Values close to or above 1x imply meaningful market participant interest, whereas values well above 1x (greater than ~1.3x) imply exuberance. This exuberance can manifest as initiation (beginning of a trend) or as exhaustion (end of a trend):
Majors FX-REER/NEER Suite [BIG]═══════════════════════════════════════════════════════════════════════════════
BIG MAJORS FX-REER/NEER SUITE
═══════════════════════════════════════════════════════════════════════════════
OVERVIEW
The BIG Majors FX-REER/NEER Suite is a multi-currency valuation framework designed for institutional FX traders, macro strategists, and systematic currency allocators. This indicator calculates Real Effective Exchange Rates (REER) and Nominal Effective Exchange Rates (NEER) for the seven major currency pairs (G7 FX), integrating macroeconomic fundamentals (CPI inflation differentials) with technical trend analysis to identify structural currency misvaluations and mean-reversion opportunities.
Unlike standard FX indicators that only analyze bilateral price action, this suite constructs trade-weighted basket indices that measure each currency's strength against a portfolio of its major trading partners, adjusted for inflation differentials. This approach mirrors central bank and sovereign wealth fund methodologies for assessing equilibrium exchange rate levels.
The framework combines:
- Fundamental valuation metrics – REER/NEER indices with Z-score normalization
- Technical trend filters – Ichimoku Cloud and Aroon oscillator confluence
- Signal classification system – Long/Short/Watch/Conflict regime identification
- Quantitative confidence scoring – 0-100% signal reliability weighting
═══════════════════════════════════════════════════════════════════════════════
CORE METHODOLOGY
═══════════════════════════════════════════════════════════════════════════════
• NEER Calculation (Nominal Effective Exchange Rate)
The NEER measures a currency's value against a trade-weighted basket of its seven major trading partners, geometrically averaged in log-space to ensure symmetry:
1. All seven G7 FX pairs are normalized to USD-pivot (A/USD format)
2. Each currency's log-normalized rate is compared to the arithmetic mean of the other six
3. Formula: NEER_i = (8/7) × log(CCY_i/USD) - mean(log(CCY_others/USD))
This construction ensures that:
- A rising NEER indicates currency appreciation against the basket
- The methodology is symmetric and avoids base-currency bias
- Changes reflect multilateral competitive dynamics, not just bilateral moves
• REER Calculation (Real Effective Exchange Rate)
The REER adjusts the NEER for inflation differentials using Consumer Price Index (CPI) data:
Formula: REER_i = NEER_i + log(CPI_i) - mean(log(CPI_others))
By incorporating CPI differentials, the REER provides a purchasing-power-parity-adjusted valuation metric that accounts for relative inflation rates. This is the institutional standard for assessing fundamental currency equilibrium levels.
Data Sources :
- FX rates: TradingView composite feed (FX:), OANDA, FXCM, FOREXCOM
- CPI data: ECONOMICS namespace (monthly frequency, official statistical releases)
- Supported currencies: USD, EUR, JPY, GBP, CHF, AUD, CAD, NZD
• Valuation Bias Detection
Each currency pair is classified as overvalued (bias = -1, "Short") or undervalued (bias = +1, "Long") based on two independent criteria:
1. Percentage Band Deviation – Relative Index distance from 100 baseline
• Overvalued: Index > 100 × (1 + deviation%), default +5%
• Undervalued: Index < 100 × (1 - deviation%), default -5%
2. Z-Score Threshold – Statistical extremes in rolling lookback window
• Overvalued: Z-Score > +1.5 (default)
• Undervalued: Z-Score < -1.5 (default)
Either condition triggers a bias classification. This dual-filter approach captures both absolute deviations and relative extremes within recent historical context.
• Trend Confirmation (Ichimoku + Aroon)
To avoid counter-trend entries in strong momentum regimes, the suite integrates two independent trend filters:
Ichimoku Cloud
- Bull: Price > Cloud AND Conversion > Base Line
- Bear: Price < Cloud AND Conversion < Base Line
- Parameters: Conv(9), Base(26), Span B(52), Displacement(26)
Aroon Oscillator
- Bull: Aroon Up > 70 AND Aroon Down < 30
- Bear: Aroon Down > 70 AND Aroon Up < 30
- Default lookback: 25 periods
Trend is confirmed only when both indicators agree (Ichimoku + Aroon ≥ +1 for bull, ≤ -1 for bear).
• Setup Classification Logic
The framework combines Bias (fundamental valuation) with Trend (technical momentum) to generate four distinct setup types:
- Long↗︎ (Setup = 1) – Undervalued + Bullish Trend
Context : Mean reversion opportunity with momentum confirmation. Currency trading at fundamental discount while technical trend supports upside.
- Short↘︎ (Setup = -1) – Overvalued + Bearish Trend
Context : Mean reversion opportunity with momentum confirmation. Currency trading at fundamental premium while technical trend supports downside.
- Watch (Setup = 2) – Valuation bias present, but no clear trend
Context : Fundamental mispricing without directional conviction. Monitor for trend emergence before entering.
- Conflict (Setup = 3) – Bias and trend pointing opposite directions
Context : Overvalued currency in uptrend OR undervalued currency in downtrend. Avoid—either trend continuation or valuation mean reversion, but unclear which dominates.
• Confidence Score (0-100%)
Each setup receives a quantitative confidence weighting based on three factors:
1. Band Distance (40%) – How far the Relative Index deviates from 100 baseline
2. Z-Score Magnitude (40%) – Statistical extremeness within lookback window
3. Trend Confluence (20%) – Agreement between Ichimoku and Aroon signals
Score interpretation:
- 70-100% = High confidence (both valuation and trend extremes aligned)
- 40-69% = Moderate confidence (one factor strong, others weak)
- 0-39% = Low confidence (marginal signals, questionable reliability)
═══════════════════════════════════════════════════════════════════════════════
VISUAL COMPONENTS
═══════════════════════════════════════════════════════════════════════════════
• Dashboard Table (Top-Right)
Displays real-time valuation metrics for all seven major pairs:
Column 1: Pair – Currency pair identifier
Column 2: RelIdx – Relative Index (100 = baseline at first valid bar)
Column 3: Z – Z-Score vs. rolling lookback window
Column 4: Bias – Long/Short/Neutral valuation classification
Column 5: Trend – ↑/↓/– trend direction (Ichimoku + Aroon)
Column 6: Setup – Long↗︎/Short↘︎/Watch/Conflict (color-coded)
Column 7: Conf – Confidence score 0-100% (color-coded)
Column 8: Quelle – REER (inflation-adjusted) or NEER (nominal only)
Color coding :
- Green = Long↗︎ setup
- Red = Short↘︎ setup
- Orange = Watch (no trend)
- Purple = Conflict (bias/trend divergence)
• Optional Chart Plot
Select any of the seven pairs to plot its Relative Index on the chart with:
- Baseline at 100 (horizontal gray line)
- +Band at 100 × (1 + deviation%), dashed red
- -Band at 100 × (1 - deviation%), dashed green
- Aqua line tracking the selected pair's Relative Index evolution
• Signal Labels
When a pair transitions into Long↗︎ or Short↘︎ setup:
- Green label below bar = Long↗︎ entry signal
- Red label above bar = Short↘︎ entry signal
- Positioned using ATR offset for visibility
═══════════════════════════════════════════════════════════════════════════════
KEY FEATURES
═══════════════════════════════════════════════════════════════════════════════
- Institutional valuation methodology – REER/NEER framework used by central banks and sovereign wealth funds
- Macro-fundamental integration – CPI inflation differentials adjust for purchasing power parity
- Multi-timeframe flexibility – Daily (D), Weekly (W), Monthly (M) resolution options
- Seven simultaneous pairs – Monitors all G7 FX majors in single unified dashboard
- No repainting – All signals confirm on bar close
- Automated alerts – TradingView notifications when setups transition (Long/Short triggers)
- Confidence weighting – Quantitative scoring allows position sizing calibration
- Fallback logic – Automatically switches to NEER if CPI data incomplete
═══════════════════════════════════════════════════════════════════════════════
HOW TO USE
═══════════════════════════════════════════════════════════════════════════════
1. Apply to any chart – The indicator pulls multi-security data; chart symbol does not matter (commonly applied to SPY or DXY for reference)
2. Select data feed – Default FX: (TradingView composite) is recommended; alternatives: OANDA, FXCM, FOREXCOM
3. Choose timeframe :
• Daily (D) = Swing trading, medium-term mean reversion (2-8 week horizons)
• Weekly (W) = Position trading, macro regime shifts (1-6 month horizons)
• Monthly (M) = Strategic allocation, long-term equilibrium analysis (6-24 month horizons)
4. Configure parameters :
• Z-Score Lookback : Default 252 (one trading year on Daily); adjust for timeframe (52 for Weekly, 36 for Monthly)
• Deviation Band : Default ±5%; tighten to ±3% for more signals, widen to ±7% for higher conviction
• Z-Threshold : Default ±1.5; increase to ±2.0 for extreme-only signals
5. Monitor dashboard table :
• Focus on pairs showing Long↗︎ or Short↘︎ setups with Conf ≥ 70%
• Watch for Watch setups transitioning to directional signals
• Avoid Conflict setups unless you have strong macro conviction
6. Execute mean-reversion trades :
• Long↗︎ = Buy undervalued currency (e.g., EURUSD Long if EUR undervalued)
• Short↘︎ = Sell overvalued currency (e.g., USDJPY Short if JPY overvalued)
• Target: Mean reversion toward 100 baseline or opposite band
7. Position sizing by confidence :
• High confidence (70-100%) → Standard position size
• Moderate confidence (40-69%) → Reduce size by 50%
• Low confidence (<40%) → Avoid or use minimal pilot size
8. Risk management :
• Stop loss: Place beyond recent swing high/low or 1.5× ATR
• Take profit: Opposite valuation band or 100 baseline
• Time stop: Exit if setup reverses (Long→Neutral→Short or vice versa)
═══════════════════════════════════════════════════════════════════════════════
LIMITATIONS
═══════════════════════════════════════════════════════════════════════════════
- CPI data lag – Consumer Price Index releases are monthly and report with 2-4 week delay. REER calculations may lag real-time inflation dynamics.
- Structural shifts ignored – The baseline (100) is set at first valid bar. Long-term structural appreciation/depreciation (e.g., 20-year USD bull market) is not accounted for. Suitable for cyclical mean reversion, not secular trend analysis.
- Equal-weighting assumption – All seven currencies are equally weighted in basket construction. Actual trade-weighted indices use GDP or trade volume weights, which this framework simplifies.
- No emerging market currencies – Limited to G7 majors (USD, EUR, JPY, GBP, CHF, AUD, CAD, NZD). Does not cover EM FX (e.g., CNY, BRL, MXN).
- Technical filter limitations – Ichimoku and Aroon are lagging indicators. In fast-moving markets (e.g., central bank interventions, geopolitical shocks), trend signals may arrive late.
- Mean reversion assumption – The framework assumes currencies revert to equilibrium. During regime changes (e.g., monetary policy divergence, crisis flows), deviations can persist or expand before eventual reversal.
═══════════════════════════════════════════════════════════════════════════════
TECHNICAL SPECIFICATIONS
═══════════════════════════════════════════════════════════════════════════════
- Pine Script v6
- Non-repainting (signals confirmed on bar close)
- Multi-security data feeds (7 FX pairs + 8 CPI series)
- Automated alert system (transitions to Long↗︎/Short↘︎)
- Real-time dashboard table (8 columns × 8 rows)
- Maximum 500 labels supported (100 per pair direction)
- Fallback logic: NEER used if CPI data unavailable
═══════════════════════════════════════════════════════════════════════════════
NOTES
═══════════════════════════════════════════════════════════════════════════════
This indicator is designed for experienced FX traders, macro strategists, and portfolio managers familiar with:
- Real and nominal effective exchange rate concepts
- Purchasing power parity theory and inflation differentials
- Multi-currency portfolio construction and basket hedging
- Carry trade and convergence strategies
- Central bank policy impacts on FX equilibrium levels
The framework provides objective valuation signals but does not account for:
- Interest rate differentials (carry)
- Capital flow dynamics (risk-on/risk-off)
- Central bank intervention zones
- Geopolitical risk premiums
Always combine REER/NEER valuation analysis with macro event calendars, positioning data (CFTC COT reports), and fundamental policy divergence assessments.
═══════════════════════════════════════════════════════════════════════════════
Developed for institutional FX valuation analysis based on central bank REER/NEER methodologies.
Impulse Reactor RSI-SMA Trend Indicator [ApexLegion]Impulse Reactor RSI-SMA Trend Indicator
Introduction and Theoretical Background
Design Rationale
Standard indicators frequently generate binary 'BUY' or 'SELL' signals without accounting for the broader market context. This often results in erratic "Flip-Flop" behavior, where signals are triggered indiscriminately regardless of the prevailing volatility regime.
Impulse Reactor was engineered to address this limitation by unifying two critical requirements: Quantitative Rigor and Execution Flexibility.
The Solution
Composite Analytical Framework This script is not a simple visual overlay of existing indicators. It is an algorithmic synthesis designed to function as a unified decision-making engine. The primary objective was to implement rigorous quantitative analysis (Volatility Normalization, Structural Filtering) directly within an alert-enabled framework. This architecture is designed to process signals through strict, multi-factor validation protocols before generating real-time notifications, allowing users to focus on structurally validated setups without manual monitoring.
How It Works
This is not a simple visual mashup. It utilizes a cross-validation algorithm where the Trend Structure acts as a gatekeeper for Momentum signals:
Logic over Lag: Unlike simple moving average crossovers, this script uses a 15-layer Gradient Ribbon to detect "Laminar Flow." If the ribbon is knotted (Compression), the system mathematically suppresses all signals.
Volatility Normalization: The core calculation adapts to ATR (Average True Range). This means the indicator automatically expands in volatile markets and contracts in quiet ones, maintaining accuracy without constant manual tweaking.
Adaptive Signal Thresholding: It incorporates an 'Anti-Greed' algorithm (Dynamic Thresholding) that automatically adjusts entry criteria based on trend duration. This logic aims to mitigate the risk of entering positions during periods of statistical trend exhaustion.
Why Use It?
Market State Decoding: The gradient Ribbon visualizes the underlying trend phase in real-time.
◦ Cyan/Blue Flow: Strong Bullish Trend (Laminar Flow).
◦ Magenta/Pink Flow: Strong Bearish Trend.
◦ Compressed/Knotted: When the ribbon lines are tightly squeezed or overlapping, it signals Consolidation. The system filters signals here to avoid chop.
Noise Reduction: The goal is not to catch every pivot, but to isolate high-confidence setups. The logic explicitly filters out minor fluctuations to help maintain position alignment with the broader trend.
⚖️ Chapter 1: System Architecture
Introduction: Composite Analytical Framework
System Overview
Impulse Reactor serves as a comprehensive technical analysis engine designed to synthesize three distinct market dimensions—Momentum, Volatility, and Trend Structure—into a unified decision-making framework. Unlike traditional methods that analyze these metrics in isolation, this system functions as a central processing unit that integrates disparate data streams to construct a coherent model of market behavior.
Operational Objective
The primary objective is to transition from single-dimensional signal generation to a multi-factor assessment model. By fusing data from the Impulse Core (Volatility), Gradient Oscillator (Momentum), and Structural Baseline (Trend), the system aims to filter out stochastic noise and identify high-probability trade setups grounded in quantitative confluence.
Market Microstructure Analysis: Limitations of Conventional Models
Extensive backtesting and quantitative analysis have identified three critical inefficiencies in standard oscillator-based strategies:
• Bounded Oscillator Limitations (The "Oscillation Trap"): Traditional indicators such as RSI or Stochastics are mathematically constrained between fixed values (0 to 100). In strong trending environments, these metrics often saturate in "overbought" or "oversold" zones. Consequently, traders relying on static thresholds frequently exit structurally valid positions prematurely or initiate counter-trend trades against prevailing momentum, resulting in suboptimal performance.
• Quantitative Blindness to Quality: Standard moving averages and trend indicators often fail to distinguish the qualitative nature of price movement. They treat low-volume drift and high-velocity expansion identically. This inability to account for "Volatility Quality" leads to delayed responsiveness during critical market events.
• Fractal Dissonance (Timeframe Disconnect): Financial markets exhibit fractal characteristics where trends on lower timeframes may contradict higher timeframe structures. Manual integration of multi-timeframe analysis increases cognitive load and susceptibility to human error, often resulting in conflicting biases at the point of execution.
Core Design Principles
To mitigate the aforementioned systemic inefficiencies, Impulse Reactor employs a modular architecture governed by three foundational principles:
Principle A:
Volatility Precursor Analysis Market mechanics demonstrate that volatility expansion often functions as a leading indicator for directional price movement. The system is engineered to detect "Volatility Deviation" — specifically, the divergence between short-term and long-term volatility baselines—prior to its manifestation in price action. This allows for entry timing aligned with the expansion phase of market volatility.
Principle B:
Momentum Density Visualization The system replaces singular momentum lines with a "Momentum Density" model utilizing a 15-layer Simple Moving Average (SMA) Ribbon.
• Concept: This visualization represents the aggregate strength and consistency of the trend.
• Application: A fully aligned and expanded ribbon indicates a robust trend structure ("Laminar Flow") capable of withstanding minor counter-trend noise, whereas a compressed ribbon signals consolidation or structural weakness.
Principle C:
Adaptive Confluence Protocols Signal validity is strictly governed by a multi-dimensional confluence logic. The system suppresses signal generation unless there is synchronized confirmation across all three analytical vectors:
1. Volatility: Confirmed expansion via the Impulse Core.
2. Momentum: Directional alignment via the Hybrid Oscillator.
3. Structure: Trend validation via the Baseline. This strict filtering mechanism significantly reduces false positives in non-trending (choppy) environments while maintaining sensitivity to genuine breakouts.
🔍 Chapter 2: Core Modules & Algorithmic Logic
Module A: Impulse Core (Normalized Volatility Deviation)
Operational Logic The Impulse Core functions as a volatility-normalized momentum gauge rather than a standard oscillator. It is designed to identify "Volatility Contraction" (Squeeze) and "Volatility Expansion" phases by quantifying the divergence between short-term and long-term volatility states.
Volatility Z-Score Normalization
The formula implements a custom normalization algorithm. Unlike standard oscillators that rely on absolute price changes, this logic calculates the Z-Score of the Volatility Spread.
◦ Numerator: (atr_f - atr_s) captures the raw momentum of volatility expansion.
◦ Denominator: (std_f + 1e-6) standardizes this value against historical variance.
◦ Result: This allows the indicator scales consistently across assets (e.g., Bitcoin vs. Euro) without manual recalibration.
f_impulse() =>
atr_f = ta.atr(fastLen) // Fast Volatility Baseline
atr_s = ta.atr(slowLen) // Slow Volatility Baseline
std_f = ta.stdev(atr_f, devLen) // Volatility Standard Deviation
(atr_f - atr_s) / (std_f + 1e-6) // Normalized Differential Calculation
Algorithmic Framework
• Differential Calculation: The system computes the spread between a Fast Volatility Baseline (ATR-10) and a Slow Volatility Baseline (ATR-30).
• Normalization Protocol: To standardize consistency across diverse asset classes (e.g., Forex vs. Crypto), the raw differential is divided by the standard deviation of the volatility itself over a 30-period lookback.
• Signal Generation:
◦ Contraction (Squeeze): When the Fast ATR compresses below the Slow ATR, it registers a potential volatility buildup phase.
◦ Expansion (Release): A rapid divergence of the Fast ATR above the Slow ATR signals a confirmed volatility expansion, validating the strength of the move.
Module B: Gradient Oscillator (RSI-SMA Hybrid)
Design Rationale To mitigate the "noise" and "false reversal" signals common in single-line oscillators (like standard RSI), this module utilizes a 15-Layer Gradient Ribbon to visualize momentum density and persistence.
Technical Architecture
• Ribbon Array: The system generates 15 sequential Simple Moving Averages (SMA) applied to a volatility-adjusted RSI source. The length of each layer increases incrementally.
• State Analysis:
Momentum Alignment (Laminar Flow): When all 15 layers are expanded and parallel, it indicates a robust trend where buying/selling pressure is distributed evenly across multiple timeframes. This state helps filter out premature "overbought/oversold" signals.
• Consolidation (Compression): When the distance between the fastest layer (Layer 1) and the slowest layer (Layer 15) approaches zero or the layers intersect, the system identifies a "Non-Tradable Zone," preventing entries during choppy market conditions.
// Laminar Flow Validation
f_validate_trend() =>
// Calculate spread between Ribbon layers
ribbon_spread = ta.stdev(ribbon_array, 15)
// Only allow signals if Ribbon is expanded (Laminar Flow)
is_flowing = ribbon_spread > min_expansion_threshold
// If compressed (Knotted), force signal to false
is_flowing ? signal : na
Module C: Adaptive Signal Filtering (Behavioral Bias Mitigation)
This subsystem, operating as an algorithmic "Anti-Greed" Mechanism, addresses the statistical tendency for signal degradation following prolonged trends.
Dynamic Threshold Adjustment
• Win Streak Detection: The algorithm internally tracks the outcome of closed trade cycles.
• Sensitivity Multiplier: Upon detecting consecutive successful signals in the same direction, a Penalty_Factor is applied to the entry logic.
• Operational Impact: This effectively raises the Required_Slope threshold for subsequent signals. For example, after three consecutive bullish signals, the system requires a 30% steeper trend angle to validate a fourth entry. This enforces stricter discipline during extended trends to reduce the probability of entering at the point of trend exhaustion.
Anti-Greed Logic: Dynamic Threshold Calculation
f_adjust_threshold(base_slope, win_streak) =>
// Adds a 10% penalty to the difficulty for every consecutive win
penalty_factor = 0.10
risk_scaler = 1 + (win_streak * penalty_factor)
// Returns the new, harder-to-reach threshold
base_slope * risk_scaler
Module D: Trend Baseline (Triple-Smoothed Structure)
The Trend Baseline serves as the structural filter for all signals. It employs a Triple-Smoothed Hybrid Algorithm designed to balance lag reduction with noise filtration.
Smoothing Stages
1. Volatility Banding: Utilizes a SuperTrend-based calculation to establish the upper and lower boundaries of price action.
2. Weighted Filter: Applies a Weighted Moving Average (WMA) to prioritize recent price data.
3. Exponential Smoothing: A final Exponential Moving Average (EMA) pass is applied to create a seamless baseline curve.
Functionality
This "Heavy" baseline resists minor intraday volatility spikes while remaining responsive to sustained structural shifts. A signal is only considered valid if the price action maintains structural integrity relative to this baseline
🚦 Chapter 3: Risk Management & Exit Protocols
Quantitative Risk Management (TP/SL & Trailing)
Foundational Architecture: Volatility-Adjusted Geometry Unlike strategies relying on static nominal values, Impulse Reactor establishes dynamic risk boundaries derived from quantitative volatility metrics. This design aligns trade invalidation levels mathematically with the current market regime.
• ATR-Based Dynamic Bracketing:
The protocol calculates Stop-Loss and Take-Profit levels by applying Fibonacci coefficients (Default: 0.786 for SL / 1.618 for TP) to the Average True Range (ATR).
◦ High Volatility Environments: The risk bands automatically expand to accommodate wider variance, preventing premature exits caused by standard market noise.
◦ Low Volatility Environments: The bands contract to tighten risk parameters, thereby dynamically adjusting the Risk-to-Reward (R:R) geometry.
• Close-Validation Protocol ("Soft Stop"):
Institutional algorithms frequently execute liquidity sweeps—driving prices briefly below key support levels to accumulate inventory.
◦ Mechanism: When the "Soft Stop" feature is enabled, the system filters out intraday volatility spikes. The stop-loss is conditional; execution is triggered only if the candle closes beyond the invalidation threshold.
◦ Strategic Advantage: This logic distinguishes between momentary price wicks and genuine structural breakdowns, preserving positions during transient volatility.
• Step-Function Trailing Mechanism:
To protect unrealized PnL while allowing for normal price breathing, a two-phase trailing methodology is employed:
◦ Phase 1 (Activation): The trailing function remains dormant until the price advances by a pre-defined percentage threshold.
◦ Phase 2 (Dynamic Floor): Once armed, the stop level creates a moving floor, adjusting relative to price action while maintaining a volatility-based (ATR) buffer to systematically protect unrealized PnL.
• Algorithmic Exit Protocols (Dynamic Liquidity Analysis)
◦ Rationale: Inefficiencies of Static Targets Static "Take Profit" levels often result in suboptimal exits. They compel traders to close positions based on arbitrary figures rather than evolving market structure, potentially capping upside during significant trends or retaining positions while the underlying trend structure deteriorates.
◦ Solution: Structural Integrity Assessment The system utilizes a Dynamic Liquidity Engine to continuously audit the validity of the position. Instead of targeting a specific price point, the algorithm evaluates whether the trend remains statistically robust.
Multi-Factor Exit Logic (The Tri-Vector System)
The Smart Exit protocol executes only when specific algorithmic invalidation criteria are met:
• 1. Momentum Exhaustion (Confluence Decay): The system monitors a 168-hour rolling average of the Confluence Score. A significant deviation below this historical baseline indicates momentum exhaustion, signaling that the driving force behind the trend has dissipated prior to a price reversal. This enables preemptive exits before a potential drawdown.
• 2. Statistical Over-Extension (Mean Reversion): Utilizing the core volatility logic, the system identifies instances where price deviates beyond 2.0 standard deviations from the mean. While the trend may be technically bullish, this statistical anomaly suggests a high probability of mean reversion (elastic snap-back), triggering a defensive exit to capitalize on peak valuation.
• 3. Oscillator Rejection (Immediate Pivot): To manage sudden V-shaped volatility, the system monitors RSI pivots. If a sharp "Pivot High" or divergence is detected, the protocol triggers an immediate "Peak Exit," bypassing standard trend filters to secure liquidity during high-velocity reversals.
🎨 Chapter 4: Visualization Guide
Gradient Oscillator Ribbon
The 15-layer SMA ribbon visualized via plot(r1...r15) represents the "Momentum Density" of the market.
• Visuals:
◦ Cyan/Blue Ribbon: Indicates Bullish Momentum.
◦ Pink/Magenta Ribbon: Indicates Bearish Momentum.
• Interpretation:
◦ Laminar Flow: When the ribbon expands widely and flows in parallel, it signifies a robust trend where momentum is distributed evenly across timeframes. This is the ideal state for trend-following.
◦ Compression (Consolidation): If the ribbon becomes narrow, twisted, or knotted, it indicates a "Non-Tradable Zone" where the market lacks a unified direction. Traders are advised to wait for clarity.
◦ Over-Extension: If the top layer crosses the Overbought (85) or Oversold (15) lines, it visually warns of potential market overheating.
Trend Baseline
The thick, color-changing line plotted via plot(baseline) represents the Structural Backbone of the market.
• Visuals: Changes color based on the trend direction (Blue for Bullish, Pink for Bearish).
• Interpretation:
Structural Filter: Long positions are statistically favored only when price action sustains above this baseline, while short positions are favored below it.
Dynamic Support/Resistance: The baseline acts as a dynamic support level during uptrends and resistance during downtrends.
Entry Signals & Labels
Text labels ("Long Entry", "Short Entry") appear when the system detects high-probability setups grounded in quantitative confluence.
• Visuals: Labeled signals appear above/below specific candles.
• Interpretation:
These signals represent moments where Volatility (Expansion), Momentum (Alignment), and Structure (Trend) are synchronized.
Smart Exit: Labels such as "Smart Exit" or "Peak Exit" appear when the system detects momentum exhaustion or structural decay, prompting a defensive exit to preserve capital.
Dynamic TP/SL Boxes
The semi-transparent colored zones drawn via fill() represent the risk management geometry.
• Visuals: Colored boxes extending from the entry point to the Take Profit (TP) and Stop Loss (SL) levels.
• Function:
Volatility-Adjusted Geometry: Unlike static price targets, these boxes expand during high volatility (to prevent wicks from stopping you out) and contract during low volatility (to optimize Risk-to-Reward ratios).
SAR + MACD Glow
Small glowing shapes appearing above or below candles.
• Visuals: Triangle or circle glows near the price bars.
• Interpretation:
This visual indicates a secondary confirmation where Parabolic SAR and MACD align with the main trend direction. It serves as an additional confluence factor to increase confidence in the trade setup.
Support/Resistance Table
A small table located at the bottom-right of the chart.
• Function: Automatically identifies and displays recent Pivot Highs (Resistance) and Pivot Lows (Support).
• Interpretation: These levels can be used as potential targets for Take Profit or invalidation points for manual Stop Loss adjustments.
🖥️ Chapter 5: Dashboard & Operational Guide
Integrated Analytics Panel (Dashboard Overview)
To facilitate rapid decision-making without manual calculation, the system aggregates critical market dimensions into a unified "Heads-Up Display" (HUD). This panel monitors real-time metrics across multiple timeframes and analytical vectors.
A. Intermediate Structure (12H Trend)
• Function: Anchors the intraday analysis to the broader market structure using a 12-hour rolling window.
• Interpretation:
◦ Bullish (> +0.5%): Indicates a positive structural bias. Long setups align with the macro flow.
◦ Bearish (< -0.5%): Indicates structural weakness. Short setups are statistically favored.
◦ Neutral: Represents a ranging environment where the Confluence Score becomes the primary weighting factor.
B. Composite Confluence Score (Signal Confidence)
• Definition: A probability metric derived from the synchronization of Volatility (Impulse Core), Momentum (Ribbon), and Trend (Baseline).
• Grading Scale:
Strong Buy/Sell (> 7.0 / < 3.0): Indicates full alignment across all three vectors. Represents a "Prime Setup" eligible for standard position sizing.
Buy/Sell (5.0–7.0 / 3.0–5.0): Indicates a valid trend but with moderate volatility confirmation.
Neutral: Signals conflicting data (e.g., Bullish Momentum vs. Bearish Structure). Trading is not recommended ("No-Trade Zone").
C. Statistical Deviation Status (Mean Reversion)
• Logic: Utilizes Bollinger Band deviation principles to quantify how far price has stretched from the statistical mean (20 SMA).
• Alert States:
Over-Extended (> 2.0 SD): Warning that price is statistically likely to revert to the mean (Elastic Snap-back), even if the trend remains technically valid. New entries are discouraged in this zone.
Normal: Price is within standard distribution limits, suitable for trend-following entries.
D. Volatility Regime Classification
• Metric: Compares current ATR against a 100-period historical baseline to categorize the market state.
• Regimes:
Low Volatility (Lvl < 1.0): Market Compression. Often precedes volatility expansion events.
Mid Volatility (Lvl 1.0 - 1.5): Standard operating environment.
High Volatility (Lvl > 1.5): Elevated market stress. Risk parameters should be adjusted (e.g., reduced position size) to account for increased variance.
E. Performance Telemetry
• Function: Displays the historical reliability of the Trend Baseline for the current asset and timeframe.
• Operational Threshold: If the displayed Win Rate falls below 40%, it suggests the current market behavior is incoherent (choppy) and does not respect trend logic. In such cases, switching assets or timeframes is recommended.
Operational Protocols & Signal Decoding
Visual Interpretation Standards
• Laminar Flow (Trade Confirmation): A valid trend is visually confirmed when the 15-layer SMA Ribbon is fully expanded and parallel. This indicates distributed momentum across timeframes.
• Consolidation (No-Trade): If the ribbon appears twisted, knotted, or compressed, the market lacks a unified directional vector.
• Baseline Interaction: The Triple-Smoothed Baseline acts as a dynamic support/resistance filter. Long positions remain valid only while price sustains above this structure.
System Calibration (Settings)
• Adaptive Signal Filtering (Prev. Anti-Greed): Enabled by default. This logic automatically raises the required trend slope threshold following consecutive wins to mitigate behavioral bias.
• Impulse Sensitivity: Controls the reactivity of the Volatility Core. Higher settings capture faster moves but may introduce more noise.
⚙️ Chapter 6: System Configuration & Alert Guide
This section provides a complete breakdown of every adjustable setting within Impulse Reactor to assist you in tailoring the engine to your specific needs.
🌐 LANGUAGE SETTINGS (Localization)
◦ Select Language (Default: English):
Function: Instantly translates all chart labels, dashboard texts into your preferred language.
Supported: English, Korean, Chinese, Spanish
⚡ IMPULSE CORE SETTINGS (Volatility Engine)
◦ Deviation Lookback (Default: 30): The period used to calculate the standard deviation of volatility.
Role: Sets the baseline for normalizing momentum. Higher values make the core smoother but slower to react.
◦ Fast Pulse Length (Default: 10): The short-term ATR period.
Role: Detects rapid volatility expansion.
◦ Slow Pulse Length (Default: 30): The long-term ATR baseline.
Role: Establishes the background volatility level. The core signal is derived from the divergence between Fast and Slow pulses.
🎯 TP/SL SETTINGS (Risk Management)
◦ SL/TP Fibonacci (Default: 0.786 / 1.618): Selects the Fibonacci ratio used for risk calculation.
◦ SL/TP Multiplier (Default: 1.5 / 2): Applies a multiplier to the ATR-based bands.
Role: Expands or contracts the Take Profit and Stop Loss boxes. Increase these values for higher volatility assets (like Altcoins) to avoid premature stop-outs.
◦ ATR Length (Default: 14): The lookback period for calculating the Average True Range used in risk geometry.
◦ Use Soft Stop (Close Basis):
Role: If enabled, Stop Loss alerts only trigger if a candle closes beyond the invalidation level. This prevents being stopped out by wick manipulations.
🔊 RIBBON SETTINGS (Momentum Visualization)
◦ Show SMA Ribbon: Toggles the visibility of the 15-layer gradient ribbon.
◦ Ribbon Line Count (Default: 15): The number of SMA lines in the ribbon array.
◦ Ribbon Start Length (Default: 2) & Step (Default: 1): Defines the spread of the ribbon.
Role: Controls the "thickness" of the momentum density visualization. A wider step creates a broader ribbon, useful for higher timeframes.
📎 DISPLAY OPTIONS
◦ Show Entry Lines / TP/SL Box / Position Labels / S/R Levels / Dashboard: Toggles individual visual elements on the chart to reduce clutter.
◦ Show SAR+MACD Glow: Enables the secondary confirmation shapes (triangles/circles) above/below candles.
📈 TREND BASELINE (Structural Filter)
◦ Supertrend Factor (Default: 12) & ATR Period (Default: 90): Controls the sensitivity of the underlying Supertrend algorithm used for the baseline calculation.
◦ WMA Length (40) & EMA Length (14): The smoothing periods for the Triple-Smoothed Baseline.
◦ Min Trend Duration (Default: 10): The minimum number of bars the trend must be established before a signal is considered valid.
🧠 SMART EXIT (Dynamic Liquidity)
◦ Use Smart Exit: Enables the momentum exhaustion logic.
◦ Exit Threshold Score (Default: 3): The sensitivity level for triggering a Smart Exit. Lower values trigger earlier exits.
◦ Average Period (168) & Min Hold Bars (5): Defines the rolling window for momentum decay analysis and the minimum duration a trade must be held before Smart Exit logic activates.
🛡️ TRAILING STOP (Step)
◦ Use Trailing Stop: Activates the step-function trailing mechanism.
◦ Step 1 Activation % (0.5) & Offset % (0.5): The price must move 0.5% in your favor to arm the first trail level, which sets a stop 0.5% behind price.
◦ Step 2 Activation % (1) & Offset % (0.2): Once price moves 1%, the trail tightens to 0.2%, securing the position.
🌀 SAR & MACD SETTINGS (Secondary Confirmation)
◦ SAR Start/Increment/Max: Standard Parabolic SAR parameters.
◦ SAR Score Scaling (ATR): Adjusts how much weight the SAR signal has in the overall confluence score.
◦ MACD Fast/Slow/Signal: Standard MACD parameters used for the "Glow" signals.
🔄 ANTI-GREED LOGIC (Behavioral Bias)
◦ Strict Entry after Win: Enables the negative feedback loop.
◦ Strict Multiplier (Default: 1.1): Increases the entry difficulty by 10% after each win.
Role: Prevents overtrading and entering at the top of an extended trend.
🌍 HTF FILTER (Multi-Timeframe)
◦ Use Auto-Adaptive HTF Filter: Automatically selects a higher timeframe (e.g., 1H -> 4H) to filter signals.
◦ Bypass HTF on Steep Trigger: Allows an entry even against the HTF trend if the local momentum slope is exceptionally steep (catch powerful reversals).
📉 RSI PEAK & CHOPPINESS
◦ RSI Peak Exit (Instant): Triggers an immediate exit if a sharp RSI pivot (V-shape) is detected.
◦ Choppiness Filter: Suppresses signals if the Choppiness Index is above the threshold (Default: 60), indicating a flat market.
📐 SLOPE TRIGGER LOGIC
◦ Force Entry on Steep Slope: Overrides other filters if the price angle is extremely vertical (high velocity).
◦ Slope Sensitivity (1.5): The angle required to trigger this override.
⛔ FLAT MARKET FILTER (ADX & ATR)
◦ Use ADX Filter: Blocks signals if ADX is below the threshold (Default: 20), indicating no trend.
◦ Use ATR Flat Filter: Blocks signals if volatility drops below a critical level (dead market).
🔔 Alert Configuration Guide
Impulse Reactor is designed with a comprehensive suite of alert conditions, allowing you to automate your trading or receive real-time notifications for specific market events.
How to Set Up:
Click the "Alert" (Clock) icon in the TradingView toolbar.
Select "Impulse Reactor " from the Condition dropdown.
Choose one of the specific trigger conditions below:
🚀 Entry Signals (Trend Initiation)
Long Entry:
Trigger: Fires when a confirmed Bullish Setup is detected (Momentum + Volatility + Structure align).
Usage: Use this to enter new Long positions.
Short Entry:
Trigger: Fires when a confirmed Bearish Setup is detected.
Usage: Use this to enter new Short positions.
🎯 Profit Taking (Target Levels)
Long TP:
Trigger: Fires when price hits the calculated Take Profit level for a Long trade.
Usage: Automate partial or full profit taking.
Short TP:
Trigger: Fires when price hits the calculated Take Profit level for a Short trade.
Usage: Automate partial or full profit taking.
🛡️ Defensive Exits (Risk Management)
Smart Exit:
Trigger: Fires when the system detects momentum decay or statistical exhaustion (even if the trend hasn't fully reversed).
Usage: Recommended for tightening stops or closing positions early to preserve gains.
Overbought / Oversold:
Trigger: Fires when the ribbon extends into extreme zones.
Usage: Warning signal to prepare for a potential reversal or pullback.
💡 Secondary Confirmation (Confluence)
SAR+MACD Bullish:
Trigger: Fires when Parabolic SAR and MACD align bullishly with the main trend.
Usage: Ideal for Pyramiding (adding to an existing winning position).
SAR+MACD Bearish:
Trigger: Fires when Parabolic SAR and MACD align bearishly.
Usage: Ideal for adding to short positions.
⚠️ Chapter 7: Conclusion & Risk Disclosure
Methodological Synthesis
Impulse Reactor represents a shift from reactive price tracking to proactive energy analysis. By decomposing market activity into its atomic components — Volatility, Momentum, and Structure — and reconstructing them into a coherent decision model, the system aims to provide a quantitative framework for market engagement. It is designed not to predict the future, but to identify high-probability conditions where kinetic energy and trend structure align.
Disclaimer & Risk Warnings
◦ Educational Purpose Only
This indicator, including all associated code, documentation, and visual outputs, is provided strictly for educational and informational purposes. It does not constitute financial advice, investment recommendations, or a solicitation to buy or sell any financial instruments.
◦ No Guarantee of Performance
Past performance is not indicative of future results. All metrics displayed on the dashboard (including "Win Rate" and "P&L") are theoretical calculations based on historical data. These figures do not account for real-world trading factors such as slippage, liquidity gaps, spread costs, or broker commissions.
◦ High-Risk Warning
Trading cryptocurrencies, futures, and leveraged financial products involves a substantial risk of loss. The use of leverage can amplify both gains and losses. Users acknowledge that they are solely responsible for their trading decisions and should conduct independent due diligence before executing any trades.
◦ Software Limitations
The software is provided "as is" without warranty. Users should be aware that market data feeds on analysis platforms may experience latency or outages, which can affect signal generation accuracy.
VWAP + EMA9/21/50 + Ichimoku + RSI (M5) - Strict + TPSL//@version=5
indicator("VWAP + EMA9/21/50 + Ichimoku + RSI (M5) - Strict + TPSL", overlay=true, shorttitle="VWAP_EMA_ICH_RSI_TPSL")
// === Inputs ===
emaFastLen = input.int(9, "EMA Fast (9)")
emaMidLen = input.int(21, "EMA Mid (21)")
emaSlowLen = input.int(50, "EMA Slow (50)")
// Ichimoku inputs
tenkanLen = input.int(9, "Tenkan Sen Length")
kijunLen = input.int(26, "Kijun Sen Length")
senkouBLen = input.int(52, "Senkou B Length")
displacement = input.int(26, "Displacement")
// RSI
rsiLen = input.int(14, "RSI Length")
rsiThreshold = input.int(50, "RSI Threshold")
// VWAP option
useSessionVWAP = input.bool(true, "Use Session VWAP (true) / Daily VWAP (false)")
// Volume filter
useVolumeFilter = input.bool(true, "Enable Volume Filter")
volAvgLen = input.int(20, "Volume Avg Length")
volMultiplier = input.float(1.2, "Min Volume > avg *", step=0.1)
// Higher timeframe trend check
useHTF = input.bool(true, "Enable Higher-Timeframe Trend Check")
htfTF = input.string("60", "HTF timeframe (e.g. 60, 240, D)")
// Alerts / webhook
alertOn = input.bool(true, "Enable Alerts")
useWebhook = input.bool(true, "Send webhook on alerts")
webhookURL = input.string("", "Webhook URL (leave blank to set in alert)")
// TP/SL & Trailing inputs
useTP = input.bool(true, "Enable Take Profit (TP)")
tpTypeRR = input.bool(true, "TP as Risk-Reward ratio (true) / Fixed points (false)")
tpRR = input.float(1.5, "TP RR (e.g. 1.5)", step=0.1)
fixedTPpts = input.float(40.0, "Fixed TP (ticks/pips) if not RR")
useSL = input.bool(true, "Enable Stop Loss (SL)")
slTypeATR = input.bool(true, "SL as ATR-based (true) / Fixed points (false)")
atrLen = input.int(14, "ATR Length")
atrMult = input.float(1.5, "ATR Multiplier for SL", step=0.1)
fixedSLpts = input.float(20.0, "Fixed SL (ticks/pips) if not ATR")
useTrailing = input.bool(true, "Enable Trailing Stop")
trailType = input.string("ATR", "Trailing type: ATR or EMA", options= ) // "ATR" or "EMA"
trailATRmult = input.float(1.0, "Trailing ATR Multiplier", step=0.1)
trailEMAlen = input.int(9, "Trailing EMA Length (if EMA chosen)")
trailLockInPts = input.float(5.0, "Trail lock-in (min profit before trail active, pts)")
// Other
showArrows = input.bool(true, "Show Entry Arrows")
// === Calculations ===
ema9 = ta.ema(close, emaFastLen)
ema21 = ta.ema(close, emaMidLen)
ema50 = ta.ema(close, emaSlowLen)
// VWAP
vwapVal = ta.vwap
// Ichimoku
highestHighTenkan = ta.highest(high, tenkanLen)
lowestLowTenkan = ta.lowest(low, tenkanLen)
tenkan = (highestHighTenkan + lowestLowTenkan) / 2
highestHighKijun = ta.highest(high, kijunLen)
lowestLowKijun = ta.lowest(low, kijunLen)
kijun = (highestHighKijun + lowestLowKijun) / 2
highestHighSenkouB = ta.highest(high, senkouBLen)
lowestLowSenkouB = ta.lowest(low, senkouBLen)
senkouB = (highestHighSenkouB + lowestLowSenkouB) / 2
senkouA = (tenkan + kijun) / 2
// RSI
rsi = ta.rsi(close, rsiLen)
// Volume
volAvg = ta.sma(volume, volAvgLen)
volOk = not useVolumeFilter or (volume > volAvg * volMultiplier)
// Higher timeframe trend values
htf_close = request.security(syminfo.tickerid, htfTF, close)
htf_ema50 = request.security(syminfo.tickerid, htfTF, ta.ema(close, emaSlowLen))
htf_rsi = request.security(syminfo.tickerid, htfTF, ta.rsi(close, rsiLen))
htf_bull = htf_close > htf_ema50
htf_bear = htf_close < htf_ema50
htf_ok = not useHTF or (htf_bull and close > ema50) or (htf_bear and close < ema50)
// Trend filters (on current timeframe)
priceAboveVWAP = close > vwapVal
priceAboveEMA50 = close > ema50
priceAboveCloud = close > senkouA and close > senkouB
bullTrend = priceAboveVWAP and priceAboveEMA50 and priceAboveCloud
bearTrend = not priceAboveVWAP and not priceAboveEMA50 and not priceAboveCloud
// Pullback detection (price near EMA21 within tolerance)
tolPerc = input.float(0.35, "Pullback tolerance (%)", step=0.05) / 100.0
nearEMA21 = math.abs(close - ema21) <= ema21 * tolPerc
// Entry conditions
emaCrossUp = ta.crossover(ema9, ema21)
emaCrossDown = ta.crossunder(ema9, ema21)
longConditionBasic = bullTrend and (nearEMA21 or close >= vwapVal) and emaCrossUp and rsi > rsiThreshold
shortConditionBasic = bearTrend and (nearEMA21 or close <= vwapVal) and emaCrossDown and rsi < rsiThreshold
longCondition = longConditionBasic and volOk and htf_ok and (not useHTF or htf_bull) and (rsi > rsiThreshold)
shortCondition = shortConditionBasic and volOk and htf_ok and (not useHTF or htf_bear) and (rsi < rsiThreshold)
// More strict: require Tenkan > Kijun for bull and Tenkan < Kijun for bear
ichimokuAlign = (tenkan > kijun) ? 1 : (tenkan < kijun ? -1 : 0)
longCondition := longCondition and (ichimokuAlign == 1)
shortCondition := shortCondition and (ichimokuAlign == -1)
// ATR for SL / trailing
atr = ta.atr(atrLen)
// --- Trade management state variables ---
var float activeLongEntry = na
var float activeShortEntry = na
var float activeLongSL = na
var float activeShortSL = na
var float activeLongTP = na
var float activeShortTP = na
var float activeLongTrail = na
var float activeShortTrail = na
// Function to convert fixed points to price (assumes chart in points as price units)
fixedToPriceLong(p) => p
fixedToPriceShort(p) => p
// On signal, set entry, SL and TP
if longCondition
activeLongEntry := close
// SL
if useSL
if slTypeATR
activeLongSL := close - atr * atrMult
else
activeLongSL := close - fixedToPriceLong(fixedSLpts)
else
activeLongSL := na
// TP
if useTP
if tpTypeRR and useSL and not na(activeLongSL)
risk = activeLongEntry - activeLongSL
activeLongTP := activeLongEntry + risk * tpRR
else
activeLongTP := activeLongEntry + fixedToPriceLong(fixedTPpts)
else
activeLongTP := na
// reset short
activeShortEntry := na
activeShortSL := na
activeShortTP := na
// init trailing
activeLongTrail := activeLongSL
if shortCondition
activeShortEntry := close
if useSL
if slTypeATR
activeShortSL := close + atr * atrMult
else
activeShortSL := close + fixedToPriceShort(fixedSLpts)
else
activeShortSL := na
if useTP
if tpTypeRR and useSL and not na(activeShortSL)
riskS = activeShortSL - activeShortEntry
activeShortTP := activeShortEntry - riskS * tpRR
else
activeShortTP := activeShortEntry - fixedToPriceShort(fixedTPpts)
else
activeShortTP := na
// reset long
activeLongEntry := na
activeLongSL := na
activeLongTP := na
// init trailing
activeShortTrail := activeShortSL
// Trailing logic (update only when in profit beyond 'lock-in')
if not na(activeLongEntry) and useTrailing
// current unrealized profit in points
currProfitPts = close - activeLongEntry
if currProfitPts >= trailLockInPts
// declare candidate before use to avoid undeclared identifier errors
float candidate = na
if trailType == "ATR"
candidate := close - atr * trailATRmult
else
candidate := close - ta.ema(close, trailEMAlen)
// move trail stop up but never below initial SL
activeLongTrail := math.max(nz(activeLongTrail, activeLongSL), candidate)
// ensure trail never goes below initial SL if SL exists
if useSL and not na(activeLongSL)
activeLongTrail := math.max(activeLongTrail, activeLongSL)
// update SL to trailing
activeLongSL := activeLongTrail
if not na(activeShortEntry) and useTrailing
currProfitPtsS = activeShortEntry - close
if currProfitPtsS >= trailLockInPts
// declare candidateS before use
float candidateS = na
if trailType == "ATR"
candidateS := close + atr * trailATRmult
else
candidateS := close + ta.ema(close, trailEMAlen)
activeShortTrail := math.min(nz(activeShortTrail, activeShortSL), candidateS)
if useSL and not na(activeShortSL)
activeShortTrail := math.min(activeShortTrail, activeShortSL)
activeShortSL := activeShortTrail
// Detect TP/SL hits (for plotting & alerts)
longTPHit = not na(activeLongTP) and close >= activeLongTP
longSLHit = not na(activeLongSL) and close <= activeLongSL
shortTPHit = not na(activeShortTP) and close <= activeShortTP
shortSLHit = not na(activeShortSL) and close >= activeShortSL
if longTPHit or longSLHit
// reset long state after hit
activeLongEntry := na
activeLongSL := na
activeLongTP := na
activeLongTrail := na
if shortTPHit or shortSLHit
activeShortEntry := na
activeShortSL := na
activeShortTP := na
activeShortTrail := na
// Plot EMAs
p_ema9 = plot(ema9, title="EMA9", linewidth=1)
plot(ema21, title="EMA21", linewidth=1)
plot(ema50, title="EMA50", linewidth=2)
// Plot VWAP
plot(vwapVal, title="VWAP", linewidth=2, style=plot.style_line)
// Plot Ichimoku lines (Tenkan & Kijun)
plot(tenkan, title="Tenkan", linewidth=1)
plot(kijun, title="Kijun", linewidth=1)
// Plot cloud (senkouA & senkouB shifted forward)
plot(senkouA, title="Senkou A", offset=displacement, transp=60)
plot(senkouB, title="Senkou B", offset=displacement, transp=60)
fill(plot(senkouA, offset=displacement), plot(senkouB, offset=displacement), color = senkouA > senkouB ? color.new(color.green, 80) : color.new(color.red, 80))
// Plot active trade lines
plotshape(not na(activeLongEntry), title="Active Long", location=location.belowbar, color=color.new(color.green, 0), style=shape.circle, size=size.tiny)
plotshape(not na(activeShortEntry), title="Active Short", location=location.abovebar, color=color.new(color.red, 0), style=shape.circle, size=size.tiny)
plot(activeLongSL, title="Long SL", color=color.red, linewidth=2)
plot(activeLongTP, title="Long TP", color=color.green, linewidth=2)
plot(activeShortSL, title="Short SL", color=color.red, linewidth=2)
plot(activeShortTP, title="Short TP", color=color.green, linewidth=2)
// Arrows / labels
if showArrows
if longCondition
label.new(bar_index, low, "BUY", style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small)
if shortCondition
label.new(bar_index, high, "SELL", style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small)
// Alerts
// alertcondition must be declared in global scope so TradingView can create alerts from them
alertcondition(longCondition, "VWAP+EMA+Ichimoku+RSI — BUY (STRICT)", "BUY signal from VWAP+EMA+Ichimoku+RSI (STRICT)")
alertcondition(shortCondition, "VWAP+EMA+Ichimoku+RSI — SELL (STRICT)", "SELL signal from VWAP+EMA+Ichimoku+RSI (STRICT)")
// Runtime alerts (still use alert() to trigger immediate alerts; webhook is added in TradingView Alert dialog)
if alertOn
if longCondition
alert("VWAP+EMA+Ichimoku+RSI — BUY (STRICT)", alert.freq_once_per_bar_close)
if shortCondition
alert("VWAP+EMA+Ichimoku+RSI — SELL (STRICT)", alert.freq_once_per_bar_close)
// Alerts for TP/SL hits
if longTPHit
alert("LONG TP HIT", alert.freq_once_per_bar_close)
if longSLHit
alert("LONG SL HIT", alert.freq_once_per_bar_close)
if shortTPHit
alert("SHORT TP HIT", alert.freq_once_per_bar_close)
if shortSLHit
alert("SHORT SL HIT", alert.freq_once_per_bar_close)
// Info table
var table info = table.new(position.top_right, 1, 8)
if barstate.islast
table.cell(info, 0, 0, text = 'Trend: ' + (bullTrend ? 'Bull' : bearTrend ? 'Bear' : 'Neutral'))
table.cell(info, 0, 1, text = 'EMA9/21/50: ' + str.tostring(ema9, format.mintick) + ' / ' + str.tostring(ema21, format.mintick) + ' / ' + str.tostring(ema50, format.mintick))
table.cell(info, 0, 2, text = 'VWAP: ' + str.tostring(vwapVal, format.mintick))
table.cell(info, 0, 3, text = 'RSI: ' + str.tostring(rsi, format.mintick))
table.cell(info, 0, 4, text = 'Vol OK: ' + (volOk ? 'Yes' : 'No'))
table.cell(info, 0, 5, text = 'HTF: ' + htfTF + ' ' + (htf_bull ? 'Bull' : htf_bear ? 'Bear' : 'Neutral'))
table.cell(info, 0, 6, text = 'ActiveLong: ' + (not na(activeLongEntry) ? 'Yes' : 'No'))
table.cell(info, 0, 7, text = 'ActiveShort: ' + (not na(activeShortEntry) ? 'Yes' : 'No'))
// End of script
Force Pulse█ OVERVIEW
Force Pulse is a fast-reacting oscillator that measures the internal strength of market sides by analyzing the aggregated dominance of bulls and bears based on candle size.
The indicator normalizes this difference into a 0–100 range, generates signals (OB/OS, midline cross, MA midline cross), and detects divergences between price and the oscillator.
It also offers advanced visualization, signal markers, and alerts, making it a versatile tool suitable for many trading styles.
█ CONCEPTS
Force Pulse was designed as a universal tool that can be applied to various trading strategies depending on its settings:
- increasing the period lengths and smoothing transforms it into a momentum/trend indicator, revealing a stable dominance of one market side.
- Lowering these parameters turns it into a peak/low detector, ideal for contrarian and mean-reversion strategies.
The oscillator analyzes the relationship between the sum of bullish and bearish candles over a selected period, based on:
- candle body size, or
- average candle body size (AVG Body).
Depending on the selected mode, OB/OS levels should be adjusted, as value dynamics differ between modes.
The output is normalized to 0–100, where:
> 50 – bullish dominance,
< 50 – bearish dominance.
The additional MA line is derived from smoothed oscillator values and serves as a signal line for midline crosses and as a trend filter.
The indicator also detects divergences (HL/LL) between price and the oscillator.
█ FEATURES
Bull & Bear Strength:
- Calculations are based on Body or AVG Body – mode selection requires adjusting OB/OS levels.
- Bullish and bearish candle values are summed separately.
- All results are normalized to the 0–100 scale.
Force Pulse Oscillator:
- The main line reflects the current dominance of either market side.
Dynamic colors:
- Green – above 50,
- Red – below 50.
Signal MA:
- SMA based on oscillator values functions as a signal line.
- Helps detect momentum shifts and generates signals via midline crosses.
- Can serve as a trend confirmation filter.
Overbought / Oversold:
- Configurable OB/OS levels, also for the MA line.
- Dynamic OB/OS line colors: when the MA line exceeds the defined threshold (e.g., MA > maOverbought or MA < maOversold), OB/OS lines change color (red/green).
- This often signals a potential reversal or correction and may act as additional confirmation for oscillator-generated signals.
Divergences:
- Detection based on swing pivots:
- Bullish: price LL, oscillator HL
- Bearish: price HH, oscillator LH
- Displayed as “Bull” / “Bear” labels.
Signals:
Supports multiple signal types:
- Overbought/Oversold Cross
- Midline Cross
- MA Midline Cross (based on the signal MA line)
- Signals appear as triangles above/below the oscillator.
Visualization:
- Gradient options for lines and levels.
- Full customization of colors, transparency, and line thickness.
Alerts available for:
- Divergences
- OB/OS crossings
- Midline crossings
- MA midline crossings
█ HOW TO USE
Add the indicator to your TradingView chart → Indicators → search “Force Pulse”
Parameter Configuration
Calculation Settings:
- Calculation Period (lookback) – defines the strength calculation window.
Force Mode (Body / AVG Body):
- Body – faster response, higher sensitivity.
- AVG Body – more stable output; adjust band levels and periods to your strategy.
- EMA Smoothing (smoothLen) – reduces oscillator noise.
- MA Length – length of the signal line (SMA).
Threshold Levels:
- Set Overbought/Oversold levels for both the oscillator and the MA line.
- Adjust levels depending on Body / AVG Body mode.
Divergence Detection:
- Enable/disable divergence detection.
- PivotLength affects both delay and signal quality.
- Signal Settings: Choose one or multiple signal types.
- Style & Colors: Full control over color schemes, gradients, and transparency.
Signal Interpretation
BUY:
- Oscillator leaves oversold (OS crossover).
- Midline cross upward.
- MA crosses the midline from below.
- Bullish divergence.
SELL:
- Oscillator leaves overbought (drops below OB).
- Midline cross downward.
- MA crosses the midline from above.
- Bearish divergence.
Trend / Momentum:
-Longer periods and stronger smoothing → stable directional signals.
-MA as a trend filter: e.g., signal line above the midline (50) and MA pointing upward indicates continuation of a bullish impulse.
Contrarian / Mean Reversion:
- Short periods → rapid detection of peaks and troughs; ideal for contrarian signals and pullback entries.
█ APPLICATIONS
- Trend Trading: Using midline and MA midline crosses to determine direction.
- Reversal Trading: OB/OS levels and divergences help identify reversals.
- Scalping & Intraday: Short settings + signal line above the midline with bullish MA → shows short-term impulse and continuation.
- Swing Trading: Longer MA and higher lookback provide a stable view of market-side dominance.
- Momentum Analysis: Force Pulse highlights the strength of the wave before price movement occurs.
█ NOTES
- In strong trends, the oscillator may stay in extreme zones for a long time — this reflects dominance, not necessarily a reversal signal.
- Divergences are more reliable on higher timeframes.
- OB/OS levels should be tailored to Body/AVG Body mode and the instrument.
- Best results come from combining the indicator with other tools (S/R, market structure, volume).
VMDM - Volume, Momentum & Divergence Master [BullByte]VMDM - Volume, Momentum and Divergence Master
Educational Multi-Layer Market Structure Analysis System
Multi-factor divergence engine that scores RSI momentum, volume pressure, and institutional footprints into one non-repainting confluence rating (0-100).
WHAT THIS INDICATOR IS
VMDM is an educational indicator designed to teach traders how to recognize high-probability reversal and continuation patterns by analyzing four independent market dimensions simultaneously. Instead of relying on a single indicator that may produce frequent false signals, VMDM creates a confluence-based scoring system that weights multiple confirmation factors, helping you understand which setups have stronger technical backing and which are lower quality.
This is NOT a trading system or signal generator. It is a learning tool that visualizes complex market structure concepts in an accessible format for both coders and non-coders.
THE PROBLEM IT SOLVES
Most traders face these common challenges:
Challenge 1 - Indicator Overload: Running RSI, volume analysis, and divergence detection separately creates chart clutter and conflicting signals. You waste time cross-referencing multiple windows trying to determine if all factors align.
Challenge 2 - False Divergences: Standard divergence indicators trigger on every minor pivot, creating noise. Many divergences fail because they lack supporting evidence from volume or market structure.
Challenge 3 - Missed Context: A bullish RSI divergence means nothing if it occurs during weak volume or in the middle of strong distribution. Context determines quality.
Challenge 4 - Repainting Confusion: Many divergence scripts repaint, showing perfect historical signals that never actually triggered in real-time, leading to false confidence.
Challenge 5 - Institutional Pattern Recognition: Absorption zones, stop hunts, and exhaustion patterns are taught in trading education but difficult to identify systematically without manual analysis.
VMDM addresses all five challenges by combining complementary analytical layers into one transparent, non-repainting, confluence-weighted system with visual clarity.
WHY THIS SPECIFIC COMBINATION - MASHUP JUSTIFICATION
This indicator is NOT a random mashup of popular indicators. Each of the four layers serves a specific analytical purpose and together they create a complete market structure assessment framework.
THE FOUR ANALYTICAL LAYERS
LAYER 1 - RSI MOMENTUM DIVERGENCE (Trend Exhaustion Detection)
Purpose: Identifies when price momentum is weakening before price itself reverses.
Why RSI: The Relative Strength Index measures momentum on a bounded 0-100 scale, making divergence detection mathematically consistent across all assets and timeframes. Unlike raw price oscillators, RSI normalizes momentum regardless of volatility regime.
How It Contributes: Divergence between price pivots and RSI pivots reveals early momentum exhaustion. A lower price low with a higher RSI low (bullish regular divergence) signals sellers are losing strength even as price makes new lows. This is the PRIMARY signal generator in VMDM.
Limitation If Used Alone: RSI divergence by itself produces many false signals because momentum can remain weak during continued trends. It needs confirmation from volume and structural evidence.
LAYER 2 - VOLUME PRESSURE ANALYSIS (Buying vs Selling Intensity)
Purpose: Quantifies whether the current bar's volume reflects buying pressure or selling pressure based on where price closed within the bar's range.
Methodology: Instead of just measuring volume size, VMDM calculates WHERE in the bar range the close occurred. A close near the high on high volume indicates strong buying absorption. A close near the low indicates selling pressure. The calculation accounts for wick size (wicks reduce pressure quality) and uses percentile ranking over a lookback period to normalize pressure strength on a 0-100 scale.
Formula Concept:
Buy Pressure = Volume × (Close - Low) / (High - Low) × Wick Quality Factor
Sell Pressure = Volume × (High - Close) / (High - Low) × Wick Quality Factor
Net Pressure = Buy Pressure - Sell Pressure
Pressure Strength = Percentile Rank of Net Pressure over lookback period
Why Percentile Ranking: Absolute volume varies by asset and session. Percentile ranking makes 85th percentile pressure on low-volume crypto comparable to 85th percentile pressure on high-volume forex.
How It Contributes: When a bullish divergence occurs at a pivot low AND pressure strength is above 60 (strong buying), this adds 25 confluence points. It confirms that the divergence is occurring during actual accumulation, not just weak selling.
Limitation If Used Alone: Pressure analysis shows current bar intensity but cannot identify trend exhaustion or reversal timing. High buying pressure can exist during a strong uptrend with no reversal imminent.
LAYER 3 - BEHAVIORAL FOOTPRINT PATTERNS (Volume Anomaly Detection)
CRITICAL DISCLAIMER: The terms "institutional footprint," "absorption," "stop hunt," and "exhaustion" used in this indicator are EDUCATIONAL LABELS for specific price and volume behavioral patterns. These patterns are detected through technical analysis of publicly available price, volume, and bar structure data. This indicator does NOT have access to actual institutional order flow, market maker data, broker stop-loss locations, or any non-public data source. These pattern names are used because they are common terminology in trading education to describe these technical behaviors. The analysis is interpretive and based on observable price action, not privileged information.
Purpose: Detect volume anomalies and price patterns that historically correlate with potential reversal zones or trend continuation failure.
Pattern Type 1 - Absorption (Labeled as "ACCUMULATION" or "DISTRIBUTION")
Detection Criteria: Volume is more than 2x the moving average AND bar range is less than 50 percent of the average bar range.
Interpretation: High volume compressed into a tight range suggests large participants are absorbing supply (accumulation) or distribution (distribution) without allowing price to move significantly. This often precedes directional moves once absorption completes.
Visual: Colored box zone highlighting the absorption area.
Pattern Type 2 - Stop Hunt (Labeled as "BULL HUNT" or "BEAR HUNT")
Detection Criteria: Price penetrates a recent 10-bar high or low by a small margin (0.2 percent), then closes back inside the range on above-average volume (1.5x+).
Interpretation: Price briefly spikes beyond recent structure (likely triggering stop losses placed just beyond obvious levels) then reverses. This is a classic false breakout pattern often seen before reversals.
Visual: Label at the wick extreme showing hunt direction.
Pattern Type 3 - Exhaustion (Labeled as "SELL EXHAUST" or "BUY EXHAUST")
Detection Criteria: Lower wick is more than 2.5x the body size with volume above 1.8x average and RSI below 35 (sell exhaustion), OR upper wick more than 2.5x body size with volume above 1.8x average and RSI above 65 (buy exhaustion).
Interpretation: Large wicks with high volume and extreme RSI suggest aggressive buying or selling was met with equally aggressive rejection. This exhaustion often marks short-term extremes.
Visual: Label showing exhaustion type.
How These Contribute: When a divergence forms at a pivot AND one of these behavioral patterns is active, the confluence score increases by 20 points. This confirms the divergence is occurring during structural anomaly activity, not just normal price flow.
Limitation If Used Alone: These patterns can occur mid-trend and do not indicate direction without momentum context. Absorption in a strong uptrend may just be continuation accumulation.
LAYER 4 - CONFLUENCE SCORING MATRIX (Quality Weighting System)
Purpose: Translate all detected conditions into a single 0-100 quality score so you can objectively compare setups.
Scoring Breakdown:
Divergence Present: +30 points (primary signal)
Pressure Confirmation: +25 points (volume supports direction)
Behavioral Footprint Active: +20 points (structural anomaly present)
RSI Extreme: +15 points (RSI below 30 or above 70 at pivot)
Volume Spike: +10 points (current volume above 1.5x average)
Maximum Possible Score: 100 points
Why These Weights: The weights reflect reliability hierarchy based on backtesting observation. Divergence is the core signal (30 points), but without volume confirmation (25 points) many fail. Behavioral patterns add meaningful context (20 points). RSI extremes and volume spikes are secondary confirmations (15 and 10 points).
Quality Tiers:
90-100: TEXTBOOK (all factors aligned)
75-89: HIGH QUALITY (strong confluence)
60-74: VALID (meets minimum threshold)
Below 60: DEVELOPING (not displayed unless threshold lowered)
How It Contributes: The confluence score allows you to filter noise. You can set your minimum quality threshold in settings. Higher thresholds (75+) show fewer but higher-quality patterns. Lower thresholds (50-60) show more patterns but include lower-confidence setups. This teaches you to distinguish strong setups from weak ones.
Limitation: Confluence scoring is historical observation-based, not predictive guarantee. A 95-point setup can still fail. The score represents technical alignment, not future certainty.
WHY THIS COMBINATION WORKS TOGETHER
Each layer addresses a limitation in the others:
RSI Divergence identifies WHEN momentum is exhausting (timing)
Volume Pressure confirms WHETHER the exhaustion is accompanied by opposite-side accumulation (confirmation)
Behavioral Footprint shows IF structural anomalies support the reversal hypothesis (context)
Confluence Scoring weights ALL factors into an objective quality metric (filtering)
Using only RSI divergence gives you timing without confirmation. Using only volume pressure gives you intensity without directional context. Using only pattern detection gives you anomalies without trend exhaustion context. Using all four together creates a complete analytical framework where each layer compensates for the others' weaknesses.
This is not a mashup for the sake of combining indicators. It is a structured analytical system where each component has a defined role in a multi-dimensional market assessment process.
HOW TO READ THE INDICATOR - VISUAL ELEMENTS GUIDE
VMDM displays up to five visual layer types. You can enable or disable each layer independently in settings under "Visual Layers."
VISUAL LAYER 1 - MARKET STRUCTURE (Pivot Points and Lines)
What You See:
Small labels at swing highs and lows marked "PH" (Pivot High) and "PL" (Pivot Low) with horizontal dashed lines extending right from each pivot.
What It Means:
These are CONFIRMED pivots, not real-time. A pivot low appears AFTER the required right-side confirmation bars pass (default 3 bars). This creates a delay but prevents repainting. The pivot only appears once it is mathematically confirmed.
The horizontal lines represent support (from pivot lows) and resistance (from pivot highs) levels where price previously found significant rejection.
Color Coding:
Green label and line: Pivot Low (potential support)
Red label and line: Pivot High (potential resistance)
How To Use:
These pivots are the foundation for divergence detection. Divergence is only calculated between confirmed pivots, ensuring all signals are non-repainting. The lines help you see historical structure levels.
VISUAL LAYER 2 - PRESSURE ZONES (Background Color)
What You See:
Subtle background color shading on bars - light green or light red tint.
What It Means:
This visualizes volume pressure strength in real-time.
Color Coding:
Light Green Background: Pressure Strength above 70 (strong buying pressure - price closing near highs on volume)
Light Red Background: Pressure Strength below 30 (strong selling pressure - price closing near lows on volume)
No Color: Neutral pressure (pressure between 30-70)
How To Use:
When a bullish divergence pattern appears during green pressure zones, it suggests the divergence is forming during accumulation. When a bearish divergence appears during red zones, distribution is occurring. Pressure zones help you filter divergences - those forming in supportive pressure environments have higher probability.
VISUAL LAYER 3 - DIVERGENCE LINES (Dotted Connectors)
What You See:
Dotted lines connecting two pivot points (either two pivot lows or two pivot highs).
What It Means:
A divergence has been detected between those two pivots. The line connects the price pivots where RSI showed opposite behavior.
Color Coding:
Bright Green Line: Bullish divergence (regular or hidden)
Bright Red Line: Bearish divergence (regular or hidden)
How To Use:
The divergence line appears ONLY after the second pivot is confirmed (delayed by right-side confirmation bars). This is intentional to prevent repainting. When you see the line appear, it means:
For Bullish Regular Divergence:
Price made a lower low (second pivot lower than first)
RSI made a higher low (RSI at second pivot higher than first)
Interpretation: Downtrend losing momentum
For Bullish Hidden Divergence:
Price made a higher low (second pivot higher than first)
RSI made a lower low (RSI at second pivot lower than first)
Interpretation: Uptrend continuation likely (pullback within uptrend)
For Bearish Regular Divergence:
Price made a higher high (second pivot higher than first)
RSI made a lower high (RSI at second pivot lower than first)
Interpretation: Uptrend losing momentum
For Bearish Hidden Divergence:
Price made a lower high (second pivot lower than first)
RSI made a higher high (RSI at second pivot higher than first)
Interpretation: Downtrend continuation likely (bounce within downtrend)
If "Show Consolidated Analysis Label" is disabled, a small label will appear on the divergence line showing the divergence type abbreviation.
VISUAL LAYER 4 - BEHAVIORAL FOOTPRINT MARKERS
What You See:
Boxes, labels, and markers at specific bars showing pattern detection.
ABSORPTION ZONES (Boxes):
Colored rectangular boxes spanning one or more bars.
Purple Box: Accumulation absorption zone (high volume, tight range, bullish close)
Red Box: Distribution absorption zone (high volume, tight range, bearish close)
If absorption continues for multiple consecutive bars, the box extends and a counter appears in the label showing how many bars the absorption lasted.
What It Means: Large volume is being absorbed without significant price movement. This often precedes directional breakouts once the absorption phase completes.
STOP HUNT MARKERS (Labels):
Small labels below or above wicks labeled "BULL HUNT" or "BEAR HUNT" (may show bar count if consecutive).
What It Means:
BULL HUNT : Price spiked below recent lows then reversed back up on volume - likely triggered sell stops before reversing
BEAR HUNT : Price spiked above recent highs then reversed back down on volume - likely triggered buy stops before reversing
EXHAUSTION MARKERS (Labels):
Labels showing "SELL EXHAUST" or "BUY EXHAUST."
What It Means:
SELL EXHAUST : Large lower wick with high volume and low RSI - aggressive selling met with strong rejection
BUY EXHAUST : Large upper wick with high volume and high RSI - aggressive buying met with strong rejection
How To Use:
These markers help you identify WHERE structural anomalies occurred. When a divergence signal appears AT THE SAME TIME as one of these patterns, the confluence score increases. You are looking for alignment - divergence + behavioral pattern + pressure confirmation = high-quality setup.
VISUAL LAYER 5 - CONSOLIDATED ANALYSIS LABEL (Main Pattern Signal)
What You See:
A large label appearing at pivot points (or in real-time mode, at current bar) containing full pattern analysis.
Label Appearance:
Depending on your "Use Compact Label Format" setting:
COMPACT MODE (Single Line):
Example: "BULLISH REGULAR | Q:HIGH QUALITY C:82"
Breakdown:
BULLISH REGULAR: Divergence type detected
Q:HIGH QUALITY: Pattern quality tier
C:82: Confluence score (82 out of 100)
FULL MODE (Multi-Line Detailed):
Example:
PATTERN DETECTED
-------------------
BULLISH REGULAR
Quality: HIGH QUALITY
Price: Lower Low
Momentum: Higher Low
Signal: Weakening Downtrend
CONFLUENCE: 82/100
-------------------
Divergence: 30
Pressure: 25
Institutional: 20
RSI Extreme: 0
Volume: 10
Breakdown:
Top section: Pattern type and quality
Middle section: Divergence explanation (what price did vs what RSI did)
Bottom section: Confluence score with itemized breakdown showing which factors contributed
Label Position:
In Confirmed modes: Label appears AT the pivot point (delayed by confirmation bars)
In Real-time mode: Label appears at current bar as conditions develop
Label Color:
Gold: Textbook quality (90+ confluence)
Green: High quality (75-89 confluence)
Blue: Valid quality (60-74 confluence)
How To Use:
This is your primary decision-making label. When it appears:
Check the divergence type (regular divergences are reversal signals, hidden divergences are continuation signals)
Review the quality tier (textbook and high quality have better historical win rates)
Examine the confluence breakdown to see which factors are present and which are missing
Look at the chart context (trend, support/resistance, timeframe)
Use this information to assess whether the setup aligns with your strategy
The label does NOT tell you to buy or sell. It tells you a technical pattern has formed and provides the quality assessment. Your trading decision must incorporate risk management, market context, and your strategy rules.
UNDERSTANDING THE THREE DETECTION MODES
VMDM offers three signal detection modes in settings to accommodate different trading styles and learning objectives.
MODE 1: "Confluence Only (Real-Time)"
How It Works: Displays signals AS THEY DEVELOP on the current bar without waiting for pivot confirmation. The system calculates confluence score from pressure, volume, RSI extremes, and behavioral patterns. Divergence signals are NOT required in this mode.
Delay: ZERO - signals appear immediately.
Use Case: Real-time scanning for high-confluence zones without divergence requirement. Useful for intraday traders who want immediate alerts when multiple factors align.
Tradeoff: More frequent signals but includes setups without confirmed divergence. Higher false signal rate. Signals can change as the bar develops (not repainting in historical bars, but current bar updates).
Visual Behavior: Labels appear at the current bar. No divergence lines unless divergence happens to be present.
MODE 2: "Divergence + Confluence (Confirmed)" - DEFAULT RECOMMENDED
How It Works: Full system engagement. Signals appear ONLY when:
A pivot is confirmed (requires right-side confirmation bars to pass)
Divergence is detected between current pivot and previous pivot
Total confluence score meets or exceeds your minimum threshold
Delay: Equal to your "Pivot Right Bars" setting (default 3 bars). This means signals appear 3 bars AFTER the actual pivot formed.
Use Case: Highest-quality, non-repainting signals for swing traders and learners who want to study confirmed pattern completion.
Tradeoff: Delayed signals. You will not receive the signal until confirmation occurs. In fast-moving markets, price may have already moved significantly by the time the signal appears.
Visual Behavior: Labels appear at the historical pivot location (in the past). Divergence lines connect the two pivots. This is the most educational mode because it shows completed, confirmed patterns.
Non-Repainting Guarantee: Yes. Once a signal appears, it never disappears or changes.
MODE 3: "Divergence + Confluence (Relaxed)"
How It Works: Same as Confirmed mode but with adaptive thresholds. If confluence is very high (10 points above threshold), the signal may appear even if some factors are weak. If divergence is present but confluence is slightly below threshold (within 10 points), it may still appear.
Delay: Same as Confirmed mode (right-side confirmation bars).
Use Case: Slightly more signals than Confirmed mode for traders willing to accept near-threshold setups.
Tradeoff: More signals but lower average quality than Confirmed mode.
Visual Behavior: Same as Confirmed mode.
DASHBOARD GUIDE - READING THE METRICS
The dashboard appears in the corner of your chart (position selectable in settings) and provides real-time market state analysis.
You can choose between four dashboard detail levels in settings: Off, Compact, Optimized (default), Full.
DASHBOARD ROW EXPLANATIONS
ROW 1 - Header Information
Left: Current symbol and timeframe
Center: "VMDM "
Right: Version number
ROW 2 - Mode and Delay
Shows which detection mode you are using and the signal delay.
Example: "CONFIRMED | Delay: 3 bars"
This reminds you that signals in confirmed mode appear 3 bars after the pivot forms.
ROW 3 - Market Regime
Format: "TREND UP HV" or "RANGING NV"
First Part - Trend State:
TREND UP: 20 EMA above 50 EMA with strong separation
TREND DOWN: 20 EMA below 50 EMA with strong separation
RANGING: EMAs close together, low trend strength
TRANSITION: Between trending and ranging states
Second Part - Volatility State:
HV: High Volatility (current ATR more than 1.3x the 50-bar average ATR)
NV: Normal Volatility (current ATR between 0.7x and 1.3x average)
LV: Low Volatility (current ATR less than 0.7x average)
Third Column: Volatility ratio (example: "1.45x" means current ATR is 1.45 times normal)
How To Use: Regime context helps you interpret signals. Reversal divergences are more reliable in ranging or transitional regimes. Continuation divergences (hidden) are more reliable in trending regimes. High volatility means wider stops may be needed.
ROW 4 - Pressure
Shows current volume pressure state.
Format: "BUYING | ██████████░░░░░░░░░"
States:
BUYING : Pressure strength above 60 (closes near highs)
SELLING : Pressure strength below 40 (closes near lows)
NEUTRAL : Pressure strength between 40-60
Bar Visualization: Each block represents 10 percentile points. A full bar (10 filled blocks) = 100th percentile pressure.
Color: Green for buying, red for selling, gray for neutral.
How To Use: When pressure aligns with divergence direction (bullish divergence during buying pressure), confluence is stronger.
ROW 5 - Volume and RSI
Format: "1.8x | RSI 68 | OB"
First Value: Current volume ratio (1.8x = volume is 1.8 times the moving average)
Second Value: Current RSI reading
Third Value: RSI state
OB: Overbought (RSI above 70)
OS: Oversold (RSI below 30)
Blank: Neutral RSI
How To Use: Volume spikes (above 1.5x) during divergence formation add confluence. RSI extremes at pivots add confluence.
ROW 6 - Behavioral Footprint
Format: "BULL HUNT | 2 bars"
Shows the most recent behavioral pattern detected and how long ago.
States:
ACCUMULATION / DISTRIBUTION: Absorption detected
BULL HUNT / BEAR HUNT: Stop hunt detected
SELL EXHAUST / BUY EXHAUST: Exhaustion detected
SCANNING: No recent pattern
NOW: Pattern is active on current bar
How To Use: When footprint activity is recent (within 50 bars) or active now, it adds context to divergence signals forming in that area.
ROW 7 - Current Pattern
Shows the divergence type currently detected (if any).
Examples: "BULLISH REGULAR", "BEARISH HIDDEN", "Scanning..."
Quality: Shows pattern quality (TEXTBOOK, HIGH QUALITY, VALID)
How To Use: This tells you what type of signal is active. Regular divergences are reversal setups. Hidden divergences are continuation setups.
ROW 8 - Session Summary
Format: "14 events | A3 H8 E3"
First Value: Total institutional events this session
Breakdown:
A: Absorption events
H: Stop hunt events
E: Exhaustion events
How To Use: High event counts suggest an active, volatile session with frequent structural anomalies. Low counts suggest quiet, orderly price action.
ROW 9 - Confluence Score (Optimized/Full mode only)
Format: "78/100 | ████████░░"
Shows current real-time confluence score even if no pattern is confirmed yet.
How To Use: Watch this in real-time to see how close you are to pattern formation. When it exceeds your threshold and divergence forms, a signal will appear (after confirmation delay).
ROW 10 - Patterns Studied (Optimized/Full mode only)
Format: "47 patterns | 12 bars ago"
First Value: Total confirmed patterns detected since chart loaded
Second Value: How many bars since the last confirmed pattern appeared
How To Use: Helps you understand pattern frequency on your selected symbol and timeframe. If many bars have passed since last pattern, market may be trending without reversal opportunities.
ROW 11 - Bull/Bear Ratio (Optimized/Full mode only)
Format: "28:19 | BULL"
Shows count of bullish vs bearish patterns detected.
Balance:
BULL: More bullish patterns detected (suggests market has had more bullish reversals/continuations)
BEAR: More bearish patterns detected
BAL: Equal counts
How To Use: Extreme imbalances can indicate directional bias in the studied period. A heavily bullish ratio in a downtrend might suggest frequent failed rallies (bearish continuation). Context matters.
ROW 12 - Volume Ratio Detail (Optimized/Full mode only)
Shows current volume vs average volume in absolute terms.
Example: "1.4x | 45230 / 32300"
How To Use: Confirms whether current activity is above or below normal.
ROW 13 - Last Institutional Event (Full mode only)
Shows the most recent institutional pattern type and how many bars ago it occurred.
Example: "DISTRIBUTION | 23 bars"
How To Use: Tracks recency of last anomaly for context.
SETTINGS GUIDE - EVERY PARAMETER EXPLAINED
PERFORMANCE SECTION
Enable All Visuals (Master Toggle)
Default: ON
What It Does: Master kill switch for ALL visual elements (labels, lines, boxes, background colors, dashboard). When OFF, only plot outputs remain (invisible unless you open data window).
When To Change: Turn OFF on mobile devices, 1-second charts, or slow computers to improve performance. You can still receive alerts even with visuals disabled.
Impact: Dramatic performance improvement when OFF, but you lose all visual feedback.
Maximum Object History
Default: 50 | Range: 10-100
What It Does: Limits how many of each object type (labels, lines, boxes) are kept in memory. Older objects beyond this limit are deleted.
When To Change: Lower to 20-30 on fast timeframes (1-minute charts) to prevent slowdown. Increase to 100 on daily charts if you want more historical pattern visibility.
Impact: Lower values = better performance but less historical visibility. Higher values = more history visible but potential slowdown on fast timeframes.
Alert Cooldown (Bars)
Default: 5 | Range: 1-50
What It Does: Minimum number of bars that must pass before another alert of the same type can fire. Prevents alert spam when multiple patterns form in quick succession.
When To Change: Increase to 20+ on 1-minute charts to reduce noise. Decrease to 1-2 on daily charts if you want every pattern alerted.
Impact: Higher cooldown = fewer alerts. Lower cooldown = more alerts.
USER EXPERIENCE SECTION
Show Enhanced Tooltips
Default: ON
What It Does: Enables detailed hover-over tooltips on labels and visual elements.
When To Change: Turn OFF if you encounter Pine Script compilation errors related to tooltip arguments (rare, platform-specific issue).
Impact: Minimal. Just adds helpful hover text.
MARKET STRUCTURE DETECTION SECTION
Pivot Left Bars
Default: 3 | Range: 2-10
What It Does: Number of bars to the LEFT of the center bar that must be higher (for pivot low) or lower (for pivot high) than the center bar for a pivot to be valid.
Example: With value 3, a pivot low requires the center bar's low to be lower than the 3 bars to its left.
When To Change:
Increase to 5-7 on noisy timeframes (1-minute charts) to filter insignificant pivots
Decrease to 2 on slow timeframes (daily charts) to catch more pivots
Impact: Higher values = fewer, more significant pivots = fewer signals. Lower values = more frequent pivots = more signals but more noise.
Pivot Right Bars
Default: 3 | Range: 2-10
What It Does: Number of bars to the RIGHT of the center bar that must pass for confirmation. This creates the non-repainting delay.
Example: With value 3, a pivot is confirmed 3 bars AFTER it forms.
When To Change:
Increase to 5-7 for slower, more confirmed signals (better for swing trading)
Decrease to 2 for faster signals (better for intraday, but still non-repainting)
Impact: Higher values = longer delay but more reliable confirmation. Lower values = faster signals but less confirmation. This setting directly controls your signal delay in Confirmed and Relaxed modes.
Minimum Confluence Score
Default: 60 | Range: 40-95
What It Does: The threshold score required for a pattern to be displayed. Patterns with confluence scores below this threshold are not shown.
When To Change:
Increase to 75+ if you only want high-quality textbook setups (fewer signals)
Decrease to 50-55 if you want to see more developing patterns (more signals, lower average quality)
Impact: This is your primary signal filter. Higher threshold = fewer, higher-quality signals. Lower threshold = more signals but includes weaker setups. Recommended starting point is 60-65.
TECHNICAL PERIODS SECTION
RSI Period
Default: 14 | Range: 5-50
What It Does: Lookback period for RSI calculation.
When To Change:
Decrease to 9-10 for faster, more sensitive RSI that detects shorter-term momentum changes
Increase to 21-28 for slower, smoother RSI that filters noise
Impact: Lower values make RSI more volatile (more frequent extremes and divergences). Higher values make RSI smoother (fewer but more significant divergences). 14 is industry standard.
Volume Moving Average Period
Default: 20 | Range: 10-200
What It Does: Lookback period for calculating average volume. Current volume is compared to this average to determine volume ratio.
When To Change:
Decrease to 10-14 for shorter-term volume comparison (more sensitive to recent volume changes)
Increase to 50-100 for longer-term volume comparison (smoother, less sensitive)
Impact: Lower values make volume ratio more volatile. Higher values make it more stable. 20 is standard.
ATR Period
Default: 14 | Range: 5-100
What It Does: Lookback period for Average True Range calculation used for volatility measurement and label positioning.
When To Change: Rarely needs adjustment. Use 7-10 for faster volatility response, 21-28 for slower.
Impact: Affects volatility ratio calculation and visual label spacing. Minimal impact on signals.
Pressure Percentile Lookback
Default: 50 | Range: 10-300
What It Does: Lookback period for calculating volume pressure percentile ranking. Your current pressure is ranked against the pressure of the last X bars.
When To Change:
Decrease to 20-30 for shorter-term pressure context (more responsive to recent changes)
Increase to 100-200 for longer-term pressure context (smoother rankings)
Impact: Lower values make pressure strength more sensitive to recent bars. Higher values provide more stable, long-term pressure assessment. Capped at 300 for performance reasons.
SIGNAL DETECTION SECTION
Signal Detection Mode
Default: "Divergence + Confluence (Confirmed)"
Options:
Confluence Only (Real-time)
Divergence + Confluence (Confirmed)
Divergence + Confluence (Relaxed)
What It Does: Selects which detection logic mode to use (see "Understanding The Three Detection Modes" section above).
When To Change: Use Confirmed for learning and non-repainting signals. Use Real-time for live scanning without divergence requirement. Use Relaxed for slightly more signals than Confirmed.
Impact: Fundamentally changes when and how signals appear.
VISUAL LAYERS SECTION
All toggles default to ON. Each controls visibility of one visual layer:
Show Market Structure: Pivot markers and support/resistance lines
Show Pressure Zones: Background color shading
Show Divergence Lines: Dotted lines connecting pivots
Show Institutional Footprint Markers: Absorption boxes, hunt labels, exhaustion labels
Show Consolidated Analysis Label: Main pattern detection label
Use Compact Label Format
Default: OFF
What It Does: Switches consolidated label between single-line compact format and multi-line detailed format.
When To Change: Turn ON if you find full labels too large or distracting.
Impact: Visual clarity vs. information density tradeoff.
DASHBOARD SECTION
Dashboard Mode
Default: "Optimized"
Options: Off, Compact, Optimized, Full
What It Does: Controls how much information the dashboard displays.
Off: No dashboard
Compact: 8 rows (essential metrics only)
Optimized: 12 rows (recommended balance)
Full: 13 rows (every available metric)
Dashboard Position
Default: "Top Right"
Options: Top Right, Top Left, Bottom Right, Bottom Left
What It Does: Screen corner where dashboard appears.
HOW TO USE VMDM - PRACTICAL WORKFLOW
STEP 1 - INITIAL SETUP
Add VMDM to your chart
Select your detection mode (Confirmed recommended for learning)
Set your minimum confluence score (start with 60-65)
Adjust pivot parameters if needed (default 3/3 is good for most timeframes)
Enable the visual layers you want to see
STEP 2 - CHART ANALYSIS
Let the indicator load and analyze historical data
Review the patterns that appear historically
Examine the confluence scores - notice which patterns had higher scores
Observe which patterns occurred during supportive pressure zones
Notice the divergence line connections - understand what price vs RSI did
STEP 3 - PATTERN RECOGNITION LEARNING
When a consolidated analysis label appears:
Read the divergence type (regular or hidden, bullish or bearish)
Check the quality tier (textbook, high quality, or valid)
Review the confluence breakdown - which factors contributed
Look at the chart context - where is price relative to structure, trend, etc.
Observe the behavioral footprint markers nearby - do they support the pattern
STEP 4 - REAL-TIME MONITORING
Watch the dashboard for real-time regime and pressure state
Monitor the current confluence score in the dashboard
When it approaches your threshold, be alert for potential pattern formation
When a new pattern appears (after confirmation delay), evaluate it using the workflow above
Use your trading strategy rules to decide if the setup aligns with your criteria
STEP 5 - POST-PATTERN OBSERVATION
After a pattern appears:
Mark the level on your chart
Observe what price does after the pattern completes
Did price respect the reversal/continuation signal
What was the confluence score of patterns that worked vs. those that failed
Learn which quality tiers and confluence levels produce better results on your specific symbol and timeframe
RECOMMENDED TIMEFRAMES AND ASSET CLASSES
VMDM is timeframe-agnostic and works on any asset with volume data. However, optimal performance varies:
BEST TIMEFRAMES
15-Minute to 1-Hour: Ideal balance of signal frequency and reliability. Pivot confirmation delay is acceptable. Sufficient volume data for pressure analysis.
4-Hour to Daily: Excellent for swing trading. Very high-quality signals. Lower frequency but higher significance. Recommended for learning because patterns are clearer.
1-Minute to 5-Minute: Works but requires adjustment. Increase pivot bars to 5-7 for filtering. Decrease max object history to 30 for performance. Expect more noise.
Weekly/Monthly: Works but very infrequent signals. Increase confluence threshold to 70+ to ensure only major patterns appear.
BEST ASSET CLASSES
Forex Majors: Excellent volume data and clear trends. Pressure analysis works well.
Crypto (Major Pairs): Good volume data. High volatility makes divergences more pronounced. Works very well.
Stock Indices (SPY, QQQ, etc.): Excellent. Clean price action and reliable volume.
Individual Stocks: Works well on high-volume stocks. Low-volume stocks may produce unreliable pressure readings.
Commodities (Gold, Oil, etc.): Works well. Clear trends and reactions.
WHAT THIS INDICATOR CANNOT DO - LIMITATIONS
LIMITATION 1 - It Does Not Predict The Future
VMDM identifies when technical conditions align historically associated with potential reversals or continuations. It does not predict what will happen next. A textbook 95-confluence pattern can still fail if fundamental events, news, or larger timeframe structure override the setup.
LIMITATION 2 - Confirmation Delay Means You Miss Early Entry
In Confirmed and Relaxed modes, the non-repainting design means you receive signals AFTER the pivot is confirmed. Price may have already moved significantly by the time you receive the signal. This is the tradeoff for non-repainting reliability. You can use Real-time mode for faster signals but sacrifice divergence confirmation.
LIMITATION 3 - It Does Not Tell You Position Sizing or Risk Management
VMDM provides technical pattern analysis. It does not calculate stop loss levels, take profit targets, or position sizing. You must apply your own risk management rules. Never risk more than you can afford to lose based on a technical signal.
LIMITATION 4 - Volume Pressure Analysis Requires Reliable Volume Data
On assets with thin volume or unreliable volume reporting, pressure analysis may be inaccurate. Stick to major liquid assets with consistent volume data.
LIMITATION 5 - It Cannot Detect Fundamental Events
VMDM is purely technical. It cannot predict earnings reports, central bank decisions, geopolitical events, or other fundamental catalysts that can override technical patterns.
LIMITATION 6 - Divergence Requires Two Pivots
The indicator cannot detect divergence until at least two pivots of the same type have formed. In strong trends without pullbacks, you may go long periods without signals.
LIMITATION 7 - Institutional Pattern Names Are Interpretive
The behavioral footprint patterns are named using common trading education terminology, but they are detected through technical analysis, not actual institutional data access. The patterns are interpretations based on price and volume behavior.
CONCEPT FOUNDATION - WHY THIS APPROACH WORKS
MARKET PRINCIPLE 1 - Momentum Divergence Precedes Price Reversal
Price is the final output of market forces, but momentum (the rate of change in those forces) shifts first. When price makes a new low but the momentum behind that move is weaker (higher RSI low), it signals that sellers are losing strength even though they temporarily pushed price lower. This precedes reversal. This is a fundamental principle in technical analysis taught by Charles Dow, widely observed in market behavior.
MARKET PRINCIPLE 2 - Volume Reveals Conviction
Price can move on low volume (low conviction) or high volume (high conviction). When price makes a new low on declining volume while RSI shows improving momentum, it suggests the new low is not confirmed by participant conviction. Adding volume pressure analysis to momentum divergence adds a confirmation layer that filters false divergences.
MARKET PRINCIPLE 3 - Anomalies Mark Structural Extremes
When volume spikes significantly but range contracts (absorption), or when price spikes beyond structure then reverses (stop hunt), or when aggressive moves are met with large-wick rejection (exhaustion), these anomalies often mark short-term extremes. Combining these structural observations with momentum analysis creates context.
MARKET PRINCIPLE 4 - Confluence Improves Probability
No single technical factor is reliable in isolation. RSI divergence alone fails frequently. Volume analysis alone cannot time entries. Combining multiple independent factors into a weighted system increases the probability that observed patterns have structural significance rather than random noise.
THE EDUCATIONAL VALUE
By visualizing all four layers simultaneously and breaking down the confluence scoring transparently, VMDM teaches you to think in terms of multi-dimensional analysis rather than single-indicator reliance. Over time, you will learn to recognize these patterns manually and understand which combinations produce better results on your traded assets.
INSTITUTIONAL TERMINOLOGY - IMPORTANT CLARIFICATION
This indicator uses the following terms that are common in trading education:
Institutional Footprint
Absorption (Accumulation / Distribution)
Stop Hunt
Exhaustion
CRITICAL DISCLAIMER:
These terms are EDUCATIONAL LABELS for specific price action and volume behavior patterns detected through technical analysis of publicly available chart data (open, high, low, close, volume). This indicator does NOT have access to:
Actual institutional order flow or order book data
Market maker positions or intentions
Broker stop-loss databases
Non-public trading data
Proprietary institutional information
The patterns labeled as "institutional footprint" are interpretations based on observable price and volume behavior that educational trading literature often associates with potential large-participant activity. The detection is algorithmic pattern recognition, not privileged data access.
When this indicator identifies "absorption," it means it detected high volume within a small range - a condition that MAY indicate large orders being filled but is not confirmation of actual institutional participation.
When it identifies a "stop hunt," it means price briefly penetrated a structural level then reversed - a pattern that MAY have triggered stop losses but is not confirmation that stops were specifically targeted.
When it identifies "exhaustion," it means high volume with large rejection wicks - a pattern that MAY indicate aggressive participation meeting strong opposition but is not confirmation of institutional involvement.
These are technical analysis interpretations, not factual statements about market participant identity or intent.
DISCLAIMER AND RISK WARNING
EDUCATIONAL PURPOSE ONLY
This indicator is designed as an educational tool to help traders learn to recognize technical patterns, understand multi-factor analysis, and practice systematic market observation. It is NOT a trading system, signal service, or financial advice.
NO PERFORMANCE GUARANTEE
Past pattern behavior does not guarantee future results. A pattern that historically preceded price movement in one direction may fail in the future due to changing market conditions, fundamental events, or random variance. Confluence scores reflect historical technical alignment, not future certainty.
TRADING INVOLVES SUBSTANTIAL RISK
Trading financial instruments involves substantial risk of loss. You can lose more than your initial investment. Never trade with money you cannot afford to lose. Always use proper risk management including stop losses, position sizing, and portfolio diversification.
NO PREDICTIVE CLAIMS
This indicator does NOT predict future price movement. It identifies when technical conditions align in patterns that historically have been associated with potential reversals or continuations. Market behavior is probabilistic, not deterministic.
BACKTESTING LIMITATIONS
If you backtest trading strategies using this indicator, ensure you account for:
Realistic commission costs
Realistic slippage (difference between signal price and actual fill price)
Sufficient sample size (minimum 100 trades for statistical relevance)
Reasonable position sizing (risking no more than 1-2 percent of account per trade)
The confirmation delay inherent in the indicator (you cannot enter at the exact pivot in Confirmed mode)
Backtests that do not account for these factors will produce unrealistic results.
AUTHOR LIABILITY
The author (BullByte) is not responsible for any trading losses incurred using this indicator. By using this indicator, you acknowledge that all trading decisions are your sole responsibility and that you understand the risks involved.
NOT FINANCIAL ADVICE
Nothing in this indicator, its code, its description, or its visual outputs constitutes financial, investment, or trading advice. Consult a licensed financial advisor before making investment decisions.
FREQUENTLY ASKED QUESTIONS
Q: Why do signals appear in the past, not at the current bar
A: In Confirmed and Relaxed modes, signals appear at confirmed pivots, which requires waiting for right-side confirmation bars (default 3). This creates a delay but prevents repainting. Use Real-time mode if you want current-bar signals without pivot confirmation.
Q: Can I use this for automated trading
A: You can create alert-based automation, but understand that Confirmed mode signals appear AFTER the pivot with delay, so your entry will not be at the pivot price. Real-time mode signals can change as the current bar develops. Automation requires careful consideration of these factors.
Q: How do I know which confluence score to use
A: Start with 60. Observe which patterns work on your symbol/timeframe. If too many false signals, increase to 70-75. If too few signals, decrease to 55. Quality vs. quantity tradeoff.
Q: Do regular divergences mean I should enter a reversal trade immediately
A: No. Regular divergences indicate momentum exhaustion, which is a WARNING sign that trend may reverse, not a confirmation that it will. Use confluence score, market context, support/resistance, and your strategy rules to make entry decisions. Many divergences fail.
Q: What's the difference between regular and hidden divergence
A: Regular divergence = price and momentum move in opposite directions at extremes = potential reversal signal. Hidden divergence = price and momentum move in opposite directions during pullbacks = potential continuation signal. Hidden divergence suggests the pullback is just a correction within the larger trend.
Q: Why does the pressure zone color sometimes conflict with the divergence direction
A: Pressure is real-time current bar analysis. Divergence is confirmed pivot analysis from the past. They measure different things at different times. A bullish divergence confirmed 3 bars ago might appear during current selling pressure. This is normal.
Q: Can I use this on stocks without volume data
A: No. Volume is required for pressure analysis and behavioral pattern detection. Use only on assets with reliable volume reporting.
Q: How often should I expect signals
A: Depends on timeframe and settings. Daily charts might produce 5-10 signals per month. 1-hour charts might produce 20-30. 15-minute charts might produce 50-100. Adjust confluence threshold to control frequency.
Q: Can I modify the code
A: Yes, this is open source. You can modify for personal use. If you publish a modified version, please credit the original and ensure your publication meets TradingView guidelines.
Q: What if I disagree with a pattern's confluence score
A: The scoring weights are based on general observations and may not suit your specific strategy or asset. You can modify the code to adjust weights if you have data-driven reasons to do so.
Final Notes
VMDM - Volume, Momentum and Divergence Master is an educational multi-layer market analysis system designed to teach systematic pattern recognition through transparent, confluence-weighted signal detection. By combining RSI momentum divergence, volume pressure quantification, behavioral footprint pattern recognition, and quality scoring into a unified framework, it provides a comprehensive learning environment for understanding market structure.
Use this tool to develop your analytical skills, understand how multiple technical factors interact, and learn to distinguish high-quality setups from noise. Remember that technical analysis is probabilistic, not predictive. No indicator replaces proper education, risk management, and trading discipline.
Trade responsibly. Learn continuously. Risk only what you can afford to lose.
-BullByte
RSI HTF Hardcoded (A/B Presets) + Regimes [CHE]RSI HTF Hardcoded (A/B Presets) + Regimes — Higher-timeframe RSI emulation with acceptance-based regime filter and on-chart diagnostics
Summary
This indicator emulates a higher-timeframe RSI on the current chart by resolving hardcoded “HTF-like” lengths from a time-bucket mapping, avoiding cross-timeframe requests. It computes RSI on a resolved length, smooths it with a resolved moving average, and derives a histogram-style difference (RSI minus its smoother). A four-state regime classifier is gated by a dead-band and an acceptance filter requiring consecutive bars before a regime is considered valid. An on-chart table reports the active preset, resolved mapping tag, resolved lengths, and the current filtered regime.
Pine version: v6
Overlay: false
Primary outputs: RSI line, SMA(RSI) line, RSI–SMA histogram columns, reference levels (30/50/70), regime-change alert, info table
Motivation
Cross-timeframe RSI implementations often rely on `request.security`, which can introduce repaint pathways and additional update latency. This design uses deterministic, on-series computation: it infers a coarse target bucket (or uses a forced bucket) and resolves lengths accordingly. The dead-band reduces noise at the decision boundaries (around RSI 50 and around the RSI–SMA difference), while the acceptance filter suppresses rapid flip-flops by requiring sustained agreement across bars.
Differences
Baseline: Standard RSI with a user-selected length on the same timeframe, or HTF RSI via cross-timeframe requests.
Key differences:
Hardcoded preset families and a bucket-based mapping to resolve “HTF-like” lengths on the current chart.
No `request.security`; all calculations run on the chart’s own series.
Regime classification uses two independent signals (RSI relative to 50 and RSI–SMA difference), gated by a configurable dead-band and an acceptance counter.
Always-on diagnostics via a persistent table (optional), showing preset, mapping tag, resolved lengths, and filtered regime.
Practical effect: The oscillator behaves like a slower, higher-timeframe variant with more stable regime transitions, at the cost of delayed recognition around sharp turns (by design).
How it works
1. Bucket selection: The script derives a coarse “target bucket” from the chart timeframe (Auto) or uses a user-forced bucket.
2. Length resolution: A chosen preset defines base lengths (RSI length and smoothing length). A bucket/timeframe mapping resolves a multiplier, producing final lengths used for RSI and smoothing.
3. Oscillator construction: RSI is computed on the resolved RSI length. A moving average of RSI is computed on the resolved smoothing length. The difference (RSI minus its smoother) is used as the histogram series.
4. Regime classification: Four regimes are defined from:
RSI relative to 50 (bullish above, bearish below), with a dead-band around 50
Difference relative to 0 (positive/negative), with a dead-band around 0
These two axes produce strong/weak bull and bear states, plus a neutral state when inside the dead-band(s).
5. Acceptance filter: The raw regime must persist for `n` consecutive bars before it becomes the filtered regime. The alert triggers when the filtered regime changes.
6. Diagnostics and visualization: Histogram columns change shade based on sign and whether the difference is rising/falling. The table displays preset, mapping tag, resolved lengths, and the filtered regime description.
Parameter Guide
Source — Input series for RSI — Default: Close — Smoother sources reduce noise but add lag.
Preset — Base lengths family — Default: A(14/14) — Switch presets to change RSI and smoothing responsiveness.
Target Bucket — Auto or forced bucket — Default: Auto — Force a bucket to lock behavior across chart timeframe changes.
Table X / Table Y — Table anchor — Default: right / top — Move to avoid covering content.
Table Size — Table text size — Default: normal — Increase for presentations, decrease for dense layouts.
Dark Mode — Table theme — Default: enabled — Match chart background for readability.
Show Table — Toggle diagnostics table — Default: enabled — Disable for a cleaner pane.
Epsilon (dead-band) — Noise gate for decisions — Default: 1.0 — Raise to reduce flips near boundaries; lower to react faster.
Acceptance bars (n) — Bars required to confirm a regime — Default: 3 — Higher reduces whipsaw; lower increases reactivity.
Reading
Histogram (RSI–SMA):
Above zero indicates RSI is above its smoother (positive momentum bias).
Below zero indicates RSI is below its smoother (negative momentum bias).
Darker/lighter shading indicates whether the difference is increasing or decreasing versus the previous bar.
RSI vs SMA(RSI):
RSI’s position relative to 50 provides broad directional bias.
RSI’s position relative to its smoother provides momentum confirmation/contra-signal.
Regimes:
Strong bull: RSI meaningfully above 50 and difference meaningfully above 0.
Weak bull: RSI above 50 but difference below 0 (pullback/transition).
Strong bear: RSI meaningfully below 50 and difference meaningfully below 0.
Weak bear: RSI below 50 but difference above 0 (pullback/transition).
Neutral: inside the dead-band(s).
Table:
Use it to validate the active preset, the mapping tag, the resolved lengths, and the filtered regime output.
Workflows
Trend confirmation:
Favor long bias when strong bull is active; favor short bias when strong bear is active.
Treat weak regimes as pullback/transition context rather than immediate reversals, especially with higher acceptance.
Structure + oscillator:
Combine regimes with swing structure, breakouts, or a baseline trend filter to avoid trading against dominant structure.
Use regime change alerts as a “state change” notification, not as a standalone entry.
Multi-asset consistency:
The bucket mapping helps keep a consistent “feel” across different chart timeframes without relying on external timeframe series.
Behavior/Constraints
Intrabar behavior:
No cross-timeframe requests are used; values can still evolve on the live bar and settle at close depending on your chart/update timing.
Warm-up requirements:
Large resolved lengths require sufficient history to seed RSI and smoothing. Expect a warm-up period after loading or switching symbols/timeframes.
Latency by design:
Dead-band and acceptance filtering reduce noise but can delay regime changes during sharp reversals.
Chart types:
Intended for standard time-based charts. Non-time-based or synthetic chart types (e.g., Heikin-Ashi, Renko, Kagi, Point-and-Figure, Range) can distort oscillator behavior and regime stability.
Tuning
Too many flips near decision boundaries:
Increase Epsilon and/or increase Acceptance bars.
Too sluggish in clean trends:
Reduce Acceptance bars by one, or choose a faster preset (shorter base lengths).
Too sensitive on lower timeframes:
Choose a slower preset (longer base lengths) or force a higher Target Bucket.
Want less clutter:
Disable the table and keep only the alert + plots you need.
What it is/isn’t
This indicator is a regime and visualization layer for RSI using higher-timeframe emulation and stability gates. It is not a complete trading system and does not provide position sizing, risk management, or execution rules. Use it alongside structure, liquidity/volatility context, and protective risk controls.
Disclaimer
The content provided, including all code and materials, is strictly for educational and informational purposes only. It is not intended as, and should not be interpreted as, financial advice, a recommendation to buy or sell any financial instrument, or an offer of any financial product or service. All strategies, tools, and examples discussed are provided for illustrative purposes to demonstrate coding techniques and the functionality of Pine Script within a trading context.
Any results from strategies or tools provided are hypothetical, and past performance is not indicative of future results. Trading and investing involve high risk, including the potential loss of principal, and may not be suitable for all individuals. Before making any trading decisions, please consult with a qualified financial professional to understand the risks involved.
By using this script, you acknowledge and agree that any trading decisions are made solely at your discretion and risk.
Best regards and happy trading
Chervolino.
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\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt 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\n\nLower 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)
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\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt 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\n\nLower 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)
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\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt 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\n\nLower 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)






















