지표 및 전략
Support & Resistance Zone Hunter [BOSWaves]Support & Resistance Zone Hunter - Dynamic Structural Zones with Real-Time Breakout Intelligence
Overview
The Support & Resistance Zone Hunter is a professional-grade structural mapping framework designed to automatically detect high-probability support and resistance areas in real time. Unlike traditional static levels or manually drawn zones, this system leverages pivot detection, range thresholds, and optional volume validation to create dynamic zones that reflect the true structural architecture of the market.
Zones evolve as price interacts with their boundaries. The first touch of a zone determines its bias - bullish, bearish, or neutral - and the system tracks the full lifecycle of each zone from formation, testing, and bias establishment to potential breakout events. Diamond-shaped breakout signals highlight structurally significant price expansions while filtering noise using a configurable cooldown period.
By visualizing market structure in this way, traders gain a deeper understanding of price behavior, trend momentum, and areas where liquidity and reactive forces are concentrated.
Theoretical Foundation
The Support & Resistance Zone Hunter is built on the premise that meaningful structural zones arise from two core principles:
Pivot-Based Turning Points : Only significant highs and lows that represent actual swings in price are considered.
Contextual Validation : Zones must pass minimum range criteria and optional volume thresholds to ensure their relevance.
Markets naturally generate numerous micro-pivots that do not carry predictive significance. By filtering out minor swings and validating zones against volume and range, the system isolates levels that are more likely to attract future price interaction or act as catalysts for breakout moves.
This framework captures not only where price is likely to react but also the direction of potential pressure, providing a statistically grounded, visually intuitive representation of market structure.
How It Works
The Support & Resistance Zone Hunter constructs zones through a multi-layered process that blends pivot logic, range validation, and real-time bias determination:
1. Pivot Detection Core
The indicator identifies pivot highs and pivot lows using a configurable lookback period. Zones are only considered valid when both a top and bottom pivot are present.
2. Zone Qualification Engine
Prospective zones must satisfy two conditions:
Range Threshold : The distance between pivot high and low must exceed the minimum percentage set by the user.
Volume Requirement : If enabled, the current volume must exceed the 50-period moving average.
Only zones meeting these criteria are drawn, reducing noise and emphasizing high-probability structural levels.
3. Zone Lifecycle
Once a valid top and bottom pivot exist:
The zone is created starting from the pivot formation bar.
Zones remain active until both boundaries have been touched by price.
The first boundary touched establishes bias: resistance first → bullish bias ,support first → bearish bias, neither → neutral.
Inactive zones stop expanding but remain visible historically to maintain a clear structural context.
4. Visual Rendering
Active zones are displayed as filled boxes with color corresponding to their bias. Top, bottom, and midpoint lines are drawn for reference. Once a zone becomes inactive, its lines are removed while the filled box remains as a historical footprint.
5. Breakout Detection
Breakout signals occur when price closes above the top boundary or below the bottom boundary of an active zone. The system applies a cooldown period and requires price to return to the zone since the previous breakout to prevent signal spam. Bullish and bearish breakouts are visually represented by diamond-shaped markers with configurable colors.
Interpretation
The Support & Resistance Zone Hunter provides a structural view of market balance:
Bullish Zones : Form when resistance is tested first, indicating upward pressure and potential continuation.
Bearish Zones : Form when support is tested first, reflecting downward pressure and continuation risk.
Neutral Zones : Fresh zones that have not yet been interacted with, representing undiscovered liquidity.
Breakout Diamonds : Highlight significant structural price expansions, helping traders identify confirmed continuation moves while filtering noise.
Zones do not simply indicate past levels; they dynamically reflect the evolving battle between buyers and sellers, providing actionable context for both trend continuation and reversion strategies.
Strategy Integration
The Support & Resistance Zone Hunter is versatile and can be applied across multiple trading approaches:
Trend Continuation : Use bullish and bearish zones to confirm directional bias. Breakout diamonds indicate structural continuation opportunities.
Reversion Entries : Neutral zones often act as magnets in ranging markets, allowing for high-probability mean-reversion setups.
Breakout Trading : Diamonds mark true structural expansions, reducing false breakout risk and guiding stop placement or momentum entries.
Liquidity Zone Alignment : Combining the indicator with order block, breaker, or volume-based tools helps validate zones against broader market participation.
Technical Implementation Details
Pivot Engine : Two-sided pivot detection based on configurable lookback.
Zone Qualification : Minimum range requirement and optional volume filter.
Bias Logic : Determined by the first boundary touched.
Zone Lifecycle : Active until both boundaries are touched, historical visibility retained.
Breakout Signals : Diamond markers with cooldown filtering and price-return validation.
Visuals : Transparent filled zones with live top, bottom, and midpoint lines.
Suggested Optimal Parameters
Pivot Lookback : 10 - 30 for intraday, 20 - 50 for swing trading.
Minimum Range % : 0.5 - 2% for crypto or indices, 1 - 3% for metals or forex.
Volume Filter : Enable for assets with inconsistent liquidity; disable for consistently liquid markets.
Breakout Cooldown : 5 - 20 bars depending on volatility.
These suggested parameters should be used as a baseline; their effectiveness depends on the asset and timeframe, so fine-tuning is expected for optimal performance.
Performance Characteristics
High Effectiveness:
Markets with clear pivot structure and reliable volume.
Trending symbols with consistent retests.
Assets where zones attract repeated price interaction.
Reduced Effectiveness:
Random walk markets lacking structural pivots.
Low-volatility periods with minimal price reaction.
Assets with irregular volume distribution or erratic price action.
Integration Guidelines
Use zone color as contextual bias rather than a standalone signal.
Combine with structural tools, order blocks, or volume-based indicators for confluence.
Validate zones on higher timeframes to refine lower timeframe entries.
Treat breakout diamonds as confirmation of continuation rather than independent triggers.
Disclaimer
The Support & Resistance Zone Hunter provides structural zone mapping and breakout analytics. It does not predict price movement or guarantee profitability. Success requires disciplined risk management, proper parameter calibration, and integration into a comprehensive trading strategy.
Safe Supertrend Strategy (No Repaint)Overview
The Safe Supertrend is a repaint-free version of the popular Supertrend trend-following indicator.
Most Supertrend indicators appear perfect on historical charts because they flip intrabar and then repaint after the candle closes.
This version fixes that by using close-of-bar confirmation only, making every trend flip 100% stable, safe, and non-repainting.
Why This Supertrend Doesn’t Repaint
Most Supertrend indicators calculate their trend direction using the current bar’s data.
But during a live candle:
ATR expands and contracts
The upper/lower bands move
Price moves above/below the band temporarily
A false flip appears → then disappears when the candle closes
That is classic repainting.
This indicator avoids all of that by using:
close > upper
close < lower
This means:
Trend direction flips only based on the previous candle,
No intrabar calculations,
No flickering signals,
No “perfect but fake” historical performance.
Every signal you see on the chart is exactly what was available in real-time.
How It Works
Calculates ATR (Average True Range) and SMA centerline
Builds upper and lower volatility bands
Confirms trend flips only after the previous bar closes
Plots clear bull and bear reversal signals
Works on all markets (crypto, stocks, forex, indices)
No repainting, no recalc, no misleading flips.
Bullish Signal (Trend Up)
A bullish trend begins only when:
The previous candle closes above the upper ATR band,
And this flip is fully confirmed.
A green triangle marks the start of a new uptrend.
Bearish Signal (Trend Down)
A bearish trend begins only when:
The previous candle closes below the lower ATR band,
And the downtrend is confirmed.
A red triangle signals the start of a new downtrend.
Inputs
ATR Length - default 10
ATR Multiplier - default 3.0
Works on all timeframes and market
Simple, but powerful.
Why Use This Version Instead of a Regular Supertrend?
Most Supertrends:
Look great historically
But repaint continuously on live charts
Give false trend flips intrabar
Cannot be reliably used in strategies
This version:
Uses strict previous-bar logic
Never repaints trend direction
Works perfectly in live trading
Backtests accurately
Is ideal for algorithmic strategies
Ideal For:
Trend-following strategies
Breakout trading
Algo trading systems
Reversal detection
Filtering market noise
Swing trading & scalping
Final Note
This is a safer, more reliable Supertrend designed for real-world use — not perfect-looking repaint illusions.
If you use Supertrend in your trading system, this no-repaint version ensures your signals are trustworthy and consistent.
Pin Bar Fib Pullback + Engulfing + Pin Reversal (21 EMA + VWAP)Dear Traders
Pin bar fib pullback continuation (in 0.50–0.618 zone)
Bullish/Bearish engulfing
Pin bar reversals (bottom/top)
Then we ask: did the next candle move at least atrMult × ATR away from the signal close in the right direction?
For a long signal: next high ≥ signal close + ATR * atrMult
For a short signal: next low ≤ signal close − ATR * atrMult
If yes, that signal gets a big circle with text:
BIG ▲ for long
BIG ▼ for short
drawn on the original signal bar (using offset = -1 trick).
You can tune how “big” you want:
Increase ATR length for smoother ATR
Increase ATR * (e.g., from 1.5 → 2.0) to only mark really strong moves.
XAUUSD Multi-Timeframe Bias Scanner🎯 Purpose & Overview
This is a sophisticated trading indicator that analyzes XAUUSD (Gold) across 5 different timeframes simultaneously to determine market bias and trend direction.
⚙️ Core Components
2. Bias Calculation Engine
The heart of the indicator uses 5 technical factors to score each timeframe:
Technical Factors (Weighted):
Moving Average Alignment (30 points)
Bullish: EMA(9) > EMA(21) > EMA(50)
Bearish: EMA(9) < EMA(21) < EMA(50)
Price vs MA Position (20 points)
Score increases when price above MAs
Score decreases when price below MAs
RSI Momentum (20 points)
Bullish: RSI > 60 or > 50
Bearish: RSI < 40 or < 50
MACD Signals (15 points)
Bullish: MACD line > Signal line AND > 0
Bearish: MACD line < Signal line AND < 0
Volume Confirmation (15 points)
Volume spikes with price movement add confirmation
📊 Timeframe Analysis
Five Timeframes Monitored:
5-minute - Short-term noise (10% weight)
15-minute - Intraday direction (15% weight)
1-hour - Key intraday bias (25% weight)
4-hour - Primary directional bias (30% weight)
1-day - Overall trend context (20% weight)
Bias Scoring System:
0-100 Scale (50 = Neutral)
STRONG BULLISH: ≥70 (Green)
BULLISH: 55-69 (Lime)
NEUTRAL: 46-54 (Gray)
BEARISH: 31-45 (Orange)
STRONG BEARISH: ≤30 (Red)
🎨 Visual Features
1. Comprehensive Table Display
pinescript
var table biasTable = table.new(position.top_right, 3, 7, ...)
Shows a color-coded table with:
Timeframe name
Numerical bias score (0-100)
Strength description with color coding
2. Chart Visual Indicators
Background coloring based on overall bias
Label markers for strong bullish/bearish conditions
Real-time label showing all timeframe scores
3. Alert System
Triggers when overall bias crosses 70 (bullish) or 30 (bearish)
Configurable with sound options
🔄 How It Processes Data
Data Flow:
Requests security data for each timeframe using request.security()
Calculates technical indicators for each TF separately
Scores each TF based on 5 technical factors
Computes weighted overall bias
Updates visual displays and checks alert conditions
💡 Trading Applications
Bullish Scenarios:
Multiple timeframes show bullish alignment
Higher timeframe bias supports lower timeframe direction
Overall score > 70 indicates strong bullish conviction
Bearish Scenarios:
Multiple timeframes show bearish alignment
Higher timeframe bias confirms lower timeframe moves
Overall score < 30 indicates strong bearish conviction
Conflict Detection:
When timeframes show conflicting biases
Caution required - market may be consolidating
Wait for alignment before taking trades
🎚️ Customization Options
Users can modify:
Timeframe weights
Technical indicator parameters
Alert thresholds
Visual display preferences
Scoring sensitivity
📈 XAUUSD Specific Optimizations
The indicator considers Gold's unique characteristics:
High volatility periods
ATR-based volatility adjustments
Volume confirmation for breakouts
Multiple timeframe confirmation for trend reliability
This creates a powerful tool for identifying high-probability trade setups in XAUUSD by ensuring traders have a complete multi-timeframe perspective before entering positions.
Altseason IndexDescription of the "Altseason Index" Indicator
The Altseason Index is a powerful and visually minimalist tool designed to objectively identify the onset and conclusion of an "altseason" in the cryptocurrency market. Moving beyond subjective speculation, this indicator employs a clear, mathematical methodology by comparing the performance of a broad basket of altcoins against Bitcoin.
🎯 Core Concept and Utility
An "Altseason" is a market period where altcoins (cryptocurrencies other than Bitcoin) consistently yield higher returns than BTC. This indicator empowers traders and investors to:
Objectively Identify Market Cycles: Precisely pinpoint when capital is actively rotating from Bitcoin into altcoins and vice versa.
Make Data-Driven Decisions: Adjust their strategy in a timely manner: increasing exposure to altcoins during an altseason or rotating back into BTC upon its conclusion.
Avoid Emotional Pitfalls: Steer clear of FOMO (Fear Of Missing Out) and base decisions on hard data rather than market noise.
⚙️ How the Calculation Works
1. Asset Selection: The indicator tracks the performance of 15 leading altcoins across various market segments (Layer 1s, DeFi, Meme, Payments), ensuring a representative sample.
2. Performance Comparison: For each altcoin, the percentage price change over the user-defined lookback period (default: 90 days) is calculated. This performance is then compared to BTC's performance over the same period.
3. Counting the "Outperformers": The index counts the number of altcoins that have "outperformed" BTC.
4. Calculating the Index: The Altseason Index value is the percentage of altcoins in the basket that are outperforming BTC. For example, a value of 60% means that 9 out of the 15 coins performed better than Bitcoin.
🛠️ Indicator Settings
The settings are kept simple and intuitive, allowing you to customize the indicator to your strategy:
Lookback Period (days) (Default: 90):
- Defines the time horizon for the performance calculation.
- Shorter Periods (30-60 days) react faster to new trends but may produce more false signals.
- Longer Periods (90-180 days) provide smoother and more reliable signals, capturing sustained macro-trends.
Altseason Threshold (%) (Default: 75%):
- This is the key parameter that defines what index value constitutes an official "altseason."
- A threshold of 75% means an altseason is declared when at least 11 out of the 15 altcoins (75%) are outperforming BTC.
- You can increase the threshold (e.g., to 85%) for more conservative and stronger signals, or decrease it (e.g., to 65%) for earlier entries.
📊 Interpreting the Readings and Signals
The indicator uses a clear color-coding system and levels for easy interpretation:
🔴 < 30%: "BTC SEASON"
Bitcoin is dominating. The market is in risk-off mode or a state of anticipation. Growth is concentrated in BTC.
⚪ 30% - 49%: "NEUTRAL"
A transitional phase. The market is uncertain. Some alts show strength, but there is no unified trend.
🔵 50% - 74%: "BULLISH"
Growing strength in altcoins. Capital is beginning to rotate actively. This can be an early stage of an altseason.
🟢 ≥ 75% (or your custom threshold): "ALTSEASON"
The active altseason phase. The vast majority of altcoins are rising faster than BTC. This is the period of maximum potential returns for alts.
Signal Markers:
Green Dot: Signals the potential start of an altseason (the index crosses above the threshold).
Red Dot: Signals the potential end of an altseason (the index crosses below the threshold).
ℹ️ Information Panel
The chart displays two clean information panels:
1. Main Info Label:
Current index value (e.g., ⟠ 80%).
Market status (ALTSEASON, BULLISH, etc.).
The ratio of outperforming altcoins (11/15 alts).
2. Dominance & Market Cap Panel:
Alts: Altcoin Dominance (the market cap share of all coins except BTC).
BTC: Bitcoin Dominance.
Market: Total cryptocurrency market capitalization in billions of USD. This helps assess the overall market context (bullish/bearish).
💎 Conclusion
The Altseason Index is your strategic companion for navigating the crypto markets. It transforms the complex task of identifying market cycles into a simple and visual process. Use it to confirm broad market trends, identify potential entry and exit points, and, most importantly, to maintain discipline in your trading strategy by filtering out noise and emotion.
Disclaimer: This indicator is a tool for analysis and does not constitute investment advice. All trading decisions are taken at your own risk.
Safe Supertrend Strategy (No Repaint)Overview
The Safe Supertrend is a repaint-free version of the popular Supertrend trend-following indicator.
Most Supertrend indicators appear perfect on historical charts because they flip intrabar and then repaint after the candle closes.
This version fixes that by using close-of-bar confirmation only, making every trend flip 100% stable, safe, and non-repainting.
Why This Supertrend Doesn’t Repaint
Most Supertrend indicators calculate their trend direction using the current bar’s data.
But during a live candle:
ATR expands and contracts
The upper/lower bands move
Price moves above/below the band temporarily
A false flip appears → then disappears when the candle closes
That is classic repainting.
This indicator avoids all of that by using:
close > upper
close < lower
This means:
Trend direction flips only based on the previous candle,
No intrabar calculations,
No flickering signals,
No “perfect but fake” historical performance.
Every signal you see on the chart is exactly what was available in real-time.
How It Works
Calculates ATR (Average True Range) and SMA centerline
Builds upper and lower volatility bands
Confirms trend flips only after the previous bar closes
Plots clear bull and bear reversal signals
Works on all markets (crypto, stocks, forex, indices)
No repainting, no recalc, no misleading flips.
Bullish Signal (Trend Up)
A bullish trend begins only when:
The previous candle closes above the upper ATR band,
And this flip is fully confirmed.
A green triangle marks the start of a new uptrend.
Bearish Signal (Trend Down)
A bearish trend begins only when:
The previous candle closes below the lower ATR band,
And the downtrend is confirmed.
A red triangle signals the start of a new downtrend.
Inputs
ATR Length - default 10
ATR Multiplier - default 3.0
Works on all timeframes and market
Simple, but powerful.
Why Use This Version Instead of a Regular Supertrend?
Most Supertrends:
Look great historically
But repaint continuously on live charts
Give false trend flips intrabar
Cannot be reliably used in strategies
This version:
Uses strict previous-bar logic
Never repaints trend direction
Works perfectly in live trading
Backtests accurately
Is ideal for algorithmic strategies
Ideal For:
Trend-following strategies
Breakout trading
Algo trading systems
Reversal detection
Filtering market noise
Swing trading & scalping
Final Note
This is a safer, more reliable Supertrend designed for real-world use — not perfect-looking repaint illusions.
If you use Supertrend in your trading system, this no-repaint version ensures your signals are trustworthy and consistent.
Price Action Concepts [RUDYINDICATOR]/// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) creativecommons.org
// © RUDYBANK INDICATOR - formerly know as RUDY INDICATOR
//@version=5
indicator("Price Action Concepts ", shorttitle = "RUDYINDICATOR-V1
- Price Action RUDYINDICATOR ", overlay = true, max_lines_count = 500, max_labels_count = 500, max_boxes_count = 500, max_bars_back = 500, max_polylines_count = 100)
//-----------------------------------------------------------------------------{
//Boolean set
//-----------------------------------------------------------------------------{
s_BOS = 0
s_CHoCH = 1
i_BOS = 2
i_CHoCH = 3
i_pp_CHoCH = 4
green_candle = 5
red_candle = 6
s_CHoCHP = 7
i_CHoCHP = 8
boolean =
array.from(
false
, false
, false
, false
, false
, false
, false
, false
, false
)
//-----------------------------------------------------------------------------{
// User inputs
//-----------------------------------------------------------------------------{
show_swing_ms = input.string ("All" , "Swing        " , inline = "1", group = "MARKET STRUCTURE" , options = )
show_internal_ms = input.string ("All" , "Internal     " , inline = "2", group = "MARKET STRUCTURE" , options = )
internal_r_lookback = input.int (5 , "" , inline = "2", group = "MARKET STRUCTURE" , minval = 2)
swing_r_lookback = input.int (50 , "" , inline = "1", group = "MARKET STRUCTURE" , minval = 2)
ms_mode = input.string ("Manual" , "Market Structure Mode" , inline = "a", group = "MARKET STRUCTURE" , tooltip = " Use selected lenght Use automatic lenght" ,options = )
show_mtf_str = input.bool (true , "MTF Scanner" , inline = "9", group = "MARKET STRUCTURE" , tooltip = "Display Multi-Timeframe Market Structure Trend Directions. Green = Bullish. Red = Bearish")
show_eql = input.bool (false , "Show EQH/EQL" , inline = "6", group = "MARKET STRUCTURE")
plotcandle_bool = input.bool (false , "Plotcandle" , inline = "3", group = "MARKET STRUCTURE" , tooltip = "Displays a cleaner colored candlestick chart in place of the default candles. (requires hiding the current ticker candles)")
barcolor_bool = input.bool (false , "Bar Color" , inline = "4", group = "MARKET STRUCTURE" , tooltip = "Color the candle bodies according to market strucutre trend")
i_ms_up_BOS = input.color (#089981 , "" , inline = "2", group = "MARKET STRUCTURE")
i_ms_dn_BOS = input.color (#f23645 , "" , inline = "2", group = "MARKET STRUCTURE")
s_ms_up_BOS = input.color (#089981 , "" , inline = "1", group = "MARKET STRUCTURE")
s_ms_dn_BOS = input.color (#f23645 , "" , inline = "1", group = "MARKET STRUCTURE")
lvl_daily = input.bool (false , "Day   " , inline = "1", group = "HIGHS & LOWS MTF")
lvl_weekly = input.bool (false , "Week " , inline = "2", group = "HIGHS & LOWS MTF")
lvl_monthly = input.bool (false , "Month" , inline = "3", group = "HIGHS & LOWS MTF")
lvl_yearly = input.bool (false , "Year  " , inline = "4", group = "HIGHS & LOWS MTF")
css_d = input.color (color.blue , "" , inline = "1", group = "HIGHS & LOWS MTF")
css_w = input.color (color.blue , "" , inline = "2", group = "HIGHS & LOWS MTF")
css_m = input.color (color.blue , "" , inline = "3", group = "HIGHS & LOWS MTF")
css_y = input.color (color.blue , "" , inline = "4", group = "HIGHS & LOWS MTF")
s_d = input.string ('⎯⎯⎯' , '' , inline = '1', group = 'HIGHS & LOWS MTF' , options = )
s_w = input.string ('⎯⎯⎯' , '' , inline = '2', group = 'HIGHS & LOWS MTF' , options = )
s_m = input.string ('⎯⎯⎯' , '' , inline = '3', group = 'HIGHS & LOWS MTF' , options = )
s_y = input.string ('⎯⎯⎯' , '' , inline = '4', group = 'HIGHS & LOWS MTF' , options = )
ob_show = input.bool (true , "Show Last    " , inline = "1", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Display volumetric order blocks on the chart Ammount of volumetric order blocks to show")
ob_num = input.int (5 , "" , inline = "1", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Orderblocks number", minval = 1, maxval = 10)
ob_metrics_show = input.bool (true , "Internal Buy/Sell Activity" , inline = "2", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Display volume metrics that have formed the orderblock")
css_metric_up = input.color (color.new(#089981, 50) , "         " , inline = "2", group = "VOLUMETRIC ORDER BLOCKS")
css_metric_dn = input.color (color.new(#f23645 , 50) , "" , inline = "2", group = "VOLUMETRIC ORDER BLOCKS")
ob_swings = input.bool (false , "Swing Order Blocks" , inline = "a", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Display swing volumetric order blocks")
css_swing_up = input.color (color.new(color.gray , 90) , "                 " , inline = "a", group = "VOLUMETRIC ORDER BLOCKS")
css_swing_dn = input.color (color.new(color.silver, 90) , "" , inline = "a", group = "VOLUMETRIC ORDER BLOCKS")
ob_filter = input.string ("None" , "Filtering             " , inline = "d", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Filter out volumetric order blocks by BOS/CHoCH/CHoCH+", options = )
ob_mitigation = input.string ("Absolute" , "Mitigation           " , inline = "4", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Trigger to remove volumetric order blocks", options = )
ob_pos = input.string ("Precise" , "Positioning          " , inline = "k", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Position of the Order Block Cover the whole candle Cover half candle Adjust to volatility Same as Accurate but more precise", options = )
use_grayscale = input.bool (false , "Grayscale" , inline = "6", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Use gray as basic order blocks color")
use_show_metric = input.bool (true , "Show Metrics" , inline = "7", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Show volume associated with the orderblock and his relevance")
use_middle_line = input.bool (true , "Show Middle-Line" , inline = "8", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Show mid-line order blocks")
use_overlap = input.bool (true , "Hide Overlap" , inline = "9", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Hide overlapping order blocks")
use_overlap_method = input.string ("Previous" , "Overlap Method    " , inline = "Z", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = " Preserve the most recent volumetric order blocks Preserve the previous volumetric order blocks", options = )
ob_bull_css = input.color (color.new(#089981 , 90) , "" , inline = "1", group = "VOLUMETRIC ORDER BLOCKS")
ob_bear_css = input.color (color.new(#f23645 , 90) , "" , inline = "1", group = "VOLUMETRIC ORDER BLOCKS")
show_acc_dist_zone = input.bool (false , "" , inline = "1", group = "Accumulation And Distribution")
zone_mode = input.string ("Fast" , "" , inline = "1", group = "Accumulation And Distribution" , tooltip = " Find small zone pattern formation Find bigger zone pattern formation" ,options = )
acc_css = input.color (color.new(#089981 , 60) , "" , inline = "1", group = "Accumulation And Distribution")
dist_css = input.color (color.new(#f23645 , 60) , "" , inline = "1", group = "Accumulation And Distribution")
show_lbl = input.bool (false , "Show swing point" , inline = "1", group = "High and Low" , tooltip = "Display swing point")
show_mtb = input.bool (false , "Show High/Low/Equilibrium" , inline = "2", group = "High and Low" , tooltip = "Display Strong/Weak High And Low and Equilibrium")
toplvl = input.color (color.red , "Premium Zone   " , inline = "3", group = "High and Low")
midlvl = input.color (color.gray , "Equilibrium Zone" , inline = "4", group = "High and Low")
btmlvl = input.color (#089981 , "Discount Zone    " , inline = "5", group = "High and Low")
fvg_enable = input.bool (false , "        " , inline = "1", group = "FAIR VALUE GAP" , tooltip = "Display fair value gap")
what_fvg = input.string ("FVG" , "" , inline = "1", group = "FAIR VALUE GAP" , tooltip = "Display fair value gap", options = )
fvg_num = input.int (5 , "Show Last  " , inline = "1a", group = "FAIR VALUE GAP" , tooltip = "Number of fvg to show")
fvg_upcss = input.color (color.new(#089981, 80) , "" , inline = "1", group = "FAIR VALUE GAP")
fvg_dncss = input.color (color.new(color.red , 80) , "" , inline = "1", group = "FAIR VALUE GAP")
fvg_extend = input.int (10 , "Extend FVG" , inline = "2", group = "FAIR VALUE GAP" , tooltip = "Extend the display of the FVG.")
fvg_src = input.string ("Close" , "Mitigation  " , inline = "3", group = "FAIR VALUE GAP" , tooltip = " Use the close of the body as trigger Use the extreme point of the body as trigger", options = )
fvg_tf = input.timeframe ("" , "Timeframe " , inline = "4", group = "FAIR VALUE GAP" , tooltip = "Timeframe of the fair value gap")
t = color.t (ob_bull_css)
invcol = color.new (color.white , 100)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - UDT }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
type bar
float o = open
float c = close
float h = high
float l = low
float v = volume
int n = bar_index
int t = time
type Zphl
line top
line bottom
label top_label
label bottom_label
bool stopcross
bool sbottomcross
bool itopcross
bool ibottomcross
string txtup
string txtdn
float topy
float bottomy
float topx
float bottomx
float tup
float tdn
int tupx
int tdnx
float itopy
float itopx
float ibottomy
float ibottomx
float uV
float dV
type FVG
box box
line ln
bool bull
float top
float btm
int left
int right
type ms
float p
int n
float l
type msDraw
int n
float p
color css
string txt
bool bull
type obC
float top
float btm
int left
float avg
float dV
float cV
int wM
int blVP
int brVP
int dir
float h
float l
int n
type obD
box ob
box eOB
box blB
box brB
line mL
type zone
chart.point points
float p
int c
int t
type hqlzone
box pbx
box ebx
box lbx
label plb
label elb
label lbl
type ehl
float pt
int t
float pb
int b
type pattern
string found = "None"
bool isfound = false
int period = 0
bool bull = false
type alerts
bool chochswing = false
bool chochplusswing = false
bool swingbos = false
bool chochplus = false
bool choch = false
bool bos = false
bool equal = false
bool ob = false
bool swingob = false
bool zone = false
bool fvg = false
bool obtouch = false
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - General Setup }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
bar b = bar.new()
var pattern p = pattern.new()
alerts blalert = alerts.new()
alerts bralert = alerts.new()
if p.isfound
p.period += 1
if p.period == 50
p.period := 0
p.found := "None"
p.isfound := false
p.bull := na
switch
b.c > b.o => boolean.set(green_candle, true)
b.c < b.o => boolean.set(red_candle , true)
f_zscore(src, lookback) =>
(src - ta.sma(src, lookback)) / ta.stdev(src, lookback)
var int iLen = internal_r_lookback
var int sLen = swing_r_lookback
vv = f_zscore(((close - close ) / close ) * 100,iLen)
if ms_mode == "Dynamic"
switch
vv >= 1.5 or vv <= -1.5 => iLen := 10
vv >= 1.6 or vv <= -1.6 => iLen := 9
vv >= 1.7 or vv <= -1.7 => iLen := 8
vv >= 1.8 or vv <= -1.8 => iLen := 7
vv >= 1.9 or vv <= -1.9 => iLen := 6
vv >= 2.0 or vv <= -2.0 => iLen := 5
=> iLen
var msline = array.new(0)
iH = ta.pivothigh(high, iLen, iLen)
sH = ta.pivothigh(high, sLen, sLen)
iL = ta.pivotlow (low , iLen, iLen)
sL = ta.pivotlow (low , sLen, sLen)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - ARRAYS }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
hl () =>
= request.security(syminfo.tickerid , 'D' , hl() , lookahead = barmerge.lookahead_on)
= request.security(syminfo.tickerid , 'W' , hl() , lookahead = barmerge.lookahead_on)
= request.security(syminfo.tickerid , 'M' , hl() , lookahead = barmerge.lookahead_on)
= request.security(syminfo.tickerid , '12M', hl() , lookahead = barmerge.lookahead_on)
lstyle(style) =>
out = switch style
'⎯⎯⎯' => line.style_solid
'----' => line.style_dashed
'····' => line.style_dotted
mtfphl(h, l ,tf ,css, pdhl_style) =>
var line hl = line.new(
na
, na
, na
, na
, xloc = xloc.bar_time
, color = css
, style = lstyle(pdhl_style)
)
var line ll = line.new(
na
, na
, na
, na
, xloc = xloc.bar_time
, color = css
, style = lstyle(pdhl_style)
)
var label lbl = label.new(
na
, na
, xloc = xloc.bar_time
, text = str.format('P{0}L', tf)
, color = invcol
, textcolor = css
, size = size.small
, style = label.style_label_left
)
var label hlb = label.new(
na
, na
, xloc = xloc.bar_time
, text = str.format('P{0}H', tf)
, color = invcol
, textcolor = css
, size = size.small
, style = label.style_label_left
)
hy = ta.valuewhen(h != h , h , 1)
hx = ta.valuewhen(h == high , time , 1)
ly = ta.valuewhen(l != l , l , 1)
lx = ta.valuewhen(l == low , time , 1)
if barstate.islast
extension = time + (time - time ) * 50
line.set_xy1(hl , hx , hy)
line.set_xy2(hl , extension , hy)
label.set_xy(hlb, extension , hy)
line.set_xy1(ll , lx , ly)
line.set_xy2(ll , extension , ly)
label.set_xy(lbl, extension , ly)
if lvl_daily
mtfphl(pdh , pdl , 'D' , css_d, s_d)
if lvl_weekly
mtfphl(pwh , pwl , 'W' , css_w, s_w)
if lvl_monthly
mtfphl(pmh , pml, 'M' , css_m, s_m)
if lvl_yearly
mtfphl(pyh , pyl , '12M', css_y, s_y)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - Market Structure }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
method darkcss(color css, float factor, bool bull) =>
blue = color.b(css) * (1 - factor)
red = color.r(css) * (1 - factor)
green = color.g(css) * (1 - factor)
color.rgb(red, green, blue, 0)
method f_line(msDraw d, size, style) =>
var line id = na
var label lbl = na
id := line.new(
d.n
, d.p
, b.n
, d.p
, color = d.css
, width = 1
, style = style
)
if msline.size() >= 250
line.delete(msline.shift())
msline.push(id)
lbl := label.new(
int(math.avg(d.n, b.n))
, d.p
, d.txt
, color = invcol
, textcolor = d.css
, style = d.bull ? label.style_label_down : label.style_label_up
, size = size
, text_font_family = font.family_monospace
)
structure(bool mtf) =>
msDraw drw = na
bool isdrw = false
bool isdrwS = false
var color css = na
var color icss = na
var int itrend = 0
var int trend = 0
bool bull_ob = false
bool bear_ob = false
bool s_bull_ob = false
bool s_bear_ob = false
n = bar_index
var ms up = ms.new(
array.new()
, array.new< int >()
, array.new()
)
var ms dn = ms.new(
array.new()
, array.new< int >()
, array.new()
)
var ms sup = ms.new(
array.new()
, array.new< int >()
, array.new()
)
var ms sdn = ms.new(
array.new()
, array.new< int >()
, array.new()
)
switch show_swing_ms
"All" => boolean.set(s_BOS , true ), boolean.set(s_CHoCH, true ) , boolean.set(s_CHoCHP, true )
"CHoCH" => boolean.set(s_BOS , false), boolean.set(s_CHoCH, true ) , boolean.set(s_CHoCHP, false )
"CHoCH+" => boolean.set(s_BOS , false), boolean.set(s_CHoCH, false) , boolean.set(s_CHoCHP, true )
"BOS" => boolean.set(s_BOS , true ), boolean.set(s_CHoCH, false) , boolean.set(s_CHoCHP, false )
"None" => boolean.set(s_BOS , false), boolean.set(s_CHoCH, false) , boolean.set(s_CHoCHP, false )
=> na
switch show_internal_ms
"All" => boolean.set(i_BOS, true ), boolean.set(i_CHoCH, true ), boolean.set(i_CHoCHP, true )
"CHoCH" => boolean.set(i_BOS, false), boolean.set(i_CHoCH, true ), boolean.set(i_CHoCHP, false)
"CHoCH+" => boolean.set(i_BOS, false), boolean.set(i_CHoCH, false ), boolean.set(i_CHoCHP, true )
"BOS" => boolean.set(i_BOS, true ), boolean.set(i_CHoCH, false ), boolean.set(i_CHoCHP, false)
"None" => boolean.set(i_BOS, false), boolean.set(i_CHoCH, false ), boolean.set(i_CHoCHP, false)
=> na
switch
iH =>
up.p.unshift(b.h )
up.l.unshift(b.h )
up.n.unshift(n )
iL =>
dn.p.unshift(b.l )
dn.l.unshift(b.l )
dn.n.unshift(n )
sL =>
sdn.p.unshift(b.l )
sdn.l.unshift(b.l )
sdn.n.unshift(n )
sH =>
sup.p.unshift(b.h )
sup.l.unshift(b.h )
sup.n.unshift(n )
// INTERNAL BULLISH STRUCTURE
if up.p.size() > 0 and dn.l.size() > 1
if ta.crossover(b.c, up.p.first())
bool CHoCH = na
string txt = na
if itrend < 0
CHoCH := true
switch
not CHoCH =>
txt := "BOS"
css := i_ms_up_BOS
blalert.bos := true
if boolean.get(i_BOS) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
up.n.first()
, up.p.first()
, i_ms_up_BOS
, txt
, true
)
CHoCH =>
dn.l.first() > dn.l.get(1) ? blalert.chochplus : blalert.choch
txt := dn.l.first() > dn.l.get(1) ? "CHoCH+" : "CHoCH"
css := i_ms_up_BOS.darkcss(0.25, true)
if (dn.l.first() > dn.l.get(1) ? boolean.get(i_CHoCHP) : boolean.get(i_CHoCH)) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
up.n.first()
, up.p.first()
, i_ms_up_BOS.darkcss(0.25, true)
, txt
, true
)
if mtf == false
switch
ob_filter == "None" => bull_ob := true
ob_filter == "BOS" and txt == "BOS" => bull_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => bull_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => bull_ob := true
itrend := 1
up.n.clear()
up.p.clear()
// INTERNAL BEARISH STRUCTURE
if dn.p.size() > 0 and up.l.size() > 1
if ta.crossunder(b.c, dn.p.first())
bool CHoCH = na
string txt = na
if itrend > 0
CHoCH := true
switch
not CHoCH =>
bralert.bos := true
txt := "BOS"
css := i_ms_dn_BOS
if boolean.get(i_BOS) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
dn.n.first()
, dn.p.first()
, i_ms_dn_BOS
, txt
, false
)
CHoCH =>
if up.l.first() < up.l.get(1)
bralert.chochplus := true
else
bralert.choch := true
txt := up.l.first() < up.l.get(1) ? "CHoCH+" : "CHoCH"
css := i_ms_dn_BOS.darkcss(0.25, false)
if (up.l.first() < up.l.get(1) ? boolean.get(i_CHoCHP) : boolean.get(i_CHoCH)) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
dn.n.first()
, dn.p.first()
, i_ms_dn_BOS.darkcss(0.25, false)
, txt
, false
)
if mtf == false
switch
ob_filter == "None" => bear_ob := true
ob_filter == "BOS" and txt == "BOS" => bear_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => bear_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => bear_ob := true
itrend := -1
dn.n.clear()
dn.p.clear()
// SWING BULLISH STRUCTURE
if sup.p.size() > 0 and sdn.l.size() > 1
if ta.crossover(b.c, sup.p.first())
bool CHoCH = na
string txt = na
if trend < 0
CHoCH := true
switch
not CHoCH =>
blalert.swingbos := true
txt := "BOS"
icss := s_ms_up_BOS
if boolean.get(s_BOS) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sup.n.first()
, sup.p.first()
, s_ms_up_BOS
, txt
, true
)
CHoCH =>
if sdn.l.first() > sdn.l.get(1)
blalert.chochplusswing := true
else
blalert.chochswing := true
txt := sdn.l.first() > sdn.l.get(1) ? "CHoCH+" : "CHoCH"
icss := s_ms_up_BOS.darkcss(0.25, true)
if (sdn.l.first() > sdn.l.get(1) ? boolean.get(s_CHoCHP) : boolean.get(s_CHoCH)) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sup.n.first()
, sup.p.first()
, s_ms_up_BOS.darkcss(0.25, true)
, txt
, true
)
if mtf == false
switch
ob_filter == "None" => s_bull_ob := true
ob_filter == "BOS" and txt == "BOS" => s_bull_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => s_bull_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => s_bull_ob := true
trend := 1
sup.n.clear()
sup.p.clear()
// SWING BEARISH STRUCTURE
if sdn.p.size() > 0 and sup.l.size() > 1
if ta.crossunder(b.c, sdn.p.first())
bool CHoCH = na
string txt = na
if trend > 0
CHoCH := true
switch
not CHoCH =>
bralert.swingbos := true
txt := "BOS"
icss := s_ms_dn_BOS
if boolean.get(s_BOS) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sdn.n.first()
, sdn.p.first()
, s_ms_dn_BOS
, txt
, false
)
CHoCH =>
if sup.l.first() < sup.l.get(1)
bralert.chochplusswing := true
else
bralert.chochswing := true
txt := sup.l.first() < sup.l.get(1) ? "CHoCH+" : "CHoCH"
icss := s_ms_dn_BOS.darkcss(0.25, false)
if (sup.l.first() < sup.l.get(1) ? boolean.get(s_CHoCHP) : boolean.get(s_CHoCH)) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sdn.n.first()
, sdn.p.first()
, s_ms_dn_BOS.darkcss(0.25, false)
, txt
, false
)
if mtf == false
switch
ob_filter == "None" => s_bear_ob := true
ob_filter == "BOS" and txt == "BOS" => s_bear_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => s_bear_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => s_bear_ob := true
trend := -1
sdn.n.clear()
sdn.p.clear()
= structure(false)
if isdrw
f_line(drw, size.small, line.style_dashed)
if isdrwS
f_line(drw, size.small, line.style_solid)
= request.security("", "15" , structure(true))
= request.security("", "60" , structure(true))
= request.security("", "240" , structure(true))
= request.security("", "1440" , structure(true))
if show_mtf_str
var tab = table.new(position = position.top_right, columns = 10, rows = 10, bgcolor = na, frame_color = color.rgb(54, 58, 69, 0), frame_width = 1, border_color = color.rgb(54, 58, 69, 100), border_width = 1)
table.cell(tab, 0, 1, text = "15" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 0, 2, text = "1H" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 0, 3, text = "4H" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 0, 4, text = "1D" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 1, 1, text = itrend15 == 1 ? "BULLISH" : itrend15 == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend15 == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend15 == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 1, 2, text = itrend1H == 1 ? "BULLISH" : itrend1H == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend1H == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend1H == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 1, 3, text = itrend4H == 1 ? "BULLISH" : itrend4H == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend4H == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend4H == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 1, 4, text = itrend1D == 1 ? "BULLISH" : itrend1D == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend1D == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend1D == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 0, 5, text = "Detected Pattern", text_halign = text.align_center, text_size = size.normal, text_color = color.silver, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 0, 6, text = p.found, text_halign = text.align_center, text_size = size.normal, text_color = na(p.bull) ? color.white : p.bull ? i_ms_up_BOS.darkcss(-0.25, true) : p.bull == false ? i_ms_dn_BOS.darkcss(0.25, false) : na, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.merge_cells(tab, 0, 5, 1, 5)
table.merge_cells(tab, 0, 6, 1, 6)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - Strong/Weak High/Low And Equilibrium }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
var phl = Zphl.new(
na
, na
, label.new(na , na , color = invcol , textcolor = i_ms_dn_BOS , style = label.style_label_down , size = size.tiny , text = "")
, label.new(na , na , color = invcol , textcolor = i_ms_up_BOS , style = label.style_label_up , size = size.tiny , text = "")
, true
, true
, true
, true
, ""
, ""
, 0
, 0
, 0
, 0
, high
, low
, 0
, 0
, 0
, 0
, 0
, 0
, na
, na
)
zhl(len)=>
upper = ta.highest(len)
lower = ta.lowest(len)
var float out = 0
out := b.h > upper ? 0 : b.l < lower ? 1 : out
top = out == 0 and out != 0 ? b.h : 0
btm = out == 1 and out != 1 ? b.l : 0
= zhl(sLen)
= zhl(iLen)
upphl(trend) =>
var label lbl = label.new(
na
, na
, color = invcol
, textcolor = toplvl
, style = label.style_label_down
, size = size.small
)
if top
phl.stopcross := true
phl.txtup := top > phl.topy ? "HH" : "HL"
if show_lbl
topl = label.new(
b.n - swing_r_lookback
, top
, phl.txtup
, color = invcol
, textcolor = toplvl
, style = label.style_label_down
, size = size.small
)
line.delete(phl.top )
phl.top := line.new(
b.n - sLen
, top
, b.n
, top
, color = toplvl)
phl.topy := top
phl.topx := b.n - sLen
phl.tup := top
phl.tupx := b.n - sLen
if itop
phl.itopcross := true
phl.itopy := itop
phl.itopx := b.n - iLen
phl.tup := math.max(high, phl.tup)
phl.tupx := phl.tup == high ? b.n : phl.tupx
phl.uV := phl.tup != phl.tup ? b.v : phl.uV
if barstate.islast
line.set_xy1(
phl.top
, phl.tupx
, phl.tup
)
line.set_xy2(
phl.top
, b.n + 50
, phl.tup
)
label.set_x(
lbl
, b.n + 50
)
label.set_y(
lbl
, phl.tup
)
dist = math.abs(phl.uV / (phl.uV + phl.dV)) * 100
label.set_text (lbl, trend < 0
? "Strong High | " + str.tostring(phl.uV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)"
: "Weak High | " + str.tostring(phl.uV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)")
dnphl(trend) =>
var label lbl = label.new(
na
, na
, color = invcol
, textcolor = btmlvl
, style = label.style_label_up
, size = size.small
)
if btm
phl.sbottomcross := true
phl.txtdn := btm > phl.bottomy ? "LH" : "LL"
if show_lbl
btml = label.new(
b.n - swing_r_lookback
, btm, phl.txtdn
, color = invcol
, textcolor = btmlvl
, style = label.style_label_up
, size = size.small
)
line.delete(phl.bottom )
phl.bottom := line.new(
b.n - sLen
, btm
, b.n
, btm
, color = btmlvl
)
phl.bottomy := btm
phl.bottomx := b.n - sLen
phl.tdn := btm
phl.tdnx := b.n - sLen
if ibtm
phl.ibottomcross := true
phl.ibottomy := ibtm
phl.ibottomx := b.n - iLen
phl.tdn := math.min(low, phl.tdn)
phl.tdnx := phl.tdn == low ? b.n : phl.tdnx
phl.dV := phl.tdn != phl.tdn ? b.v : phl.dV
if barstate.islast
line.set_xy1(
phl.bottom
, phl.tdnx
, phl.tdn
)
line.set_xy2(
phl.bottom
, b.n + 50
, phl.tdn
)
label.set_x(
lbl
, b.n + 50
)
label.set_y(
lbl
, phl.tdn
)
dist = math.abs(phl.dV / (phl.uV + phl.dV)) * 100
label.set_text (lbl, trend > 0
? "Strong Low | " + str.tostring(phl.dV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)"
: "Weak Low | " + str.tostring(phl.uV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)")
midphl() =>
avg = math.avg(phl.bottom.get_y2(), phl.top.get_y2())
var line l = line.new(
y1 = avg
, y2 = avg
, x1 = b.n - sLen
, x2 = b.n + 50
, color = midlvl
, style = line.style_solid
)
var label lbl = label.new(
x = b.n + 50
, y = avg
, text = "Equilibrium"
, style = label.style_label_left
, color = invcol
, textcolor = midlvl
, size = size.small
)
if barstate.islast
more = (phl.bottom.get_x1() + phl.bottom.get_x2()) > (phl.top.get_x1() + phl.top.get_x2()) ? phl.top.get_x1() : phl.bottom.get_x1()
line.set_xy1(l , more , avg)
line.set_xy2(l , b.n + 50, avg)
label.set_x (lbl , b.n + 50 )
label.set_y (lbl , avg )
dist = math.abs((l.get_y2() - close) / close) * 100
label.set_text (lbl, "Equilibrium (" + str.tostring(math.round(dist,0)) + "%)")
hqlzone() =>
if barstate.islast
var hqlzone dZone = hqlzone.new(
box.new(
na
, na
, na
, na
, bgcolor = color.new(toplvl, 70)
, border_color = na
)
, box.new(
na
, na
, na
, na
, bgcolor = color.new(midlvl, 70)
, border_color = na
)
, box.new(
na
, na
, na
, na
, bgcolor = color.new(btmlvl, 70)
, border_color = na
)
, label.new(na, na, text = "Premium" , color = invcol, textcolor = toplvl, style = label.style_label_down, size = size.small)
, label.new(na, na, text = "Equilibrium", color = invcol, textcolor = midlvl, style = label.style_label_left, size = size.small)
, label.new(na, na, text = "Discount" , color = invcol, textcolor = btmlvl, style = label.style_label_up , size = size.small)
)
dZone.pbx.set_lefttop(int(math.max(phl.topx, phl.bottomx)) , phl.tup)
dZone.pbx.set_rightbottom(b.n + 50 , 0.95 * phl.tup + 0.05 * phl.tdn)
dZone.ebx.set_lefttop(int(math.max(phl.topx, phl.bottomx)), 0.525 * phl.tup + 0.475 * phl.tdn)
dZone.ebx.set_rightbottom(b.n + 50 , 0.525 * phl.tdn + 0.475 * phl.tup)
dZone.lbx.set_lefttop(int(math.max(phl.topx, phl.bottomx)), 0.95 * phl.tdn + 0.05 * phl.tup)
dZone.lbx.set_rightbottom(b.n + 50 , phl.tdn)
dZone.plb.set_xy( int(math.avg(math.max(phl.topx, phl.bottomx), int(b.n + 50))) , phl.tup)
dZone.elb.set_xy( int(b.n + 50) , math.avg(phl.tup, phl.tdn))
dZone.lbl.set_xy( int(math.avg(math.max(phl.topx, phl.bottomx), int(b.n + 50))) , phl.tdn)
if show_mtb
upphl (trend)
dnphl (trend)
hqlzone()
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - Volumetric Order Block }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
method eB(box b, bool ext, color css, bool swing) =>
b.unshift(
box.new(
na
, na
, na
, na
, xloc = xloc.bar_time
, text_font_family = font.family_monospace
, extend = ext ? extend.right : extend.none
, border_color = swing ? color.new(css, 0) : color.new(color.white,100)
, bgcolor = css
, border_width = 1
)
)
method eL(line l, bool ext, bool solid, color css) =>
l.unshift(
line.new(
na
, na
, na
, na
, width = 1
, color = css
, xloc = xloc.bar_time
, extend = ext ? extend.right : extend.none
, style = solid ? line.style_solid : line.style_dashed
)
)
method drawVOB(bool cdn, bool bull, color css, int loc, bool swing) =>
= request.security(
syminfo.tickerid
, ""
,
, lookahead = barmerge.lookahead_off
)
var obC obj = obC.new(
array.new()
, array.new()
, array.new< int >()
, array.new()
, array.new()
, array.new()
, array.new< int >()
, array.new< int >()
, array.new< int >()
, array.new< int >()
, array.new()
, array.new()
, array.new< int >()
)
var obD draw = obD.new(
array.new()
, array.new()
, array.new()
, array.new()
, array.new()
)
if barstate.isfirst
for i = 0 to ob_num - 1
draw.mL .eL(false, false, use_grayscale ? color.new(color.gray, 0) : color.new(css,0))
draw.ob .eB(false, use_grayscale ? color.new(color.gray, 90) : css, swing)
draw.blB.eB(false, css_metric_up , swing)
draw.brB.eB(false, css_metric_dn , swing)
draw.eOB.eB(true , use_grayscale ? color.new(color.gray, 90) : css, swing)
float pos = ob_pos == "Full"
? (bull ? high : low)
: ob_pos == "Middle"
? ohlc4
: ob_pos == "Accurate"
? hl2
: hl2
if cdn
obj.h.clear()
obj.l.clear()
obj.n.clear()
for i = 0 to math.abs((loc - b.n)) - 1
obj.h.push(hH )
obj.l.push(lL )
obj.n.push(b.t )
// obj.h.reverse()
// obj.l.reverse()
int iU = obj.l.indexof(obj.l.min()) + 1
int iD = obj.h.indexof(obj.h.max()) + 1
obj.dir.unshift(
bull
? (b.c > b.o ? 1 : -1)
: (b.c > b.o ? 1 : -1)
)
obj.top.unshift(
bull
? pos
: obj.h.max()
)
obj.btm.unshift(
bull
? obj.l.min()
: pos
)
obj.left.unshift(
bull
? obj.n.get(obj.l.indexof(obj.l.min()))
: obj.n.get(obj.h.indexof(obj.h.max()))
)
obj.avg.unshift(
math.avg(obj.top.first(), obj.btm.first())
)
obj.cV.unshift(
bull
? b.v
: b.v
)
if ob_pos == "Precise"
switch bull
true =>
if obj.avg.get(0) < (b.c < b.o ? b.c : b.o ) and obj.top.get(0) > hlcc4
obj.top.set(0, obj.avg.get(0))
obj.avg.set(0, math.avg(obj.top.first(), obj.btm.first()))
false =>
if obj.avg.get(0) > (b.c < b.o ? b.o : b.c ) and obj.btm.get(0) < hlcc4
obj.btm.set(0, obj.avg.get(0))
obj.avg.set(0, math.avg(obj.top.first(), obj.btm.first()))
obj.blVP.unshift ( 0 )
obj.brVP.unshift ( 0 )
obj.wM .unshift ( 1 )
if use_overlap
int rmP = use_overlap_method == "Recent" ? 1 : 0
if obj.avg.size() > 1
if bull
? obj.btm.first() < obj.top.get(1)
: obj.top.first() > obj.btm.get(1)
obj.wM .remove(rmP)
obj.cV .remove(rmP)
obj.dir .remove(rmP)
obj.top .remove(rmP)
obj.avg .remove(rmP)
obj.btm .remove(rmP)
obj.left .remove(rmP)
obj.blVP .remove(rmP)
obj.brVP .remove(rmP)
if barstate.isconfirmed
for x = 0 to ob_num - 1
tg = switch ob_mitigation
"Middle" => obj.avg
"Absolute" => bull ? obj.btm : obj.top
for in tg
if (bull ? cC < pt : cC > pt)
obj.wM .remove(idx)
obj.cV .remove(idx)
obj.dir .remove(idx)
obj.top .remove(idx)
obj.avg .remove(idx)
obj.btm .remove(idx)
obj.left .remove(idx)
obj.blVP .remove(idx)
obj.brVP .remove(idx)
if barstate.islast
if obj.avg.size() > 0
// Alert
if bull
? ta.crossunder(low , obj.top.get(0))
: ta.crossover (high, obj.btm.get(0))
switch bull
true => blalert.obtouch := true
false => bralert.obtouch := true
float tV = 0
obj.dV.clear()
seq = math.min(ob_num - 1, obj.avg.size() - 1)
for j = 0 to seq
tV += obj.cV.get(j)
if j == seq
for y = 0 to seq
obj.dV.unshift(
math.floor(
(obj.cV.get(y) / tV) * 100)
)
obj.dV.reverse()
for i = 0 to math.min(ob_num - 1, obj.avg.size() - 1)
dmL = draw.mL .get(i)
dOB = draw.ob .get(i)
dblB = draw.blB.get(i)
dbrB = draw.brB.get(i)
deOB = draw.eOB.get(i)
dOB.set_lefttop (obj.left .get(i) , obj.top.get(i))
deOB.set_lefttop (b.t , obj.top.get(i))
dOB.set_rightbottom (b.t , obj.btm.get(i))
deOB.set_rightbottom(b.t + (b.t - b.t ) * 100 , obj.btm.get(i))
if use_middle_line
dmL.set_xy1(obj.left.get(i), obj.avg.get(i))
dmL.set_xy2(b.t , obj.avg.get(i))
if ob_metrics_show
dblB.set_lefttop (obj.left.get(i), obj.top.get(i))
dbrB.set_lefttop (obj.left.get(i), obj.avg.get(i))
dblB.set_rightbottom(obj.left.get(i), obj.avg.get(i))
dbrB.set_rightbottom(obj.left.get(i), obj.btm.get(i))
rpBL = dblB.get_right()
rpBR = dbrB.get_right()
dbrB.set_right(rpBR + (b.t - b.t ) * obj.brVP.get(i))
dblB.set_right(rpBL + (b.t - b.t ) * obj.blVP.get(i))
if use_show_metric
txt = switch
obj.cV.get(i) >= 1000000000 => str.tostring(math.round(obj.cV.get(i) / 1000000000,3)) + "B"
obj.cV.get(i) >= 1000000 => str.tostring(math.round(obj.cV.get(i) / 1000000,3)) + "M"
obj.cV.get(i) >= 1000 => str.tostring(math.round(obj.cV.get(i) / 1000,3)) + "K"
obj.cV.get(i) < 1000 => str.tostring(math.round(obj.cV.get(i)))
deOB.set_text(
str.tostring(
txt + " (" + str.tostring(obj.dV.get(i)) + "%)")
)
deOB.set_text_size (size.auto)
deOB.set_text_halign(text.align_left)
deOB.set_text_color (use_grayscale ? color.silver : color.new(css, 0))
if ob_metrics_show and barstate.isconfirmed
if obj.wM.size() > 0
for i = 0 to obj.avg.size() - 1
switch obj.dir.get(i)
1 =>
switch obj.wM.get(i)
1 => obj.blVP.set(i, obj.blVP.get(i) + 1), obj.wM.set(i, 2)
2 => obj.blVP.set(i, obj.blVP.get(i) + 1), obj.wM.set(i, 3)
3 => obj.brVP.set(i, obj.brVP.get(i) + 1), obj.wM.set(i, 1)
-1 =>
switch obj.wM.get(i)
1 => obj.brVP.set(i, obj.brVP.get(i) + 1), obj.wM.set(i, 2)
2 => obj.brVP.set(i, obj.brVP.get(i) + 1), obj.wM.set(i, 3)
3 => obj.blVP.set(i, obj.blVP.get(i) + 1), obj.wM.set(i, 1)
var hN = array.new(1, b.n)
var lN = array.new(1, b.n)
var hS = array.new(1, b.n)
var lS = array.new(1, b.n)
if iH
hN.pop()
hN.unshift(int(b.n ))
if iL
lN.pop()
lN.unshift(int(b.n ))
if sH
hS.pop()
hS.unshift(int(b.n ))
if sL
lS.pop()
lS.unshift(int(b.n ))
if ob_show
bull_ob.drawVOB(true , ob_bull_css, hN.first(), false)
bear_ob.drawVOB(false, ob_bear_css, lN.first(), false)
if ob_swings
s_bull_ob.drawVOB(true , css_swing_up, hS.first(), true)
s_bear_ob.drawVOB(false, css_swing_dn, lS.first(), true)
if bull_ob
blalert.ob := true
if bear_ob
bralert.ob := true
if s_bull_ob
blalert.swingob := true
if s_bear_ob
blalert.swingob := true
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - FVG | VI | OG }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
ghl() => request.security(syminfo.tickerid, fvg_tf, [high , low , close , open ])
tfG() => request.security(syminfo.tickerid, fvg_tf, )
cG(bool bull) =>
= ghl()
= tfG()
var FVG draw = FVG.new(
array.new()
, array.new()
)
var FVG cords = array.new()
float pup = na
float pdn = na
bool cdn = na
int pos = 2
cc = timeframe.change(fvg_tf)
if barstate.isfirst
for i = 0 to fvg_num - 1
draw.box.unshift(box.new (na, na, na, na, border_color = color.new(color.white, 100), xloc = xloc.bar_time))
draw.ln.unshift (line.new(na, na, na, na, xloc = xloc.bar_time, width = 1, style = line.style_solid))
switch what_fvg
"FVG" =>
pup := bull ? gl : l
pdn := bull ? h : gh
cdn := bull ? gl > h and cc : gh < l and cc
pos := 2
"VI" =>
pup := bull
? (gc > go
? go
: gc)
: (gc > go
? go
: gc )
pdn := bull
? (gc > go
? gc
: go )
: (gc > go
? gc
: go)
cdn := bull
? go > gc and gh >
Thirdeyechart Global Gold PercentageThe global gold percentage – Percentage Change Indicator is a TradingView tool developed to help traders monitor multiple currency pairs and precious metals in one glance. This indicator was coded personally, using custom formulas to calculate the percentage change for each symbol over selected timeframes, making it unique and fully tailored to individual analysis needs.
Users can input any symbols they wish to track as a comma-separated list, making it highly flexible. The script automatically calculates percentage changes for Daily (D), 1-Hour (H1), and 4-Hour (H4) timeframes. Positive changes are highlighted in blue and negative changes in red, allowing for an instant visual representation of market movements. The table updates in real-time, giving traders immediate feedback without needing to switch between charts.
Designed with simplicity and functionality in mind, this indicator is ideal for intraday traders, swing traders, or anyone who wants to keep an eye on multiple markets efficiently. It works for currency pairs, metals like gold (XAUUSD, XAUJPY), or any TradingView-available symbol. The table is positioned at the top-right corner of the chart and automatically adapts to the number of symbols entered.
This script is purely informational and educational, providing a clear view of price movements but not offering buy or sell signals. Traders should perform their own analysis and risk management before making any trading decisions.
Disclaimer / Copyright:
© 2025 Thirdeyechart. All rights reserved. This indicator is for educational and informational purposes only. The author is not responsible for any trading losses or financial decisions made based on this script. Redistribution, copying, or commercial use of this code without permission is strictly prohibited.
Fast RSI with Divergence, Signal and Volume Spike1. This is fast RSI, with configurable left and right lookback bars
2. Signal on lower band crossover and upper band crossunder
3. Volume Spike indication with configurable average volume multiplier.
Hold targets when you see higher than average volume spike.
EMA 50/200 Signals with Price-Arrows✔ Plots EMA 50 and EMA 200
✔ Displays arrows when a crossover occurs (signals)
✔ Creates alerts for TradingView
✔ Works for crypto, forex, and stocks
Thirdeyechart Volume Gold//@version=6
indicator("MT5 Style Quotes – Custom Pair Table", overlay=true, max_labels_count=500)
// ==== USER INPUTS ====
// Masukkan pair tambahan kat sini (pisahkan dengan koma)
extraPairsInput = input.string("XAUUSD,XAUJPY,USDJPY,EURJPY", "Custom Pairs (comma separated)")
// Convert input → array
string extraPairs = str.split(extraPairsInput, ",")
// Function kira % change
f_change(sym, tf) =>
o = request.security(sym, tf, open)
c = request.security(sym, tf, close)
pct = ((c - o) / o) * 100
pct
// Table setup
rowCount = array.size(extraPairs) + 1
var tbl = table.new(position.top_right, 4, rowCount, border_width=1)
// Header row
table.cell(tbl, 0, 0, "Symbol", bgcolor=color.new(color.white, 90))
table.cell(tbl, 1, 0, "Day %", bgcolor=color.new(color.white, 90))
table.cell(tbl, 2, 0, "H1 %", bgcolor=color.new(color.white, 90))
table.cell(tbl, 3, 0, "H4 %", bgcolor=color.new(color.white, 90))
// Loop setiap pair
for i = 0 to array.size(extraPairs)-1
sym = str.trim(array.get(extraPairs, i))
day = f_change(sym, "D")
h1 = f_change(sym, "60")
h4 = f_change(sym, "240")
col_day = day >= 0 ? color.blue : color.red
col_h1 = h1 >= 0 ? color.blue : color.red
col_h4 = h4 >= 0 ? color.blue : color.red
table.cell(tbl, 0, i+1, sym)
table.cell(tbl, 1, i+1, str.tostring(day, format.percent), text_color=col_day)
table.cell(tbl, 2, i+1, str.tostring(h1, format.percent), text_color=col_h1)
table.cell(tbl, 3, i+1, str.tostring(h4, format.percent), text_color=col_h4)
EMA 50/200 Strategy Signals - Axis.BhpEMA 50/200 Strategy
Plots EMA 50 and EMA 200
Displays arrows when a crossover occurs (signals)
Creates alerts for TradingView
Works for crypto, forex, and stocks
Fractals Trend [BigBeluga]🔵 OVERVIEW
Fractals Trend is a trend-following overlay that leverages fractal swing points to define dynamic support and resistance zones. By storing and averaging recent high and low fractals, it determines trend direction and plots a smooth band that flips depending on market bias—displaying support during uptrends and resistance during downtrends .
🔵 CONCEPTS
Fractal Swings: Fractals are identified using a customizable length. A high fractal forms when the current high is the highest in a range; a low fractal when the current low is the lowest.
Fractal Memory: The indicator keeps a rolling window of recent high and low fractals inside arrays, limited by the user-defined storage quantity.
switch
upperF => FracrtalsUpper.push(high )
lowerF => FracrtalsLower.push(low )
FracrtalsUpper.size() > fCount => FracrtalsUpper.shift()
FracrtalsLower.size() > fCount => FracrtalsLower.shift()
Trend Detection: Price crossing above the average, min/max or median high fractals signals an uptrend; crossing below average, min/max or median low fractals signals a downtrend.
Dynamic Band Plotting: Depending on the trend, the script plots the average of either the upper or lower fractals as a trailing support or resistance line.
Visual Confirmation: Fractal labels appear as triangle markers at highs and lows, providing additional structural context.
🔵 FEATURES
Automatically detects high and low fractals using customizable length.
Stores a defined number of fractals to smooth out noise and reduce false signals.
Flips trend bias dynamically with colored band and smooth transitions.
Plots fractal-based support in bullish trends, resistance in bearish trends.
Triangle markers show real-time fractal highs and lows.
Fully configurable visuals, color themes, and fractal detection logic.
Clean, non-intrusive overlay that works on any market or timeframe.
🔵 HOW TO USE
Use the colored band as a directional filter: green = uptrend (support), orange = downtrend (resistance).
Combine with entry signals or break/retest strategies when price approaches the band.
Use triangle markers to confirm structural swing points.
Adjust Fractals Length to tune sensitivity—shorter values detect quicker shifts, longer values reduce noise.
Change the fractal bands type to adapt trend detection to different market conditions.
Use in conjunction with momentum or volume tools for confluence.
🔵 CONCLUSION
Fractals Trend offers a lightweight, intuitive way to track market bias using price structure alone. Its smart switching logic and clean visuals make it a powerful tool for trend traders seeking structure-based dynamic S/R—without laggy moving averages or overcomplicated signals.
jhehli LiquidityWhat are BSL and SSL?
In the context of Smart Money Concepts, liquidity simply refers to pending orders—specifically Stop Losses and Buy/Sell Stop orders—resting above old highs and below old lows.
BSL (Buy-Side Liquidity): This is found above Swing Highs. Retail traders who are short the market will place their "Buy Stop" protective orders here. Additionally, breakout traders place "Buy Limit" orders here. Smart Money views this area as a pool of willing buyers. To fill large sell orders, institutions must drive price up into this liquidity to pair their massive sell interest with these buy stops.
SSL (Sell-Side Liquidity): This is found below Swing Lows. Retail traders who are long the market place their "Sell Stop" protective orders here. Smart Money targets these levels to accumulate long positions. They need the market to sell off into these levels so they can buy from the willing sellers at a discount.
How this Indicator Works
This tool automates the process of market structure analysis by identifying key Swing Highs and Swing Lows.
Detection: It scans price action to find fractal highs and lows (classic swing points) where price has rejected a level.
Visualization: It projects a line from these points, clearly marking where the "stops" are likely residing.
Liquidity Raids: When price pierces these levels, it is considered a "Liquidity Raid" or "Stop Hunt."
How to Use This in Your Trading
Do not treat these lines simply as Support and Resistance. In the ICT methodology, old highs and lows are targets, not barriers.
For Reversals: Wait for a "Turtle Soup" or "Judas Swing." This occurs when price aggressively expands into a BSL or SSL level to trigger stops, only to quickly reverse back into the trading range. This indicates that Smart Money has finished their accumulation or distribution.
For Bias: If the higher timeframe trend is Bullish, expect SSL to be raided to fuel the move, while BSL becomes the target (Draw on Liquidity).
By using this indicator, you remove the guesswork of manually marking every swing point, allowing you to focus on price action and the reaction at these critical liquidity pools.
EP CPR Future CPR + 4 MA
1. CPR Trend Direction(Bias):
Bullish: If the current day's price is trading above the TC, it suggests a strong bullish trend where the CPR acts as a support zone.
Bearish: If the current day's price is trading below the BC, it suggests a strong bearish trend where the CPR acts as a resistance zone.
Range-Bound/Consolidation: If the price is trading within the CPR lines, it indicates a lack of clear directional bias and suggests a likely sideways or accumulation phase.
2. Moving average Trend Identification
Uptrend: If the price is above a moving average (and the MA line is sloping up), it confirms a bullish trend.
Downtrend: If the price is below a moving average (and the MA line is sloping down), it confirms a bearish trend.
Crossovers (Trading Signals)
A popular strategy involves using two moving averages—a short-term MA (e.g., 50-period) and a long-term MA (e.g., 200-period).
Golden Cross (Bullish Signal): Occurs when the shorter-term MA crosses above the longer-term MA.
Death Cross (Bearish Signal): Occurs when the shorter-term MA crosses below the longer-term MA.
BTC Dual Cycle: Stats DashboardOverview
"Price takes the elevator down, but takes the stairs up."
This indicator is a macro-analysis tool designed to visualize the true duration of Bitcoin’s market cycles. Unlike standard oscillators that focus on short-term price action, the Macro Cycle Tracker filters out the noise to answer two fundamental questions:
Are we in a phase of Expansion (Price Discovery)?
Are we in a phase of Recovery (Repairing the damage of a crash)?
It visually separates the market into two distinct regimes based on a configurable drawdown threshold (default: -50%) and provides real-time statistics on how long these phases historically last.
How It Works
The script tracks the All-Time High (ATH) and divides market history into two colored zones:
🟢 The Green Zone (Expansion / Price Discovery)
Trigger: Starts immediately when Bitcoin breaks the previous ATH.
Meaning: The market is healthy, profitable, and exploring new valuation levels.
End: The zone ends when price drops by 50% (configurable) from the cycle top.
🔴 The Red Zone (Recovery / Capitulation)
Trigger: Starts when price drops below the 50% threshold from the peak.
Meaning: The asset is "underwater." This zone remains active persistently—even during relief rallies—until the previous ATH is fully reclaimed.
Philosophy: A cycle is not over until the damage is repaired.
Key Features
Cycle Timer: Displays the exact number of days passed for every historical cycle directly on the chart.
Live Counter: Shows the current duration of the active phase (e.g., "ZONE GREEN: 450 Days...").
Statistical Dashboard: A table in the bottom-right corner automatically calculates the Mean and Median duration (in days) for both Green and Red phases. This allows you to compare the current cycle against historical averages.
How to Use
For Investors (HODLers): Use the Red Zone to understand the "Time Cost" of a bear market. It helps visualize that recovery takes patience and that price action below the old ATH is merely accumulation.
For Analysts: Use the Dashboard statistics to project potential cycle turning points based on historical median durations.
Settings
Drop Percent (%): Default is 50%. This defines the "Crash" threshold. You can adjust this to 20% or 30% for more sensitive cycle detection.
Text Size: Adjust the size of the dashboard text to fit your screen resolution.
Disclaimer: This tool is for educational purposes only and does not constitute financial advice. Past performance is not indicative of future results.
Strict Weekly 50/200 WMA Signals True Weekly Only-Strict Weekly 50/200 WMA Signals True Weekly Only => also on other time frames than weekly (like daily, etc.) always indicates the indicators based on the weekly chart
-especially useful for Crypto
-gives buy and sell signals when the 200 WMA or the 50 WMA are crossed
-typically above the 50 WMA indicates a bull market
-reaching below the 200 WMA indicates a bear market and typically for investors with a longer time frame (>2-4 years) a good entry point
BTC -50% Crash to Recovery ZoneGeneral Overview This is a macro-analysis tool designed to visualize the true duration of Bitcoin’s "Suffering & Recovery Cycles." Unlike standard oscillators that only signal oversold conditions, this script highlights the entire timeline required for the market to flush out leverage and return to All-Time Highs (ATH).
Operational Logic The algorithm tracks Bitcoin’s historical All-Time High (ATH).
The Trigger: It activates automatically when the price drops 50% below the last recorded ATH.
The "Recovery Zone": Once triggered, the chart background turns red (indicating a "Drawdown" state). This zone remains active persistently, even during intermediate relief rallies.
The Reset: The zone deactivates only when the price breaks above the previous ATH, marking the official start of a new Price Discovery phase.
How to Read It
Red Background: We are officially in a Bear Market or Recovery Phase. The asset is technically "underwater." For the long-term investor with a low time preference, this visually defines the accumulation window.
Red Horizontal Line: Indicates the "Target." This is the exact price level of the old ATH that Bitcoin must reclaim to close the bearish cycle.
No Background Color: We are in Price Discovery. The market is healthy and pushing for new highs.
The Financial Lesson This indicator visually demonstrates a fundamental market truth: "Price takes the elevator down, but takes the stairs up." It shows that after a halving of value (-50%), Bitcoin may take months or years to recover previous levels, helping investors filter out the noise of short-term pumps that fail to break the macro-bearish structure.
EMA Trend Pro v1Here is a clear, professional English description you can copy-paste directly (suitable for sharing with friends, investors, brokers, or posting on TradingView):
EMA Trend Pro v5.0 – Strategy Overview
This is a trend-following strategy designed for 15-minute charts on assets like XAUUSD, NASDAQ, BTC, and ETH.
Entry Rules
Buy when the 7, 14, and 21-period EMAs are aligned upward and the 14-period EMA crosses above the 144-period EMA (with ADX > 20 and volume confirmation).
Sell short when the EMAs are aligned downward and the 14-period EMA crosses below the 144-period EMA.
Risk Management
Initial stop-loss is placed at 1.8 × ATR below (long) or above (short) the entry price.
Position size is calculated to risk a fixed percentage of equity per trade.
Profit-Taking & Trade Management
When price reaches 1:1 reward-to-risk, 30% of the position is closed.
At the same moment, the stop-loss for the remaining 70% is moved to the entry price (breakeven).
The remaining position is split:
50% targets 1:2 reward-to-risk
50% targets 1:3 reward-to-risk (allowing big wins during strong trends)
Visualization
Clean colored bars extend to the right showing entry, stop-loss, and three take-profit levels.
Price labels clearly display "Entry", "SL", "TP1 1:1", "TP2 1:2", and "TP3 1:3".
Only the current trade is displayed for a clean chart.
Key Advantages
High win rate due to breakeven protection after 1R
Excellent reward-to-risk ratio that lets winners run
Fully automated, works on any market with clear trends
Professional look, easy to understand and explain
Perfect for swing traders who want consistent profits with limited downside risk.
Feel free to use this description on TradingView, in your trading journal, or when explaining the strategy to others!
If you want a shorter version (e.g., for TradingView description box) or a Chinese version, just let me know — I’ll give it to you right away! 😊
EMA Trend Pro v5.0 5M ONLY — 策略版(1:1出30%+保本)Here is a clear, professional English description you can copy-paste directly (suitable for sharing with friends, investors, brokers, or posting on TradingView):
EMA Trend Pro v5.0 – Strategy Overview
This is a trend-following strategy designed for 15-minute charts on assets like XAUUSD, NASDAQ, BTC, and ETH.
Entry Rules
Buy when the 7, 14, and 21-period EMAs are aligned upward and the 14-period EMA crosses above the 144-period EMA (with ADX > 20 and volume confirmation).
Sell short when the EMAs are aligned downward and the 14-period EMA crosses below the 144-period EMA.
Risk Management
Initial stop-loss is placed at 1.8 × ATR below (long) or above (short) the entry price.
Position size is calculated to risk a fixed percentage of equity per trade.
Profit-Taking & Trade Management
When price reaches 1:1 reward-to-risk, 30% of the position is closed.
At the same moment, the stop-loss for the remaining 70% is moved to the entry price (breakeven).
The remaining position is split:
50% targets 1:2 reward-to-risk
50% targets 1:3 reward-to-risk (allowing big wins during strong trends)
Visualization
Clean colored bars extend to the right showing entry, stop-loss, and three take-profit levels.
Price labels clearly display "Entry", "SL", "TP1 1:1", "TP2 1:2", and "TP3 1:3".
Only the current trade is displayed for a clean chart.
Key Advantages
High win rate due to breakeven protection after 1R
Excellent reward-to-risk ratio that lets winners run
Fully automated, works on any market with clear trends
Professional look, easy to understand and explain
Perfect for swing traders who want consistent profits with limited downside risk.
Feel free to use this description on TradingView, in your trading journal, or when explaining the strategy to others!
If you want a shorter version (e.g., for TradingView description box) or a Chinese version, just let me know — I’ll give it to you right away! 😊
Recursive WMA Angle StrategyDescription: This strategy utilizes a recursive Weighted Moving Average (WMA) calculation to determine the trend direction and strength based on the slope (angle) of the curve. By calculating the angle of the smoothed moving average in degrees, the script filters out noise and aims to enter trades only during strong momentum phases.
How it Works:
Recursive WMA: The script calculates a series of nested WMAs (M1 to M5), creating a very smooth yet responsive curve.
Angle Calculation: It measures the rate of change of this curve over a user-defined lookback period and converts it into an angle (in degrees).
Entry Condition (Long): A long position is opened when the calculated angle exceeds the Min Angle for BUY threshold (default: 0.2), indicating a strong upward trend.
Exit Condition: The position is closed when the angle drops below the Min Angle for SELL threshold (default: -0.2), indicating a sharp trend reversal.
Settings:
MA Settings: Adjust the base lengths for the recursive calculation.
Angle Settings: Fine-tune the sensitivity by changing the Buy/Sell angle thresholds.
Date Filter: Restrict the backtest to a specific date range.
Note: This strategy is designed for Long-Only setups.
Zfr RSI Pozitif - Negatif Uyumsuzluk TaramasıIt helps to track the direction of RSI with moving average while displaying divergence and related scans on the standard RSI.






















