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).
ابحث في النصوص البرمجية عن "bear"
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)
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)
VuManChu Filtered OverlayVuManChu Filtered Overlay is a price-overlay signal tool inspired by VuManChu Cipher B.
Instead of plotting the full oscillator in a separate pane, this script focuses on generating clean long/short signals directly on the chart, combining WaveTrend, Money Flow–style momentum, and an adjustable overbought/oversold threshold.
Under the hood, the script builds a smoothed “Inertia Wave” using a normalized (close–open)/(high–low) money-flow proxy and a long SMA. This is used together with a classic WaveTrend (wt1 / wt2) calculation. Signals are only triggered when:
WaveTrend lines cross (wt1 vs wt2),
The cross direction matches the expected bias
Bull: cross up from below, WaveTrend below zero
Bear: cross down from above, WaveTrend above zero
The custom money-flow curve (rsiMFI) confirms direction
Bull: rsiMFI > 0
Bear: rsiMFI < 0
The WaveTrend line is beyond a user-defined OS/OB magnitude (Wavetrendtrigger), so only meaningful extremes are considered.
The “VuManChu WaveTrend OS/OB threshold (+/-)” input lets you control how aggressive the signals are:
Lower values (e.g. 5–10) → more frequent, more sensitive signals
Higher values (e.g. 40–60) → fewer signa
ls, focused on strong exhaustion moves
Bullish and bearish opportunities are plotted as green and red dots on the candles, and corresponding alerts are fired:
🟢 Optimized VuManChu LONG signal detected on timeframe: X
🔴 Optimized VuManChu SHORT signal detected on timeframe: X
This script is meant as a filter / confirmation layer, not a standalone system. For best results, combine it with your own trend, volume, or higher-timeframe context. This is not financial advice and should be used for educational and experimental purposes only.
DeltaFlow Matrix═════════════════─────────
DELTAFLOW MATRIX - COMPLETE GUIDE
For 1-Minute Scalping
═════════════════─────────
───────────────────────────────────────
📊 VISUAL ELEMENTS EXPLAINED (What You See on the Chart)
───────────────────────────────────────
🟦🟥 RED/GREEN BARS ON THE RIGHT = Delta Flow Direction
The horizontal bars extending right from your chart show WHO controlled the price at each level. Green = bulls won, Red = bears won. Longer bars = more volume traded at that price. Example: If BTC is at $100,000 and you see a massive green bar, that means buyers aggressively absorbed all sell orders at that exact price level.
📊 GRADIENT BACKGROUND (Heat Map) = Volume Intensity
The colored background behind the bars shows volume concentration. Darker/more opaque = heavy trading, lighter/transparent = light trading. Example: A dark background at $99,800 means that's where most traders are positioned - it's a "magnet price" where BTC keeps returning.
🟩 GREEN BOX WITH BORDER = POC (Point of Control)
This is THE most important price on your chart - where the absolute highest volume traded. This is where the majority of traders are stuck. Example: POC at $99,950 means most BTC holders bought/sold there. Price will be magnetically pulled back to test this level repeatedly.
⬜ WHITE DOTTED LINES = VA High and VA Low (Value Area)
These lines contain 70% of all trading volume. Think of them as "fair price boundaries." Example: VA High at $100,200, VA Low at $99,700 means BTC's "fair value range" is $99,700-$100,200. Breakouts above/below these lines are significant moves.
💜 MAGENTA BORDER ON BARS = MICRO-SR (Micro Support/Resistance)
These magenta-outlined bars mark high-frequency support/resistance zones where price repeatedly bounced. These are your scalping zones. Example: MICRO-SR at $99,975 means BTC touched this price multiple times in the last 100 bars - it's a critical battle line for 1-minute scalpers.
🟡 GOLD TEXT "BULL EXHAUST" / "BEAR EXHAUST" = Exhaustion Zones
When one side dominated the volume BUT the trend is dying. This is where the big money got tired. Example: "BULL EXHAUST" at $100,100 means buyers pushed hard but are running out of steam - expect a reversal or consolidation soon.
🔵 CYAN TEXT "FLOW SHIFT ↑" / "FLOW SHIFT ↓" = Institutional Reversal
This is the holy grail - when delta completely flipped from bearish to bullish (or vice versa) with increasing volume. This marks where institutions changed their position. Example: "FLOW SHIFT ↑" at $99,900 means selling pressure just turned into aggressive buying - the big players reversed direction.
🟠 ORANGE TEXT "FAILED SHIFT ↑" / "FAILED SHIFT ↓" = Failed Institutional Reversal
When a FLOW SHIFT appears but then gets rejected by the opposite side within 3-10 bars. This means institutions TRIED to reverse but couldn't - the other side is defending hard. Example: "FAILED SHIFT ↑" at $99,900 means bulls attempted to take control but bears defended and stopped the reversal - this is a bearish sign, price likely continues down.
🟢 GREEN "COILED" LABEL BELOW PRICE = Bullish Compression Setup
When price is compressed below VA Low with 5+ MICRO-SR resistance levels stacked overhead AND bullish momentum is building. This is a spring-loaded long setup - price is coiled under resistance ready to explode upward. Example: BTC at $99,700, VA Low at $100,000, 7 MICRO-SR levels stacked from $100,100-$100,400, and delta shows +45 with bullish flow → "COILED" appears. This means price is compressed like a spring with bullish pressure building - when it breaks, it will rip through all those overhead levels fast.
🔴 RED "COILED" LABEL ABOVE PRICE = Bearish Compression Setup
When price is extended above VA High with 5+ MICRO-SR support levels stacked below AND bearish momentum is building. This is a spring-loaded short setup - price is coiled above support ready to crash downward. Example: BTC at $100,500, VA High at $100,200, 6 MICRO-SR levels stacked from $100,000-$99,700, and delta shows -52 with bearish flow → "COILED" appears. This means price is compressed with bearish pressure building - when it breaks down, it will slice through all those support levels.
🔴🟢 "REJECT" LABEL = Failed Breakout / Rejection
When price enters a cluster zone (resistance or support) but shows opposite momentum - the breakout attempt failed. Example: Price pushed up into overhead resistance at $100,200 but delta turns bearish (-38) → "REJECT" appears in red above price. This means the breakout attempt was rejected, bulls who entered are trapped, expect reversal down.
⚠️ "WALL ↑" / "WALL ↓" = Resistance/Support Wall Alert
When 5+ MICRO-SR levels are stacked together creating a "wall" of resistance or support. These are significant barriers where price will likely stall or reverse. Example: "WALL ↑ 7x" means there are 7 MICRO-SR resistance levels stacked above current price - breaking through this will be very difficult without strong momentum and volume.
🔴🟢 "BULL ATTACK" / "BEAR ATTACK" = Aggressive Momentum
One side is attacking with both high delta AND increasing volume. This is active warfare. Example: "BEAR ATTACK" at $100,050 means sellers are aggressively dumping with rising volume - price is likely to drop fast.
🛡️ "BULL DEFENSE" / "BEAR DEFENSE" = Holding the Line
One side has high delta but volume is flat or decreasing - they're defending a level, not pushing. Example: "BULL DEFENSE" at $99,850 means buyers are absorbing sells to prevent BTC from dropping further, but they're not strong enough to push up yet.
⚖️ "EQUILIBRIUM" / "ROTATION" = Balanced Market
Bulls and bears are equally matched - perfect for range trading, terrible for breakout trades. Example: "EQUILIBRIUM" at $100,000 means the market is perfectly balanced here - trade the range, don't chase breakouts.
📈📉 "UP" / "DN" ARROWS = Volume Trend
Small green "UP" or red "DN" labels show if volume is increasing or decreasing at that price level over time. Example: "UP" at $99,900 means more traders are entering positions at this price compared to earlier - this level is becoming more important.
⇈⇊ DOUBLE ARROWS = Delta Momentum Acceleration
These show when delta is accelerating rapidly - not just strong, but GETTING STRONGER. Example: ⇈ at $100,050 means bullish delta isn't just high, it's accelerating - expect explosive upward movement.
🟢🔴 VELOCITY BANDS (Horizontal bars far right) = Volume Acceleration
Thin horizontal bars extending from the profile show how fast volume is building. Green = volume accelerating up, Red = volume accelerating down. Example: Green velocity band at $100,100 means volume is spiking at this level right now - action is heating up.
💜 "x3.8" LABEL ABOVE CANDLE = Volume Spike Signal
Magenta text showing volume multiplier. Example: "x3.2" above a BTC candle means this candle had 3.2 times the average volume - something big just happened (news, liquidation cascade, whale entry).
🟢🔴 THICK LINE AT VA HIGH/LOW = Breakout with Momentum
When BTC breaks the VA line, the line changes:
- Thin line (width 2) = Weak breakout (<30Δ momentum)
- Medium line (width 3) = Medium breakout (30-60Δ)
- Thick dashed line (width 4) = STRONG breakout (>60Δ) - THIS IS THE FLASH
The label also changes: "VA High 72Δ V✓ STRONG" = 72 delta momentum, volume confirmed, strong breakout.
🔵 CYAN DASHED LINE AT POC = POC Bounce Flash
A short cyan dashed line appears when BTC bounces off the POC with a bullish reversal candle. This is your highest-probability long entry - the POC "magnet" just pulled price back and bulls are responding.
───────────────────────────────────────────────
🧠 PATTERN COMBINATIONS = Market Psychology (What Traders Are Thinking)
───────────────────────────────────────────────
🚀 PATTERN 1: "The Nitro Boost" (Highest Win Rate)
WHAT YOU SEE: FLOW SHIFT ↑ appears below current price + only MICRO-SR (magenta) levels above + Volume Spike (x2.5+)
PSYCHOLOGY: Big money just reversed from selling to buying. Retail still thinks it's going down. All the nearby resistance levels are weak (just micro-levels). The explosion in volume means someone BIG just entered.
EXAMPLE: BTC at $99,900, FLOW SHIFT ↑ just appeared, above you see MICRO-SR at $100,000, $100,050, $100,100 with no major resistance. Volume spike shows x3.1. → Institutions flipped bullish and the path of least resistance is UP. These MICRO-SR levels will be blown through like paper.
TRADE: Long immediately, targets at each MICRO-SR level, stop below the FLOW SHIFT price.
💎 PATTERN 2: "The Wall" (Reversal Setup)
WHAT YOU SEE: BULL/BEAR EXHAUST at a price level + Price approaching POC from above/below + Delta momentum arrows (⇊) pointing opposite to price movement
PSYCHOLOGY: One side pushed too hard and ran out of gas right as they're approaching the most important price level (POC). Delta momentum is reversing. The "wall" of volume at POC will reject them.
EXAMPLE: BTC pushed from $99,800 to $100,200, now "BULL EXHAUST" appears at $100,200. POC is at $100,000. You see ⇊ (bearish delta acceleration). → Bulls exhausted themselves pushing up, POC will act as resistance, bears are accelerating. Price will get rejected back down.
TRADE: Short at current price, target is POC at $100,000, stop above the exhaust level.
⚔️ PATTERN 3: "The War Zone" (Stay Out)
WHAT YOU SEE: BULL ATTACK and BEAR ATTACK labels alternating rapidly + EQUILIBRIUM or ROTATION at current price + VA lines very close together
PSYCHOLOGY: Bulls and bears are in full battle mode, neither side is winning. The market is chopping violently in a tight range. This is where retail gets destroyed by whipsaw.
EXAMPLE: BTC bouncing between $99,900-$100,100. "BULL ATTACK" at $100,000, "BEAR ATTACK" at $100,050, "EQUILIBRIUM" at $100,025. VA High at $100,100, VA Low at $99,900. → Pure chaos. Both sides throwing punches, nobody winning.
TRADE: STAY OUT. Wait for exhaustion or flow shift. If you must trade, use very tight ranges (buy at VA Low, sell at VA High, 5-tick stops).
🎯 PATTERN 4: "The Breakout Confirmation" (High Confidence)
WHAT YOU SEE: VA breakout with STRONG label + Volume spike (x2.0+) + FLOW SHIFT in breakout direction + No major resistance for 50+ ticks
PSYCHOLOGY: Every signal is aligned. Price broke the fair value range WITH strong momentum, WITH volume confirmation, WITH institutional flow reversal. This is the "perfect storm" breakout.
EXAMPLE: BTC breaks VA High at $100,200. Label changes to "VA High 68Δ V✓ STRONG" (thick dashed line). Volume spike shows x2.8. FLOW SHIFT ↑ appears at $100,210. Next resistance is MICRO-SR at $100,400. → This is as good as it gets. Institutions are buying, retail FOMO is coming, momentum is strong.
TRADE: Long on the breakout, targets at +100 ticks ($100,300), +200 ticks ($100,400), trail stop below the breakout candle.
🛡️ PATTERN 5: "The Failed Breakout" (Fade Setup)
WHAT YOU SEE: VA breakout with WEAK label + No volume spike + DEFENSE label appears (opposite side) + Delta momentum arrows pointing back into VA
PSYCHOLOGY: Price tried to break out but without conviction. No volume = no big players interested. The defending side is holding the line. Breakout traders are about to get trapped.
EXAMPLE: BTC breaks VA High at $100,200. Label shows "VA High 23Δ WEAK" (thin line). No volume spike. "BEAR DEFENSE" appears at $100,220. You see ⇊ (bearish acceleration). → Weak breakout, bears defending, momentum reversing. Bull breakout traders are trapped.
TRADE: Short the failed breakout, target is back inside VA (POC at $100,000), stop above the high.
🧲 PATTERN 6: "The POC Magnet" (Mean Reversion)
WHAT YOU SEE: Price far from POC (100+ ticks away) + Volume decreasing (DN arrows) + No ATTACK or FLOW SHIFT labels + MICRO-SR levels between current price and POC
PSYCHOLOGY: Price overextended from the most important level. No new aggressive volume is coming in. Market is tired. Like a rubber band, price will snap back to POC where most traders are positioned.
EXAMPLE: BTC at $100,350, POC at $100,000 (350 ticks away). "DN" arrows showing volume declining. "ROTATION" at current price. MICRO-SR at $100,300, $100,200, $100,100. → Overextended, running out of steam, POC will pull it back.
TRADE: Short with targets at each MICRO-SR level on the way down to POC, final target at POC itself.
💥 PATTERN 7: "The Liquidation Cascade" (Momentum Continuation)
WHAT YOU SEE: Multiple consecutive candles with volume spikes (x2.5+) + ATTACK label same direction + Delta momentum arrows same direction (⇈ or ⇊) + Breaking through MICRO-SR levels without stopping
PSYCHOLOGY: Liquidations are triggering more liquidations. Stop losses are getting hit, triggering more stop losses. This is a cascade - it won't stop until hitting POC or VA boundary. Retail is getting destroyed, institutions are feasting.
EXAMPLE: BTC drops from $100,200. Candles show x2.7, x3.1, x2.9 volume spikes. "BEAR ATTACK" at every level. ⇊ arrows accelerating. MICRO-SR levels at $100,100, $100,000, $99,900 all getting destroyed. POC at $99,750. → Liquidation cascade in progress. Won't stop until POC.
TRADE: If you're in the direction, hold until POC. If not in, wait for POC to enter counter-trend. DO NOT try to catch this knife early.
🔄 PATTERN 8: "The Reversal Confirmation" (Highest Probability Entry)
WHAT YOU SEE: POC Bounce Flash (cyan dashed line) + FLOW SHIFT in new direction + Volume spike + Price bouncing off POC with bullish/bearish engulfing candle
PSYCHOLOGY: Price hit the most important level (POC) and institutions just reversed direction. This is THE signal. The magnet worked, price came back to POC, and big money is now pushing it the other way.
EXAMPLE: BTC drops to POC at $100,000. Cyan dashed POC bounce flash appears. Bullish engulfing candle. "FLOW SHIFT ↑" appears. Volume spike x2.6. → Perfect reversal setup at the most important price level with institutional confirmation.
TRADE: Long at POC, target next MICRO-SR or VA High, stop below POC. This is your highest win-rate setup.
🎪 PATTERN 9: "The Fake-Out Trap" (Avoid or Fade)
WHAT YOU SEE: FLOW SHIFT appears + No volume spike + EXHAUST label appears within 3-5 candles same direction + Delta momentum arrows reverse
PSYCHOLOGY: Someone tried to fake a reversal (maybe a whale painting the tape) but there's no real follow-through. The move exhausted immediately. Traders who followed the FLOW SHIFT are about to get trapped.
EXAMPLE: "FLOW SHIFT ↑" appears at $99,950. No volume spike. Within 3 candles, "BULL EXHAUST" appears at $100,000. ⇊ arrows appear. → False reversal, trap set, traders entering longs are getting baited.
TRADE: Fade it. Short when exhaust appears, target back below the fake FLOW SHIFT level.
🏆 PATTERN 10: "The Perfect Storm Long" (All Systems Go)
WHAT YOU SEE: Price above POC + FLOW SHIFT ↑ + VA Low breakout with STRONG + Volume spike + Only MICRO-SR resistance above + BULL ATTACK label + ⇈ acceleration
PSYCHOLOGY: Everything aligned bullish. Institutions buying, momentum strong, volume confirming, path clear. This is when retail FOMO kicks in and you get the biggest moves.
EXAMPLE: BTC at $100,100. POC at $100,000 (above POC ✓). "FLOW SHIFT ↑" at $100,050 ✓. "VA Low 71Δ V✓ STRONG" breakout ✓. Volume x3.4 ✓. MICRO-SR at $100,300, $100,500 (weak resistance) ✓. "BULL ATTACK" ✓. ⇈ arrows ✓. → Every single bullish signal firing. This is the setup you wait for all day.
TRADE: Long with size, targets at +200 ticks minimum, trail aggressively, stop only if FLOW SHIFT reverses.
🎯 PATTERN 11: "The Coiled Spring" (High Probability Breakout)
WHAT YOU SEE: "COILED" label appears + 5-8 MICRO-SR levels stacked in breakout direction + Delta +30 or higher (for long) / -30 or lower (for short) + Price compressed below VA Low (long) or above VA High (short)
PSYCHOLOGY: Price is compressed in a weak position with heavy resistance/support overhead, BUT institutions are building momentum in the direction of the breakout. When it breaks, all those clustered MICRO-SR levels will be blown through rapidly because the spring is loaded. This is the setup where you get 100-200 tick moves in minutes.
EXAMPLE: BTC at $99,650. VA Low at $100,000. "COILED" (green) appears below price. WALL ↑ 8x showing 8 MICRO-SR levels from $100,100-$100,800. Delta shows +47. FLOW SHIFT ↑ just appeared. → Price is coiled below massive resistance wall with strong bullish momentum building. When VA Low breaks, the spring releases and price will rip through all 8 resistance levels.
TRADE: Long when price breaks VA Low with volume confirmation, targets at each MICRO-SR cluster (+100, +200, +300 ticks), trail stop below breakout candle. This is your "moonshot" setup.
🛑 PATTERN 12: "The Failed Shift Trap" (Fade Setup)
WHAT YOU SEE: "FAILED SHIFT ↑" or "FAILED SHIFT ↓" appears + Strong opposite momentum (⇊ for failed bull shift, ⇈ for failed bear shift) + No volume spike + Price back in original range
PSYCHOLOGY: Institutions attempted a reversal but the other side defended hard and rejected it. Traders who followed the FLOW SHIFT are now trapped. The failed reversal confirms the original trend will continue - the defending side is in control.
EXAMPLE: BTC pushed from $100,200 to $99,900. "FLOW SHIFT ↓" appeared at $100,100 signaling bearish reversal. Within 5 bars, bulls defended at $99,850, pushing price back to $100,000. "FAILED SHIFT ↓" now appears at $100,100 with ⇈ (bullish acceleration). → Bears tried to reverse trend but failed. Bulls defended successfully. Original uptrend continues.
TRADE: Fade the failed shift. If "FAILED SHIFT ↓" appears, go long (bulls won the battle). If "FAILED SHIFT ↑" appears, go short (bears won). Target is back to the other side of the range.
⚠️ PATTERN 13: "The Wall Collision" (High Risk, High Reward)
WHAT YOU SEE: "WALL ↑" or "WALL ↓" with 6+ levels + Price approaching wall with strong momentum (ATTACK label) + Volume spike + Delta accelerating (⇈ or ⇊)
PSYCHOLOGY: Unstoppable force meeting immovable object. Price is charging at a massive wall of resistance/support with strong momentum. Either it breaks through explosively OR it gets rejected violently. This is binary - huge win or huge loss.
EXAMPLE: BTC at $100,050 with "BULL ATTACK" and ⇈ arrows. Volume x3.2. Approaching "WALL ↑ 9x" at $100,200-$100,600. POC at $100,300 (inside the wall). → Bulls charging at massive resistance wall with strong momentum. If they break through, it's explosive. If rejected, crash back down.
TRADE: ADVANCED ONLY. Wait for the collision. If price breaks through wall with FLOW SHIFT confirmation + volume spike, go long immediately with tight stop. If price gets REJECTED (bearish delta appears at wall), short immediately targeting POC. DO NOT enter before knowing the outcome.
🔄 PATTERN 14: "The Rejection Reversal" (Counter-Trend Entry)
WHAT YOU SEE: "REJECT" label appears + Price in cluster zone + Opposite side DEFENSE or ATTACK label appears + Delta momentum reverses (⇈ to ⇊ or vice versa)
PSYCHOLOGY: The breakout failed, trapped traders are exiting, and the opposite side is now attacking the weak hands. This creates fast moves back in the original direction.
EXAMPLE: BTC breaks VA High to $100,250. Weak volume, delta only +22. Enters overhead MICRO-SR cluster. "REJECT" appears in red. "BEAR DEFENSE" appears at $100,280. ⇊ arrows appear. → Breakout failed, bulls trapped, bears attacking. Price will reverse fast.
TRADE: Counter-trend entry in direction of REJECT. Short when "REJECT" appears with bearish confirmation, target is back to POC or VA Low. Stop above the rejection high. Fast scalp.
───────────────────────────────────────────────────────────────────────────────
⚡ QUICK REFERENCE CHEAT SHEET
───────────────────────────────────────────────────────────────────────────────
SAFEST ENTRIES (Highest Win Rate):
✅ POC Bounce Flash + FLOW SHIFT (Pattern 8)
✅ FLOW SHIFT + Only MICRO-SR above + Volume Spike (Pattern 1)
✅ Strong VA Breakout + Volume Spike + FLOW SHIFT (Pattern 4)
✅ COILED label + Multiple stacked MICRO-SR + Delta >30 (Pattern 11)
DANGER ZONES (Stay Out):
⛔ BULL ATTACK + BEAR ATTACK alternating (Pattern 3)
⛔ FLOW SHIFT + No volume + Quick exhaust (Pattern 9)
⛔ EQUILIBRIUM at current price with tight VA range
⛔ WALL collision without clear direction (Pattern 13 - wait for outcome)
FADE/REVERSAL SETUPS:
🔄 EXHAUST at price level + Approaching POC (Pattern 2)
🔄 Weak VA Breakout + DEFENSE opposite side (Pattern 5)
🔄 Price far from POC + Volume declining (Pattern 6)
🔄 FAILED SHIFT appears + Opposite momentum (Pattern 12)
🔄 REJECT label + Opposite ATTACK/DEFENSE (Pattern 14)
HOLD/MOMENTUM CONTINUATION:
🚀 Multiple volume spikes + ATTACK label + ⇈/⇊ arrows (Pattern 7)
🚀 All bullish/bearish signals aligned (Pattern 10)
🚀 COILED spring release through wall (Pattern 11)
═══════════════════════════════════════════════════════════
Remember: The indicator shows you WHERE the big money is (POC), WHAT they're doing (FLOW SHIFT), and HOW HARD they're doing it (volume spikes, momentum). Your job is to follow the big money, not fight them. When institutions shift, you shift. When they exhaust, you fade. When they're in a war, you stay out. Trade with the whales, not against them.
════════════════════════════════════════════════════════════
═══════════════════════════════════════════════════════════════════════════════
ENHANCED DELTA VOLUME PROFILE - TECHNICAL CALCULATIONS GUIDE
How Each Element is Actually Calculated
═══════════════════════════════════════════════════════════════════════════════
───────────────────────────────────────────────────────────────────────────────
🧮 CORE CALCULATIONS (The Math Behind What You See)
───────────────────────────────────────────────────────────────────────────────
📊 VOLUME BINS = Price range divided into 40 horizontal slices
The indicator takes the last 100 candles (configurable), finds the highest and lowest price touched, then divides that range into 40 equal "bins" (horizontal price levels). Each bin collects volume from candles that touched that price range. Example: BTC ranged from $99,500 to $100,500 in the last 100 bars. That's $1,000 range ÷ 40 bins = $25 per bin. Bin 1 = $99,500-$99,525, Bin 2 = $99,525-$99,550, etc.
🟦🟥 DELTA CALCULATION = (Bull Volume - Bear Volume) / Total Volume × 100
For each bin, the indicator separates bullish candles (close > open) from bearish candles (close < open). Delta = ((bull volume - bear volume) / total volume) × 100. This gives you a percentage from -100% (pure selling) to +100% (pure buying). Example: At $100,000, if 70 BTC was traded on green candles and 30 BTC on red candles, delta = ((70-30)/100) × 100 = 40% bullish.
🎨 GRADIENT COLOR = Delta converted to color spectrum
The delta percentage (-100 to +100) is mapped to a color gradient. -100% = pure bearish color (orange/red), 0% = neutral, +100% = pure bullish color (cyan/blue). The color you see on each bar directly represents the delta. Example: A bright cyan bar = high positive delta (strong buying), orange bar = high negative delta (strong selling), gray bar = balanced (delta near 0%).
🟩 POC (Point of Control) = Bin with the absolute highest total volume
The indicator sums up all volume in each of the 40 bins, then finds which bin has the most. That's your POC. Example: Bin 15 (around $100,000) collected 1,250 BTC of volume, which is more than any other bin. Bin 15 is your POC. This is where the most trading happened and where most traders are positioned.
⬜ VALUE AREA (VA) = The bins containing 70% of total volume, centered on POC
Starting from the POC, the indicator expands up and down, adding bins one at a time (choosing the bin with more volume each time) until it has captured 70% of all volume. The top of this range = VA High, bottom = VA Low. Example: POC at $100,000. Expanding out captures 70% of volume from $99,700 to $100,300. VA Low = $99,700, VA High = $100,300.
📈📉 VOLUME TREND = (Recent Volume - Old Volume) / Total Volume
The indicator splits your 100-bar lookback into three periods: Recent (last 15 bars), Mid (bars 15-30), and Older (last 15 bars of the 100). For each bin, it compares recent volume to older volume. If recent > older, trend is UP. If recent < older, trend is DOWN. Example: At $100,000, recent 15 bars had 80 BTC volume, older 15 bars had 40 BTC. Trend = (80-40)/(80+40) = 0.33 = UP. This shows volume is increasing at this level.
💜 MICRO-SR DETECTION = High volume (>60% of max) + High hits (>20% of max) + Active volume trend
A bin becomes MICRO-SR if: (1) Its volume is at least 60% of the highest-volume bin, (2) Price touched it frequently (at least 20% as many times as the most-touched bin), (3) Volume trend isn't flat (absolute trend > 0.05). Example: Bin at $99,975 has 750 BTC (75% of max), was hit 45 times (30% of max hits), volume trend = 0.08. = MICRO-SR (magenta border).
🟡 EXHAUSTION DETECTION = Extreme delta (>65%) + Declining volume trend (<-0.15) OR Extreme delta + Volume spike (>1.5× average)
Two ways to detect exhaustion: (1) One side dominated (delta > 65% or < -65%) BUT volume is decreasing (trend < -0.15), meaning participation is dropping. (2) Extreme delta WITH a huge volume spike (>1.5× average for that bin), meaning climactic volume. Example: At $100,200, delta = 72% bullish, but volume trend = -0.22 (declining). = BULL EXHAUST. Bulls won but are running out of steam.
🔵 FLOW SHIFT DETECTION = Delta changed sign (+ to - or - to +) + Delta change >40% + Volume trend increasing (>0.1)
Compares each bin's delta to the previous bin's delta. If delta flipped from negative to positive (or vice versa) by more than 40%, AND volume is increasing, = FLOW SHIFT. Example: Previous bin at $99,950 had -35% delta (bearish). Current bin at $100,000 has +45% delta (bullish). Change = 80% (flipped + exceeded 40%), volume trend = +0.15. = FLOW SHIFT ↑.
⇈⇊ DELTA MOMENTUM = Current delta - Average delta of last 3 bins
For each bin, the indicator looks at the previous 3 bins, calculates their average delta, then compares current delta to that average. If current delta is significantly higher/lower than the 3-bin average, momentum arrows appear. Example: Last 3 bins had deltas of 20%, 25%, 30% (average = 25%). Current bin delta = 55%. Momentum = 55 - 25 = +30 = ⇈ (strong bullish acceleration).
🟢🔴 VOLUME ACCELERATION = Rate of change of volume trend across three periods
Compares how volume changed from Old→Mid vs Mid→Recent. If Recent increased MORE than Mid did compared to Old, = positive acceleration. Formula: ((Recent-Mid) - (Mid-Old)) / |Mid-Old|. Example: Old=100, Mid=120, Recent=160. Mid increased by 20, Recent increased by 40. Acceleration = (40-20)/20 = 1.0 = strong acceleration (green velocity band).
⚖️ BALANCE SCORE = Combines volume balance, price range balance, and hit frequency
Three factors weighted equally: (1) How balanced is bull vs bear volume? (1 - |bull-bear|/total). (2) How tight is the price range? (1 - avgRange/maxRange). (3) How frequently was it hit? (hits/maxHits). Multiply these together. Score >0.7 = EQUILIBRIUM. Example: Volume is 55% bull / 45% bear = 0.9 balance. Range is tight = 0.8. Hit frequently = 0.85. Score = 0.9 × 0.8 × 0.85 = 0.61 = ROTATION.
📊 BULL/BEAR ATTACK/DEFENSE = Delta threshold (>60% or <-60%) + Volume trend direction
ATTACK = High delta (>60% either direction) + Volume trend increasing (>0.15). DEFENSE = High delta (>60% either direction) + Volume trend NOT increasing (≤0.15). Example: Delta = 68% bullish, volume trend = 0.22 = BULL ATTACK (buying with increasing volume). Delta = 68% bullish, volume trend = 0.05 = BULL DEFENSE (buying but volume not increasing).
───────────────────────────────────────────────────────────────────────────────
🎯 SIGNAL CALCULATIONS (The New Features)
───────────────────────────────────────────────────────────────────────────────
💜 VOLUME SPIKE = Current bar volume / 20-bar average volume
Takes the current candle's volume and divides it by the simple moving average of the last 20 candles' volume. If ratio >2.0 (configurable), spike detected. The label shows the exact multiplier. Example: Current candle = 450 BTC volume. 20-bar average = 140 BTC. Ratio = 450/140 = 3.21 = "x3.2" label appears in magenta above the candle.
🟢🔴 VA BREAKOUT MOMENTUM = POC bin's delta (absolute value)
When price breaks VA High or VA Low, the indicator looks at the POC bin's delta to measure momentum strength. Uses absolute value (ignore direction). <30 = WEAK, 30-60 = MED, >60 = STRONG. Line thickness and style change based on this. Example: BTC breaks VA High. POC bin delta = 72%. Momentum = 72 = STRONG. Line = width 4 (thick), dashed (flash effect), label shows "VA High 72Δ V✓ STRONG".
📊 BREAKOUT LINE THICKNESS = Momentum-based dynamic sizing
- Momentum <30: Line width = 2 (thin), solid line
- Momentum 30-60: Line width = 3 (medium), solid line
- Momentum >60: Line width = 4 (thick), dashed line (creates flash effect)
Example: Breakout with 45% momentum = width 3 solid line. Breakout with 75% momentum = width 4 dashed line (flashing).
✓ VOLUME CONFIRMATION = Current volume / 20-bar average >1.5
Checks if the breakout candle has strong volume. If current volume is at least 1.5× the 20-bar average, adds "V✓" to the label. Example: Breakout candle has 280 BTC volume, 20-bar average is 160 BTC. Ratio = 280/160 = 1.75 > 1.5 = "V✓" appears in label.
🔵 POC BOUNCE DETECTION = Price within 0.5 bin-step of POC + Bullish reversal candle + Previous candle was bearish
Three conditions must all be true: (1) Current close price is within half a bin's height from POC price. (2) Current candle is bullish (close > open). (3) Previous candle was bearish (close < open). If all true = POC bounce, cyan dashed flash line appears. Example: POC at $100,000, bin step = $25. Current close = $100,008 (within $12.50 of POC ✓). Current candle green ✓. Previous candle red ✓. = POC Bounce Flash.
───────────────────────────────────────────────────────────────────────────────
⚙️ TECHNICAL PARAMETERS (What You Can Adjust)
───────────────────────────────────────────────────────────────────────────────
🔢 LOOKBACK PERIOD (Default: 100 bars) = How much history to analyze
The number of candles backwards from current that get analyzed. More bars = more stable but slower to react. Fewer bars = more reactive but noisier. For 1-minute BTC scalping, 100 bars = last 100 minutes = 1 hour 40 minutes of data. Example: Setting to 50 bars makes it more reactive to recent action but less stable. Setting to 200 bars makes it smoother but slower to show new developments.
🎚️ NUMBER OF BINS (Default: 40) = Resolution of price levels
How many horizontal slices to divide the price range into. More bins = finer resolution but more noise. Fewer bins = smoother but less precise. 40 bins for 1-minute = good balance. Example: With $1,000 range, 40 bins = $25 per level. 20 bins would be $50 per level (less precise). 60 bins would be $16.67 per level (more precise but noisier).
📏 DISPLAY OFFSET (Default: 10 bars) = How far right the profile extends
How many bars to the right of current candle the volume profile displays. Purely visual - doesn't affect calculations. Example: Offset = 10 means the profile extends 10 bars to the right. Offset = 30 means it extends further right (more separation from candles).
📊 VOLUME TREND PERIOD (Default: 15 bars) = How many recent bars define "recent"
The number of bars considered "recent" vs "old" when calculating volume trends. Shorter = more sensitive to very recent changes. Longer = smoother trends. Example: 15 bars means "recent" = last 15 candles (last 15 minutes on 1m chart). Setting to 5 would make it hyper-reactive to the last 5 minutes. Setting to 30 would make it smoother.
🎯 EXHAUSTION THRESHOLD (Default: 65%) = How extreme delta must be for exhaustion
The minimum delta percentage to trigger exhaustion detection. Higher = more selective (only extreme cases). Lower = more signals but more false positives. Example: 65% means delta must be >65% or <-65% to qualify. Setting to 75% would only catch the most extreme exhaustion. Setting to 55% would catch more cases.
💜 MICRO-LEVEL THRESHOLD (Default: 60%) = How strong a level must be for MICRO-SR
The minimum volume percentage (relative to max) required for MICRO-SR detection. Higher = fewer, stronger levels. Lower = more levels but weaker. Example: 60% means bin must have at least 60% of the max bin's volume. Setting to 70% would show only the strongest levels. Setting to 50% would show more levels.
⚡ DELTA MOMENTUM PERIOD (Default: 3 bars) = How many bins to average for momentum
How many previous bins to average when calculating delta momentum. Shorter = more sensitive acceleration signals. Longer = smoother, less noisy. Example: 3 bins means compares current to average of last 3. Setting to 5 would smooth out momentum detection. Setting to 2 would make it more reactive.
🌊 FLOW SHIFT SENSITIVITY (Default: 40%) = Minimum delta change for flow shift
How much delta must change between consecutive bins to trigger FLOW SHIFT. Lower = more flow shift signals (more sensitive). Higher = fewer, stronger signals. Example: 40% means delta must flip by at least 40% (e.g., from -20% to +20% or from +10% to -30%). Setting to 60% would only catch major reversals. Setting to 25% would catch smaller shifts.
💥 VOLUME SPIKE THRESHOLD (Default: 2.0x) = Multiplier to trigger spike signal
How many times above average volume must be to show the spike label. Higher = fewer spikes shown (only extreme). Lower = more spikes shown. Example: 2.0× means current volume must be at least double the 20-bar average. Setting to 3.0× would only show massive spikes. Setting to 1.5× would show more moderate spikes.
🚀 BREAKOUT MOMENTUM MINIMUM (Default: 20%) = Minimum delta for breakout signal
How much delta momentum required at POC for VA breakout to trigger. Higher = fewer breakout signals (more selective). Lower = more signals but more false positives. Example: 20% means POC delta must be at least 20% (or -20%) when price breaks VA. Setting to 30% would only show strong breakouts. Setting to 10% would show weaker breakouts too.
───────────────────────────────────────────────────────────────────────────────
🔬 ADVANCED TECHNICAL DETAILS
───────────────────────────────────────────────────────────────────────────────
📐 BIN POSITIONING = Price-to-bin mapping formula
For any price P, its bin index = floor((P - MinPrice) / BinStep). BinStep = (MaxPrice - MinPrice) / NumBins. Example: Range $99,000-$100,000, 40 bins. BinStep = $1,000/40 = $25. Price $99,550 → Bin 22: (99,550 - 99,000) / 25 = 22.
📊 VOLUME DISTRIBUTION = Proportional allocation across bins
When a candle spans multiple bins, its volume is distributed proportionally based on how much of the candle's range overlapped each bin. Example: Candle from $99,950 to $100,050 (range = $100) with 50 BTC volume. Bin 1 ($99,950-$99,975) gets 25% of range = 12.5 BTC. Bin 2 ($99,975-$100,000) gets 25% = 12.5 BTC. Bin 3 ($100,000-$100,025) gets 25% = 12.5 BTC. Bin 4 ($100,025-$100,050) gets 25% = 12.5 BTC.
🎨 COLOR GRADIENT MAPPING = Delta to RGB conversion
Delta percentage is normalized to 0-1 scale (from -100/+100 range), then mapped to RGB gradient. -100% (0.0) = Full bearish color RGB. 0% (0.5) = Neutral gray. +100% (1.0) = Full bullish color RGB. Example: Delta = 60% → Normalized = 0.8 → 80% towards full bullish color (bright cyan).
⚖️ BALANCE SCORE FORMULA = Weighted geometric mean
BalanceScore = (VolumeBalance^w) × (PriceBalance^w) × (HitBalance^w), where w=weight (default 1.0). VolumeBalance = 1 - |BullVol - BearVol|/TotalVol. PriceBalance = 1 - AvgRange/MaxRange. HitBalance = Hits/MaxHits. Example: Vol=0.9, Price=0.8, Hit=0.7 → Score = 0.9 × 0.8 × 0.7 = 0.504.
🔄 DELTA HISTORY TRACKING = Rolling array per bin
Each bin maintains an array of its last N delta values (where N = delta momentum period). When calculating momentum, current delta is compared to the average of this array. Example: Bin's delta history = . Average = 25%. Current = 55%. Momentum = 55 - 25 = 30.
📈 VOLUME VELOCITY = Second derivative of volume
Measures acceleration of volume change. Recent change = (Recent - Mid). Old change = (Mid - Old). Acceleration = (Recent change - Old change) / |Old change|. Positive = accelerating. Negative = decelerating. Example: Old=100, Mid=150, Recent=220. Recent change = 70. Old change = 50. Accel = (70-50)/50 = 0.4 = 40% acceleration.
🎯 VA EXPANSION ALGORITHM = Greedy breadth-first from POC
Start at POC bin. While accumulated volume < 70% of total: Look at bin above and bin below POC boundary. Choose whichever has more volume. Add that bin to VA. Repeat. Example: POC at bin 20. Bin 21 (above) has 80 BTC, Bin 19 (below) has 95 BTC. Add bin 19. Now VA = bins 19-20. Next: Bin 21 has 80, Bin 18 has 70. Add bin 21. VA = bins 19-21. Continue until 70% captured.
⏱️ REAL-TIME UPDATES = Recalculates on every new bar close
The entire profile recalculates when barstate.islast = true (current bar). All 40 bins are cleared and rebuilt from scratch using the last N candles. This ensures the profile is always accurate to the current market state. Example: On 1-minute chart, the profile fully recalculates every 60 seconds when the new candle opens.
🎨 RENDERING OPTIMIZATION = 500-bar future limit management
TradingView limits drawing objects to 500 bars into the future. The indicator calculates safe offsets: maxFutureBar = bar_index + 499, then caps all box/line/label positions to stay under this limit. Example: Current bar_index = 1000. Max future = 1499. Display offset wanted = 200. Safe offset = min(200, 400 - 100) = min(200, 300) = 200 ✓ safe.
───────────────────────────────────────────────────────────────────────────────
💡 INTERPRETATION TIPS
───────────────────────────────────────────────────────────────────────────────
🔢 Understanding Percentages:
- Delta 0-30%: Weak bias, essentially balanced
- Delta 30-60%: Moderate bias, one side has control
- Delta 60-85%: Strong bias, one side dominated
- Delta 85-100%: Extreme bias, one-sided market (exhaustion likely)
📊 Volume Trend Interpretation:
- Trend -1.0 to -0.3: Strong decline in participation
- Trend -0.3 to -0.1: Moderate decline
- Trend -0.1 to +0.1: Stable/flat volume
- Trend +0.1 to +0.3: Moderate increase
- Trend +0.3 to +1.0: Strong increase in participation
🎯 Balance Score Ranges:
- 0.0-0.3: Heavily imbalanced, strong directional bias
- 0.3-0.5: Moderate imbalance, rotation forming
- 0.5-0.7: Balanced rotation zone
- 0.7-1.0: Perfect equilibrium, range-bound
⚡ Momentum Thresholds:
- <10: Negligible momentum change
- 10-20: Moderate acceleration
- 20-40: Strong acceleration (arrow appears)
- >40: Extreme acceleration (very rare, very significant)
═══════════════════════════════════════════════════════════════════════════════
Understanding these calculations helps you know WHY the indicator is showing what it's showing. When you see "FLOW SHIFT ↑", you now know it calculated a >40% delta flip with increasing volume. When you see MICRO-SR, you know that level has >60% of max volume, >20% of max hits, and active participation. When you see ⇈, you know delta jumped significantly above its 3-bin average. Use this knowledge to trust the signals and understand their strength.
═══════════════════════════════════════════════════════════════════════════════
CVD Absorption/Exhaustion IndicatorCVD Absorption/Exhaustion Indicator – Explanation
This indicator identifies trading opportunities by analyzing the relationship between price action and Cumulative Volume Delta (CVD) at key pivot points. It implements a professional trading framework that distinguishes between tradeable continuation signals (Absorption) and potential reversal warnings (Exhaustion).
Part 1: Foundation – CVD Calculation
The indicator starts by calculating Cumulative Volume Delta using the Bull & Bear Balance formula:
Volume Pressure Calculation
Bull Power: Measures buying pressure based on candlestick characteristics
Bear Power: Measures selling pressure using the same methodology
Volume Split: Each bar's volume is proportionally divided between bull and bear pressure
Delta: bullVolume - bearVolume (net buying vs selling per bar)
CVD: Running total (ta.cum(delta)) that shows cumulative market order flow
On the chart: Yellow line = raw CVD. White line = optional SMA (20-period default). Fill color = teal when CVD > MA (bullish flow), red when below (bearish flow).
Part 2: Signal Logic – Pivot Detection
The indicator identifies pivot points on the CVD line (not price) using lookback parameters:
Left Bars (lbL=1): Minimum bars to left to form pivot
Right Bars (lbR=2): Bars to right to confirm pivot (also creates offset)
Range Validation
Pivot signals only trigger if the distance between consecutive pivots is between 5-60 bars (adjustable). This filters out noise and ensures meaningful divergence patterns.
Part 3: Trading Framework
The core innovation is distinguishing two signal types at each pivot:
🟢 BULLISH SIGNALS (at CVD Pivot Lows)
Table
Copy
Signal Type Price Action CVD Action Trading Action Color
Exhaustion Lower Low (LL) Higher Low (HL) AVOID - Reversal warning Transparent Gray
Absorption Higher Low (HL) Lower Low (LL) TRADE - Continuation likely Solid Green
🔴 BEARISH SIGNALS (at CVD Pivot Highs)
Table
Copy
Signal Type Price Action CVD Action Trading Action Color
Exhaustion Higher High (HH) Lower High (LH) AVOID - Reversal warning Transparent Gray
Absorption Lower High (LH) Higher High (HH) TRADE - Continuation likely Solid Red
Part 4: Visualization Mechanism
The indicator uses precision plotting for clarity:
Pivot Lines: Thin vertical lines appear exactly at the pivot bar using offset=-lbR (shifts plot back to correct location)
Conditional Coloring: Lines are transparent (noneColor) unless a valid signal exists
Minimal Labels: Single letters "E" (Exhaustion) or "A" (Absorption) in tiny size to avoid chart clutter
Direction: Labels appear above the line for bullish signals, below for bearish signals
Part 5: How to Read the Chart
Signal Quality Hierarchy
Solid Green/Red lines with "A" = Primary trade signals (Absorption/Continuation)
Transparent Gray lines with "E" = Warning signals (Exhaustion/Reversal) - use for context or exit planning
No lines at pivots = No valid pattern - ignore
Timeframe Usage
Best on: 5-minute to 1-hour charts (as per PDF)
Multi-timeframe: Use the dropdown in settings to analyze higher timeframe signals while trading lower timeframe
Practical Workflow
Wait for solid color "A" signal in the direction of the trend
Confirm with price action (e.g., support/resistance break)
Use "E" signals as profit targets or trend exhaustion warnings
Never trade Exhaustion signals alone – they indicate potential reversals, not entries
Alert System
Four distinct alerts fire on bar close with clear messages:
Exhaustion Bullish: "Price:LL, CVD:HL (Reversal)"
Absorption Bullish: "Price:HL, CVD:LL (Continuation)"
Exhaustion Bearish: "Price:HH, CVD:LH (Reversal)"
Absorption Bearish: "Price:LH, CVD:HH (Continuation)"
CVD Absorption/Exhaustion IndicatorCVD Absorption/Exhaustion Indicator – Explanation
This indicator identifies trading opportunities by analyzing the relationship between price action and Cumulative Volume Delta (CVD) at key pivot points. It implements a professional trading framework that distinguishes between tradeable continuation signals (Absorption) and potential reversal warnings (Exhaustion).
Part 1: Foundation – CVD Calculation
The indicator starts by calculating Cumulative Volume Delta using the Bull & Bear Balance formula:
Volume Pressure Calculation
Bull Power: Measures buying pressure based on candlestick characteristics
Bear Power: Measures selling pressure using the same methodology
Volume Split: Each bar's volume is proportionally divided between bull and bear pressure
Delta: bullVolume - bearVolume (net buying vs selling per bar)
CVD: Running total (ta.cum(delta)) that shows cumulative market order flow
On the chart: Yellow line = raw CVD. White line = optional SMA (20-period default). Fill color = teal when CVD > MA (bullish flow), red when below (bearish flow).
Part 2: Signal Logic – Pivot Detection
The indicator identifies pivot points on the CVD line (not price) using lookback parameters:
Left Bars (lbL=1): Minimum bars to left to form pivot
Right Bars (lbR=2): Bars to right to confirm pivot (also creates offset)
Range Validation
Pivot signals only trigger if the distance between consecutive pivots is between 5-60 bars (adjustable). This filters out noise and ensures meaningful divergence patterns.
Part 3: Trading Framework – PDF Logic
The core innovation is distinguishing two signal types at each pivot:
🟢 BULLISH SIGNALS (at CVD Pivot Lows)
Table
Copy
Signal Type Price Action CVD Action Trading Action Color
Exhaustion Lower Low (LL) Higher Low (HL) AVOID - Reversal warning Transparent Gray
Absorption Higher Low (HL) Lower Low (LL) TRADE - Continuation likely Solid Green
🔴 BEARISH SIGNALS (at CVD Pivot Highs)
Table
Copy
Signal Type Price Action CVD Action Trading Action Color
Exhaustion Higher High (HH) Lower High (LH) AVOID - Reversal warning Transparent Gray
Absorption Lower High (LH) Higher High (HH) TRADE - Continuation likely Solid Red
Part 4: Visualization Mechanism
The indicator uses precision plotting for clarity:
Pivot Lines: Thin vertical lines appear exactly at the pivot bar using offset=-lbR (shifts plot back to correct location)
Conditional Coloring: Lines are transparent (noneColor) unless a valid signal exists
Minimal Labels: Single letters "E" (Exhaustion) or "A" (Absorption) in tiny size to avoid chart clutter
Direction: Labels appear above the line for bullish signals, below for bearish signals
Part 5: How to Read the Chart
Signal Quality Hierarchy
Solid Green/Red lines with "A" = Primary trade signals (Absorption/Continuation)
Transparent Gray lines with "E" = Warning signals (Exhaustion/Reversal) - use for context or exit planning
No lines at pivots = No valid pattern - ignore
Timeframe Usage
Best on: 5-minute to 1-hour charts (as per PDF)
Multi-timeframe: Use the dropdown in settings to analyze higher timeframe signals while trading lower timeframe
Practical Workflow
Wait for solid color "A" signal in the direction of the trend
Confirm with price action (e.g., support/resistance break)
Use "E" signals as profit targets or trend exhaustion warnings
Never trade Exhaustion signals alone – they indicate potential reversals, not entries
Alert System
Four distinct alerts fire on bar close with clear messages:
Exhaustion Bullish: "Price:LL, CVD:HL (Reversal)"
Absorption Bullish: "Price:HL, CVD:LL (Continuation)"
Exhaustion Bearish: "Price:HH, CVD:LH (Reversal)"
Absorption Bearish: "Price:LH, CVD:HH (Continuation)"
ENTRY CONFIRMATION V2// This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// © Zerocapitalmx
//@version=5
indicator(title="ENTRY CONFIRMATION V2", format=format.price, timeframe="", timeframe_gaps=true)
len = input.int(title="RSI Period", minval=1, defval=50)
src = input(title="RSI Source", defval=close)
lbR = input(title="Pivot Lookback Right", defval=5)
lbL = input(title="Pivot Lookback Left", defval=5)
rangeUpper = input(title="Max of Lookback Range", defval=60)
rangeLower = input(title="Min of Lookback Range", defval=5)
plotBull = input(title="Plot Bullish", defval=true)
plotHiddenBull = input(title="Plot Hidden Bullish", defval=false)
plotBear = input(title="Plot Bearish", defval=true)
plotHiddenBear = input(title="Plot Hidden Bearish", defval=false)
bearColor = color.red
bullColor = color.green
hiddenBullColor = color.new(color.green, 80)
hiddenBearColor = color.new(color.red, 80)
textColor = color.white
noneColor = color.new(color.white, 100)
osc = ta.rsi(src, len)
rsiPeriod = input.int(50, minval = 1, title = "RSI Period")
bandLength = input.int(1, minval = 1, title = "Band Length")
lengthrsipl = input.int(1, minval = 0, title = "Fast MA on RSI")
lengthtradesl = input.int(50, minval = 1, title = "Slow MA on RSI")
r = ta.rsi(src, rsiPeriod) // RSI of Close
ma = ta.sma(r, bandLength ) // Moving Average of RSI
offs = (1.6185 * ta.stdev(r, bandLength)) // Offset
fastMA = ta.sma(r, lengthrsipl) // Moving Average of RSI 2 bars back
slowMA = ta.sma(r, lengthtradesl) // Moving Average of RSI 7 bars back
plot(slowMA, "Slow MA", color=color.black, linewidth=1) // Plot Slow MA
plot(osc, title="RSI", linewidth=2, color=color.purple)
hline(50, title="Middle Line", color=#787B86, linestyle=hline.style_dotted)
obLevel = hline(70, title="Overbought", color=#787B86, linestyle=hline.style_dotted)
osLevel = hline(30, title="Oversold", color=#787B86, linestyle=hline.style_dotted)
plFound = na(ta.pivotlow(osc, lbL, lbR)) ? false : true
phFound = na(ta.pivothigh(osc, lbL, lbR)) ? false : true
_inRange(cond) =>
bars = ta.barssince(cond == true)
rangeLower <= bars and bars <= rangeUpper
//------------------------------------------------------------------------------
// Regular Bullish
// Osc: Higher Low
oscHL = osc > ta.valuewhen(plFound, osc , 1) and _inRange(plFound )
// Price: Lower Low
priceLL = low < ta.valuewhen(plFound, low , 1)
bullCond = plotBull and priceLL and oscHL and plFound
plot(
plFound ? osc : na,
offset=-lbR,
title="Regular Bullish",
linewidth=1,
color=(bullCond ? bullColor : noneColor)
)
plotshape(
bullCond ? osc : na,
offset=-lbR,
title="Regular Bullish Label",
text=" EDM ",
style=shape.labelup,
location=location.absolute,
color=bullColor,
textcolor=textColor
)
//------------------------------------------------------------------------------
// Hidden Bullish
// Osc: Lower Low
oscLL = osc < ta.valuewhen(plFound, osc , 1) and _inRange(plFound )
// Price: Higher Low
priceHL = low > ta.valuewhen(plFound, low , 1)
hiddenBullCond = plotHiddenBull and priceHL and oscLL and plFound
plot(
plFound ? osc : na,
offset=-lbR,
title="Hidden Bullish",
linewidth=1,
color=(hiddenBullCond ? hiddenBullColor : noneColor)
)
plotshape(
hiddenBullCond ? osc : na,
offset=-lbR,
title="Hidden Bullish Label",
text=" EDM ",
style=shape.labelup,
location=location.absolute,
color=bullColor,
textcolor=textColor
)
//------------------------------------------------------------------------------
// Regular Bearish
// Osc: Lower High
oscLH = osc < ta.valuewhen(phFound, osc , 1) and _inRange(phFound )
// Price: Higher High
priceHH = high > ta.valuewhen(phFound, high , 1)
bearCond = plotBear and priceHH and oscLH and phFound
plot(
phFound ? osc : na,
offset=-lbR,
title="Regular Bearish",
linewidth=1,
color=(bearCond ? bearColor : noneColor)
)
plotshape(
bearCond ? osc : na,
offset=-lbR,
title="Regular Bearish Label",
text=" EDM ",
style=shape.labeldown,
location=location.absolute,
color=bearColor,
textcolor=textColor
)
//------------------------------------------------------------------------------
// Hidden Bearish
// Osc: Higher High
oscHH = osc > ta.valuewhen(phFound, osc , 1) and _inRange(phFound )
// Price: Lower High
priceLH = high < ta.valuewhen(phFound, high , 1)
hiddenBearCond = plotHiddenBear and priceLH and oscHH and phFound
plot(
phFound ? osc : na,
offset=-lbR,
title="Hidden Bearish",
linewidth=1,
color=(hiddenBearCond ? hiddenBearColor : noneColor)
)
plotshape(
hiddenBearCond ? osc : na,
offset=-lbR,
title="Hidden Bearish Label",
text=" EDM ",
style=shape.labeldown,
location=location.absolute,
color=bearColor,
textcolor=textColor
)
Tactical Holding [SwissAlgo]Tactical Holding
A visual framework for managing long-term positions across market cycles
--------------------------------------------------------------
Purpose
Instead of holding a fixed position through all market conditions , you can use this framework to adjust your exposure tactically . By reducing positions during distribution phases and accumulating during favorable accumulation zones, you may end up holding more units of the asset over complete market cycles - even if you temporarily exit or reduce exposure during unfavorable periods. This approach aims to help you compound your holdings by taking advantage of market volatility rather than simply enduring it.
--------------------------------------------------------------
Recommended Settings
Timeframe : Weekly (1W) chart
Chart Type : Standard candlesticks (select 'Bar' type Candles)
This indicator is designed for higher timeframe analysis. While it can be applied to other timeframes, the logic and signal generation are optimized for weekly charts to filter out short-term noise and focus on major market cycles.
--------------------------------------------------------------
Key Features
♦ Market State Classification
The indicator aims to categorize potential market conditions into five color-coded states based on technical confluences:
* Bull (bright green): Multiple bullish indicators align
* Bull Retrace (teal): Bullish structure with temporary weakness
* Bull ⇆ Bear Reversal (yellow): Transitional phase between trends
* Bear (bright red): Multiple bearish indicators align
* Bear Retrace (Pale Red/Maroon): Bearish structure with temporary strength
♦ Visual Elements
* Candles change color based on the current market state
* A 50-period EMA tracks with the same color coding, providing visual trend context
* Small arrow markers appear when specific pattern conditions are met (zones for potential distribution or accumulation)
* A legend table (toggle on/off) explains the color system
* A label shows the current state name on the chart
♦ Pattern Recognition
The system monitors for two types of potential entry/exit zones:
1. State transition patterns after periods of market regime consistency
2. RSI divergence patterns (when price and momentum move in opposite directions)
♦ Customization
* Toggle the legend table visibility through settings
* All calculations are transparent and use standard technical analysis methods
--------------------------------------------------------------
How It Works
Think of this indicator as a traffic light system for your portfolio:
♦ Green zones suggest the asset might be in an environment where long-term holders historically have remained invested
Bright green (Bull) : Multiple technical indicators align in a potentially strong bullish phase
Pale green (Bull Retrace) : Bullish structure remains intact, but momentum shows temporary weakness - often a pullback within an uptrend
♦ Red zones suggest conditions where long-term holders might consider reducing exposure or waiting for better entry points
Dark red (Bear) : Multiple technical indicators align in a potentially strong bearish phase
Pale red (Bear Retrace) : Bearish structure remains intact but shows temporary strength - often a bounce within a downtrend
♦ Yellow zones indicate the market is in transition between bull and bear regimes - a time for increased attention as the trend direction becomes uncertain
The system doesn't predict future prices. Instead, it helps you understand the current technical environment by doing the heavy lifting of analyzing multiple indicators at once and presenting them in a simple visual format.
Example: During the 2022 crypto bear market, the indicator would have displayed extended red periods, signaling defensive conditions for holders. When accumulation arrows appeared in late 2022-early 2023, it highlighted potential re-entry zones as the technical regime transitioned back toward green, before the 2024 recovery.
--------------------------------------------------------------
Who This Is For
♦ Long-term investors who want to hold assets through cycles but prefer a systematic approach to position sizing and timing rather than buying and never selling .
♦ Portfolio managers looking for a visual tool to help determine when to increase or decrease exposure to specific assets based on technical regime changes.
♦ Swing traders on higher timeframes who want to align their positions with the broader market structure rather than fighting the trend.
This is not designed for:
* Day traders or scalpers
* Those seeking exact entry/exit prices
* Automated trading systems (this is a visual decision-support tool)
--------------------------------------------------------------
Understanding the Visuals
When you apply Tactical Holding to a chart, you'll see:
1. Colored candles - Instantly see what market regime the asset is in
2. Colored EMA line (thick line) - Provides a dynamic support/resistance reference that changes color with market conditions
3. Small arrows (↑ ↓) - Mark bars where specific technical patterns complete
4. State label - Shows current market classification
5. Legend table (top right) - Quick reference guide for the color system
6. Warning banner (top center) - Reminds you to use weekly charts
The visual design prioritizes clarity over complexity. You should be able to glance at a chart and immediately understand the current technical environment.
--------------------------------------------------------------
Important Limitations
This indicator cannot:
* Predict future price movements
* Guarantee profitable trades
* Work equally well on all assets or timeframes
* Replace your own research and risk management
Technical considerations:
* Divergence detection has a 3-bar confirmation lag (by design, to avoid false signals)
* State transitions require multiple technical confirmations, which may cause delayed reactions to rapid market changes
* The system is reactive, not predictive - it responds to price action after it occurs
* Performance varies significantly between trending assets (like Solana) and stable assets (like Apple)
--------------------------------------------------------------
Practical Application
Consider using this indicator as one component of a broader investment framework:
♦ Understanding Position Context:
The color-coded states can help frame your thinking about current holdings:
Bull: Technical conditions that have historically been associated with sustained uptrends
Bull Retrace: Pullbacks within an overall bullish structure- these periods may offer opportunities to evaluate entry points or reassess existing positions
Reversal (Yellow): Transitional phases where the trend direction is unclear - periods that may warrant closer monitoring
Bear Retrace: Temporary strength within an overall bearish structure - rallies that historically have often faded
Bear: Technical conditions that have historically been associated with sustained downtrends
♦ Interpreting Signal Arrows:
Arrow markers indicate when specific technical pattern conditions have been met. These are observation points, not instructions:
A signal appearing doesn't mean immediate action is required
Treat arrows as prompts for further analysis rather than automatic triggers
Consider the broader context: fundamentals, your investment timeline, risk tolerance, and overall market conditions
Signals show when historical technical patterns have formed - not whether those patterns will lead to the same outcomes as in the past
The framework is designed to organize information visually, not to tell you what to do. Your investment decisions should incorporate this technical perspective alongside other factors relevant to your situation.
--------------------------------------------------------------
Technical Methodology
For transparency, the indicator uses:
* RSI (14) with a 14-period SMA to assess momentum direction
* MACD (12,26,9) to confirm trend strength and histogram momentum
* Stochastic RSI with K and D line crossovers for additional confirmation
* 50-period EMA as the primary trend filter
* Linear regression-based slope analysis to detect flat/transitional periods
* Pivot-based divergence detection following standard technical analysis principles
All calculations use publicly available technical analysis formulas. Nothing is hidden or proprietary beyond the specific combination and weighting of these standard tools.
--------------------------------------------------------------
Disclaimer
This indicator is an educational and analytical tool only. It is not financial advice.
* Trading and investing involve substantial risk of loss
* Past performance of any technical system does not indicate future results
* No indicator can predict market movements with certainty
* Always conduct your own research and consult with qualified financial professionals
* Never invest more than you can afford to lose
* The creators of this indicator are not responsible for any trading losses
* This tool is not affiliated with, endorsed by, or connected to TradingView, 3Commas, or any other trading platform
* Use of this indicator is at your own risk
Risk Management: Regardless of what any indicator shows, always use proper position sizing, stop losses, and risk management appropriate to your personal financial situation.
This indicator provides a framework for analysis. Your decisions, research, and risk management determine your results.
Screener (ILPAC) [AlgoAlpha]🟠 OVERVIEW
This script is a powerful multi-symbol scanner designed to work as a companion to the "Institutional Liquidity & PA Concepts" (ILPAC) indicator. It allows you to monitor the key price action and liquidity signals from the ILPAC suite across a watchlist of up to 18 assets, all from a single dashboard. The primary goal of this tool is to provide a high-level market overview, enabling you to efficiently spot assets that are showing strong structural trends, interacting with key liquidity zones, or exhibiting signs of FOMO-driven volatility.
Instead of switching between dozens of charts, you can use this screener to quickly filter for assets that meet your specific trading criteria based on the advanced concepts of market structure, liquidity analysis, trend lines, and market sentiment.
🟠 CONCEPTS
The screener is built upon the core analytical engine of the "Institutional Liquidity & PA Concepts" indicator. It applies the proprietary algorithms of the ILPAC indicator to each symbol in your watchlist and presents the results in an easy-to-digest table. The concepts are combined to create a holistic view of the market.
Each column in the table is a window into a specific trading concept:
Market Structure: This is the foundation of price action analysis. The screener identifies the current market trend (bullish or bearish) by tracking swing highs and lows. It also flags critical events like a Break of Structure (BOS), which signals trend continuation, and a Change of Character (CHoCH), which suggests a potential trend reversal.
Liquidity Analysis: The screener analyzes order flow to determine where significant liquidity is resting. The "Liquidity Bias" column shows the net direction of this pressure, while the "Liquidity Event" column alerts you when price interacts with these key zones, either by forming a new one or mitigating an old one.
Trend Lines: This concept automates the classic technical analysis technique of drawing trend lines. The screener identifies significant swing points to form trend lines and then monitors them, alerting you to potential trend continuations or breakouts.
FOMO Bubbles: This concept measures crowd psychology by identifying sudden spikes in volume and price movement that are characteristic of "Fear of Missing Out." These signals can help identify potential trend exhaustion points or the start of a speculative rally.
By presenting these distinct but interconnected concepts together, the screener provides a multi-faceted view that allows traders to build a strong, confluence-based trading thesis.
🟠 FEATURES
This screener organizes a vast amount of data into a simple, color-coded table. Here is a breakdown of each column and the values you can expect to see:
Asset: Displays the ticker symbol for the asset being analyzed.
Market Structure: Shows the dominant trend based on swing highs and lows.
Bull: The asset is in a structural uptrend (making higher highs and higher lows).
Bear: The asset is in a structural downtrend (making lower highs and lower lows).
Detecting: The trend is neutral or a clear structure has not yet been established.
Structure Event: Flags the most recent significant market structure event.
Bull CHoCH: A bullish Change of Character, signaling a potential shift from a downtrend to an uptrend.
Bear CHoCH: A bearish Change of Character, signaling a potential shift from an uptrend to a downtrend.
Bull BOS: A bullish Break of Structure, confirming the continuation of an uptrend.
Bear BOS: A bearish Break of Structure, confirming the continuation of a downtrend.
–: No significant event has occurred recently.
Latest Swing Label: Identifies the most recently confirmed swing point.
HH: Higher High.
HL: Higher Low.
LH: Lower High.
LL: Lower Low.
–: No new swing point has been confirmed.
Liquidity Bias: Measures the net direction of liquidity and its relative strength.
▲ : A bullish liquidity bias, where the number indicates the strength.
▼ : A bearish liquidity bias, where the number indicates the strength.
Balanced: Liquidity is relatively balanced between buyers and sellers.
Liquidity Event: Indicates recent interactions with key liquidity zones.
New▲: A new bullish liquidity zone has just formed.
New▼: A new bearish liquidity zone has just formed.
Mit▲: Price has just tested (mitigated) a key bullish liquidity zone.
Mit▼: Price has just tested (mitigated) a key bearish liquidity zone.
–: No recent interaction.
Trend Line: Displays the status of automatically drawn trend lines.
Break▲: Price has broken above a key bearish trend line.
Break▼: Price has broken below a key bullish trend line.
Bull TL: Price is respecting an active bullish trend line.
Bear TL: Price is respecting an active bearish trend line.
–: No significant trend line is currently active.
FOMO: Detects sentiment-driven price moves of varying intensity.
Big▲/Med▲/Small▲: A bullish FOMO bubble has been detected (large, medium, or small).
Big▼/Med▼/Small▼: A bearish FOMO bubble has been detected (large, medium, or small).
–: No FOMO activity detected.
🟠 USAGE
The primary way to use this screener is to quickly scan your watchlist for assets that exhibit a confluence of bullish or bearish signals, which can significantly improve the probability of a trade.
1. Setup and Configuration:
Add the screener to your chart.
Open the settings and populate the "Watchlist" section with the symbols you want to track.
Fine-tune the input settings for each component (Market Structure, Liquidity, etc.) to match your preferred trading style. These settings will apply to all symbols in the table.
2. Interpreting the Columns for Trading Decisions:
Market Structure Columns: Use the first three structure columns to define your trading bias. For a high-probability long setup, you would look for an asset with a "Bull" structure, a recent "Bull BOS" event, and a "HL" as the latest swing point. This confirms the uptrend is healthy and ongoing.
Liquidity Columns: These are crucial for identifying key price levels. A strong "Liquidity Bias" can confirm your directional bias. A "Mit▲" (mitigation) event at a support level can be a powerful entry trigger, as it shows that institutional buy orders are defending that zone.
Trend Line Column: This is ideal for breakout traders. A "Break▲" signal can serve as an excellent entry confirmation, especially if the overall "Market Structure" is already "Bull".
FOMO Column: This column is best used for identifying potential exhaustion points. For instance, if you are in a long trade and a "Big▲" FOMO signal appears after a strong rally, it could be a sign that the move is overextended and it's a good time to consider taking profits.
Paid script
MPO4 Lines – Modal Engine█ OVERVIEW
MPO4 Lines – Modal Engine is an advanced multi-line modal oscillator for TradingView, designed to detect momentum shifts, trend strength, and reversal points through candle-based pressure analysis with multiple fast lines and a reference slow line. It features divergence detection on Fast Line A, overbought/oversold return signals, dynamic coloring modes, and layered gradient visualizations for enhanced clarity and decision-making.
█ CONCEPT
The indicator is built upon the Market Pressure Oscillator (MPO) and serves as its expanded evolution, aimed at enabling broader market analysis through multiple lines with varying parameters. It calculates modal pressure using candle body size and direction, weighted against average body size over a lookback period, then normalized and smoothed via EMA. It generates four distinct oscillator lines: a heavily smoothed Slow Line (trend reference), two Fast Lines (A & B) for momentum and support/resistance, and an optional Line 4 for additional confirmation. Divergence is calculated solely on Fast Line A, with visual gradients between lines and bands for intuitive interpretation.
█ WHY USE IT?
- Multi-Layer Momentum: Combines slow trend reference with dual fast lines for precise entry/exit timing.
- Divergence Precision: Bullish/bearish divergences on Fast Line A with labeled confirmation.
- OB/OS Return Signals: Clear buy/sell markers when Fast Line A exits oversold/overbought zones.
- Dynamic Visuals: Gradient fills, line-to-line shading, and band gradients for instant market state recognition.
- Flexible Coloring: Slow Line color by direction or zero-position; fast lines by sign.
- Full Customization: Independent lengths, smoothing, visibility, and transparency — by adjusting the lengths of different lines, you can tailor results for various strategies; for example, enabling Line 4 and tuning its length allows trading based on crossovers between different lines.
█ HOW IT WORKS?
- Candle Pressure Calculation: Body = math.abs(close - open); avgBody = ta.sma(body, len). Direction = +1 (bull), –1 (bear), 0 (neutral). Weight = body / avgBody. Contribution = direction × weight.
- Rolling Sum & Normalization: Sums contributions over lookback, normalizes to ±100 scale (÷ (len × 2) × 100).
Smoothing: Applies primary EMA (smoothLen), with extra EMA on Slow Line for stability.
Line Structure:
- Slow Line = calcCPO(len1=20, smoothLen1=5) → extra EMA (5)
- Fast Line A = calcCPO(len2=6, smoothLen2=7)
- Fast Line B = calcCPO(len3=6, smoothLen3=10)
- Line 4 = calcCPO(len4=14, smoothLen4=1)
Divergence Detection: Uses ta.pivothigh/low on price and Fast Line A (pivotLength left/right). Bullish: lower price low + higher osc low. Bearish: higher price high + lower osc high. Valid within 5–60 bar window.
Signals:
- Buy: Fast Line A crosses above oversold (–30)
- Sell: Fast Line A crosses below overbought (+30)
- Slow Line color flip (direction or zero-cross)
- Divergence labels ("Bull" / "Bear")
- Band Coloring as Momentum Signal:
When Fast Line A ≤ Fast Line B → Overbought band turns red (bearish pressure building)
When Fast Line A > Fast Line B → Oversold band turns green (bullish pressure building) This dynamic coloring serves as visual confirmation of momentum shift following fast line crossovers
Visualization:
- Gradients: Fast B → Zero (multi-layer fade), Fast A ↔ B fill, OB/OS bands
- Dynamic colors: Green/red based on sign or trend
- Zero line + dashed OB/OS thresholds
Alerts: Trigger on OB/OS returns, Slow Line changes, and divergences.
█ SETTINGS AND CUSTOMIZATION
- Line Visibility: Toggle Slow, Fast A, Fast B, Line 4 independently.
Line Lengths:
- Slow Line: Base (20), Primary EMA (5), Extra EMA (5)
- Fast A: Lookback (6), EMA (7)
- Fast B: Lookback (6), EMA (10)
- Line 4: Lookback (14), EMA (1)
- Slow Line Coloring Mode: “Direction” (trend-based) or “Position vs Zero”.
- Bands & Thresholds: Overbought (+30), Oversold (–30), step 0.1.
- Signals: Enable Fast A OB/OS return markers (default: on).
- Divergence: Enable/disable, Pivot Length (default: 2, min 1).
- Colors & Appearance: Full control over bullish/bearish hues for all lines, zero, bands, divergence, and text.
Gradients & Transparency:
- Fast B → Zero: 75 (default)
- Fast A ↔ B fill: 50
- Band gradients: 40
- Toggle each gradient independently
█ USAGE EXAMPLES
The indicator allows users to configure various strategies manually, though no built-in alerts exist for them. Entry signals can include color of fast lines, crossovers between different lines, alignment of colors across lines, or consistency in direction.
- Trend Confirmation: Slow Line above zero + green = bullish bias; below + red = bearish.
- Entry Timing: Buy on Fast A crossing above –30 (circle marker), especially if Slow Line is rising or near zero.
- Reversal Setup: Bullish divergence (“Bull” label) + Fast A in oversold + green gradient band = high-probability long.
- Scalping: Fast A vs Fast B crossover in direction of Slow Line trend.
- Noise Reduction: Increase extraSmoothLen on Slow Line
█ USER NOTES
- Best combined with volume, support/resistance, or trend channels.
- Adjust lookback and smoothing to asset volatility.
- Divergence delay = pivotLength; plan entries accordingly.
COT IndexTHE HIDDEN INTELLIGENCE IN FUTURES MARKETS
What if you could see what the smartest players in the futures markets are doing before the crowd catches on? While retail traders chase momentum indicators and moving averages, obsess over Japanese candlestick patterns, and debate whether the RSI should be set to fourteen or twenty-one periods, institutional players leave footprints in the sand through their mandatory reporting to the Commodity Futures Trading Commission. These footprints, published weekly in the Commitment of Traders reports, have been hiding in plain sight for decades, available to anyone with an internet connection, yet remarkably few traders understand how to interpret them correctly. The COT Index indicator transforms this raw institutional positioning data into actionable trading signals, bringing Wall Street intelligence to your trading screen without requiring expensive Bloomberg terminals or insider connections.
The uncomfortable truth is this: Most retail traders operate in a binary world. Long or short. Buy or sell. They apply technical analysis to individual positions, constrained by limited capital that forces them to concentrate risk in single directional bets. Meanwhile, institutional traders operate in an entirely different dimension. They manage portfolios dynamically weighted across multiple markets, adjusting exposure based on evolving market conditions, correlation shifts, and risk assessments that retail traders never see. A hedge fund might be simultaneously long gold, short oil, neutral on copper, and overweight agricultural commodities, with position sizes calibrated to volatility and portfolio Greeks. When they increase gold exposure from five percent to eight percent of portfolio allocation, this rebalancing decision reflects sophisticated analysis of opportunity cost, risk parity, and cross-market dynamics that no individual chart pattern can capture.
This portfolio reweighting activity, multiplied across hundreds of institutional participants, manifests in the aggregate positioning data published weekly by the CFTC. The Commitment of Traders report does not show individual trades or strategies. It shows the collective footprint of how actual commercial hedgers and large speculators have allocated their capital across different markets. When mining companies collectively increase forward gold sales to hedge thirty percent more production than last quarter, they are not reacting to a moving average crossover. They are making strategic allocation decisions based on production forecasts, cost structures, and price expectations derived from operational realities invisible to outside observers. This is portfolio management in action, revealed through positioning data rather than price charts.
If you want to understand how institutional capital actually flows, how sophisticated traders genuinely position themselves across market cycles, the COT report provides a rare window into that hidden world. But understand what you are getting into. This is not a tool for scalpers seeking confirmation of the next five-minute move. This is not an oscillator that flashes oversold at market bottoms with convenient precision. COT analysis operates on a timescale measured in weeks and months, revealing positioning shifts that precede major market turns but offer no precision timing. The data arrives three days stale, published only once per week, capturing strategic positioning rather than tactical entries.
If you need instant gratification, if you trade intraday moves, if you demand mechanical signals with ninety percent accuracy, close this document now. COT analysis rewards patience, position sizing discipline, and tolerance for being early. It punishes impatience, overleveraging, and the expectation that any single indicator can substitute for market understanding.
The premise is deceptively simple. Every Tuesday, large traders in futures markets must report their positions to the CFTC. By Friday afternoon, this data becomes public. Academic research spanning three decades has consistently shown that not all market participants are created equal. Some traders consistently profit while others consistently lose. Some anticipate major turning points while others chase trends into exhaustion. Bessembinder and Chan (1992) demonstrated in their seminal study that commercial hedgers, those with actual exposure to the underlying commodity or financial instrument, possess superior forecasting ability compared to speculators. Their research, published in the Journal of Finance, found statistically significant predictive power in commercial positioning, particularly at extreme levels. This finding challenged the efficient market hypothesis and opened the door to a new approach to market analysis based on positioning rather than price alone.
Think about what this means. Every week, the government publishes a report showing you exactly how the most informed market participants are positioned. Not their opinions. Not their predictions. Their actual money at risk. When agricultural producers collectively hold their largest short hedge in five years, they are not making idle speculation. They are locking in prices for crops they will harvest, informed by private knowledge of weather conditions, soil quality, inventory levels, and demand expectations invisible to outside observers. When energy companies aggressively hedge forward production at current prices, they reveal information about expected supply that no analyst report can capture. This is not technical analysis based on past prices. This is not fundamental analysis based on publicly available data. This is behavioral analysis based on how the smartest money is actually positioned, how institutions allocate capital across portfolios, and how those allocation decisions shift as market conditions evolve.
WHY SOME TRADERS KNOW MORE THAN OTHERS
Building on this foundation, Sanders, Boris and Manfredo (2004) conducted extensive research examining the behaviour patterns of different trader categories. Their work, which analyzed over a decade of COT data across multiple commodity markets, revealed a fascinating dynamic that challenges much of what retail traders are taught. Commercial hedgers consistently positioned themselves against market extremes, buying when speculators were most bearish and selling when speculators reached peak bullishness. The contrarian positioning of commercials was not random noise but rather reflected their superior information about supply and demand fundamentals. Meanwhile, large speculators, primarily hedge funds and commodity trading advisors, exhibited strong trend-following behaviour that often amplified market moves beyond fundamental values. Small traders, the retail participants, consistently entered positions late in trends, frequently near turning points, making them reliable contrary indicators.
Wang (2003) extended this research by demonstrating that the predictive power of commercial positioning varies significantly across different commodity sectors. His analysis of agricultural commodities showed particularly strong forecasting ability, with commercial net positions explaining up to fifteen percent of return variance in subsequent weeks. This finding suggests that the informational advantages of hedgers are most pronounced in markets where physical supply and demand fundamentals dominate, as opposed to purely financial markets where information asymmetries are smaller. When a corn farmer hedges six months of expected harvest, that decision incorporates private observations about rainfall patterns, crop health, pest pressure, and local storage capacity that no distant analyst can match. When an oil refinery hedges crude oil purchases and gasoline sales simultaneously, the spread relationships reveal expectations about refining margins that reflect operational realities invisible in public data.
The theoretical mechanism underlying these empirical patterns relates to information asymmetry and different participant motivations. Commercial hedgers engage in futures markets not for speculative profit but to manage business risks. An agricultural producer selling forward six months of expected harvest is not making a bet on price direction but rather locking in revenue to facilitate financial planning and ensure business viability. However, this hedging activity necessarily incorporates private information about expected supply, inventory levels, weather conditions, and demand trends that the hedger observes through their commercial operations (Irwin and Sanders, 2012). When aggregated across many participants, this private information manifests in collective positioning.
Consider a gold mining company deciding how much forward production to hedge. Management must estimate ore grades, recovery rates, production costs, equipment reliability, labor availability, and dozens of other operational variables that determine whether locking in prices at current levels makes business sense. If the industry collectively hedges more aggressively than usual, it suggests either exceptional production expectations or concern about sustaining current price levels or combination of both. Either way, this positioning reveals information unavailable to speculators analyzing price charts and economic data. The hedger sees the physical reality behind the financial abstraction.
Large speculators operate under entirely different incentives and constraints. Commodity Trading Advisors managing billions in assets typically employ systematic, trend-following strategies that respond to price momentum rather than fundamental supply and demand. When crude oil rallies from sixty dollars to seventy dollars per barrel, these systems generate buy signals. As the rally continues to eighty dollars, position sizes increase. The strategy works brilliantly during sustained trends but becomes a liability at reversals. By the time oil reaches ninety dollars, trend-following funds are maximally long, having accumulated positions progressively throughout the rally. At this point, they represent not smart money anticipating further gains but rather crowded money vulnerable to reversal. Sanders, Boris and Manfredo (2004) documented this pattern across multiple energy markets, showing that extreme speculator positioning typically marked late-stage trend exhaustion rather than early-stage trend development.
Small traders, the retail participants who fall below reporting thresholds, display the weakest forecasting ability. Wang (2003) found that small trader positioning exhibited negative correlation with subsequent returns, meaning their aggregate positioning served as a reliable contrary indicator. The explanation combines several factors. Retail traders often lack the capital reserves to weather normal market volatility, leading to premature exits from positions that would eventually prove profitable. They tend to receive information through slower channels, entering trends after mainstream media coverage when institutional participants are preparing to exit. Perhaps most importantly, they trade with emotion, buying into euphoria and selling into panic at precisely the wrong times.
At major turning points, the three groups often position opposite each other with commercials extremely bearish, large speculators extremely bullish, and small traders piling into longs at the last moment. These high-divergence environments frequently precede increased volatility and trend reversals. The insiders with business exposure quietly exit as the momentum traders hit maximum capacity and retail enthusiasm peaks. Within weeks, the reversal begins, and positions unwind in the opposite sequence.
FROM RAW DATA TO ACTIONABLE SIGNALS
The COT Index indicator operationalizes these academic findings into a practical trading tool accessible through TradingView. At its core, the indicator normalizes net positioning data onto a zero to one hundred scale, creating what we call the COT Index. This normalization is critical because absolute position sizes vary dramatically across different futures contracts and over time. A commercial trader holding fifty thousand contracts net long in crude oil might be extremely bullish by historical standards, or it might be quite neutral depending on the context of total market size and historical ranges. Raw position numbers mean nothing without context. The COT Index solves this problem by calculating where current positioning stands relative to its range over a specified lookback period, typically two hundred fifty-two weeks or approximately five years of weekly data.
The mathematical transformation follows the methodology originally popularized by legendary trader Larry Williams, though the underlying concept appears in statistical normalization techniques across many fields. For any given trader category, we calculate the highest and lowest net position values over the lookback period, establishing the historical range for that specific market and trader group. Current positioning is then expressed as a percentage of this range, where zero represents the most bearish positioning ever seen in the lookback window and one hundred represents the most bullish extreme. A reading of fifty indicates positioning exactly in the middle of the historical range, suggesting neither extreme optimism nor pessimism relative to recent history (Williams and Noseworthy, 2009).
This index-based approach allows for meaningful comparison across different markets and time periods, overcoming the scaling problems inherent in analyzing raw position data. A commercial index reading of eighty-five in gold carries the same interpretive meaning as an eighty-five reading in wheat or crude oil, even though the absolute position sizes differ by orders of magnitude. This standardization enables systematic analysis across entire futures portfolios rather than requiring market-specific expertise for each contract.
The lookback period selection involves a fundamental tradeoff between responsiveness and stability. Shorter lookback periods, perhaps one hundred twenty-six weeks or approximately two and a half years, make the index more sensitive to recent positioning changes. However, it also increases noise and produces more false signals. Longer lookback periods, perhaps five hundred weeks or approximately ten years, create smoother readings that filter short-term noise but become slower to recognize regime changes. The indicator settings allow users to adjust this parameter based on their trading timeframe, risk tolerance, and market characteristics.
UNDERSTANDING CFTC DATA STRUCTURES
The indicator supports both Legacy and Disaggregated COT report formats, reflecting the evolution of CFTC reporting standards over decades of market development. Legacy reports categorize market participants into three broad groups: commercial traders (hedgers with underlying business exposure), non-commercial traders (large speculators seeking profit without commercial interest), and non-reportable traders (small speculators below reporting thresholds). Each category brings distinct motivations and information advantages to the market (CFTC, 2020).
The Disaggregated reports, introduced in September 2009 for physical commodity markets, provide finer granularity by splitting participants into five categories (CFTC, 2009). Producer and merchant positions capture those actually producing, processing, or merchandising the physical commodity. Swap dealers represent financial intermediaries facilitating derivative transactions for clients. Managed money includes commodity trading advisors and hedge funds executing systematic or discretionary strategies. Other reportables encompasses diverse participants not fitting the main categories. Small traders remain as the fifth group, representing retail participation.
This enhanced categorization reveals nuances invisible in Legacy reports, particularly distinguishing between different types of institutional capital and their distinct behavioural patterns. The indicator automatically detects which report type is appropriate for each futures contract and adjusts the display accordingly.
Importantly, Disaggregated reports exist only for physical commodity futures. Agricultural commodities like corn, wheat, and soybeans have Disaggregated reports because clear producer, merchant, and swap dealer categories exist. Energy commodities like crude oil and natural gas similarly have well-defined commercial hedger categories. Metals including gold, silver, and copper also receive Disaggregated treatment (CFTC, 2009). However, financial futures such as equity index futures, Treasury bond futures, and currency futures remain available only in Legacy format. The CFTC has indicated no plans to extend Disaggregated reporting to financial futures due to different market structures and participant categories in these instruments (CFTC, 2020).
THE BEHAVIORAL FOUNDATION
Understanding which trader perspective to follow requires appreciation of their distinct trading styles, success rates, and psychological profiles. Commercial hedgers exhibit anticyclical behaviour rooted in their fundamental knowledge and business imperatives. When agricultural producers hedge forward sales during harvest season, they are not speculating on price direction but rather locking in revenue for crops they will harvest. Their business requires converting volatile commodity exposure into predictable cash flows to facilitate planning and ensure survival through difficult periods. Yet their aggregate positioning reveals valuable information because these hedging decisions incorporate private information about supply conditions, inventory levels, weather observations, and demand expectations that hedgers observe through their commercial operations (Bessembinder and Chan, 1992).
Consider a practical example from energy markets. Major oil companies continuously hedge portions of forward production based on price levels, operational costs, and financial planning needs. When crude oil trades at ninety dollars per barrel, they might aggressively hedge the next twelve months of production, locking in prices that provide comfortable profit margins above their extraction costs. This hedging appears as short positioning in COT reports. If oil rallies further to one hundred dollars, they hedge even more aggressively, viewing these prices as exceptional opportunities to secure revenue. Their short positioning grows increasingly extreme. To an outside observer watching only price charts, the rally suggests bullishness. But the commercial positioning reveals that the actual producers of oil find these prices attractive enough to lock in years of sales, suggesting skepticism about sustaining even higher levels. When the eventual reversal occurs and oil declines back to eighty dollars, the commercials who hedged at ninety and one hundred dollars profit while speculators who chased the rally suffer losses.
Large speculators or managed money traders operate under entirely different incentives and constraints. Their systematic, momentum-driven strategies mean they amplify existing trends rather than anticipate reversals. Trend-following systems, the most common approach among large speculators, by definition require confirmation of trend through price momentum before entering positions (Sanders, Boris and Manfredo, 2004). When crude oil rallies from sixty dollars to eighty dollars per barrel over several months, trend-following algorithms generate buy signals based on moving average crossovers, breakouts, and other momentum indicators. As the rally continues, position sizes increase according to the systematic rules.
However, this approach becomes a liability at turning points. By the time oil reaches ninety dollars after a sustained rally, trend-following funds are maximally long, having accumulated positions progressively throughout the move. At this point, their positioning does not predict continued strength. Rather, it often marks late-stage trend exhaustion. The psychological and mechanical explanation is straightforward. Trend followers by definition chase price momentum, entering positions after trends establish rather than anticipating them. Eventually, they become fully invested just as the trend nears completion, leaving no incremental buying power to sustain the rally. When the first signs of reversal appear, systematic stops trigger, creating a cascade of selling that accelerates the downturn.
Small traders consistently display the weakest track record across academic studies. Wang (2003) found that small trader positioning exhibited negative correlation with subsequent returns in his analysis across multiple commodity markets. This result means that whatever small traders collectively do, the opposite typically proves profitable. The explanation for small trader underperformance combines several factors documented in behavioral finance literature. Retail traders often lack the capital reserves to weather normal market volatility, leading to premature exits from positions that would eventually prove profitable. They tend to receive information through slower channels, learning about commodity trends through mainstream media coverage that arrives after institutional participants have already positioned. Perhaps most importantly, retail traders are more susceptible to emotional decision-making, buying into euphoria and selling into panic at precisely the wrong times (Tharp, 2008).
SETTINGS, THRESHOLDS, AND SIGNAL GENERATION
The practical implementation of the COT Index requires understanding several key features and settings that users can adjust to match their trading style, timeframe, and risk tolerance. The lookback period determines the time window for calculating historical ranges. The default setting of two hundred fifty-two bars represents approximately one year on daily charts or five years on weekly charts, balancing responsiveness with stability. Conservative traders seeking only the most extreme, highest-probability signals might extend the lookback to five hundred bars or more. Aggressive traders seeking earlier entry and willing to accept more false positives might reduce it to one hundred twenty-six bars or even less for shorter-term applications.
The bullish and bearish thresholds define signal generation levels. Default settings of eighty and twenty respectively reflect academic research suggesting meaningful information content at these extremes. Readings above eighty indicate positioning in the top quintile of the historical range, representing genuine extremes rather than temporary fluctuations. Conversely, readings below twenty occupy the bottom quintile, indicating unusually bearish positioning (Briese, 2008).
However, traders must recognize that appropriate thresholds vary by market, trader category, and personal risk tolerance. Some futures markets exhibit wider positioning swings than others due to seasonal patterns, volatility characteristics, or participant behavior. Conservative traders seeking high-probability setups with fewer signals might raise thresholds to eighty-five and fifteen. Aggressive traders willing to accept more false positives for earlier entry could lower them to seventy-five and twenty-five.
The key is maintaining meaningful differentiation between bullish, neutral, and bearish zones. The default settings of eighty and twenty create a clear three-zone structure. Readings from zero to twenty represent bearish territory where the selected trader group holds unusually bearish positions. Readings from twenty to eighty represent neutral territory where positioning falls within normal historical ranges. Readings from eighty to one hundred represent bullish territory where the selected trader group holds unusually bullish positions.
The trading perspective selection determines which participant group the indicator follows, fundamentally shaping interpretation and signal meaning. For counter-trend traders seeking reversal opportunities, monitoring commercial positioning makes intuitive sense based on the academic research discussed earlier. When commercials reach extreme bearish readings below twenty, indicating unprecedented short positioning relative to recent history, they are effectively betting against the crowd. Given their informational advantages demonstrated by Bessembinder and Chan (1992), this contrarian stance often precedes major bottoms.
Trend followers might instead monitor large speculator positioning, but with inverted logic compared to commercials. When managed money reaches extreme bullish readings above eighty, the trend may be exhausting rather than accelerating. This seeming paradox reflects their late-cycle participation documented by Sanders, Boris and Manfredo (2004). Sophisticated traders thus use speculator extremes as fade signals, entering positions opposite to speculator consensus.
Small trader monitoring serves primarily as a contrary indicator for all trading styles. Extreme small trader bullishness above seventy-five or eighty typically warns of retail FOMO at market tops. Extreme small trader bearishness below twenty or twenty-five often marks capitulation bottoms where the last weak hands have sold.
VISUALIZATION AND USER INTERFACE
The visual design incorporates multiple elements working together to facilitate decision-making and maintain situational awareness during active trading. The primary COT Index line plots in bold with adjustable line width, defaulting to two pixels for clear visibility against busy price charts. An optional glow effect, controlled by a simple toggle, adds additional visual prominence through multiple plot layers with progressively increasing transparency and width.
A twenty-one period exponential moving average overlays the index line, providing trend context for positioning changes. When the index crosses above its moving average, it signals accelerating bullish sentiment among the selected trader group regardless of whether absolute positioning is extreme. Conversely, when the index crosses below its moving average, it signals deteriorating sentiment and potentially the beginning of a reversal in positioning trends.
The EMA provides a dynamic reference line for assessing positioning momentum. When the index trades far above its EMA, positioning is not only extreme in absolute terms but also building with momentum. When the index trades far below its EMA, positioning is contracting or reversing, which may indicate weakening conviction even if absolute levels remain elevated.
The data table positioned at the top right of the chart displays eleven metrics for each trader category, transforming the indicator from a simple index calculation into an analytical dashboard providing multidimensional market intelligence. Beyond the COT Index itself, users can monitor positioning extremity, which measures how unusual current levels are compared to historical norms using statistical techniques. The extremity metric clarifies whether a reading represents the ninety-fifth or ninety-ninth percentile, with values above two standard deviations indicating genuinely exceptional positioning.
Market power quantifies each group's influence on total open interest. This metric expresses each trader category's net position as a percentage of total market open interest. A commercial entity holding forty percent of total open interest commands significantly more influence than one holding five percent, making their positioning signals more meaningful.
Momentum and rate of change metrics reveal whether positions are building or contracting, providing early warning of potential regime shifts. Position velocity measures the rate of change in positioning changes, effectively a second derivative providing even earlier insight into inflection points.
Sentiment divergence highlights disagreements between commercial and speculative positioning. This metric calculates the absolute difference between normalized commercial and large speculator index values. Wang (2003) found that these high-divergence environments frequently preceded increased volatility and reversals.
The table also displays concentration metrics when available, showing how positioning is distributed among the largest handful of traders in each category. High concentration indicates a few dominant players controlling most of the positioning, while low concentration suggests broad-based participation across many traders.
THE ALERT SYSTEM AND MONITORING
The alert system, comprising five distinct alert conditions, enables systematic monitoring of dozens of futures markets without constant screen watching. The bullish and bearish COT signal alerts trigger when the index crosses user-defined thresholds, indicating the selected trader group has reached extreme positioning worthy of attention. These alerts fire in real-time as new weekly COT data publishes, typically Friday afternoon following the Tuesday measurement date.
Extreme positioning alerts fire at ninety and ten index levels, representing the top and bottom ten percent of the historical range, warning of particularly stretched readings that historically precede reversals with high probability. When commercials reach a COT Index reading below ten, they are expressing their most bearish stance in the entire lookback period.
The data staleness alert notifies users when COT reports have not updated for more than ten days, preventing reliance on outdated information for trading decisions. Government shutdowns or federal holidays can interrupt the normal Friday publication schedule. Using stale signals while believing them current creates dangerous false confidence.
The indicator's watermark information display positioned in the bottom right corner provides essential context at a glance. This persistent display shows the symbol and timeframe, the COT report date timestamp, days since last update, and the current signal state. A trader analyzing a potential short entry in crude oil can glance at the watermark to instantly confirm positioning context without interrupting analysis flow.
LIMITATIONS AND REALISTIC EXPECTATIONS
Practical application requires understanding both the indicator's considerable strengths and inherent limitations. COT data inherently lags price action by three days, as Tuesday positions are not published until Friday afternoon. This delay means the indicator cannot catch rapid intraday reversals or respond to surprise news events. Traders using the COT Index for timing entries must accept this latency and focus on swing trading and position trading timeframes where three-day lags matter less than in day trading or scalping.
The weekly publication schedule similarly makes the indicator unsuitable for short-term trading strategies requiring immediate feedback. The COT Index works best for traders operating on weekly or longer timeframes, where positioning shifts measured in weeks and months align with trading horizon.
Extreme COT readings can persist far longer than typical technical indicators suggest, testing the patience and capital reserves of traders attempting to fade them. When crude oil enters a sustained bull market driven by genuine supply disruptions, commercial hedgers may maintain bearish positioning for many months as prices grind higher. A commercial COT Index reading of fifteen indicating extreme bearishness might persist for three months while prices continue rallying before finally reversing. Traders without sufficient capital and risk tolerance to weather such drawdowns will exit prematurely, precisely when the signal is about to work (Irwin and Sanders, 2012).
Position sizing discipline becomes paramount when implementing COT-based strategies. Rather than risking large percentages of capital on individual signals, successful COT traders typically allocate modest position sizes across multiple signals, allowing some to take time to mature while others work more quickly.
The indicator also cannot overcome fundamental regime changes that alter the structural drivers of markets. If gold enters a true secular bull market driven by monetary debasement, commercial hedgers may remain persistently bearish as mining companies sell forward years of production at what they perceive as favorable prices. Their positioning indicates valuation concerns from a production cost perspective, but cannot stop prices from rising if investment demand overwhelms physical supply-demand balance.
Similarly, structural changes in market participation can alter the meaning of positioning extremes. The growth of commodity index investing in the two thousands brought massive passive long-only capital into futures markets, fundamentally changing typical positioning ranges. Traders relying on COT signals without recognizing this regime change would have generated numerous false bearish signals during the commodity supercycle from 2003 to 2008.
The research foundation supporting COT analysis derives primarily from commodity markets where the commercial hedger information advantage is most pronounced. Studies specifically examining financial futures like equity indices and bonds show weaker but still present effects. Traders should calibrate expectations accordingly, recognizing that COT analysis likely works better for crude oil, natural gas, corn, and wheat than for the S&P 500, Treasury bonds, or currency futures.
Another important limitation involves the reporting threshold structure. Not all market participants appear in COT data, only those holding positions above specified minimums. In markets dominated by a few large players, concentration metrics become critical for proper interpretation. A single large trader accounting for thirty percent of commercial positioning might skew the entire category if their individual circumstances are idiosyncratic rather than representative.
GOLD FUTURES DURING A HYPOTHETICAL MARKET CYCLE
Consider a practical example using gold futures during a hypothetical but realistic market scenario that illustrates how the COT Index indicator guides trading decisions through a complete market cycle. Suppose gold has rallied from fifteen hundred to nineteen hundred dollars per ounce over six months, driven by inflation concerns following aggressive monetary expansion, geopolitical uncertainty, and sustained buying by Asian central banks for reserve diversification.
Large speculators, operating primarily trend-following strategies, have accumulated increasingly bullish positions throughout this rally. Their COT Index has climbed progressively from forty-five to eighty-five. The table display shows that large speculators now hold net long positions representing thirty-two percent of total open interest, their highest in four years. Momentum indicators show positive readings, indicating positions are still building though at a decelerating rate. Position velocity has turned negative, suggesting the pace of position building is slowing.
Meanwhile, commercial hedgers have responded to the rally by aggressively selling forward production and inventory. Their COT Index has moved inversely to price, declining from fifty-five to twenty. This bearish commercial positioning represents mining companies locking in forward sales at prices they view as attractive relative to production costs. The table shows commercials now hold net short positions representing twenty-nine percent of total open interest, their most bearish stance in five years. Concentration metrics indicate this positioning is broadly distributed across many commercial entities, suggesting the bearish stance reflects collective industry view rather than idiosyncratic positioning by a single firm.
Small traders, attracted by mainstream financial media coverage of gold's impressive rally, have recently piled into long positions. Their COT Index has jumped from forty-five to seventy-eight as retail investors chase the trend. Television financial networks feature frequent segments on gold with bullish guests. Internet forums and social media show surging retail interest. This retail enthusiasm historically marks late-stage trend development rather than early opportunity.
The COT Index indicator, configured to monitor commercial positioning from a contrarian perspective, displays a clear bearish signal given the extreme commercial short positioning. The table displays multiple confirming metrics: positioning extremity shows commercials at the ninety-sixth percentile of bearishness, market power indicates they control twenty-nine percent of open interest, and sentiment divergence registers sixty-five, indicating massive disagreement between commercial hedgers and large speculators. This divergence, the highest in three years, places the market in the historically high-risk category for reversals.
The interpretation requires nuance and consideration of context beyond just COT data. Commercials are not necessarily predicting an imminent crash. Rather, they are hedging business operations at what they collectively view as favorable price levels. However, the data reveals they have sold unusually large quantities of forward production, suggesting either exceptional production expectations for the year ahead or concern about sustaining current price levels or combination of both. Combined with extreme speculator positioning indicating a crowded long trade, and small trader enthusiasm confirming retail FOMO, the confluence suggests elevated reversal risk even if the precise timing remains uncertain.
A prudent trader analyzing this situation might take several actions based on COT Index signals. Existing long positions could be tightened with closer stop losses. Profit-taking on a portion of long exposure could lock in gains while maintaining some participation. Some traders might initiate modest short positions as portfolio hedges, sizing them appropriately for the inherent uncertainty in timing reversals. Others might simply move to the sidelines, avoiding new long entries until positioning normalizes.
The key lesson from case study analysis is that COT signals provide probabilistic edges rather than deterministic predictions. They work over many observations by identifying higher-probability configurations, not by generating perfect calls on individual trades. A fifty-five percent win rate with proper risk management produces substantial profits over time, yet still means forty-five percent of signals will be premature or wrong. Traders must embrace this probabilistic reality rather than seeking the impossible goal of perfect accuracy.
INTEGRATION WITH TRADING SYSTEMS
Integration with existing trading systems represents a natural and powerful use case for COT analysis, adding a positioning dimension to price-based technical approaches or fundamental analytical frameworks. Few traders rely exclusively on a single indicator or methodology. Rather, they build systems that synthesize multiple information sources, with each component addressing different aspects of market behavior.
Trend followers might use COT extremes as regime filters, modifying position sizing or avoiding new trend entries when positioning reaches levels historically associated with reversals. Consider a classic trend-following system based on moving average crossovers and momentum breakouts. Integration of COT analysis adds nuance. When large speculator positioning exceeds ninety or commercial positioning falls below ten, the regime filter recognizes elevated reversal risk. The system might reduce position sizing by fifty percent for new signals during these high-risk periods (Kaufman, 2013).
Mean reversion traders might require COT signal confluence before fading extended moves. When crude oil becomes technically overbought and large speculators show extreme long positioning above eighty-five, both signals confirm. If only technical indicators show extremes while positioning remains neutral, the potential short signal is rejected, avoiding fades of trends with underlying institutional support (Kaufman, 2013).
Discretionary traders can monitor the indicator as a continuous awareness tool, informing bias and position sizing without dictating mechanical entries and exits. A discretionary trader might notice commercial positioning shifting from neutral to progressively more bullish over several months. This trend informs growing positive bias even without triggering mechanical signals.
Multi-timeframe analysis represents another powerful integration approach. A trader might use daily charts for trade execution and timing while monitoring weekly COT positioning for strategic context. When both timeframes align, highest-probability opportunities emerge.
Portfolio construction for futures traders can incorporate COT signals as an additional selection criterion. Markets showing strong technical setups AND favorable COT positioning receive highest allocations. Markets with strong technicals but neutral or unfavorable positioning receive reduced allocations.
ADVANCED METRICS AND INTERPRETATION
The metrics table transforms simple positioning data into multidimensional market intelligence. Position extremity, calculated as the absolute deviation from the historical mean normalized by standard deviation, helps identify truly unusual readings versus routine fluctuations. A reading above two standard deviations indicates ninety-fifth percentile or higher extremity. Above three standard deviations indicates ninety-ninth percentile or higher, genuinely rare positioning that historically precedes major events with high probability.
Market power, expressed as a percentage of total open interest, reveals whose positioning matters most from a mechanical market impact perspective. Consider two scenarios in gold futures. In scenario one, commercials show a COT Index reading of fifteen while their market power metric shows they hold net shorts representing thirty-five percent of open interest. This is a high-confidence bearish signal. In scenario two, commercials also show a reading of fifteen, but market power shows only eight percent. While positioning is extreme relative to this category's normal range, their limited market share means less mechanical influence on price.
The rate of change and momentum metrics highlight whether positions are accelerating or decelerating, often providing earlier warnings than absolute levels alone. A COT Index reading of seventy-five with rapidly building momentum suggests continued movement toward extremes. Conversely, a reading of eighty-five with decelerating or negative momentum indicates the positioning trend is exhausting.
Position velocity measures the rate of change in positioning changes, effectively a second derivative. When velocity shifts from positive to negative, it indicates that while positioning may still be growing, the pace of growth is slowing. This deceleration often precedes actual reversal in positioning direction by several weeks.
Sentiment divergence calculates the absolute difference between normalized commercial and large speculator index values. When commercials show extreme bearish positioning at twenty while large speculators show extreme bullish positioning at eighty, the divergence reaches sixty, representing near-maximum disagreement. Wang (2003) found that these high-divergence environments frequently preceded increased volatility and reversals. The mechanism is intuitive. Extreme divergence indicates the informed hedgers and momentum-following speculators have positioned opposite each other with conviction. One group will prove correct and profit while the other proves incorrect and suffers losses. The resolution of this disagreement through price movement often involves volatility.
The table also displays concentration metrics when available. High concentration indicates a few dominant players controlling most of the positioning within a category, while low concentration suggests broad-based participation. Broad-based positioning more reliably reflects collective market intelligence and industry consensus. If mining companies globally all independently decide to hedge aggressively at similar price levels, it suggests genuine industry-wide view about price valuations rather than circumstances specific to one firm.
DATA QUALITY AND RELIABILITY
The CFTC has maintained COT reporting in various forms since the nineteen twenties, providing nearly a century of positioning data across multiple market cycles. However, data quality and reporting standards have evolved substantially over this long period. Modern electronic reporting implemented in the late nineteen nineties and early two thousands significantly improved accuracy and timeliness compared to earlier paper-based systems.
Traders should understand that COT reports capture positions as of Tuesday's close each week. Markets remain open three additional days before publication on Friday afternoon, meaning the reported data is three days stale when received. During periods of rapid market movement or major news events, this lag can be significant. The indicator addresses this limitation by including timestamp information and staleness warnings.
The three-day lag creates particular challenges during extreme volatility episodes. Flash crashes, surprise central bank interventions, geopolitical shocks, and other high-impact events can completely transform market positioning within hours. Traders must exercise judgment about whether reported positioning remains relevant given intervening events.
Reporting thresholds also mean that not all market participants appear in disaggregated COT data. Traders holding positions below specified minimums aggregate into the non-reportable or small trader category. This aggregation affects different markets differently. In highly liquid contracts like crude oil with thousands of participants, reportable traders might represent seventy to eighty percent of open interest. In thinly traded contracts with only dozens of active participants, a few large reportable positions might represent ninety-five percent of open interest.
Another data quality consideration involves trader classification into categories. The CFTC assigns traders to commercial or non-commercial categories based on reported business purpose and activities. However, this process is not perfect. Some entities engage in both commercial and speculative activities, creating ambiguity about proper classification. The transition to Disaggregated reports attempted to address some of these ambiguities by creating more granular categories.
COMPARISON WITH ALTERNATIVE APPROACHES
Several alternative approaches to COT analysis exist in the trading community beyond the normalization methodology employed by this indicator. Some analysts focus on absolute position changes week-over-week rather than index-based normalization. This approach calculates the change in net positioning from one week to the next. The emphasis falls on momentum in positioning changes rather than absolute levels relative to history. This method potentially identifies regime shifts earlier but sacrifices cross-market comparability (Briese, 2008).
Other practitioners employ more complex statistical transformations including percentile rankings, z-score standardization, and machine learning classification algorithms. Ruan and Zhang (2018) demonstrated that machine learning models applied to COT data could achieve modest improvements in forecasting accuracy compared to simple threshold-based approaches. However, these gains came at the cost of interpretability and implementation complexity.
The COT Index indicator intentionally employs a relatively straightforward normalization methodology for several important reasons. First, transparency enhances user understanding and trust. Traders can verify calculations manually and develop intuitive feel for what different readings mean. Second, academic research suggests that most of the predictive power in COT data comes from extreme positioning levels rather than subtle patterns requiring complex statistical methods to detect. Third, robust methods that work consistently across many markets and time periods tend to be simpler rather than more complex, reducing the risk of overfitting to historical data. Fourth, the complexity costs of implementation matter for retail traders without programming teams or computational infrastructure.
PSYCHOLOGICAL ASPECTS OF COT TRADING
Trading based on COT data requires psychological fortitude that differs from momentum-based approaches. Contrarian positioning signals inherently mean betting against prevailing market sentiment and recent price action. When commercials reach extreme bearish positioning, prices have typically been rising, sometimes for extended periods. The price chart looks bullish, momentum indicators confirm strength, moving averages align positively. The COT signal says bet against all of this. This psychological difficulty explains why COT analysis remains underutilized relative to trend-following methods.
Human psychology strongly predisposes us toward extrapolation and recency bias. When prices rally for months, our pattern-matching brains naturally expect continued rally. The recent price action dominates our perception, overwhelming rational analysis about positioning extremes and historical probabilities. The COT signal asking us to sell requires overriding these powerful psychological impulses.
The indicator design attempts to support the required psychological discipline through several features. Clear threshold markers and signal states reduce ambiguity about when signals trigger. When the commercial index crosses below twenty, the signal is explicit and unambiguous. The background shifts to red, the signal label displays bearish, and alerts fire. This explicitness helps traders act on signals rather than waiting for additional confirmation that may never arrive.
The metrics table provides analytical justification for contrarian positions, helping traders maintain conviction during inevitable periods of adverse price movement. When a trader enters short positions based on extreme commercial bearish positioning but prices continue rallying for several weeks, doubt naturally emerges. The table display provides reassurance. Commercial positioning remains extremely bearish. Divergence remains high. The positioning thesis remains intact even though price action has not yet confirmed.
Alert functionality ensures traders do not miss signals due to inattention while also not requiring constant monitoring that can lead to emotional decision-making. Setting alerts for COT extremes enables a healthier relationship with markets. When meaningful signals occur, alerts notify them. They can then calmly assess the situation and execute planned responses.
However, no indicator design can completely overcome the psychological difficulty of contrarian trading. Some traders simply cannot maintain short positions while prices rally. For these traders, COT analysis might be better employed as an exit signal for long positions rather than an entry signal for shorts.
Ultimately, successful COT trading requires developing comfort with probabilistic thinking rather than certainty-seeking. The signals work over many observations by identifying higher-probability configurations, not by generating perfect calls on individual trades. A fifty-five or sixty percent win rate with proper risk management produces substantial profits over years, yet still means forty to forty-five percent of signals will be premature or wrong. COT analysis provides genuine edge, but edge means probability advantage, not elimination of losing trades.
EDUCATIONAL RESOURCES AND CONTINUOUS LEARNING
The indicator provides extensive built-in educational resources through its documentation, detailed tooltips, and transparent calculations. However, mastering COT analysis requires study beyond any single tool or resource. Several excellent resources provide valuable extensions of the concepts covered in this guide.
Books and practitioner-focused monographs offer accessible entry points. Stephen Briese published The Commitments of Traders Bible in two thousand eight, offering detailed breakdowns of how different markets and trader categories behave (Briese, 2008). Briese's work stands out for its empirical focus and market-specific insights. Jack Schwager includes discussion of COT analysis within the broader context of market behavior in his book Market Sense and Nonsense (Schwager, 2012). Perry Kaufman's Trading Systems and Methods represents perhaps the most rigorous practitioner-focused text on systematic trading approaches including COT analysis (Kaufman, 2013).
Academic journal articles provide the rigorous statistical foundation underlying COT analysis. The Journal of Futures Markets regularly publishes research on positioning data and its predictive properties. Bessembinder and Chan's earlier work on systematic risk, hedging pressure, and risk premiums in futures markets provides theoretical foundation (Bessembinder, 1992). Chang's examination of speculator returns provides historical context (Chang, 1985). Irwin and Sanders provide essential skeptical perspective in their two thousand twelve article (Irwin and Sanders, 2012). Wang's two thousand three article provides one of the most empirical analyses of COT data across multiple commodity markets (Wang, 2003).
Online resources extend beyond academic and book-length treatments. The CFTC website provides free access to current and historical COT reports in multiple formats. The explanatory materials section offers detailed documentation of report construction, category definitions, and historical methodology changes. Traders serious about COT analysis should read these official CFTC documents to understand exactly what they are analyzing.
Commercial COT data services such as Barchart provide enhanced visualization and analysis tools beyond raw CFTC data. TradingView's educational materials, published scripts library, and user community provide additional resources for exploring different approaches to COT analysis.
The key to mastering COT analysis lies not in finding a single definitive source but rather in building understanding through multiple perspectives and information sources. Academic research provides rigorous empirical foundation. Practitioner-focused books offer practical implementation insights. Direct engagement with data through systematic backtesting develops intuition about how positioning dynamics manifest across different market conditions.
SYNTHESIZING KNOWLEDGE INTO PRACTICE
The COT Index indicator represents the synthesis of academic research, trading experience, and software engineering into a practical tool accessible to retail traders equipped with nothing more than a TradingView account and willingness to learn. What once required expensive data subscriptions, custom programming capabilities, statistical software, and institutional resources now appears as a straightforward indicator requiring only basic parameter selection and modest study to understand. This democratization of institutional-grade analysis tools represents a broader trend in financial markets over recent decades.
Yet technology and data access alone provide no edge without understanding and discipline. Markets remain relentlessly efficient at eliminating edges that become too widely known and mechanically exploited. The COT Index indicator succeeds only when users invest time learning the underlying concepts, understand the limitations and probability distributions involved, and integrate signals thoughtfully into trading plans rather than applying them mechanically.
The academic research demonstrates conclusively that institutional positioning contains genuine information about future price movements, particularly at extremes where commercial hedgers are maximally bearish or bullish relative to historical norms. This informational content is neither perfect nor deterministic but rather probabilistic, providing edge over many observations through identification of higher-probability configurations. Bessembinder and Chan's finding that commercial positioning explained modest but significant variance in future returns illustrates this probabilistic nature perfectly (Bessembinder and Chan, 1992). The effect is real and statistically significant, yet it explains perhaps ten to fifteen percent of return variance rather than most variance. Much of price movement remains unpredictable even with positioning intelligence.
The practical implication is that COT analysis works best as one component of a trading system rather than a standalone oracle. It provides the positioning dimension, revealing where the smart money has positioned and where the crowd has followed, but price action analysis provides the timing dimension. Fundamental analysis provides the catalyst dimension. Risk management provides the survival dimension. These components work together synergistically.
The indicator's design philosophy prioritizes transparency and education over black-box complexity, empowering traders to understand exactly what they are analyzing and why. Every calculation is documented and user-adjustable. The threshold markers, background coloring, tables, and clear signal states provide multiple reinforcing channels for conveying the same information.
This educational approach reflects a conviction that sustainable trading success comes from genuine understanding rather than mechanical system-following. Traders who understand why commercial positioning matters, how different trader categories behave, what positioning extremes signify, and where signals fit within probability distributions can adapt when market conditions change. Traders mechanically following black-box signals without comprehension abandon systems after normal losing streaks.
The research foundation supporting COT analysis comes primarily from commodity markets where commercial hedger informational advantages are most pronounced. Agricultural producers hedging crops know more about supply conditions than distant speculators. Energy companies hedging production know more about operating costs than financial traders. Metals miners hedging output know more about ore grades than index funds. Financial futures markets show weaker but still present effects.
The journey from reading this documentation to profitable trading based on COT analysis involves several stages that cannot be rushed. Initial reading and basic understanding represents the first stage. Historical study represents the second stage, reviewing past market cycles to observe how positioning extremes preceded major turning points. Paper trading or small-size real trading represents the third stage to experience the psychological challenges. Refinement based on results and personal psychology represents the fourth stage.
Markets will continue evolving. New participant categories will emerge. Regulatory structures will change. Technology will advance. Yet the fundamental dynamics driving COT analysis, that different market participants have different information, different motivations, and different forecasting abilities that manifest in their positioning, will persist as long as futures markets exist. While specific thresholds or optimal parameters may shift over time, the core logic remains sound and adaptable.
The trader equipped with this indicator, understanding of the theory and evidence behind COT analysis, realistic expectations about probability rather than certainty, discipline to maintain positions through adverse volatility, and patience to allow signals time to develop possesses genuine edge in markets. The edge is not enormous, markets cannot allow large persistent inefficiencies without arbitraging them away, but it is real, measurable, and exploitable by those willing to invest in learning and disciplined application.
REFERENCES
Bessembinder, H. (1992) Systematic risk, hedging pressure, and risk premiums in futures markets, Review of Financial Studies, 5(4), pp. 637-667.
Bessembinder, H. and Chan, K. (1992) The profitability of technical trading rules in the Asian stock markets, Pacific-Basin Finance Journal, 3(2-3), pp. 257-284.
Briese, S. (2008) The Commitments of Traders Bible: How to Profit from Insider Market Intelligence. Hoboken: John Wiley & Sons.
Chang, E.C. (1985) Returns to speculators and the theory of normal backwardation, Journal of Finance, 40(1), pp. 193-208.
Commodity Futures Trading Commission (CFTC) (2009) Explanatory Notes: Disaggregated Commitments of Traders Report. Available at: www.cftc.gov (Accessed: 15 January 2025).
Commodity Futures Trading Commission (CFTC) (2020) Commitments of Traders: About the Report. Available at: www.cftc.gov (Accessed: 15 January 2025).
Irwin, S.H. and Sanders, D.R. (2012) Testing the Masters Hypothesis in commodity futures markets, Energy Economics, 34(1), pp. 256-269.
Kaufman, P.J. (2013) Trading Systems and Methods. 5th edn. Hoboken: John Wiley & Sons.
Ruan, Y. and Zhang, Y. (2018) Forecasting commodity futures prices using machine learning: Evidence from the Chinese commodity futures market, Applied Economics Letters, 25(12), pp. 845-849.
Sanders, D.R., Boris, K. and Manfredo, M. (2004) Hedgers, funds, and small speculators in the energy futures markets: an analysis of the CFTC's Commitments of Traders reports, Energy Economics, 26(3), pp. 425-445.
Schwager, J.D. (2012) Market Sense and Nonsense: How the Markets Really Work and How They Don't. Hoboken: John Wiley & Sons.
Tharp, V.K. (2008) Super Trader: Make Consistent Profits in Good and Bad Markets. New York: McGraw-Hill.
Wang, C. (2003) The behavior and performance of major types of futures traders, Journal of Futures Markets, 23(1), pp. 1-31.
Williams, L.R. and Noseworthy, M. (2009) The Right Stock at the Right Time: Prospering in the Coming Good Years. Hoboken: John Wiley & Sons.
FURTHER READING
For traders seeking to deepen their understanding of COT analysis and futures market positioning beyond this documentation, the following resources provide valuable extensions:
Academic Journal Articles:
Fishe, R.P.H. and Smith, A. (2012) Do speculators drive commodity prices away from supply and demand fundamentals?, Journal of Commodity Markets, 1(1), pp. 1-16.
Haigh, M.S., Hranaiova, J. and Overdahl, J.A. (2007) Hedge funds, volatility, and liquidity provision in energy futures markets, Journal of Alternative Investments, 9(4), pp. 10-38.
Kocagil, A.E. (1997) Does futures speculation stabilize spot prices? Evidence from metals markets, Applied Financial Economics, 7(1), pp. 115-125.
Sanders, D.R. and Irwin, S.H. (2011) The impact of index funds in commodity futures markets: A systems approach, Journal of Alternative Investments, 14(1), pp. 40-49.
Books and Practitioner Resources:
Murphy, J.J. (1999) Technical Analysis of the Financial Markets: A Guide to Trading Methods and Applications. New York: New York Institute of Finance.
Pring, M.J. (2002) Technical Analysis Explained: The Investor's Guide to Spotting Investment Trends and Turning Points. 4th edn. New York: McGraw-Hill.
Federal Reserve and Research Institution Publications:
Federal Reserve Banks regularly publish working papers examining commodity markets, futures positioning, and price discovery mechanisms. The Federal Reserve Bank of San Francisco and Federal Reserve Bank of Kansas City maintain active research programs in this area.
Online Resources:
The CFTC website provides free access to current and historical COT reports, explanatory materials, and regulatory documentation.
Barchart offers enhanced COT data visualization and screening tools.
TradingView's community library contains numerous published scripts and educational materials exploring different approaches to positioning analysis.
Quantum Market Harmonics [QMH]# Quantum Market Harmonics - TradingView Script Description
## 📊 OVERVIEW
Quantum Market Harmonics (QMH) is a comprehensive multi-dimensional trading indicator that combines four independent analytical frameworks to generate high-probability trading signals with quantifiable confidence scores. Unlike simple indicator combinations that display multiple tools side-by-side, QMH synthesizes temporal analysis, inter-market correlations, behavioral psychology, and statistical probabilities into a unified confidence scoring system that requires agreement across all dimensions before generating a confirmed signal.
---
## 🎯 WHAT MAKES THIS SCRIPT ORIGINAL
### The Core Innovation: Weighted Confidence Scoring
Most indicators provide binary signals (buy/sell) or display multiple indicators separately, leaving traders to interpret conflicting information. QMH's originality lies in its weighted confidence scoring system that:
1. **Combines Four Independent Methods** - Each framework (described below) operates independently and contributes points to an overall confidence score
2. **Requires Multi-Dimensional Agreement** - Signals only fire when multiple frameworks align, dramatically reducing false positives
3. **Quantifies Signal Strength** - Every signal includes a numerical confidence rating (0-100%), allowing traders to filter by quality
4. **Adapts to Market Conditions** - Different market regimes activate different component combinations
### Why This Combination is Useful
Traditional approaches suffer from:
- **Single-dimension bias**: RSI shows oversold, but trend is still down
- **Conflicting signals**: MACD says buy, but volume is weak
- **No prioritization**: All signals treated equally regardless of strength
QMH solves these problems by requiring multiple independent confirmations and weighting each component's contribution to the final signal. This multi-dimensional approach mirrors how professional traders analyze markets - not relying on one indicator, but waiting for multiple pieces of evidence to align.
---
## 🔬 THE FOUR ANALYTICAL FRAMEWORKS
### 1. Temporal Fractal Resonance (TFR)
**What It Does:**
Analyzes trend alignment across four different timeframes simultaneously (15-minute, 1-hour, 4-hour, and daily) to identify periods of multi-timeframe synchronization.
**How It Works:**
- Uses `request.security()` with `lookahead=barmerge.lookahead_off` to retrieve confirmed price data from each timeframe
- Calculates "fractal strength" for each timeframe using this formula:
```
Fractal Strength = (Rate of Change / Standard Deviation) × 100
```
This creates a momentum-to-volatility ratio that measures trend strength relative to noise
- Computes a Resonance Index when all four timeframes show the same directional bias
- The index averages the absolute strength values when all timeframes align
**Why This Method:**
Fractal Market Hypothesis suggests that price patterns repeat across different time scales. When trends align from short-term (15m) to long-term (Daily), the probability of trend continuation increases substantially. The momentum/volatility ratio filters out low-conviction moves where volatility dominates direction.
**Contribution to Confidence Score:**
- TFR Bullish = +25 points
- TFR Bearish = +25 points (to bearish confidence)
- No alignment = 0 points
---
### 2. Cross-Asset Quantum Entanglement (CAQE)
**What It Does:**
Analyzes correlation patterns between the current asset and three reference markets (Bitcoin, US Dollar Index, and Volatility Index) to identify both normal correlation behavior and anomalous breakdowns that often precede significant moves.
**How It Works:**
- Retrieves price data from BTC (BINANCE:BTCUSDT), DXY (TVC:DXY), and VIX (TVC:VIX) using confirmed bars
- Calculates Pearson correlation coefficient between the main asset and each reference:
```
Correlation = Covariance(X,Y) / (StdDev(X) × StdDev(Y))
```
- Computes an Intermarket Pressure Index by weighting each reference asset's momentum by its correlation strength:
```
Pressure = (Corr₁ × ROC₁ + Corr₂ × ROC₂ + Corr₃ × ROC₃) / 3
```
- Detects "correlation breakdowns" when average correlation drops below 0.3
**Why This Method:**
Markets don't operate in isolation. Inter-market analysis (developed by John Murphy) recognizes that:
- Crypto assets often correlate with Bitcoin
- Risk assets inversely correlate with VIX (fear gauge)
- Dollar strength affects commodity and crypto prices
When these normal correlations break down, it signals potential regime changes. The term "quantum" reflects the interconnected nature of these relationships - like quantum entanglement where distant particles influence each other.
**Contribution to Confidence Score:**
- CAQE Bullish (positive pressure, stable correlations) = +25 points
- CAQE Bearish (negative pressure, stable correlations) = +25 points (to bearish)
- Correlation breakdown = Warning marker (potential reversal zone)
---
### 3. Adaptive Market Psychology Matrix (AMPM)
**What It Does:**
Classifies the current market emotional state into six distinct categories by analyzing the interaction between momentum (RSI), volume behavior, and volatility acceleration (ATR change).
**How It Works:**
The system evaluates three metrics:
1. **RSI (14-period)**: Measures overbought/oversold conditions
2. **Volume Analysis**: Compares current volume to 20-period average
3. **ATR Rate of Change**: Detects volatility acceleration
Based on these inputs, the market is classified into:
- **Euphoria**: RSI > 80, volume spike present, volatility rising (extreme bullish emotion)
- **Greed**: RSI > 70, normal volume (moderate bullish emotion)
- **Neutral**: RSI 40-60, declining volatility (balanced state)
- **Fear**: RSI 40-60, low volatility (uncertainty without panic)
- **Panic**: RSI < 30, volume spike present, volatility rising (extreme bearish emotion)
- **Despair**: RSI < 20, normal volume (capitulation phase)
**Why This Method:**
Behavioral finance principles (Kahneman, Tversky) show that markets follow predictable emotional cycles. Extreme psychological states often mark reversal points because:
- At Euphoria/Greed peaks, everyone bullish has already bought (no buyers left)
- At Panic/Despair bottoms, everyone bearish has already sold (no sellers left)
AMPM provides contrarian signals at these extremes while respecting trends during Fear and Greed intermediate states.
**Contribution to Confidence Score:**
- Psychology Bullish (Panic/Despair + RSI < 35) = +15 points
- Psychology Bearish (Euphoria/Greed + RSI > 65) = +15 points
- Neutral states = 0 points
---
### 4. Time-Decay Probability Zones (TDPZ)
**What It Does:**
Creates dynamic support and resistance zones based on statistical probability distributions that adapt to changing market volatility, similar to Bollinger Bands but with enhancements for trend environments.
**How It Works:**
- Calculates a 20-period Simple Moving Average as the basis line
- Computes standard deviation of price over the same period
- Creates four probability zones:
- **Extreme Upper**: Basis + 2.5 standard deviations (≈99% probability boundary)
- **Upper Zone**: Basis + 1.5 standard deviations
- **Lower Zone**: Basis - 1.5 standard deviations
- **Extreme Lower**: Basis - 2.5 standard deviations (≈99% probability boundary)
- Dynamically adjusts zone width based on ATR (Average True Range):
```
Adjusted Upper = Upper Zone + (ATR × adjustment_factor)
Adjusted Lower = Lower Zone - (ATR × adjustment_factor)
```
- The adjustment factor increases during high volatility, widening the zones
**Why This Method:**
Traditional support/resistance levels are static and don't account for volatility regimes. TDPZ zones are probability-based and mean-reverting:
- Price has ≈99% probability of staying within extreme zones in normal conditions
- Touches to extreme zones represent statistical outliers (high-probability reversal opportunities)
- Zone expansion/contraction reflects volatility regime changes
- ATR adjustment prevents false signals during unusual volatility
The "time-decay" concept refers to mean reversion - the further price moves from the basis, the higher the probability of eventual return.
**Contribution to Confidence Score:**
- Price in Lower Extreme Zone = +15 points (bullish reversal probability)
- Price in Upper Extreme Zone = +15 points (bearish reversal probability)
- Price near basis = 0 points
---
## 🎯 HOW THE CONFIDENCE SCORING SYSTEM WORKS
### Signal Generation Formula
QMH calculates separate Bullish and Bearish confidence scores each bar:
**Bullish Confidence (0-100%):**
```
Base Score: 20 points
+ TFR Bullish: 25 points (if all 4 timeframes aligned bullish)
+ CAQE Bullish: 25 points (if intermarket pressure positive)
+ AMPM Bullish: 15 points (if Panic/Despair contrarian signal)
+ TDPZ Bullish: 15 points (if price in lower probability zones)
─────────
Maximum Possible: 100 points
```
**Bearish Confidence (0-100%):**
```
Base Score: 20 points
+ TFR Bearish: 25 points (if all 4 timeframes aligned bearish)
+ CAQE Bearish: 25 points (if intermarket pressure negative)
+ AMPM Bearish: 15 points (if Euphoria/Greed contrarian signal)
+ TDPZ Bearish: 15 points (if price in upper probability zones)
─────────
Maximum Possible: 100 points
```
### Confirmed Signal Requirements
A **QBUY** (Quantum Buy) signal generates when:
1. Bullish Confidence ≥ User-defined threshold (default 60%)
2. Bullish Confidence > Bearish Confidence
3. No active sell signal present
A **QSELL** (Quantum Sell) signal generates when:
1. Bearish Confidence ≥ User-defined threshold (default 60%)
2. Bearish Confidence > Bullish Confidence
3. No active buy signal present
### Why This Approach Is Different
**Example Comparison:**
Traditional RSI Strategy:
- RSI < 30 → Buy signal
- Result: May buy into falling knife if trend remains bearish
QMH Approach:
- RSI < 30 → Psychology shows Panic (+15 points)
- But requires additional confirmation:
- Are all timeframes also showing bullish reversal? (+25 points)
- Is intermarket pressure turning positive? (+25 points)
- Is price at a statistical extreme? (+15 points)
- Only when total ≥ 60 points does a QBUY signal fire
This multi-layer confirmation dramatically reduces false signals while maintaining sensitivity to genuine opportunities.
---
## 🚫 NO REPAINT GUARANTEE
**QMH is designed to be 100% repaint-free**, which is critical for honest backtesting and reliable live trading.
### Technical Implementation:
1. **All Multi-Timeframe Data Uses Confirmed Bars**
```pinescript
tf1_close = request.security(syminfo.tickerid, "15", close , lookahead=barmerge.lookahead_off)
```
Using `close ` instead of `close ` ensures we only reference the previous confirmed bar, not the current forming bar.
2. **Lookahead Prevention**
```pinescript
lookahead=barmerge.lookahead_off
```
This parameter prevents the function from accessing future data that wouldn't be available in real-time.
3. **Signal Timing**
Signals appear on the bar AFTER all conditions are met, not retroactively on the bar where conditions first appeared.
### What This Means for Users:
- **Backtest Accuracy**: Historical signals match exactly what you would have seen in real-time
- **No Disappearing Signals**: Once a signal appears, it stays (though price may move against it)
- **Honest Performance**: Results reflect true predictive power, not hindsight optimization
- **Live Trading Reliability**: Alerts fire at the same time signals appear on the chart
The dashboard displays "✓ NO REPAINT" to confirm this guarantee.
---
## 📖 HOW TO USE THIS INDICATOR
### Basic Trading Strategy
**For Trend Followers:**
1. **Wait for Signal Confirmation**
- QBUY label appears below a bar = Confirmed bullish entry opportunity
- QSELL label appears above a bar = Confirmed bearish entry opportunity
2. **Check Confidence Score**
- 60-70%: Moderate confidence (consider smaller position size)
- 70-85%: High confidence (standard position size)
- 85-100%: Very high confidence (consider larger position size)
3. **Enter Trade**
- Long entry: Market or limit order near signal bar
- Short entry: Market or limit order near signal bar
4. **Set Targets Using Probability Zones**
- Long trades: Target the adjusted upper zone (lime line)
- Short trades: Target the adjusted lower zone (red line)
- Alternatively, target the basis line (yellow) for conservative exits
5. **Set Stop Loss**
- Long trades: Below recent swing low minus 1 ATR
- Short trades: Above recent swing high plus 1 ATR
**For Mean Reversion Traders:**
1. **Wait for Extreme Zones**
- Price touches extreme lower zone (dotted red line below)
- Price touches extreme upper zone (dotted lime line above)
2. **Confirm with Psychology**
- At lower extreme: Look for Panic or Despair state
- At upper extreme: Look for Euphoria or Greed state
3. **Wait for Confidence Build**
- Monitor dashboard until confidence exceeds threshold
- Requires patience - extreme touches don't always reverse immediately
4. **Enter Reversal**
- Target: Return to basis line (yellow SMA 20)
- Stop: Beyond the extreme zone
**For Position Traders (Longer Timeframes):**
1. **Use Daily Timeframe**
- Set chart to daily for longer-term signals
- Signals will be less frequent but higher quality
2. **Require High Confidence**
- Filter setting: Min Confidence Score 80%+
- Only take the strongest multi-dimensional setups
3. **Confirm with Resonance Background**
- Green tinted background = All timeframes bullish aligned
- Red tinted background = All timeframes bearish aligned
- Only enter when background tint matches signal direction
4. **Hold for Major Targets**
- Long trades: Hold until extreme upper zone or opposite signal
- Short trades: Hold until extreme lower zone or opposite signal
---
## 📊 DASHBOARD INTERPRETATION
The QMH Dashboard (top-right corner) provides real-time market analysis across all four dimensions:
### Dashboard Elements:
1. **✓ NO REPAINT**
- Green confirmation that signals don't repaint
- Always visible to remind users of signal integrity
2. **SIGNAL: BULL/BEAR XX%**
- Shows dominant direction (whichever confidence is higher)
- Displays current confidence percentage
- Background color intensity reflects confidence level
3. **Psychology: **
- Current market emotional state
- Color coded:
- Orange = Euphoria (extreme bullish emotion)
- Yellow = Greed (moderate bullish emotion)
- Gray = Neutral (balanced state)
- Purple = Fear (uncertainty)
- Red = Panic (extreme bearish emotion)
- Dark red = Despair (capitulation)
4. **Resonance: **
- Multi-timeframe alignment strength
- Positive = All timeframes bullish aligned
- Negative = All timeframes bearish aligned
- Near zero = Timeframes not synchronized
- Emoji indicator: 🔥 (bullish resonance) ❄️ (bearish resonance)
5. **Intermarket: **
- Cross-asset pressure measurement
- Positive = BTC/DXY/VIX correlations supporting upside
- Negative = Correlations supporting downside
- Warning ⚠️ if correlation breakdown detected
6. **RSI: **
- Current RSI(14) reading
- Background colors: Red (>70 overbought), Green (<30 oversold)
- Status: OB (overbought), OS (oversold), or • (neutral)
7. **Status: READY BUY / READY SELL / WAIT**
- Quick trade readiness indicator
- READY BUY: Confidence ≥ threshold, bias bullish
- READY SELL: Confidence ≥ threshold, bias bearish
- WAIT: Confidence below threshold
### How to Use Dashboard:
**Before Entering a Trade:**
- Verify Status shows READY (not WAIT)
- Check that Resonance matches signal direction
- Confirm Psychology isn't contradicting (e.g., buying during Euphoria)
- Note Intermarket value - breakdowns (⚠️) suggest caution
**During a Trade:**
- Monitor Psychology shifts (e.g., from Fear to Greed in a long)
- Watch for Resonance changes that could signal exit
- Check for Intermarket breakdown warnings
---
## ⚙️ CUSTOMIZATION SETTINGS
### TFR Settings (Temporal Fractal Resonance)
- **Enable/Disable**: Turn TFR analysis on/off
- **Fractal Sensitivity** (5-50, default 14):
- Lower values = More responsive to short-term changes
- Higher values = More stable, slower to react
- Recommendation: 14 for balanced, 7 for scalping, 21 for position trading
### CAQE Settings (Cross-Asset Quantum Entanglement)
- **Enable/Disable**: Turn CAQE analysis on/off
- **Asset 1** (default BTC): Reference asset for correlation analysis
- **Asset 2** (default DXY): Second reference asset
- **Asset 3** (default VIX): Third reference asset
- **Correlation Length** (10-100, default 20):
- Lower values = More sensitive to recent correlation changes
- Higher values = More stable correlation measurements
- Recommendation: 20 for most assets, 50 for less volatile markets
### Psychology Settings (Adaptive Market Psychology Matrix)
- **Enable/Disable**: Turn AMPM analysis on/off
- **Volume Spike Threshold** (1.0-5.0x, default 2.0):
- Lower values = Detect smaller volume increases as spikes
- Higher values = Only flag major volume surges
- Recommendation: 2.0 for stocks, 1.5 for crypto
### Probability Settings (Time-Decay Probability Zones)
- **Enable/Disable**: Turn TDPZ visualization on/off
- **Probability Lookback** (20-200, default 50):
- Lower values = Zones adapt faster to recent price action
- Higher values = Zones based on longer statistical history
- Recommendation: 50 for most uses, 100 for position trading
### Filter Settings
- **Min Confidence Score** (40-95%, default 60%):
- Lower threshold = More signals, more false positives
- Higher threshold = Fewer signals, higher quality
- Recommendation: 60% for active trading, 75% for selective trading
### Visual Settings
- **Show Entry Signals**: Toggle QBUY/QSELL labels on chart
- **Show Probability Zones**: Toggle zone visualization
- **Show Psychology State**: Toggle dashboard display
---
## 🔔 ALERT CONFIGURATION
QMH includes four alert conditions that can be configured via TradingView's alert system:
### Available Alerts:
1. **Quantum Buy Signal**
- Fires when: Confirmed QBUY signal generates
- Message includes: Confidence percentage
- Use for: Entry notifications
2. **Quantum Sell Signal**
- Fires when: Confirmed QSELL signal generates
- Message includes: Confidence percentage
- Use for: Entry notifications or exit warnings
3. **Market Panic**
- Fires when: Psychology state reaches Panic
- Use for: Contrarian opportunity alerts
4. **Market Euphoria**
- Fires when: Psychology state reaches Euphoria
- Use for: Reversal warning alerts
### How to Set Alerts:
1. Right-click on chart → "Add Alert"
2. Condition: Select "Quantum Market Harmonics"
3. Choose alert type from dropdown
4. Configure expiration, frequency, and notification method
5. Create alert
**Recommendation**: Set alerts for Quantum Buy/Sell signals with "Once Per Bar Close" frequency to avoid intra-bar false triggers.
---
## 💡 BEST PRACTICES
### For All Users:
1. **Backtest First**
- Test on your specific market and timeframe before live trading
- Different assets may perform better with different confidence thresholds
- Verify that the No Repaint guarantee works as described
2. **Paper Trade**
- Practice with signals on a demo account first
- Understand typical signal frequency for your timeframe
- Get comfortable with the dashboard interpretation
3. **Risk Management**
- Never risk more than 1-2% of capital per trade
- Use proper stop losses (not just mental stops)
- Position size based on confidence score (larger size at higher confidence)
4. **Consider Context**
- QMH signals work best in clear trends or at extremes
- During tight consolidation, false signals increase
- Major news events can invalidate technical signals
### Optimal Use Cases:
**QMH Works Best When:**
- ✅ Markets are trending (up or down)
- ✅ Volatility is normal to elevated
- ✅ Price reaches probability zone extremes
- ✅ Multiple timeframes align
- ✅ Clear inter-market relationships exist
**QMH Is Less Effective When:**
- ❌ Extremely low volatility (zones contract too much)
- ❌ Sideways choppy markets (conflicting timeframes)
- ❌ Flash crashes or news events (correlations break down)
- ❌ Very illiquid assets (irregular price action)
### Session Considerations:
- **24/7 Markets (Crypto)**: Works on all sessions, but signals may be more reliable during high-volume periods (US/European trading hours)
- **Forex**: Best during London/New York overlap when volume is highest
- **Stocks**: Most reliable during regular trading hours (not pre-market/after-hours)
---
## ⚠️ LIMITATIONS AND RISKS
### This Indicator Cannot:
- **Predict Black Swan Events**: Sudden unexpected events invalidate technical analysis
- **Guarantee Profits**: No indicator is 100% accurate; losses will occur
- **Replace Risk Management**: Always use stop losses and proper position sizing
- **Account for Fundamental Changes**: Company news, economic data, etc. can override technical signals
- **Work in All Market Conditions**: Less effective during extreme low volatility or major news events
### Known Limitations:
1. **Multi-Timeframe Lag**: Uses confirmed bars (`close `), so signals appear one bar after conditions met
2. **Correlation Dependency**: CAQE requires sufficient history; may be less reliable on newly listed assets
3. **Computational Load**: Multiple `request.security()` calls may cause slower performance on older devices
4. **Repaint of Dashboard**: Dashboard updates every bar (by design), but signals themselves don't repaint
### Risk Warnings:
- Past performance doesn't guarantee future results
- Backtesting results may not reflect actual trading results due to slippage, commissions, and execution delays
- Different markets and timeframes may produce different results
- The indicator should be used as a tool, not as a standalone trading system
- Always combine with your own analysis, risk management, and trading plan
---
## 🎓 EDUCATIONAL CONCEPTS
This indicator synthesizes several established financial theories and technical analysis concepts:
### Academic Foundations:
1. **Fractal Market Hypothesis** (Edgar Peters)
- Markets exhibit self-similar patterns across time scales
- Implemented via multi-timeframe resonance analysis
2. **Behavioral Finance** (Kahneman & Tversky)
- Investor psychology drives market inefficiencies
- Implemented via market psychology state classification
3. **Intermarket Analysis** (John Murphy)
- Asset classes correlate and influence each other predictably
- Implemented via cross-asset correlation monitoring
4. **Mean Reversion** (Statistical Arbitrage)
- Prices tend to revert to statistical norms
- Implemented via probability zones and standard deviation bands
5. **Multi-Timeframe Analysis** (Technical Analysis Standard)
- Higher timeframe trends dominate lower timeframe noise
- Implemented via fractal resonance scoring
### Learning Resources:
To better understand the concepts behind QMH:
- Read "Intermarket Analysis" by John Murphy (for CAQE concepts)
- Study "Thinking, Fast and Slow" by Daniel Kahneman (for psychology concepts)
- Review "Fractal Market Analysis" by Edgar Peters (for TFR concepts)
- Learn about Bollinger Bands (for TDPZ foundation)
---
## 🔄 VERSION HISTORY AND UPDATES
**Current Version: 1.0**
This is the initial public release. Future updates will be published using TradingView's Update feature (not as separate publications). Planned improvements may include:
- Additional reference assets for CAQE
- Optional machine learning-based weight optimization
- Customizable psychology state definitions
- Alternative probability zone calculations
- Performance metrics tracking
Check the "Updates" tab on the script page for version history.
---
## 📞 SUPPORT AND FEEDBACK
### How to Get Help:
1. **Read This Description First**: Most questions are answered in the detailed sections above
2. **Check Comments**: Other users may have asked similar questions
3. **Post Comments**: For general questions visible to the community
4. **Use TradingView Messaging**: For private inquiries (if available)
### Providing Useful Feedback:
When reporting issues or suggesting improvements:
- Specify your asset, timeframe, and settings
- Include a screenshot if relevant
- Describe expected vs. actual behavior
- Check if issue persists with default settings
### Continuous Improvement:
This indicator will evolve based on user feedback and market testing. Constructive suggestions for improvements are always welcome.
---
## ⚖️ DISCLAIMER
This indicator is provided for **educational and informational purposes only**. It does **not constitute financial advice, investment advice, trading advice, or any other type of advice**.
**Important Disclaimers:**
- You should **not** rely solely on this indicator to make trading decisions
- Always conduct your own research and due diligence
- Past performance is not indicative of future results
- Trading and investing involve substantial risk of loss
- Only trade with capital you can afford to lose
- Consider consulting with a licensed financial advisor before trading
- The author is not responsible for any trading losses incurred using this indicator
**By using this indicator, you acknowledge:**
- You understand the risks of trading
- You take full responsibility for your trading decisions
- You will use proper risk management techniques
- You will not hold the author liable for any losses
---
## 🙏 ACKNOWLEDGMENTS
This indicator builds upon the collective knowledge of the technical analysis and trading community. While the specific implementation and combination are original, the underlying concepts draw from:
- The Pine Script community on TradingView
- Academic research in behavioral finance and market microstructure
- Classical technical analysis methods developed over decades
- Open-source indicators that demonstrate best practices in Pine Script coding
Special thanks to TradingView for providing the platform and Pine Script language that make indicators like this possible.
---
## 📚 ADDITIONAL RESOURCES
**Pine Script Documentation:**
- Official Pine Script Manual: www.tradingview.com
**Related Concepts to Study:**
- Multi-timeframe analysis techniques
- Correlation analysis in financial markets
- Behavioral finance principles
- Mean reversion strategies
- Bollinger Bands methodology
**Recommended TradingView Tools:**
- Strategy Tester: To backtest signal performance
- Bar Replay: To see how signals develop in real-time
- Alert System: To receive notifications of new signals
---
**Thank you for using Quantum Market Harmonics. Trade safely and responsibly.**
WorldCup Dashboard + Institutional Sessions© 2025 NewMeta™ — Educational use only.
# Full, Premium Description
## WorldCup Dashboard + Institutional Sessions
**A trade-ready, intraday framework that combines market structure, real flow, and institutional timing.**
This toolkit fuses **Institutional Sessions** with a **price–volume decision engine** so you can see *who is active*, *where value sits*, and *whether the drive is real*. You get: **CVD/Delta**, volume-weighted **Momentum**, **Aggression** spikes, **FVG (MTF)** with nearest side, **Daily Volume Profile (VAH/POC/VAL)**, **ATR regime**, a **24h position gauge**, classic **candle patterns**, IBH/IBL + **first-hour “true close”** lines, and a **10-vote confluence scoreboard**—all in one view.
---
## What’s inside (and how to trade it)
### 🌍 Institutional Sessions (Sydney • Tokyo • London • New York)
* Session boxes + a highlighted **first hour**.
* Plots the **true close** (first-hour close) as a running line with a label.
**Use:** Many desks anchor risk to this print. Above = bullish bias; below = bearish. **IBH/IBL** breaks during London/NY carry the most signal.
### 📊 CVD / Delta (Flow)
* Net buyer vs seller pressure with smooth trend state.
**Use:** **Rising CVD + acceptance above mid/POC** confirms continuation. Bearish price + rising CVD = caution (possible absorption).
### ⚡ Volume-Weighted Momentum
* Momentum adjusted by participation quality (volume).
**Use:** Momentum>MA and >0 → trend drive is “real”; <0 and falling → distribution risk.
### 🔥 Aggression Detector
* ROC × normalized volume × wick factor to flag **forceful** candles.
**Use:** On spikes, avoid fading blindly—wait for pullbacks into **aligned FVG** or for aggression to cool.
### 🟦🟪 Fair Value Gaps (with MTF)
* Detects up to 3 recent FVGs and marks the **nearest** side to price.
**Use:** Trend pullbacks into **bullish FVG** for longs; bounces into **bearish FVG** for shorts. Optional threshold to filter weak gaps.
### 🧭 24h Gauge (positioning)
* Shows current price across the 24h low⇢high with a mid reference.
**Use:** Above mid and pushing upper third = momentum continuation setups; below mid = sell the rips bias.
### 🧱 Daily Volume Profile (manual per day)
* **VAH / POC / VAL** derived from discretized rows.
**Use:** **POC below** supports longs; **POC above** caps rallies. Fade VAH/VAL in ranges; treat them as break/hold levels in trends.
### 📈 ATR Regime
* **ATR vs ATR-avg** with direction and regime flag (**HIGH / NORMAL / LOW**).
**Use:** HIGH ⇒ give trades room & favor trend following. LOW ⇒ fade edges, scale targets.
### 🕯️ Candle Patterns (contextual, not standalone)
* Engulfings, Morning/Evening Star, 3 Soldiers/Crows, Harami, Hammer/Shooting Star, Double Top/Bottom.
**Use:** Only with session + flow + momentum alignment.
### 🤝 Price–Volume Classification
* Labels each bar as **continuation**, **exhaustion**, **distribution**, or **healthy pullback**.
**Use:** Align continuation reads with trend; treat “Price↑ + Vol↓” as a caution flag.
### 🧪 Confluence Scoreboard & B/S Meter
* Ten elements vote: 🔵 bull, ⚪ neutral, 🟣 bear.
**Use:** Execution filter—take setups when the board’s skew matches your trade direction.
---
## Playbooks (actionable)
**Trend Pullback (Long)**
1. London/NY active, Momentum↑, CVD↑, price above 24h mid & POC.
2. Pullback into **nearest bullish FVG**.
3. Invalidate under FVG low or **true-close** line.
4. Targets: IBH → VAH → 24h high.
**Range Fade (Short)**
1. Asia/quiet regime, **Price↑ + Vol↓** into **VAH**, ATR low.
2. Nearest FVG bearish or scoreboard skew bearish.
3. Invalidate above VAH/IBH.
4. Targets: POC → VAL.
**News/Impulse**
Aggression spike? Don’t chase. Let it pull back into the aligned FVG; require CVD/Momentum agreement before entry.
---
## Alerts (included)
* **Bull/Bear Confluence ≥ 7/10**
* **Intraday Target Achieved** / **Daily Target Achieved**
* **Session True-Close Retests** (Sydney/Tokyo/London/NY)
*(Keep alerts “Once per bar” unless you specifically want intrabar triggers.)*
---
## Setup Tips
* **UTC**: Choose the reference that matches how you track sessions (default UTC+2).
* **Volume threshold**: 2.0× is a strong baseline; raise for noisy alts, lower for majors.
* **CVD smoothing**: 14–24 for scalps; 24–34 for slower markets.
* **ATR lengths**: Keep defaults unless your asset has a persistent regime shift.
---
## Why this framework?
Because **timing (sessions)**, **truth (flow)**, and **location (value/FVG)** together beat any single signal. You get *who is trading*, *how strong the push is*, and *where risk lives*—on one screen—so execution is faster and cleaner.
---
**Disclaimer**: Educational use only. Not financial advice. Markets are risky—backtest and size responsibly.
多周期趋势动量面板加强版(Multi-Timeframe Trend Momentum Panel - User Guide)多周期趋势动量面板(Multi-Timeframe Trend Momentum Panel - User Guide)(english explanation follows.)
📖 指标功能详解 (精简版):
🎯 核心功能:
1. 多周期趋势分析 同时监控8个时间周期(1m/5m/15m/1H/4H/D/W/M)
2. 4维度投票系统 MA趋势+RSI动量+MACD+布林带综合判断
3. 全球交易时段 可视化亚洲/伦敦/纽约交易时间
4. 趋势强度评分 0100%量化市场力量
5. 智能警报 强势多空信号自动推送
________________________________________
📚 重要名词解释:
🔵 趋势状态 (MA均线分析):
名词 含义 信号强度
强势多头 快MA远高于慢MA(差值≥0.35%) ⭐⭐⭐⭐⭐ 做多
多头倾向 快MA略高于慢MA(差值<0.35%) ⭐⭐⭐ 谨慎做多
震荡 快慢MA缠绕,无明确方向 ⚠️ 观望
空头倾向 快MA略低于慢MA ⭐⭐⭐ 谨慎做空
强势空头 快MA远低于慢MA ⭐⭐⭐⭐⭐ 做空
简单理解: 快MA就像短跑运动员(反应快),慢MA是长跑运动员(稳定)。短跑远超长跑=强势多头,反之=强势空头。
________________________________________
🟠 动量状态 (RSI力度分析):
名词 含义 操作建议
动量上攻↗ RSI>60且快速上升 强烈买入信号
动量高位 RSI>60但上升变慢 警惕回调,可减仓
动量中性 RSI在4060之间,平稳 等待方向明确
动量低位 RSI<40但下跌变慢 警惕反弹,可止盈
动量下压↘ RSI<40且快速下降 强烈卖出信号
简单理解: RSI就像汽车速度表。"动量上攻"=油门踩到底加速,"动量高位"=已经很快但不再加速了。
________________________________________
🟣 辅助信号:
MACD:
• MACD多头 = 柱状图>0 = 买方力量强
• MACD空头 = 柱状图<0 = 卖方力量强
布林带(BB):
• BB超买 = 价格在布林带上轨附近 = 可能回调
• BB超卖 = 价格在布林带下轨附近 = 可能反弹
• BB中轨 = 价格在中间位置 = 平衡状态
________________________________________
💡 快速上手 3步看懂面板:
第1步: 看"综合结论标签" (K线上方)
• 绿色"多头占优" → 可以做多
• 红色"空头占优" → 可以做空
• 橙色"震荡/均衡" → 观望
第2步: 看"票数 多/空" (面板最下方)
• 多头票数远大于空头 (差距>2) → 趋势强
• 票数接近 (差距<1) → 震荡市
第3步: 看"趋势强度" (综合标签中)
• 强度>70% → 强势趋势,可重仓
• 强度5070% → 中等趋势,正常仓位
• 强度<50% → 弱势,轻仓或观望
________________________________________
🎨 时段背景色含义:
• 紫色背景 = 亚洲时段 (东京交易时间) 波动较小
• 橙色背景 = 伦敦时段 (欧洲交易时间) 波动增大
• 蓝色背景 = 纽约凌晨 美盘准备阶段
• 红色背景 = 纽约关键5分钟 (09:3009:35) ⚠️ 最重要! 市场最活跃,趋势易形成
• 绿色背景 = 纽约上午后段 延续早盘趋势
交易建议: 重点关注红色关键时段,这5分钟往往决定全天方向!
________________________________________
⚙️ 三大市场推荐设置
🥇 黄金: Hull MA 12/EMA 34, 阈值0.250.35%
₿ 比特币: EMA 21/EMA 55, 阈值0.801.20%
💎 以太坊: TEMA 21/EMA 55, 阈值0.600.80%
参数优化建议
黄金 (XAUUSD)
快速MA: Hull MA 12 (超灵敏捕捉黄金快速波动)
慢速MA: EMA 34 (斐波那契数列)
RSI周期: 9 (加快反应)
强趋势阈值: 0.25%
周期: 5, 15, 60, 240, 1440
比特币 (BTCUSD)
快速MA: EMA 21
慢速MA: EMA 55
RSI周期: 14
强趋势阈值: 0.8% (波动大,阈值需提高)
周期: 15, 60, 240, D, W
外汇 EUR/USD
快速MA: TEMA 10 (快速响应)
慢速MA: T3 30, 因子0.7 (平滑噪音)
RSI周期: 14
强趋势阈值: 0.08% (外汇波动小)
周期: 5, 15, 60, 240, 1440
📖 Indicator Function Details (Concise Version):
🎯 Core Functions:
1. MultiTimeframe Trend Analysis Monitors 8 timeframes simultaneously (1m/5m/15m/1H/4H/D/W/M)
2. 4Dimensional Voting System Comprehensive judgment based on MA trend + RSI momentum + MACD + Bollinger Bands
3. Global Trading Sessions Visualizes Asia/London/New York trading hours
4. Trend Strength Score Quantifies market strength from 0100%
5. Smart Alerts Automatically pushes strong bullish/bearish signals
📚 Key Term Explanations:
🔵 Trend Status (MA Analysis):
| Term | Meaning | Signal Strength |
| | | |
| Strong Bull | Fast MA significantly > Slow MA (Diff ≥0.35%) | ⭐⭐⭐⭐⭐ Long |
| Bullish Bias | Fast MA slightly > Slow MA (Diff <0.35%) | ⭐⭐⭐ Caution Long |
| Ranging | MAs intertwined, no clear direction | ⚠️ Wait & See |
| Bearish Bias | Fast MA slightly < Slow MA | ⭐⭐⭐ Caution Short |
| Strong Bear | Fast MA significantly < Slow MA | ⭐⭐⭐⭐⭐ Short |
Simple Understanding: Fast MA = sprinter (fast reaction), Slow MA = longdistance runner (stable). Sprinter far ahead = Strong Bull, opposite = Strong Bear.
🟠 Momentum Status (RSI Analysis):
| Term | Meaning | Trading Suggestion |
| | | |
| Momentum Up ↗ | RSI >60 & rising rapidly | Strong Buy Signal |
| Momentum High | RSI >60 but rising slower | Watch for pullback, consider reducing position |
| Momentum Neutral | RSI between 4060, stable | Wait for clearer direction |
| Momentum Low | RSI <40 but falling slower | Watch for rebound, consider taking profit |
| Momentum Down ↘ | RSI <40 & falling rapidly | Strong Sell Signal |
Simple Understanding: RSI = car speedometer. "Momentum Up" = full throttle acceleration, "Momentum High" = already fast but not accelerating further.
🟣 Auxiliary Signals:
MACD:
MACD Bullish = Histogram >0 = Strong buyer power
MACD Bearish = Histogram <0 = Strong seller power
Bollinger Bands (BB):
BB Overbought = Price near upper band = Possible pullback
BB Oversold = Price near lower band = Possible rebound
BB Middle = Price near middle band = Balanced state
💡 Quick Start 3 Steps to Understand the Panel:
Step 1: Check "Composite Conclusion Label" (Above the chart)
Green "Bulls Favored" → Consider Long
Red "Bears Favored" → Consider Short
Orange "Ranging/Balanced" → Wait & See
Step 2: Check "Votes Bull/Bear" (Bottom of the panel)
Bull votes significantly > Bear votes (Difference >2) → Strong Trend
Votes close (Difference <1) → Ranging Market
Step 3: Check "Trend Strength" (In the composite label)
Strength >70% → Strong Trend, consider heavier position
Strength 5070% → Moderate Trend, normal position size
Strength <50% → Weak Trend, light position or wait & see
🎨 Trading Session Background Color Meanings:
Purple = Asian Session (Tokyo hours) Lower volatility
Orange = London Session (European hours) Increased volatility
Blue = NY Early Morning US session preparation phase
Red = NY Critical 5 Minutes (09:3009:35) ⚠️ Most Important! Market most active, trends easily form
Green = NY Late Morning Continuation of early session trend
Trading Tip: Focus on the red critical period; these 5 minutes often determine the day's direction!
⚙️ Recommended Settings for Three Major Markets
🥇 Gold (XAUUSD):
Fast MA: Hull MA 12 (Highly sensitive for gold's fast moves)
Slow MA: EMA 34 (Fibonacci number)
RSI Period: 9 (Faster reaction)
Strong Trend Threshold: 0.25%
Timeframes: 5, 15, 60, 240, 1440
₿ Bitcoin (BTCUSD):
Fast MA: EMA 21
Slow MA: EMA 55
RSI Period: 14
Strong Trend Threshold: 0.8% (High volatility, requires higher threshold)
Timeframes: 15, 60, 240, D, W
💎 Ethereum (ETHUSD):
Fast MA: TEMA 21
Slow MA: EMA 55
RSI Period: 14
Strong Trend Threshold: 0.600.80%
Timeframes: 15, 60, 240, D, W
💱 Forex EUR/USD:
Fast MA: TEMA 10 (Fast response)
Slow MA: T3 30, Factor 0.7 (Smooths noise)
RSI Period: 14
Strong Trend Threshold: 0.08% (Forex has low volatility)
Timeframes: 5, 15, 60, 240, 1440
多周期趋势动量面板(Multi-Timeframe Trend Momentum Panel - User Guide)多周期趋势动量面板(Multi-Timeframe Trend Momentum Panel - User Guide)(english explanation follows.)
📖 指标功能详解 (精简版):
🎯 核心功能:
1. 多周期趋势分析 同时监控8个时间周期(1m/5m/15m/1H/4H/D/W/M)
2. 4维度投票系统 MA趋势+RSI动量+MACD+布林带综合判断
3. 全球交易时段 可视化亚洲/伦敦/纽约交易时间
4. 趋势强度评分 0100%量化市场力量
5. 智能警报 强势多空信号自动推送
________________________________________
📚 重要名词解释:
🔵 趋势状态 (MA均线分析):
名词 含义 信号强度
强势多头 快MA远高于慢MA(差值≥0.35%) ⭐⭐⭐⭐⭐ 做多
多头倾向 快MA略高于慢MA(差值<0.35%) ⭐⭐⭐ 谨慎做多
震荡 快慢MA缠绕,无明确方向 ⚠️ 观望
空头倾向 快MA略低于慢MA ⭐⭐⭐ 谨慎做空
强势空头 快MA远低于慢MA ⭐⭐⭐⭐⭐ 做空
简单理解: 快MA就像短跑运动员(反应快),慢MA是长跑运动员(稳定)。短跑远超长跑=强势多头,反之=强势空头。
________________________________________
🟠 动量状态 (RSI力度分析):
名词 含义 操作建议
动量上攻↗ RSI>60且快速上升 强烈买入信号
动量高位 RSI>60但上升变慢 警惕回调,可减仓
动量中性 RSI在4060之间,平稳 等待方向明确
动量低位 RSI<40但下跌变慢 警惕反弹,可止盈
动量下压↘ RSI<40且快速下降 强烈卖出信号
简单理解: RSI就像汽车速度表。"动量上攻"=油门踩到底加速,"动量高位"=已经很快但不再加速了。
________________________________________
🟣 辅助信号:
MACD:
• MACD多头 = 柱状图>0 = 买方力量强
• MACD空头 = 柱状图<0 = 卖方力量强
布林带(BB):
• BB超买 = 价格在布林带上轨附近 = 可能回调
• BB超卖 = 价格在布林带下轨附近 = 可能反弹
• BB中轨 = 价格在中间位置 = 平衡状态
________________________________________
💡 快速上手 3步看懂面板:
第1步: 看"综合结论标签" (K线上方)
• 绿色"多头占优" → 可以做多
• 红色"空头占优" → 可以做空
• 橙色"震荡/均衡" → 观望
第2步: 看"票数 多/空" (面板最下方)
• 多头票数远大于空头 (差距>2) → 趋势强
• 票数接近 (差距<1) → 震荡市
第3步: 看"趋势强度" (综合标签中)
• 强度>70% → 强势趋势,可重仓
• 强度5070% → 中等趋势,正常仓位
• 强度<50% → 弱势,轻仓或观望
________________________________________
🎨 时段背景色含义:
• 紫色背景 = 亚洲时段 (东京交易时间) 波动较小
• 橙色背景 = 伦敦时段 (欧洲交易时间) 波动增大
• 蓝色背景 = 纽约凌晨 美盘准备阶段
• 红色背景 = 纽约关键5分钟 (09:3009:35) ⚠️ 最重要! 市场最活跃,趋势易形成
• 绿色背景 = 纽约上午后段 延续早盘趋势
交易建议: 重点关注红色关键时段,这5分钟往往决定全天方向!
________________________________________
⚙️ 三大市场推荐设置
🥇 黄金: Hull MA 12/EMA 34, 阈值0.250.35%
₿ 比特币: EMA 21/EMA 55, 阈值0.801.20%
💎 以太坊: TEMA 21/EMA 55, 阈值0.600.80%
参数优化建议
黄金 (XAUUSD)
快速MA: Hull MA 12 (超灵敏捕捉黄金快速波动)
慢速MA: EMA 34 (斐波那契数列)
RSI周期: 9 (加快反应)
强趋势阈值: 0.25%
周期: 5, 15, 60, 240, 1440
比特币 (BTCUSD)
快速MA: EMA 21
慢速MA: EMA 55
RSI周期: 14
强趋势阈值: 0.8% (波动大,阈值需提高)
周期: 15, 60, 240, D, W
外汇 EUR/USD
快速MA: TEMA 10 (快速响应)
慢速MA: T3 30, 因子0.7 (平滑噪音)
RSI周期: 14
强趋势阈值: 0.08% (外汇波动小)
周期: 5, 15, 60, 240, 1440
📖 Indicator Function Details (Concise Version):
🎯 Core Functions:
1. MultiTimeframe Trend Analysis Monitors 8 timeframes simultaneously (1m/5m/15m/1H/4H/D/W/M)
2. 4Dimensional Voting System Comprehensive judgment based on MA trend + RSI momentum + MACD + Bollinger Bands
3. Global Trading Sessions Visualizes Asia/London/New York trading hours
4. Trend Strength Score Quantifies market strength from 0100%
5. Smart Alerts Automatically pushes strong bullish/bearish signals
📚 Key Term Explanations:
🔵 Trend Status (MA Analysis):
| Term | Meaning | Signal Strength |
| | | |
| Strong Bull | Fast MA significantly > Slow MA (Diff ≥0.35%) | ⭐⭐⭐⭐⭐ Long |
| Bullish Bias | Fast MA slightly > Slow MA (Diff <0.35%) | ⭐⭐⭐ Caution Long |
| Ranging | MAs intertwined, no clear direction | ⚠️ Wait & See |
| Bearish Bias | Fast MA slightly < Slow MA | ⭐⭐⭐ Caution Short |
| Strong Bear | Fast MA significantly < Slow MA | ⭐⭐⭐⭐⭐ Short |
Simple Understanding: Fast MA = sprinter (fast reaction), Slow MA = longdistance runner (stable). Sprinter far ahead = Strong Bull, opposite = Strong Bear.
🟠 Momentum Status (RSI Analysis):
| Term | Meaning | Trading Suggestion |
| | | |
| Momentum Up ↗ | RSI >60 & rising rapidly | Strong Buy Signal |
| Momentum High | RSI >60 but rising slower | Watch for pullback, consider reducing position |
| Momentum Neutral | RSI between 4060, stable | Wait for clearer direction |
| Momentum Low | RSI <40 but falling slower | Watch for rebound, consider taking profit |
| Momentum Down ↘ | RSI <40 & falling rapidly | Strong Sell Signal |
Simple Understanding: RSI = car speedometer. "Momentum Up" = full throttle acceleration, "Momentum High" = already fast but not accelerating further.
🟣 Auxiliary Signals:
MACD:
MACD Bullish = Histogram >0 = Strong buyer power
MACD Bearish = Histogram <0 = Strong seller power
Bollinger Bands (BB):
BB Overbought = Price near upper band = Possible pullback
BB Oversold = Price near lower band = Possible rebound
BB Middle = Price near middle band = Balanced state
💡 Quick Start 3 Steps to Understand the Panel:
Step 1: Check "Composite Conclusion Label" (Above the chart)
Green "Bulls Favored" → Consider Long
Red "Bears Favored" → Consider Short
Orange "Ranging/Balanced" → Wait & See
Step 2: Check "Votes Bull/Bear" (Bottom of the panel)
Bull votes significantly > Bear votes (Difference >2) → Strong Trend
Votes close (Difference <1) → Ranging Market
Step 3: Check "Trend Strength" (In the composite label)
Strength >70% → Strong Trend, consider heavier position
Strength 5070% → Moderate Trend, normal position size
Strength <50% → Weak Trend, light position or wait & see
🎨 Trading Session Background Color Meanings:
Purple = Asian Session (Tokyo hours) Lower volatility
Orange = London Session (European hours) Increased volatility
Blue = NY Early Morning US session preparation phase
Red = NY Critical 5 Minutes (09:3009:35) ⚠️ Most Important! Market most active, trends easily form
Green = NY Late Morning Continuation of early session trend
Trading Tip: Focus on the red critical period; these 5 minutes often determine the day's direction!
⚙️ Recommended Settings for Three Major Markets
🥇 Gold (XAUUSD):
Fast MA: Hull MA 12 (Highly sensitive for gold's fast moves)
Slow MA: EMA 34 (Fibonacci number)
RSI Period: 9 (Faster reaction)
Strong Trend Threshold: 0.25%
Timeframes: 5, 15, 60, 240, 1440
₿ Bitcoin (BTCUSD):
Fast MA: EMA 21
Slow MA: EMA 55
RSI Period: 14
Strong Trend Threshold: 0.8% (High volatility, requires higher threshold)
Timeframes: 15, 60, 240, D, W
💎 Ethereum (ETHUSD):
Fast MA: TEMA 21
Slow MA: EMA 55
RSI Period: 14
Strong Trend Threshold: 0.600.80%
Timeframes: 15, 60, 240, D, W
💱 Forex EUR/USD:
Fast MA: TEMA 10 (Fast response)
Slow MA: T3 30, Factor 0.7 (Smooths noise)
RSI Period: 14
Strong Trend Threshold: 0.08% (Forex has low volatility)
Timeframes: 5, 15, 60, 240, 1440
HTF Cross Breakout [CHE] HTF Cross Breakout — Detects higher timeframe close crossovers for breakout signals, anchors VWAP for trend validation, and flags continuations or traps with visual extensions for delta percent and stop levels.
Summary
This indicator spots moments when the current chart's close price crosses a higher timeframe close, marking potential breakouts only when the current bar shows directional strength. It anchors a volume-weighted average price line from the breakout point to track trend health, updating labels to show if the move continues or reverses into a trap. Extensions add a dotted line linking the breakout level to the current close with percent change display, plus a stop-loss marker at the VWAP end. Signals gain robustness from higher timeframe confirmation and anti-repainting options, reducing noise in live bars compared to simple crossover tools.
Motivation: Why this design?
Traders often face false breakouts from intrabar wiggles on lower timeframes, especially without higher timeframe alignment, leading to whipsaws in volatile sessions. This design uses higher timeframe close as a stable reference for crossover detection, combined with anchored volume weighting to gauge sustained momentum. It addresses these by enforcing bar confirmation and directional filters, providing clearer entry validation and risk points without overcomplicating the chart.
What’s different vs. standard approaches?
Reference baseline
Standard crossover indicators like moving average crosses operate solely on the chart timeframe, ignoring higher timeframe context and lacking volume anchoring.
Architecture differences
- Higher timeframe data pulls via security calls with optional repainting control for stability.
- Anchored VWAP resets at each signal, accumulating from the breakout bar only.
- Label dynamics update in real-time for continuation checks, with extensions for visual delta and stop computation.
- Event-driven line finalization prunes old elements after a set bar extension.
Practical effect
Charts show persistent lines and labels that extend live but finalize cleanly on new events, avoiding clutter. This matters for spotting trap reversals early via label color shifts, and extensions provide quick risk visuals without manual calculations, improving decision speed in trend trades.
How it works (technical)
The indicator first determines a higher timeframe based on user selection, pulling its close price securely. It checks for crossovers or crossunders of the current close against this higher close, but only triggers on confirmed bars with matching directional opens and closes. On a valid event, a horizontal line and label mark the higher close level, while a dashed VWAP line starts accumulating typical price times volume from that bar onward. During the active phase, the breakout line extends to the current bar, the label repositions and updates text based on whether the current close holds above or below the level for bulls or bears. A background tint warns if the close deviates adversely from the current VWAP. Extensions draw a vertical dotted line at the last bar between the breakout level and close, placing a midpoint label with percent difference; separately, a label at the VWAP end shows a computed stop price. Persistent variables track the active state and accumulators, resetting on new events after briefly extending old elements. Repaint risk from security calls is mitigated by confirmed bar gating or user opt-in.
Parameter Guide
Plateau Length (reserved for future, currently unused): Sets a length for potential plateau detection in extensions; default 3, minimum 1. Higher values would increase stability but are not active yet—leave at default to avoid tuning.
Line Width: Controls thickness of breakout, VWAP, and extension lines; default 2, range 1 to 5. Thicker lines improve visibility on busy charts but may obscure price action—use 1 for clean views, 3 or more for emphasis.
+Bars after next HTF event (finalize old, then delete): Extends old lines and labels by this many bars before deletion on new signals; default 20, minimum 0. Shorter extensions keep charts tidy but risk cutting visuals prematurely; longer aids review but builds clutter over time.
Evaluate label only on HTF close (prevents gray traps intrabar): When true, label updates wait for higher timeframe confirmation; default true. Enabling reduces intrabar flips for stabler signals, though it may delay feedback—disable for faster live trading at repaint cost.
Allow Repainting: Permits real-time security data without confirmation offset; default false. False ensures historical accuracy but lags live bars; true speeds updates but can repaint on HTF closes.
Timeframe Type: Chooses HTF method—Auto Timeframe (dynamic steps up), Multiplier (chart multiple), or Manual (fixed string); default Auto Timeframe. Auto adapts to chart scale for convenience; Multiplier suits custom scaling like 5 times current; Manual for precise like 1D on any chart.
Multiplier for Alternate Resolution: Scales chart timeframe when Multiplier type selected; default 5, minimum 1. Values near 1 mimic current resolution for subtle shifts; higher like 10 jumps to broader context, increasing signal rarity.
Manual Resolution: Direct timeframe string like 60 for 1H when Manual type; default 60. Match to trading horizon—shorter for swing, longer for positional—to balance frequency and reliability.
Show Extension 1: Toggles dotted line and delta percent label between breakout level and current close; default true. Disable to simplify for basic use, enable for precise momentum tracking.
Dotted Line Width: Thickness for Extension 1 line; default 2, range 1 to 5. Align with main Line Width for consistency.
Text Size: Size for delta percent label; options tiny, small, normal, large; default normal. Smaller reduces overlap on dense charts; larger aids glance reads.
Decimals for Δ%: Precision in percent change display; default 2, range 0 to 6. Fewer decimals speed reading; more suit low-volatility assets.
Positive Δ Color: Hue for upward percent changes; default lime. Choose contrasting for visibility.
Negative Δ Color: Hue for downward percent changes; default red. Pair with positive for quick polarity scan.
Dotted Line Color: Color for Extension 1 line; default gray. Neutral tones blend well; brighter for emphasis.
Background Transparency (0..100): Opacity for delta label background; default 90. Higher values fade for subtlety; lower solidifies for readability.
Show Extension 2: Toggles stop-loss label at VWAP end; default true. Turn off for entry focus only.
Stop Method: Percent from VWAP end or fixed ticks; options Percent, Ticks; default Percent. Percent scales with price levels; Ticks suits tick-based instruments.
Stop %: Distance as fraction of VWAP for Percent method; default 1.0, step 0.05, minimum 0.0. Tighter like 0.5 reduces risk but increases stops; wider like 2.0 allows breathing room.
Stop Ticks: Tick count offset for Ticks method; default 20, minimum 0. Adjust per asset volatility—fewer for tight control.
Price Decimals: Rounding for stop price text; default 4, range 0 to 10. Match syminfo.precision for clean display.
Text Size: Size for stop label; options tiny, small, normal, large; default normal. Scale to chart zoom.
Text Color: Foreground for stop text; default white. Ensure contrast with background.
Inherit VWAP Color (BG tint): Bases stop label background on VWAP hue; default true. True maintains theme; false allows custom black base.
BG Transparency (0..100): Opacity for stop label background; default 0. Zero for no tint; up to 100 for full fade.
Reading & Interpretation
Breakout lines appear green for bullish crosses or red for bearish, extending live until a new event finalizes them briefly then deletes. Labels start blank, updating to Bull Cont. or Bear Cont. in matching colors if holding the level, or gray Bull Trap/Bear Trap on reversal. VWAP dashes yellow for bulls, orange for bears, sloping with accumulated volume weight—deviations trigger faint red background warnings. Extension 1's dotted vertical shows at the last bar, with midpoint label green/red for positive/negative percent from breakout to close. Extension 2 places a left-aligned label at VWAP end with stop price and method note, tinted to VWAP for context.
Practical Workflows & Combinations
For trend following, enter long on green Bull Cont. labels above VWAP with higher highs confirmation, filtering via rising structure; short on red Bear Cont. below. Pair with volume surges or RSI above 50 for bulls to avoid traps. For exits, trail stops using the Extension 2 level, tightening on warnings or gray labels—aggressive on continuations, conservative post-trap. In multi-timeframe setups, use default Auto on 15m charts for 1H signals, scaling multiplier to 4 for daily context on hourly; test on forex/stocks where volume is reliable, avoiding low-liquidity assets.
Behavior, Constraints & Performance
Signals confirm on bar close with HTF gating when strict mode active, but live bars may update if repainting enabled—opt false for backtest fidelity, true for intraday speed. Security calls risk minor repaints on HTF closes, mitigated by confirmation offsets. Resources cap at 1000 bars back, 50 lines/labels total, with event prunes to stay under budgets—no loops, minimal arrays. Limits include VWAP lag in low-volume periods and dependency on accurate HTF data; gaps or holidays may skew anchors.
Sensible Defaults & Quick Tuning
Defaults suit 5m-1H charts on liquid assets: Auto HTF, no repaint, 1% stops. For choppy markets with excess signals, enable strict eval and bump multiplier to 10 for rarer triggers. If sluggish in trends, shorten extend bars to 10 and allow repainting for quicker visuals. On high-vol like crypto, widen stop % to 2.0 and use Ticks method; for stables like indices, tighten to 0.5% and keep Percent.
What this indicator is—and isn’t
This is a signal visualization layer for breakout confirmation and basic risk marking, best as a filter in discretionary setups. It isn’t a standalone system or predictive oracle—combine with price structure, news awareness, and sizing rules for real edges.
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.
Do not use this indicator on Heikin-Ashi, Renko, Kagi, Point-and-Figure, or Range charts, as these chart types can produce unrealistic results for signal markers and alerts.
Best regards and happy trading
Chervolino
FVG Scanner ProFVG Scanner Pro — Smart Fair Value Gap Detector (with HTF context & proximity alerts)
What it does
FVG Scanner Pro automatically finds Fair Value Gaps (FVGs) on your current chart and (optionally) on a higher timeframe (HTF), draws them as color-coded zones, and notifies you when price comes close to a gap boundary using an ADR-based proximity trigger and (optional) volume confirmation. It’s designed for ICT-style gap trading, confluence building, and clean visual execution.
How it works:
FVG definition
* Bullish FVG (gap up): low > high (the current candle’s low is above the high 2 bars ago).
* Bearish FVG (gap down): high < low (the current candle’s high is below the low 2 bars ago).
* Gaps smaller than your Min FVG Size (%) are ignored. (Gap size = (top-bottom)/bottom * 100.)
Higher-timeframe logic (auto-selected)
The script auto picks a sensible HTF:
1–5m → 15m, 15m → 1H, 1H → 4H, 4H → 1D, 1D → 1W, 1W → 1M, small 1M → 3M, big ≥3M → 12M.
You can display HTF FVGs and even filter so current-TF FVGs only show when they overlap an HTF gap.
Proximity alerts (ADR-based)
The script computes ADR on the current chart timeframe over a user-set lookback (default 20 bars).
An alert fires when price moves toward the closest actionable boundary and comes within ADR × Multiplier:
Bullish: price moving down, within distance of the bottom of a bullish FVG.
Bearish: price moving up, within distance of the top of a bearish FVG.
Yellow ▲/▼ markers show where a proximity alert triggered.
Volume filter (optional)
Require volume to be greater than SMA(20) × multiplier to accept a newly formed FVG.
Lifecycle
Each gap remains active for Extend FVG Box (Bars) bars.
You can delete the box after fill, or keep filled gaps visible as gray zones, or hide them.
Color legend
Current-TF Bullish: Pink/Magenta box
Current-TF Bearish: Cyan/Turquoise box
HTF Bullish: Gold box
HTF Bearish: Orange box
Filled (if shown): Gray box
Alert markers: Yellow ▲ (bullish), Yellow ▼ (bearish)
Inputs (what to tweak)
Show FVGs: Bullish / Bearish / Both
Max Bars Back to Find FVG: collection window & cleanup guard
Extend FVG Box (Bars): how long a zone stays tradable/active
Min FVG Size (%): ignore micro gaps
Delete Box After Fill & Show Filled FVGs: choose how you want completed gaps handled
Show Alert Markers: show/hide the yellow proximity arrows
Show Higher Timeframe FVG: overlay HTF gaps (auto TF)
HTF Filter: only display current-TF gaps that overlap an HTF gap
ADR Lookback & Proximity Multiplier: tune alert sensitivity to your market & timeframe
Volume Filter & Volume > MA Multiple: require above-average volume for new gaps
Built-in alerts (ready to use)
Create alerts in TradingView (⚠️ “Once per bar” or “Once per bar close”, your choice) and select from:
🟢 Bullish FVG Proximity — price approaching a bullish gap bottom
🔴 Bearish FVG Proximity — price approaching a bearish gap top
✅ New Bullish FVG Formed
⚠️ New Bearish FVG Formed
The alert messages include the symbol and price; proximity markers are also plotted on chart.
Tips & best practices
Use FVGs with market structure (break of structure, swing points), order blocks, or liquidity pools for confluence.
On very low timeframes, raise Min FVG Size and/or lower Max Bars Back to reduce noise and keep things fast.
Extend FVG Box controls how long a zone is considered valid; align it with your holding horizon (scalp vs swing).
Information panel (top-right)
Shows your mode, current HTF, number of gaps in memory, active bull/bear counts, and current-TF ADR.
Liquidity TriggersKey Points
Liquidity Triggers indicate:
Where liquidity-derived support levels are.
Where liquidity-derived resistance levels are.
When a large price increase is approaching via the Rip Currents .
- When a large price decrease is approaching via the Dip Currents .
Summary
Liquidity Triggers are produced by measuring liquidity and determining where supportive liquidity and resistance-liquidity are. These trigger-levels designate price-points where breakouts, breakthroughs, and bounces are anticipated.
Liquidity Triggers are dynamic, and they constantly re-evaluate liquidity conditions to determine where the next group of sellers or buyers are that can fuel rapid changes in price movement, such as initiating a trend change or stalling price-action completely.
To use, simply apply to your chart and monitor for Supportive Liquidity Triggers (LTs that are below price) for bounces, and Resistance Liquidity Triggers (LTs that are above price) for rejections.
You can also set Alerts designed specifically around the Liquidity Triggers.
Examples
Example 1: A quick look at LT Resistances and Supports. When a LT is above spot, then it is considered a resistance. When LT is below spot, it is considered a support.
Example 2: LTs can indicate to us when an upcoming Rip Current (large price appreciation) or a Dip Current (large price depreciation) is starting.
Here is an example of a Rip Current:
And here is a Dip Current:
Details
Liquidity Triggers come with a default load-out that utilizes several pre-configured settings for quick and easy start-up.
Triggers
The default triggers are labeled LT-1 through LT-7, these correspond ` orders ` that describe which type of liquidity is monitored. The two groups of traders that are monitored are the ` Eager ` and the ` Organic `.
The default triggers use the Fibonacci sequence to adjust their orders in a standardized way.
Triggers 1, 2, 3, and 4 monitor the ` Eager ` traders (with default settings) while triggers 5, 6, and 7 monitor the ` Organic `traders.
Eager Triggers represent profit-takers and dip-buyers .
When the Eager Triggers are above the price, they are ` selling the rip `, and when the Eager Triggers are below price, they are ` buying the dip `. These moments indicate growing pressure for a reversal. Eager triggers are any trigger with an order of 89 or less .
Organic Triggers represent value-seekers with long-term goals. When they are below price, they are areas of support and tend to fuel bounces, while when organic triggers that are above price are areas of resistance and often provoke rejections. Organic triggers are any trigger with an order of 90 or more .
Here's an example showing the faint eager liquidity triggers above spot, indicating profit-taking and below spot after a price-dip indicating dip-buying .
Customization
There are additional settings and configurations available to the Liquidity Triggers indicator that help customize your view of liquidity.
Smoothing
Smoothing can be applied to the triggers for a more peaceful showing. The smoothing options are:
None - Default.
Exponential-Moving Average (EMA) : Ideal for when you want the most recent activity to take higher priority.
Simple-Moving Average (SMA) : Ideal for when you want a smoother appearance but do not want to change the data too much.
Weighted-Moving Average (WMA): Ideal for when you want the smoothing to increase as the trigger order increases.
Modified-Moving Average (RMA): Produces the most smooth data.
Here is an example of how smoothing can change the appearance of LTs for easier analysis for when things get complicated:
Modifying the Default Load-out
The default loadout attempts to balance having a wide view of the data without bringing too many lines or values into the picture that might be too noisy, but these values can be added to customize and expand your view if desired.
The Fib load-out has the options with t he default load-out being .
Feel free to mix and match and explore which views you prefer when analyzing liquidity.
For example, for the extreme data-heads, you can add LDPM twice on the chart to get all of the orders displayed at once:
Liquidity Triggers - Granular Triggers
The granular trigger can be toggled on (default: off) for when candle-specific liquidity measurements desired. They can help identify which specific candles have eager and aggressive traders attempting to move spot: the further away the granular trigger is from the candle, the more force is being applied!
Manual LTs
If you’re not satisfied with the default options for triggers, you can set your own with the Manual Liquidity Triggers option.
Time-Based LTs
Time-based liquidity triggers give you a view of support and resistance triggers based off of the time chosen, rather than by an order. This allows you to construct “weekly Liquidity-Triggers” or “hourly Liquidity Triggers” to analyze and compare against.
Note: If the timeframes are too far apart, you might get an error. For instance, putting a 1-week reference LT onto a 30-second chart may not work.
Liquidity-Triggers Data-Table
With the `Display Liquidity Trigger Statuses and Values` option, you can place a data-table on the chart that will display the time-based triggers, their values, and if they are above (bearish) or below (bullish) spot.
Alerts
When you set alerts, you can determine which order is used for determining `Is bullish`, `Is Bearish`, `Has Become Bullish`, `Has Become Bearish` alerts in the LT Alert Order setting.
Several LT alerts are available to set:
Is Bullish / Bearish: these are designed to analyze conditions at the end of the candle and if spot is above the alert-trigger, then an alert is sent out that conditions are bullish, and if spot is below the alert-trigger, then an alert is sent out if conditions are bearish.
Has Become Bullish / Bearish: designed to analyze conditions at the start of a candle and determine if a change has occurred (a LT cross-over).
Suspected Rip Current: these are designed to alert you when a suspected upwards rip in price is underway, as characterized by all LT triggers moving rapidly down away from spot.
Suspected Dip Current: these are designed to alert you when a suspected downwards rip in price is underway, as characterized by all LT triggers moving rapidly up and above, away from spot.
These alerts can then be put into a webhook for external processing if desired.
Frequently Asked Questions
How can I gain access to LT?
Check out the Author's Instructions section below.
Where can I get more information?
Check out the Author's Instructions section below for how to obtain more information.
I tried to add LT to my chart but it produced an error.
Sometimes this happens but no worries. Just change the chart's interval to a different time and then back, the indicator should re-load. If that fails, try removing it completely and re-applying it.
Is it normal for LTs to have different values on different timeframes?
Yup! Think of each time-interval as a different "zoom" of the market. Imagine you are taking a picture of the ocean to figure out the direction of water movement. If you take the picture from space, you will see big general trends but if you take the photo from your boat in the harbor, you're going to get specific data about that area. That's how LT works!
The view of the liquidity depends on the "zoom-age" (the chart's interval) used when taking the photo.
I think there is an issue with the alerts - what should I do?
This is not ideal! If this happens, please reach out via the contact information in the Author's Instructions section below with the following details:
What symbol?
What timeframe?
Which alert?
When did the alert occur?
Can I attach the alerts to webhooks?
Yup! Be sure to check out TV's guide on webhooks ( T.V. Guide to Alerts ) for how to get started.
Does LT receive updates?
Yup! If a bug or issue is found, an update is pushed out. You will be notified when this occurs and it is highly recommended that you replace all charts with LT on them with the new version as the updates go out.






















