Vertical Lines Every 12 Hours//@version=5
indicator("Vertical Lines Every 12 Hours", overlay=true)
// Get the current time in milliseconds since the Unix epoch
currentTime = time
// Calculate 12 hours in milliseconds (12 hours * 60 minutes/hour * 60 seconds/minute * 1000 milliseconds/second)
twelveHoursInMs = 12 * 60 * 60 * 1000
// Determine the timestamp of the last 12-hour mark
// We use 'time / twelveHoursInMs' to get the number of 12-hour blocks since epoch,
// then multiply by 'twelveHoursInMs' to get the start of the current 12-hour block.
// Adding 'twelveHoursInMs' ensures we plot at the *next* 12-hour mark.
// The modulo operator '%' helps us check if the current bar's time is exactly
// at a 12-hour interval relative to the start of the current day.
// This approach tries to align the lines consistently.
// A more robust way to do this is to check if the hour changes to 00:00 or 12:00 UTC (or your preferred timezone)
// and plot a line then. However, for "every 12 hours" relative to the chart's start,
// a simple time-based check is often sufficient.
// Let's refine the logic to hit specific 12-hour intervals like 00:00 and 12:00 daily (UTC as an example).
// You might need to adjust the timezone based on your chart's time zone settings and your preference.
// Get the hour of the day for the current bar's timestamp
hourOfDay = hour(time, "GMT") // "GMT" for UTC, adjust as needed (e.g., "America/New_York", "Asia/Jerusalem")
// Plot a vertical line if the hour is 0 (midnight) or 12 (noon)
if hourOfDay == 0 or hourOfDay == 12
line.new(x1=bar_index, y1=low, x2=bar_index, y2=high, extend=extend.both, color=color.blue, width=1)
Indikator dan strategi
Fester prozentualer Abstand zum Kursthe indicator delivers a fixed percent distance to the market price, made with AI support
NY opennew york open.
new york open hours of the past two weeks up until two days ahead are shown as vertical lines which is great for both analyzing past data and seeing where would future new york open align with compared to your own future analysis.
10-Period Simple Moving AverageSimple Moving Average 10 Period. Moving average 10 period. SMA. The SMA works on any timeframe (e.g., 1-minute, 1-hour, daily). The 10-period SMA will calculate based on the chart’s timeframe (e.g., 10 minutes on a 1-minute chart, 10 days on a daily chart). If you want to change the SMA period, edit the number in ta.sma(close, 10) to your desired period (e.g., ta.sma(close, 20) for a 20-period SMA).
Candle Range % vs 8-Candle AvgCandle % Indicator – Measure Candle Strength by Range %
**Overview:**
The *Candle % Indicator* helps traders visually and analytically gauge the strength or significance of a price candle relative to its recent historical context. This is particularly useful for detecting breakout moves, volatility shifts, or overextended candles that may signal exhaustion.
**What It Does:**
* Calculates the **percentage range** of the current candle compared to the **average range of the past N candles**.
* Highlights candles that exceed a user-defined threshold (e.g., 150% of the average range).
* Useful for **filtering out extreme candles** that might represent anomalies or unsustainable moves.
* Can be combined with other strategies (like EMA crossovers, support/resistance breaks, etc.) to improve signal quality.
**Use Case Examples:**
***Filter out fakeouts** in breakout strategies by ignoring candles that are overly large and may revert.
***Volatility control**: Avoid entries when market conditions are erratic.
**Confluence**: Combine with EMA or RSI signals for refined entries.
**How to Read:**
* If a candle is larger than the average range by more than the set percentage (default 150%), it's flagged (e.g., no entry signal or optional visual marker).
* Ideal for intraday, swing, or algorithmic trading setups.
**Customizable Inputs:**
**Lookback Period**: Number of previous candles to calculate the average range.
**% Threshold**: Maximum percentage a candle can exceed the average before being filtered or marked.
My script//@version=5
indicator("XAUUSD High Win-Rate Strategy", shorttitle="XAUUSD HWR", overlay=true)
// ============================================================================
// XAUUSD HIGH WIN-RATE STRATEGY INDICATOR
// Based on Dual-Phase Momentum Filter System
// Designed for M1, M5 timeframes with H1/H4 bias confirmation
// ============================================================================
// Input Parameters
ma_length = input.int(55, title="MA Channel Length", minval=1, maxval=200)
atr_length = input.int(14, title="ATR Length", minval=1, maxval=50)
atr_multiplier = input.float(2.5, title="ATR Stop Loss Multiplier", minval=1.0, maxval=5.0, step=0.1)
rr_ratio = input.float(1.5, title="Risk:Reward Ratio", minval=1.0, maxval=3.0, step=0.1)
htf_bias = input.timeframe("60", title="Higher Timeframe for Bias")
show_levels = input.bool(true, title="Show Entry/Exit Levels")
show_signals = input.bool(true, title="Show Buy/Sell Signals")
show_channel = input.bool(true, title="Show MA Channel")
// ============================================================================
// CORE CALCULATIONS
// ============================================================================
// Moving Average Channel (55-period High/Low)
ma_high = ta.sma(high, ma_length)
ma_low = ta.sma(low, ma_length)
// Heiken Ashi Calculations
ha_close = (open + high + low + close) / 4
var float ha_open = na
ha_open := na(ha_open ) ? (open + close) / 2 : (ha_open + ha_close ) / 2
ha_high = math.max(high, math.max(ha_open, ha_close))
ha_low = math.min(low, math.min(ha_open, ha_close))
// Higher Timeframe Bias (200 SMA)
htf_sma200 = request.security(syminfo.tickerid, htf_bias, ta.sma(close, 200), lookahead=barmerge.lookahead_off)
// ATR for Stop Loss Calculation
atr = ta.atr(atr_length)
// RSI for Additional Confirmation
rsi = ta.rsi(close, 14)
// ============================================================================
// SIGNAL LOGIC
// ============================================================================
// Channel Filter - No trades when price is within the channel
in_channel = close > ma_low and close < ma_high
outside_channel = not in_channel
// Heiken Ashi Color
ha_bullish = ha_close > ha_open
ha_bearish = ha_close < ha_open
// Higher Timeframe Bias
htf_bullish = close > htf_sma200
htf_bearish = close < htf_sma200
// Entry Conditions
long_condition = outside_channel and close > ma_high and ha_bullish and htf_bullish
short_condition = outside_channel and close < ma_low and ha_bearish and htf_bearish
// Entry Signals (only on bar close to avoid repainting)
long_signal = long_condition and not long_condition
short_signal = short_condition and not short_condition
// ============================================================================
// TRADE LEVELS CALCULATION
// ============================================================================
var float entry_price = na
var float stop_loss = na
var float take_profit = na
var string trade_direction = na
// Calculate levels for new signals
if long_signal
entry_price := close
stop_loss := close - (atr * atr_multiplier)
take_profit := close + ((close - stop_loss) * rr_ratio)
trade_direction := "LONG"
if short_signal
entry_price := close
stop_loss := close + (atr * atr_multiplier)
take_profit := close - ((stop_loss - close) * rr_ratio)
trade_direction := "SHORT"
// ============================================================================
// VISUAL ELEMENTS
// ============================================================================
// MA Channel - Store plot IDs for fill function
ma_high_plot = plot(show_channel ? ma_high : na, color=color.blue, linewidth=1, title="MA High")
ma_low_plot = plot(show_channel ? ma_low : na, color=color.red, linewidth=1, title="MA Low")
// Fill the channel
fill(ma_high_plot, ma_low_plot, color=color.new(color.gray, 90), title="MA Channel")
// Higher Timeframe SMA200
plot(htf_sma200, color=color.purple, linewidth=2, title="HTF SMA200")
// Entry Signals
plotshape(show_signals and long_signal, title="Long Signal", location=location.belowbar,
style=shape.triangleup, size=size.normal, color=color.green)
plotshape(show_signals and short_signal, title="Short Signal", location=location.abovebar,
style=shape.triangledown, size=size.normal, color=color.red)
// Trade Levels
entry_plot = plot(show_levels and not na(entry_price) ? entry_price : na,
color=color.yellow, linewidth=2, style=line.style_dashed, title="Entry Price")
stop_plot = plot(show_levels and not na(stop_loss) ? stop_loss : na,
color=color.red, linewidth=2, style=line.style_dotted, title="Stop Loss")
target_plot = plot(show_levels and not na(take_profit) ? take_profit : na,
color=color.green, linewidth=2, style=line.style_dotted, title="Take Profit")
// ============================================================================
// ALERTS
// ============================================================================
// Alert Conditions
alertcondition(long_signal, title="Long Entry Signal",
message="XAUUSD Long Entry: Price={{close}}, SL=" + str.tostring(stop_loss) + ", TP=" + str.tostring(take_profit))
alertcondition(short_signal, title="Short Entry Signal",
message="XAUUSD Short Entry: Price={{close}}, SL=" + str.tostring(stop_loss) + ", TP=" + str.tostring(take_profit))
// ============================================================================
// INFORMATION TABLE
// ============================================================================
if barstate.islast and show_levels
var table info_table = table.new(position.top_right, 2, 8, bgcolor=color.white, border_width=1)
table.cell(info_table, 0, 0, "XAUUSD Strategy Info", text_color=color.black, text_size=size.normal)
table.cell(info_table, 1, 0, "", text_color=color.black)
table.cell(info_table, 0, 1, "Current Price:", text_color=color.black)
table.cell(info_table, 1, 1, str.tostring(close, "#.##"), text_color=color.black)
table.cell(info_table, 0, 2, "ATR (14):", text_color=color.black)
table.cell(info_table, 1, 2, str.tostring(atr, "#.##"), text_color=color.black)
table.cell(info_table, 0, 3, "RSI (14):", text_color=color.black)
table.cell(info_table, 1, 3, str.tostring(rsi, "#.##"), text_color=color.black)
table.cell(info_table, 0, 4, "HTF Bias:", text_color=color.black)
table.cell(info_table, 1, 4, htf_bullish ? "BULLISH" : "BEARISH",
text_color=htf_bullish ? color.green : color.red)
table.cell(info_table, 0, 5, "In Channel:", text_color=color.black)
table.cell(info_table, 1, 5, in_channel ? "YES" : "NO",
text_color=in_channel ? color.red : color.green)
if not na(trade_direction)
table.cell(info_table, 0, 6, "Last Signal:", text_color=color.black)
table.cell(info_table, 1, 6, trade_direction,
text_color=trade_direction == "LONG" ? color.green : color.red)
table.cell(info_table, 0, 7, "Risk/Reward:", text_color=color.black)
table.cell(info_table, 1, 7, "1:" + str.tostring(rr_ratio, "#.#"), text_color=color.black)
// ============================================================================
// BACKGROUND COLORING
// ============================================================================
// Color background based on trend and channel status
bg_color = color.new(color.white, 100)
if htf_bullish and not in_channel
bg_color := color.new(color.green, 95)
else if htf_bearish and not in_channel
bg_color := color.new(color.red, 95)
else if in_channel
bg_color := color.new(color.yellow, 95)
bgcolor(bg_color, title="Background Trend Color")
// ============================================================================
// STRATEGY NOTES
// ============================================================================
// This indicator implements the Dual-Phase Momentum Filter System:
// 1. MA Channel Filter: Avoids trades when price is between 55-period high/low MAs
// 2. Heiken Ashi Confirmation: Requires momentum alignment for entries
// 3. Higher Timeframe Bias: Uses 200 SMA on higher timeframe for direction
// 4. ATR-based Risk Management: Dynamic stop losses based on volatility
// 5. Fixed Risk:Reward Ratio: Consistent 1:1.5 profit targets
//
// Usage Instructions:
// 1. Apply to M1 or M5 timeframe for optimal signals
// 2. Set higher timeframe to H1 or H4 for bias confirmation
// 3. Wait for signals outside the MA channel
// 4. Enter trades only when all conditions align
// 5. Use provided stop loss and take profit levels
// 6. Risk no more than 0.5% of account per trade
//
// Best Trading Sessions: Asian and New York
// Avoid: Low liquidity periods and major news events
Dynamic RSIThis script is now updated to show the background fill as green and red for bullish and bearish periods
m1-m2This is an economics indicator, showing CNM1 YoY, CNM2 YoY, and CNM1 YoY - CNM2 YoY.
When it increases, the economy most likely improves;
When it decreases, the economy most likely declines.
TradersPostDeluxeLibrary "TradersPostDeluxe"
TradersPost integration. It's currently not very deluxe
SendEntryAlert(ticker, action, quantity, orderType, takeProfit, stopLoss, id, price, timestamp, timezone)
Sends an alert to TradersPost to trigger an Entry
Parameters:
ticker (string) : Symbol to trade. Default is syminfo.ticker
action (series Action) : TradersPostAction (.buy, .sell) default = buy
quantity (float) : Amount to trade, default = 1
orderType (series OrderType) : TradersPostOrderType, default =e TradersPostOrderType.market
takeProfit (float) : Take profit limit price
stopLoss (float) : Stop loss price
id (string) : id for the trade
price (float) : Expected price
timestamp (int) : Time of the trade for reporting, defaults to timenow
timezone (string) : associated with the time, defaults to syminfo.timezone
Returns: Nothing
SendExitAlert(ticker, price, timestamp, timezone)
Sends an alert to TradersPost to trigger an Exit
Parameters:
ticker (string) : Symbol to flatten
price (float) : Documented planned price
timestamp (int) : Time of the trade for reporting, defaults to timenow
timezone (string) : associated with the time, defaults to syminfo.timezone
Returns: Nothing
Z-Score Mean Reversion (EURUSD)Made by Laila
Works best on 1 min/5 min timeframe ( 68% winrate)
Z-Score Mean Reversion Indicator (EURUSD)
This Pine Script indicator identifies potential buy and sell opportunities based on Z-score mean reversion for the EUR/USD pair.
The Z-score is calculated by comparing the current price to its simple moving average (SMA), measured in terms of standard deviations. If the price deviates significantly from the average—either above or below—it may revert back toward the mean.
A buy signal is generated when the Z-score drops below -2, suggesting the price is abnormally low and may rise. A sell signal is triggered when the Z-score rises above +2, indicating the price is unusually high and may fall.
On the chart, the script plots the Z-score along with horizontal lines at +2, -2, and 0. Green and red arrows highlight potential buy and sell points based on these thresholds.
CGMALibrary "CGMA"
This library provides a function to calculate a moving average based on Chebyshev-Gauss Quadrature. This method samples price data more intensely from the beginning and end of the lookback window, giving it a unique character that responds quickly to recent changes while also having a long "memory" of the trend's start. Inspired by reading rohangautam.github.io
What is Chebyshev-Gauss Quadrature?
It's a numerical method to approximate the integral of a function f(x) that is weighted by 1/sqrt(1-x^2) over the interval . The approximation is a simple sum: ∫ f(x)/sqrt(1-x^2) dx ≈ (π/n) * Σ f(xᵢ) where xᵢ are special points called Chebyshev nodes.
How is this applied to a Moving Average?
A moving average can be seen as the "mean value" of the price over a lookback window. The mean value of a function with the Chebyshev weight is calculated as:
Mean = /
The math simplifies beautifully, resulting in the mean being the simple arithmetic average of the function evaluated at the Chebyshev nodes:
Mean = (1/n) * Σ f(xᵢ)
What's unique about this MA?
The Chebyshev nodes xᵢ are not evenly spaced. They are clustered towards the ends of the interval . We map this interval to our lookback period. This means the moving average samples prices more intensely from the beginning and the end of the lookback window, and less intensely from the middle. This gives it a unique character, responding quickly to recent changes while also having a long "memory" of the start of the trend.
Internal Bar Strength (IBS)This script calculates the Internal Bar Strength (IBS), a mean-reversion indicator defined as (Close - Low) / (High - Low). IBS values range from 0 to 1, with lower values indicating potential oversold conditions and higher values suggesting overbought conditions. Useful for intraday reversal strategies.
Scalping Edge StrategyScalping Edge Strategy
Major exchanges: OKX, KuCoin, Bybit
Trading Checklist
- Is volatility and liquidity present?
- Are indicators aligned?
- Is entry clean?
- Is SL/TP defined before entry?
EMA20-EMA50 DifferenceThe indicator shows whether the EMA20 is above or below the EMA50.
If the curve is above the zero line, the EMA20 is above the EMA50.
If the curve is below the zero line, the EMA20 is below the EMA50.
The greater the distance from the zero line is, the further apart the EMA20 and EMA50 are.
Smart Bar Counter with Alerts🚀 Smart Bar Counter with Alerts 🚀
-----------------------------------------------------
Overview
-----------------------------------------------------
Ever wanted to count a specific number of bars from a key point on your chart—such as after a Break of Structure (BOS), the start of a new trading session, or from any point of interest— without having to stare at the screen?
This "Smart Bar Counter" indicator was created to solve this exact problem. It's a simple yet powerful tool that allows you to define a custom "Start Point" and a "Target Bar Count." Once the target count is reached, it can trigger an Alert to notify you immediately.
-----------------------------------------------------
Key Features
-----------------------------------------------------
• Manual Start Point: Precisely select the date and time from which you want the count to begin, offering maximum flexibility in your analysis.
• Custom Bar Target: Define exactly how many bars you want to count, whether it's 50, 100, or 200 bars.
• On-Chart Display: A running count is displayed on each bar after the start time, allowing you to visually track the progress.
• Automatic Alerts: Set up alerts to be notified via TradingView's various channels (pop-up, mobile app, email) once the target count is reached.
-----------------------------------------------------
How to Use
-----------------------------------------------------
1. Add this indicator to your chart.
2. Go to the indicator's Settings (Gear Icon ⚙️).
- Select Start Time: Set the date and time you wish to begin counting.
- Number of Bars to Count: Input your target number.
3. Set up the Alert ( Very Important! ).
- Right-click on the chart > Select " Add alert ."
- In the " Condition " dropdown, select this indicator: Smart Bar Counter with Alerts .
- In the next dropdown, choose the available alert condition.
- Set " Options " to Once Per Bar Close .
- Choose your desired notification methods under " Alert Actions ."
- Click " Create ."
-----------------------------------------------------
Use Cases
-----------------------------------------------------
• Post-Event Analysis: Count bars after a key event like a Break of Structure (BOS) or Change of Character (CHoCH) to observe subsequent price action.
• Time-based Analysis: Use it to count bars after a market open for a specific session (e.g., London, New York).
• Strategy Backtesting: Useful for testing trading rules that are based on time or a specific number of bars.
-----------------------------------------------------
Final Words
-----------------------------------------------------
Hope you find this indicator useful for your analysis and trading strategies! Feel free to leave comments or suggestions below.
BreakoutLibrary "Breakout"
init()
method run(state, opts)
Namespace types: BreakoutState
Parameters:
state (BreakoutState)
opts (BreakoutOpts)
BreakoutState
Fields:
levelUps (array)
levelDowns (array)
levelUpTargets (array)
levelDownTargets (array)
levelUpConfirmed (array)
levelDownConfirmed (array)
levelUpNumLevels (array)
levelDownNumLevels (array)
breakoutSignalUp (series bool)
breakoutSignalDown (series bool)
BreakoutOpts
Fields:
canConfirmUp (series bool)
canConfirmDown (series bool)
numLevelMinToConfirm (series int)
numLevelMaxToConfirm (series int)
zigZagPeriod (series int)
rsi (series float)
rsiMA (series float)
Lucy – 3-Bar Reversal with EMA50 Trend Filter📛 Lucy – 3-Bar Reversal with EMA50 Trend Filter
Purpose:
To detect and highlight bullish and bearish 3-bar reversal patterns on the chart, but only when they align with the dominant trend, defined by the EMA 50.
✅ How It Works
🟢 Bullish 3-Bar Reversal (Buy Setup):
Bar 1 is bearish (close < open)
Bar 2 makes a lower low than Bar 1
Bar 3 is bullish (close > open) and closes above Bar 2’s high
Price must be above EMA 50 (trend filter)
✅ Result: Shows a green triangle below the bar
🔴 Bearish 3-Bar Reversal (Sell Setup):
Bar 1 is bullish (close > open)
Bar 2 makes a higher high than Bar 1
Bar 3 is bearish (close < open) and closes below Bar 2’s low
Price must be below EMA 50
✅ Result: Shows a red triangle above the bar
📊 What It Plots:
🔼 Green triangle below bullish signal bar
🔽 Red triangle above bearish signal bar
🟠 Orange line = EMA50 (trend filter)
🔔 Built-in Alerts:
You’ll get an alert if:
A bullish reversal pattern forms above EMA50
A bearish reversal pattern forms below EMA50
🧠 Use Cases:
Great for trend-following traders who want clean, price-action entries
Works well on intraday (15m/1h) or swing (4h/daily) timeframes
Can be used for manual entries, or converted to strategy for automation
quanstocThe quanstoc2 indicator is designed to detect rare and potentially high-probability reversal or trend initiation signals using Stochastic RSI. It identifies a double cross event: two consecutive crosses between %K and %D lines (on back-to-back candles), following a quiet period of at least three candles without any crossover. The signal is marked clearly on the chart and can trigger custom alerts. Supports all timeframes.
BigCandleLibrary "BigCandle"
init()
method bigGreenCandleTail(state, i)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
i (int)
method bigRedCandleTail(state, i)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
i (int)
method removeCrossedGreenCandleIndexes(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method removeCrossedRedCandleIndexes(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method run(state, opts)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
opts (BigCandleOpts)
method lastGreenCandleIndex(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method lastRedCandleIndex(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method lastGreenCandleTail(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method lastRedCandleTail(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method lastGreenCandleStrength(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method lastRedCandleStrength(state)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
method reset(state, direction)
Namespace types: BigCandleState
Parameters:
state (BigCandleState)
direction (int)
BigCandleState
Fields:
greenCandleIndexes (array)
redCandleIndexes (array)
greenCandleStrength (array)
redCandleStrength (array)
averageHeight (series float)
averageBodyHeight (series float)
heightPercentage (series float)
bodyHeightPercentage (series float)
BigCandleOpts
Fields:
averageHeightPeriod (series int)
minCandleHeight (series float)
minCandleBodyHeight (series float)
minCandleHeight2 (series float)
minCandleBodyHeight2 (series float)
Babil34 Comparative Average PanelBabil34 Comparative Average Panel is an advanced moving averages dashboard that allows you to add and compare up to 5 EMAs, 5 DEMAs, and 5 SMAs simultaneously.
You can independently set the period, source, and timeframe for each average. With its colorful table and optional labels, you can easily observe the differences, trend changes, and crossovers between all averages at a glance.
It is suitable for both short-term and long-term strategies and lets you monitor multiple averages side by side.
Key Features:
Support for up to 5 independent EMAs, 5 DEMAs, and 5 SMAs
Multi-timeframe and multi-source selection
Clean, colorful table visualization
Toggleable labels and table for flexibility
Compatible with all markets and timeframes
Enhanced visual and technical analysis
This panel is specifically designed for traders who want to compare different types and periods of moving averages at a glance.
Yearly Performance Table with CAGROverview
This Pine Script indicator provides a clear table displaying the annual performance of an asset, along with two different average metrics: the arithmetic mean and the geometric mean (CAGR).
Core Features
Annual Performance Calculation:
Automatically detects the first trading day of each calendar year.
Calculates the percentage return for each full calendar year.
Based on closing prices from the first to the last trading day of the respective year.
Flexible Display:
Adjustable Period: Displays data for 1-50 years (default: 10 years).
Daily Timeframe Only: Functions exclusively on daily charts.
Automatic Update: Always shows the latest available years.
Two Average Metrics:
AVG (Arithmetic Mean)
A simple average of all annual returns. (Formula: (R₁ + R₂ + ... + Rₙ) ÷ n)
Important: Can be misleading in the presence of volatile returns.
GEO (Geometric Mean / CAGR)
Compound Annual Growth Rate. (Formula: ^(1/n) - 1)
Represents the true average annual growth rate.
Fully accounts for the compounding effect.
Limitations
Daily Charts Only: Does not work on intraday or weekly/monthly timeframes.
Calendar Year Basis: Calculations are based on calendar years, not rolling 12-month periods.
Historical Data: Dependent on the availability of historical data from the broker/data provider.
Interpretation of Results
CAGR as Benchmark: The geometric mean is more suitable for performance comparisons.
Annual Patterns: Individual year figures can reveal seasonal or cyclical trends.