RSI Weighted Trend System I [InvestorUnknown]The RSI Weighted Trend System I is an experimental indicator designed to combine both slow-moving trend indicators for stable trend identification and fast-moving indicators to capture potential major turning points in the market. The novelty of this system lies in the dynamic weighting mechanism, where fast indicators receive weight based on the current Relative Strength Index (RSI) value, thus providing a flexible tool for traders seeking to adapt their strategies to varying market conditions.
Dynamic RSI-Based Weighting System
The core of the indicator is the dynamic weighting of fast indicators based on the value of the RSI. In essence, the higher the absolute value of the RSI (whether positive or negative), the higher the weight assigned to the fast indicators. This enables the system to capture rapid price movements around potential turning points.
Users can choose between a threshold-based or continuous weight system:
Threshold-Based Weighting: Fast indicators are activated only when the absolute RSI value exceeds a user-defined threshold. Below this threshold, fast indicators receive no weight.
Continuous Weighting: By setting the weight threshold to zero, the fast indicators always receive some weight, although this can result in more false signals in ranging markets.
// Calculate weight for Fast Indicators based on RSI (Slow Indicator weight is kept to 1 for simplicity)
f_RSI_Weight_System(series float rsi, simple float weight_thre) =>
float fast_weight = na
float slow_weight = na
if weight_thre > 0
if math.abs(rsi) <= weight_thre
fast_weight := 0
slow_weight := 1
else
fast_weight := 0 + math.sqrt(math.abs(rsi))
slow_weight := 1
else
fast_weight := 0 + math.sqrt(math.abs(rsi))
slow_weight := 1
Slow and Fast Indicators
Slow Indicators are designed to identify stable trends, remaining constant in weight. These include:
DMI (Directional Movement Index) For Loop
CCI (Commodity Channel Index) For Loop
Aroon For Loop
Fast Indicators are more responsive and designed to spot rapid trend shifts:
ZLEMA (Zero-Lag Exponential Moving Average) For Loop
IIRF (Infinite Impulse Response Filter) For Loop
Each of these indicators is calculated using a for-loop method to generate a moving average, which captures the trend of a given length range.
RSI Normalization
To facilitate the weighting system, the RSI is normalized from its usual 0-100 range to a -1 to 1 range. This allows for easy scaling when calculating weights and helps the system adjust to rapidly changing market conditions.
// Normalize RSI (1 to -1)
f_RSI(series float rsi_src, simple int rsi_len, simple string rsi_wb, simple string ma_type, simple int ma_len) =>
output = switch rsi_wb
"RAW RSI" => ta.rsi(rsi_src, rsi_len)
"RSI MA" => ma_type == "EMA" ? (ta.ema(ta.rsi(rsi_src, rsi_len), ma_len)) : (ta.sma(ta.rsi(rsi_src, rsi_len), ma_len))
Signal Calculation
The final trading signal is a weighted average of both the slow and fast indicators, depending on the calculated weights from the RSI. This ensures a balanced approach, where slow indicators maintain overall trend guidance, while fast indicators provide timely entries and exits.
// Calculate Signal (as weighted average)
sig = math.round(((DMI*slow_w) + (CCI*slow_w) + (Aroon*slow_w) + (ZLEMA*fast_w) + (IIRF*fast_w)) / (3*slow_w + 2*fast_w), 2)
Backtest Mode and Performance Metrics
This version of the RSI Weighted Trend System includes a comprehensive backtesting mode, allowing users to evaluate the performance of their selected settings against a Buy & Hold strategy. The backtesting includes:
Equity calculation based on the signals generated by the indicator.
Performance metrics table comparing Buy & Hold strategy metrics with the system’s signals, including: Mean, positive, and negative return percentages, Standard deviations (of all, positive and negative returns), Sharpe Ratio, Sortino Ratio, and Omega Ratio
f_PerformanceMetrics(series float base, int Lookback, simple float startDate, bool Annualize = true) =>
// Initialize variables for positive and negative returns
pos_sum = 0.0
neg_sum = 0.0
pos_count = 0
neg_count = 0
returns_sum = 0.0
returns_squared_sum = 0.0
pos_returns_squared_sum = 0.0
neg_returns_squared_sum = 0.0
// Loop through the past 'Lookback' bars to calculate sums and counts
if (time >= startDate)
for i = 0 to Lookback - 1
r = (base - base ) / base
returns_sum += r
returns_squared_sum += r * r
if r > 0
pos_sum += r
pos_count += 1
pos_returns_squared_sum += r * r
if r < 0
neg_sum += r
neg_count += 1
neg_returns_squared_sum += r * r
float export_array = array.new_float(12)
// Calculate means
mean_all = math.round((returns_sum / Lookback) * 100, 2)
mean_pos = math.round((pos_count != 0 ? pos_sum / pos_count : na) * 100, 2)
mean_neg = math.round((neg_count != 0 ? neg_sum / neg_count : na) * 100, 2)
// Calculate standard deviations
stddev_all = math.round((math.sqrt((returns_squared_sum - (returns_sum * returns_sum) / Lookback) / Lookback)) * 100, 2)
stddev_pos = math.round((pos_count != 0 ? math.sqrt((pos_returns_squared_sum - (pos_sum * pos_sum) / pos_count) / pos_count) : na) * 100, 2)
stddev_neg = math.round((neg_count != 0 ? math.sqrt((neg_returns_squared_sum - (neg_sum * neg_sum) / neg_count) / neg_count) : na) * 100, 2)
// Calculate probabilities
prob_pos = math.round((pos_count / Lookback) * 100, 2)
prob_neg = math.round((neg_count / Lookback) * 100, 2)
prob_neu = math.round(((Lookback - pos_count - neg_count) / Lookback) * 100, 2)
// Calculate ratios
sharpe_ratio = math.round(mean_all / stddev_all * (Annualize ? math.sqrt(Lookback) : 1), 2)
sortino_ratio = math.round(mean_all / stddev_neg * (Annualize ? math.sqrt(Lookback) : 1), 2)
omega_ratio = math.round(pos_sum / math.abs(neg_sum), 2)
// Set values in the array
array.set(export_array, 0, mean_all), array.set(export_array, 1, mean_pos), array.set(export_array, 2, mean_neg),
array.set(export_array, 3, stddev_all), array.set(export_array, 4, stddev_pos), array.set(export_array, 5, stddev_neg),
array.set(export_array, 6, prob_pos), array.set(export_array, 7, prob_neu), array.set(export_array, 8, prob_neg),
array.set(export_array, 9, sharpe_ratio), array.set(export_array, 10, sortino_ratio), array.set(export_array, 11, omega_ratio)
// Export the array
export_array
The metrics help traders assess the effectiveness of their strategy over time and can be used to optimize their settings.
Calibration Mode
A calibration mode is included to assist users in tuning the indicator to their specific needs. In this mode, traders can focus on a specific indicator (e.g., DMI, CCI, Aroon, ZLEMA, IIRF, or RSI) and fine-tune it without interference from other signals.
The calibration plot visualizes the chosen indicator's performance against a zero line, making it easy to see how changes in the indicator’s settings affect its trend detection.
Customization and Default Settings
Important Note: The default settings provided are not optimized for any particular market or asset. They serve as a starting point for experimentation. Traders are encouraged to calibrate the system to suit their own trading strategies and preferences.
The indicator allows deep customization, from selecting which indicators to use, adjusting the lengths of each indicator, smoothing parameters, and the RSI weight system.
Alerts
Traders can set alerts for both long and short signals when the indicator flips, allowing for automated monitoring of potential trading opportunities.
Statistics
Similar Price ActionDescription:
The indicator tries to find an area of N candles in history that has the most similar price action to the latest N candles. The maximum search distance is limited to 5000 candles. It works by calculating a coefficient for each candle and comparing it with the coefficient of the latest candle, thus searching for two closest values. The indicator highlights the latest N candles, as well as the most similar area found in the past, and also tries to predict future price based on the latest price and price directly after the most similar area that was found in the past.
Inputs:
- Length -> the area we are searching for is comprised of this many candles
- Lookback -> maximum distance in which a similar area can be found
- Function -> the function used to compare latest and past prices
Notes:
- The indicator is intended to work on smaller timeframes where the overall price difference is not very high, but can be used on any
LPPL Critical Pulse (by BigBlueCheese) Version 1.1LPPL Critical Pulse (by BigBlueCheese)
I couldn’t locate a single script on TradingView that utilized the Log-Periodic Power Law (LPPL) and period doubling—key tools used by street professionals. Here is my first script…More to come.
Log-Periodic Power Law (LPPL)
LPPL is a mathematical framework used to model asset price bubbles that can help predict market crashes or corrections. It is based on the idea that speculative bubbles exhibit self-reinforcing, positive feedback behavior that leads to increasingly unsustainable price growth, followed by a crash or correction. But the big news is that because of the speculative behavior it can identify, it has equal application across many other instruments & timeframes.
The LPPL, has been around since the 1950’s and 1960’s where its theoretical foundation lies in the concepts of renormalized group theory and critical point behavior. Physicists Lev Landau, Vitaly Ginzburg & Kenneth Wilson contributed to how we can understand systems behave at critical points and was further developed by Benoit Mandelbrot via the concept of discrete scale invariance and log-periodicity. The concepts were popularized by Didier Sornette in Why Stock Markets Crash, where he used his model to detect when markets are experiencing extreme price movements, indicating the potential for a bubble to burst or a significant correction to occur. It is suspected that others like Jim Simons was an early adopter/adapter of this (and other) advanced mathematical concepts. LPPL is especially valuable for traders trying to anticipate rapid price movements—both upward and downward.
What is a Speculative Bubble?
A speculative bubble forms when an asset’s price skyrockets due to excitement from investors, pushing it well beyond its true value. At some point, this unsustainable growth leads to a crash, as the bubble “pops.” However, these crashes don’t need to be massive market-shaking events. They can also emerge from short-term price anomalies in any market or timeframe…..and they apply equally to upward & downward price moves. That is you can use this approach for both long and short trades.
Power Law & Log-Periodicity
The Power Law aspect describes how prices accelerate as they approach a critical point, forming a steep curve that signals instability.
The Log-Periodic component captures the oscillations that grow increasingly frequent as the price nears this tipping point, marking rising volatility.
Criticality in Trading: Feedback Loops, Attractors and Repellers
LPPL can be applied to financial markets by comparing them to natural systems prone to critical points, like avalanches or earthquakes. The key concept is criticality—the idea that, just like pressure building in an earthquake zone or snow stacking up on a mountain, there’s a feedback loop in markets where investor behavior becomes increasingly synchronized. This creates a self-reinforcing cycle, accelerating price movements until the system can no longer sustain the tension, and it collapses—similar to a critical phase shift in nature when physical systems experience sudden, catastrophic events when they reach a critical threshold.
In this context, the LPPL model aims to identify these critical points in financial markets by recognizing specific patterns in price movements, providing insight into the potential timing of major market shifts.
This is how markets can behave like attractors (drawing prices into unsustainable growth or collapses) or repellers (pushing them away through sudden corrections), depending on the balance of forces. LPPL captures this dynamic, helping traders anticipate when the market is nearing these critical moments.
Attractors are states or patterns that a system tends to gravitate towards over time, representing points of stability or equilibrium. Repellers are states that the system tends to avoid or move away from, representing instability or points of divergence.
In the context of the LPPL model, the market is seen as a dynamic system that is moving towards a critical point—often a bubble or a crash. The critical point itself can be viewed as an attractor, pulling the market toward a period of instability as prices accelerate and oscillations become more frequent. This movement reflects positive feedback loops, where investor behavior (e.g., herd mentality or speculative buying) reinforces the trend until it reaches an unsustainable level.
Conversely, once the critical point is reached, it can act as a repeller, causing the system (market) to rapidly move away from that state, often resulting in a crash or market correction. In essence, the LPPL model tries to identify these phases of movement toward or away from critical points, using attractors and repellers to describe the behavior of the system before and after major market events.
This dynamic interaction between stability and instability, or attractors and repellers, is a key feature of how Sornette’s LPPL approach models financial markets, emphasizing the market’s ability to oscillate between periods of calm and critical shifts.
Bubbles and Crashes in Any Timeframe
While people often think of bubbles and crashes as huge events like the Crash of 87, the Global Financial Crisis or COVID-19, they can also be much smaller or instrument specific. A short-term spike in a stock or a sudden currency drop can behave like a miniature bubble. LPPL helps spot these shorter-term price anomalies, making it versatile for traders looking for opportunities in all instruments and timeframes.
How Can I Use LPPL Critical Pulse?
Monitor price acceleration that signals unsustainable growth/movement .
Spot volatility, oscillations, extensions and compressions and exhaustion as the market nears critical instability and levels.
Combine with other indicators to help time entries and exits, manage risk as markets approach/consolidate/leave critical levels.
LPPL Critical Pulse (LPPLCP)
LPPLCP is based on LPPL principles that identify potential upward and downward market movements, exhaustion and consolidation periods.
Visualization
The LPPL line is smoothed using a moving average to reduce noise, and the result is scaled to fit within the price range of the past 100 bars, aligning the LPPL line with the price movements on the chart.
Dynamic LPPL Line Plot:
A smoothed and scaled LPPL line plotted directly on the price chart.
• Color-Coded Trend Analysis: The LPPL line changes color dynamically based on the conditions of slope and acceleration to reflect market behaviors such as period doubling or exhaustion.
1. White (Exhaustion/Consolidation Condition): Indicates that both the slope and the acceleration of the LPPL line are zero, suggesting a potential market flattening or exhaustion/consolidation. At the end of this period, a new trend may emerge OR the prior trend may reassert itself.
2. Purple (Period Doubling): This color appears when the LPPL model detects rapid changes in acceleration, indicating the potential for a market turning point (period doubling). The slope of the LPPL line during this period suggests whether the market is moving upward or downward.
3. Green (Positive Slope with Increasing Acceleration): A green LPPL line suggests that the market is in an upward trend, with increasing acceleration.
4. Red (Negative Slope with Decreasing Acceleration): A red LPPL line indicates a downward market trend with decreasing acceleration.
5. Yellow (Neutral): Yellow is the default color when none of the specific conditions (exhaustion, period doubling, positive/negative slope with acceleration) are met, i.e. generally a continuation of the prior condition but at a slower pace.
Customization for Any Market
LPPL Critical Pulse has application across most time frames for pretty much whatever you want to trade…stocks, commodities, currencies, futures, and more. You will have to tweak the inputs to optimize for the market(s) you choose to trade.
Inputs
1. Lookback Period for Adaptation
o Type: Integer
o Default: 1
o Description: Defines the lookback period for calculating the Simple Moving Average (SMA) and Standard Deviation (StDev) used in the LPPL model. A higher value smooths the calculations over a longer period.
2. Period Doubling Threshold
o Type: Float
o Default: 0.01
o Description: Determines the sensitivity for detecting period doubling in the LPPL line. A lower threshold increases sensitivity.
3. Flattening Threshold
o Type: Float
o Default: 0.01
o Description: This input is not actively used in the current version but can be modified for further customizations in the LPPL model.
4. Period Doubling Acceleration Threshold
o Type: Float
o Default: 0.02
o Description: This controls the threshold for detecting rapid changes in the LPPL acceleration, helping identify when period doubling occurs.
Calculation Components
The LPPL line is calculated using several components:
• SMA (A): The simple moving average of the closing prices over the selected lookback period.
• Standard Deviation (B, C): These parameters are calculated based on the standard deviation of prices and control the amplitude of the LPPL oscillations.
• Exponential Decay: The LPPL line decays as it approaches a theoretical critical time (tc), where market crashes or rapid changes may occur.
Disclaimer.
Not investment advice. Use at your own risk. Past results do not represent and are not indicative of future results
Industry Group Strength - IndiaPresenting the Industry Group Strength Indicator for India market, designed to help traders identify top-performing stocks within specific industry groups that are predefined.
⦿ Identifies Leading Stocks in Industry Groups
⦿ Analyses the following metrics
YTD Return : Measures stock performance from the start of the year.
RS Rating : Relative Strength rating for user-selected periods.
% Return : Percentage return over a user-selected lookback period.
Features
This indicator dynamically recognises the industry group of the current stock on the chart and ranks stocks within that group based on predefined data points. Traders can add this indicator to focus on top-performing stocks relative to their industry.
⦿ Color-coded for Easy Visualisation
You can choose from the following key metrics to rank stocks:
YTD Return
RS Rating
% Return
⦿ Table Format with Performance Metrics Compact mode
Vertical View
Horizontal View
All of the three metrics are shown in the compact mode and the current stock that is viewed is highlighted!
Vertical view
Horizontal view
Stock Ranking
Stocks are ranked based on their performance within industry groups, enabling traders to easily spot leaders and laggards in each sector. Color-coded gradients visually represent the stocks’ performance rankings, with higher percentile rankings indicating better performance.
Relative Strength (RS)
Relative Strength (RS) compares a stock’s performance against the benchmark index. The RS value is normalized from 1 to 99, making it easier to compare across different stocks. A rising RS value indicates that the stock is outperforming the market, helping traders quickly gauge relative performance within industry groups.
Limitations
At the time of developing this indicator, Pine requests are limited to 40 per script so the predefined symbols had to be filtered to 40 per Industry group
Stocks Filters
Filters that are used to filter the stocks in an Industry group to have maximum of 40 stocks
⦿ Auto, Chemical, Engineering, Finance, Pharma
Market Cap >= 1000 Crores and Market Cap <= 60000 Crores
Price >= 30 and Price <= 6000
50 Days Average ( Price * Volume ) >= 6 Crores
⦿ For rest of the Industry groups
Market Cap >= 1000 Crores and Market Cap <= 100000 Crores
Price >= 20 and Price <= 10000
50 Days Average ( Price * Volume ) >= 3 Crores
Credits
This indicator is forked from the Script for US market by @Amphibiantrading Thanks Brandon for the beginning of this indicator.
This indicator is built on TradingView’s new dynamic requests feature, thanks to @PineCoders for making this possible!
Williams %R StrategyThe Williams %R Strategy implemented in Pine Script™ is a trading system based on the Williams %R momentum oscillator. The Williams %R indicator, developed by Larry Williams in 1973, is designed to identify overbought and oversold conditions in a market, helping traders time their entries and exits effectively (Williams, 1979). This particular strategy aims to capitalize on short-term price reversals in the S&P 500 (SPY) by identifying extreme values in the Williams %R indicator and using them as trading signals.
Strategy Rules:
Entry Signal:
A long position is entered when the Williams %R value falls below -90, indicating an oversold condition. This threshold suggests that the market may be near a short-term bottom, and prices are likely to reverse or rebound in the short term (Murphy, 1999).
Exit Signal:
The long position is exited when:
The current close price is higher than the previous day’s high, or
The Williams %R indicator rises above -30, indicating that the market is no longer oversold and may be approaching an overbought condition (Wilder, 1978).
Technical Analysis and Rationale:
The Williams %R is a momentum oscillator that measures the level of the close relative to the high-low range over a specific period, providing insight into whether an asset is trading near its highs or lows. The indicator values range from -100 (most oversold) to 0 (most overbought). When the value falls below -90, it indicates an oversold condition where a reversal is likely (Achelis, 2000). This strategy uses this oversold threshold as a signal to initiate long positions, betting on mean reversion—an established principle in financial markets where prices tend to revert to their historical averages (Jegadeesh & Titman, 1993).
Optimization and Performance:
The strategy allows for an adjustable lookback period (between 2 and 25 days) to determine the range used in the Williams %R calculation. Empirical tests show that shorter lookback periods (e.g., 2 days) yield the most favorable outcomes, with profit factors exceeding 2. This finding aligns with studies suggesting that shorter timeframes can effectively capture short-term momentum reversals (Fama, 1970; Jegadeesh & Titman, 1993).
Scientific Context:
Mean Reversion Theory: The strategy’s core relies on mean reversion, which suggests that prices fluctuate around a mean or average value. Research shows that such strategies, particularly those using oscillators like Williams %R, can exploit these temporary deviations (Poterba & Summers, 1988).
Behavioral Finance: The overbought and oversold conditions identified by Williams %R align with psychological factors influencing trading behavior, such as herding and panic selling, which often create opportunities for price reversals (Shiller, 2003).
Conclusion:
This Williams %R-based strategy utilizes a well-established momentum oscillator to time entries and exits in the S&P 500. By targeting extreme oversold conditions and exiting when these conditions revert or exceed historical ranges, the strategy aims to capture short-term gains. Scientific evidence supports the effectiveness of short-term mean reversion strategies, particularly when using indicators sensitive to momentum shifts.
References:
Achelis, S. B. (2000). Technical Analysis from A to Z. McGraw Hill.
Fama, E. F. (1970). Efficient Capital Markets: A Review of Theory and Empirical Work. The Journal of Finance, 25(2), 383-417.
Jegadeesh, N., & Titman, S. (1993). Returns to Buying Winners and Selling Losers: Implications for Stock Market Efficiency. The Journal of Finance, 48(1), 65-91.
Murphy, J. J. (1999). Technical Analysis of the Financial Markets: A Comprehensive Guide to Trading Methods and Applications. New York Institute of Finance.
Poterba, J. M., & Summers, L. H. (1988). Mean Reversion in Stock Prices: Evidence and Implications. Journal of Financial Economics, 22(1), 27-59.
Shiller, R. J. (2003). From Efficient Markets Theory to Behavioral Finance. Journal of Economic Perspectives, 17(1), 83-104.
Williams, L. (1979). How I Made One Million Dollars… Last Year… Trading Commodities. Windsor Books.
Wilder, J. W. (1978). New Concepts in Technical Trading Systems. Trend Research.
This explanation provides a scientific and evidence-based perspective on the Williams %R trading strategy, aligning it with fundamental principles in technical analysis and behavioral finance.
Kaufman's Adaptive Moving Average (KAMA)Another simple easy to use indicator that incorporates mean reversion and trend following.
Kaufman's Adaptive Moving Average (KAMA) is an indicator developed by Perry Kaufman that adjusts its sensitivity based on market volatility. It is designed to react more quickly during trending markets and slow down in sideways or volatile markets. The primary idea is that in a trending market, the moving average should be more sensitive to price changes, while in a non-trending market, it should be less responsive to noise.
KAMA Formula
The formula for the Kaufman Adaptive Moving Average is:
Efficiency Ratio (ER): Measures the efficiency of price movement over a given period.
ER
=
Smoothing Factor
Volatility
=
Sum of absolute price change
Sum of absolute price movement
ER=
Volatility
Smoothing Factor
=
Sum of absolute price movement
Sum of absolute price change
The Efficiency Ratio is calculated by taking the price change over a defined period and dividing it by the total price movement (which is the sum of absolute price changes).
Smoothing Constant (SC): This is a factor used to adjust the moving average's responsiveness:
SC
=
ER
×
(
2
/
(
𝑛
+
1
)
)
+
(
1
−
ER
)
×
(
2
/
(
𝑛
+
1
)
)
SC=ER×(2/(n+1))+(1−ER)×(2/(n+1))
where n is the length of the moving average period.
Steps to Calculate KAMA:
Efficiency Ratio (ER):
Calculate the sum of absolute price changes over the chosen period.
Calculate the sum of absolute price movements over the same period.
Smoothing Constant (SC):
Use the Efficiency Ratio to adjust the smoothing factor.
KAMA Calculation:
The initial KAMA is the simple moving average (SMA) of the first n periods.
For subsequent periods, KAMA is calculated using a formula based on the smoothing constant and previous KAMA values.
experiment with the variables as you like!!
Fourier Smoothed Volume Zone Oscillator ( FSVZO )Overview 🔎
The fourier smoothed Volume Zone Oscillator (FSVZO) is a versatile tool designed to provide traders with a detailed understanding of market conditions by examining volume dynamics. FSVZO applies a series of advanced regularization techniques aimed at trying to reduce market noise, making signals potentially more readable and actionable. This indicator combines traditional technical analysis tools with a unique set of smoothing functions, aimed at creating a more balanced and reliable oscillator that can assist traders in their decision-making process.
A Combination of Technical Elements for a Unique Edge 🔀
FSVZO integrates a variety of technical elements to offer a comprehensive perspective on the market. These elements can be used individually or in combination, depending on user preferences. Here are the main components:
Volume Zone Oscillator (VZO): This foundational element leverages volume data to identify trends and shifts in buying or selling pressure. Unlike a standalone VZO, the FSVZO incorporates a Fourier-based regularization technique to reduce false signals, allowing traders to focus on meaningful volume-driven movements.
Ehler's White Noise Filter: This component is a sophisticated filter that helps distinguish genuine market signals from white noise. By isolating the meaningful movements in price and volume, the white noise filter contributes to the clarity and reliability of the signals generated.
Divergences Detection: FSVZO also provides divergence signals (both hidden and regular) based on the oscillator and price action. Divergences can be used to anticipate possible market reversals or confirmations, enhancing the trader's ability to recognize significant market shifts.
Money Flow Index (MFI) Smoothing: The MFI is calculated and then smoothed using wavelet and whitenoise techniques, providing a cleaner view of money flow within the market. This helps reduce erratic fluctuations and focuses on more consistent trends.
Trendshift Visualization: The FSVZO features an optional trendshift indicator, highlighting shifts between bullish and bearish conditions. These visual cues make it easier to identify trend reversals, aiding traders in timely decision-making.
Flexible Display Options 📊
FSVZO offers a variety of display modes to cater to different trading styles and visual preferences:
Neon Style Plot: The oscillator is presented with neon-style plots primarily for aesthetic purposes.
Color Blindness Modes 🌈: FSVZO includes several color palettes to accommodate traders affected by different types of color blindness (Protanopia, Deuteranopia, Tritanopia, Achromatopsia). These options ensure that everyone can easily interpret the signals, regardless of visual impairments.
Take Profit Areas & Alerts: The indicator can display take profit areas based on overbought or oversold conditions of the smoothed oscillator, marked by background hues to provide a clear visual signal. Alerts for high and low thresholds can also be enabled to identify moments of increased buying or selling interest.
Divergences and Trend Analysis 🔍
FSVZO also aims to identify bullish and bearish divergences:
Regular Bullish/Bearish Divergence: These occur when the oscillator diverges from the price action, indicating a possible reversal.
Hidden Bullish/Bearish Divergence: These occur within a trend, signaling continuation opportunities that help traders capitalize on ongoing trends.
FSVZO also supports additional filtering for divergences, allowing users to refine the detection of divergences to better suit their trading preferences.
Enhanced Noise Filtering 🔄
One of the unique features of FSVZO is its Fourier Regularization and Ehler's White Noise Filter, which help improve signal reliability by reducing the impact of market noise. These filtering methods are beneficial for traders seeking to avoid whipsaws and focus on more meaningful market movements.
Why FSVZO Stands Out 🔑
Noise Reduction: By combining multiple filtering techniques, FSVZO is designed to react to price changes as quickly as possible while offering various smoothing options to reduce noise, which may make it less responsive but more stable.
Flexible Visualization: The option to use different display modes and the inclusion of color blindness-friendly palettes make FSVZO versatile and accessible to all traders.
Detailed Divergence Analysis: The integration of both regular and hidden divergence detection helps improve the potential for identifying trading opportunities.
Advanced Regularization Techniques: The use of Fourier transformation and white noise filters adds a unique aspect to volume analysis, differentiating FSVZO from other traditional volume oscillators.
Conclusion 🔒
The Regularized Volume Zone Oscillator (FSVZO) is a unique tool that brings together multiple advanced techniques to help traders better understand market conditions and volume dynamics. The indicator is designed to react to price changes as quickly as possible, which may lead to false signals; however, it also offers smoothing options to help reduce noise at the cost of reduced reaction speed. This balance between responsiveness and stability provides traders with flexibility in adapting the indicator to different market conditions. However, as with all indicators, it is crucial to combine FSVZO with other tools and maintain sound risk management practices.
FSVZO is primarily designed for more experienced traders due the number of different signals it provides. It offers enhanced insights into volume trends and market movement, and should be used alongside other indicators to reduce risk and false signals
Gauss KenJi Robot
Gauss KenJi Trading Robot: Precision and Automation for Traders
The Gauss KenJi robot is a cutting-edge trading solution designed for experienced traders seeking to enhance their decision-making through advanced statistical models and automation. Unlike traditional trading tools that rely on generic indicators prone to false signals, the Gauss KenJi robot offers an innovative approach by utilizing two unique indicators: the Kenji Indicator v.2.0 and the Gauss Indicator .
Kenji Indicator v.2.0
Traditional moving averages and related indicators often fail in flat market conditions, where frequent crossovers lead to confusing signals and false trends. The Kenji Indicator addresses this issue by using a combination of correlation analysis and moving averages to more accurately identify the market’s state. This real-time insight allows for better navigation of local trends, reducing noise and increasing the precision of trade signals.
Gauss Indicator
The Gauss Indicator brings the power of statistical analysis into trading by applying the 3 sigmas rule. It calculates and predicts the likely price ranges for specific time frames (hourly, daily, weekly) with probabilities of 68%, 95%, and 99%. This offers traders an actionable framework for setting stop-loss, take-profit, and identifying key support and resistance levels. By providing a clearer view of potential price movements, the Gauss Indicator improves decision-making, ensuring that traders enter and exit the market at optimal points.
Gauss KenJi Robot: How it Works
The Gauss KenJi robot operates on a statistical algorithm based on the Gaussian function, which uses market volatility as a core indicator of price movements. The robot opens positions in the direction of the trend when the price reaches the predetermined Gauss border. Position sizes are calculated according to the “Initial_lot” parameter, with stop-loss and take-profit levels defined by the “Pips” parameter. Trades are automatically closed either when profit targets or stop-loss limits are reached, or if local trend reversals are detected by the Kenji Indicator.
This highly adaptable algorithm can be applied to any asset class (stocks, forex, crypto, commodities) and any time frame, providing traders with a versatile tool to navigate various markets.
Why Gauss KenJi is Essential for Traders
1. Time Efficiency: The robot operates autonomously, allowing traders to step away from constant chart monitoring while still capitalizing on market movements.
2. Profit Maximization: By leveraging machine learning and advanced statistical models, the robot identifies opportunities faster than human traders, ensuring more profitable trades.
3. Risk Management: The robot strictly adheres to predefined rules, helping traders minimize losses and protect their capital in volatile market conditions.
4. Cross-market Versatility: Whether you’re trading forex, stocks, crypto, or commodities, Gauss KenJi adapts to different markets and time frames, making it a versatile tool for professional traders.
The Gauss KenJi robot is a comprehensive, scientifically driven trading solution designed to eliminate common pitfalls associated with traditional indicators. Its combination of the Kenji Indicator’s trend identification and the Gauss Indicator’s price prediction capabilities makes it an indispensable tool for traders looking to enhance both the precision of their trades and the automation of their strategies. Whether you are aiming for consistent daily profits or optimizing long-term trading strategies, Gauss KenJi offers the efficiency and accuracy required to stay ahead in today’s competitive markets.
Spazz MSiThis innovative adaptation of the Enhanced McClellan Summation Index (MSI) incorporates advanced statistical analysis to refine its market interpretation capabilities. The core enhancement involves the integration of a Z-score calculation, which is applied to a user-selectable price data series (open, high, low, close, or their derivatives).
Key modifications and improvements include:
1. Flexible Data Input: The indicator now allows for the selection of various price points or their combinations (e.g., OHLC4, HLC3) as the basis for the MSI calculation, enhancing its adaptability to different trading strategies and market conditions.
2. Z-Score Integration: By incorporating a Z-score metric, the indicator provides a standardized measure of the price series' deviation from its mean. This statistical approach offers a more nuanced view of market extremes.
3. Dynamic Overbought/Oversold Identification: The Z-score implementation enables a more sophisticated method for identifying overbought and oversold conditions. These states are now determined relative to the asset's own historical volatility, rather than fixed thresholds.
4. Automated Signal Generation: The indicator now features an algorithmic approach to generate buy and sell signals. These signals are triggered when specific Z-score thresholds are breached, offering traders clear, statistically-backed entry and exit points.
5. Visual Enhancements: The addition of graphical elements, such as color-coded plots and shape markers, improves the indicator's visual interpretability, allowing for quicker and more intuitive market analysis.
This enhanced version of the McClellan Summation Index combines the robust trend-following capabilities of the original MSI with the precision of statistical analysis. By doing so, it provides traders with a more refined tool for market timing and trend identification, particularly useful in volatile or transitioning market conditions.
ATR Movement Percentage from Daily (Bal)Script Description: ATR Movement Percentage from Daily
The script titled "ATR Movement Percentage from Daily" is designed to help traders analyze the price movement of an asset in relation to its daily volatility, as represented by the Average True Range (ATR). Here's a breakdown of how the script works:
Key Features of the Script:
ATR Calculation:
The script allows the user to input the length of the ATR calculation (default is 14 periods).
It retrieves the daily ATR value using the request.security function, ensuring that the ATR is based on the daily timeframe, regardless of the current chart's timeframe.
Price Movement Calculation:
It calculates the opening price of the current day using request.security to ensure it is aligned with the daily timeframe.
It retrieves the current closing price and computes the price change from the opening price.
Movement Percentage:
The percentage of price movement relative to the daily ATR is calculated. This value helps traders understand how significant the current price movement is compared to the expected volatility for the day.
Direction of Movement:
The script determines the direction of the price movement (upward or downward) based on whether the price change is positive or negative.
Dynamic Label Display:
A label is created and updated to show the movement percentage and direction on the chart.
If the price movement is upward, the label is displayed in green; if downward, it is shown in red.
The label position updates with each new bar, keeping it relevant to the current price action.
Plotting Daily ATR:
The daily ATR value is plotted on the chart as a blue line, providing a visual reference for traders to see the volatility levels in relation to price movements.
Conclusion:
This script is particularly useful for traders who want to assess market conditions based on volatility. By understanding how much the price has moved in relation to the daily ATR, traders can make informed decisions about entry and exit points, and adjust their risk management strategies accordingly. The dynamic labeling feature enhances the usability of the script, allowing for quick visual assessments of market behavior.
High and Low in Selected Time Window (Chart's Timezone)Simple indicator for finding the high and low in any selected time period. to use enter the start time by selecting the hour and minute and enter the end time the same.
a line will be drawn along with the price and a timestamp of when it occurred. shows multiple days of the same time period. Useful for observing ICT Macros, 6VS10 etc.
Multi-Assets Monthly/Weekly/Daily/ Rate Multi-Assets Rate Indicator
This indicator provides a comprehensive view of performance across multiple asset classes, including Forex pairs, Indices, Commodities, and Cryptocurrencies. It offers the following features:
1. Asset Type Selection: Users can choose between "FOREX" and "Other Assets" to view different sets of instruments.
2. Timeframe Flexibility: Performance can be analyzed on Weekly, Daily, or Monthly timeframes.
3. Performance Metrics:
- Current Period Performance: Percentage change in the selected timeframe.
- Previous Period Performance: Percentage change in the previous period.
- Rate of Change: Difference between current and previous period performances.
4. Visual Representation: Results are displayed in a color-coded table for easy interpretation.
- Green indicates positive performance
- Red indicates negative performance
5. Customizable Symbols: Users can input their preferred symbols for each category.
6. Categorized View: When "Other Assets" is selected, the table is organized into Indices, Commodities, and Cryptocurrencies for better clarity.
This indicator is designed to help traders and investors quickly assess and compare performance across various financial instruments and asset classes. It's particularly useful for identifying trends, comparing relative strengths, and making informed decisions based on multi-timeframe analysis.
Note: This indicator relies on data provided by TradingView. Ensure that you have access to the required data feeds for accurate results.
Disclaimer: This indicator is for informational purposes only and should not be considered as financial advice. Always conduct your own research and consider your financial situation before making investment decisions.
PRINT_DROVINGLibrary "PRINT_DROVING"
method print_droving(foot_bar, sup)
printing all footprint objects
Namespace types: footprint_type.Footprint_bar
Parameters:
foot_bar (Footprint_bar type from Alesetup/PRINT_TYPE/1) : instance of Footprint_bar type
sup (Support_objects type from Alesetup/PRINT_TYPE/1) : instance of Support_objects type
Returns: Void.
PRINT_LOGICLibrary "PRINT_LOGIC"
method fill_imba_line(imba_line, foot_bar, sup)
fill imbalance line
Namespace types: footprint_type.Imbalance_line
Parameters:
imba_line (Imbalance_line type from Alesetup/PRINT_TYPE/1) : instance of Imbalance_line type
foot_bar (Footprint_bar type from Alesetup/PRINT_TYPE/1) : instance of Footprint_bar type
sup (Support_objects type from Alesetup/PRINT_TYPE/1) : instance of Support_objects type
Returns: Void
method fill_footprint_type(foot_bar, sup)
Namespace types: footprint_type.Footprint_bar
Parameters:
foot_bar (Footprint_bar type from Alesetup/PRINT_TYPE/1) : instance of Footprint_bar type
sup (Support_objects type from Alesetup/PRINT_TYPE/1) : instance of Support_objects type
Returns: Void
method fill_footprint_object(foot_bar, sup)
fill all footprint objects
Namespace types: footprint_type.Footprint_bar
Parameters:
foot_bar (Footprint_bar type from Alesetup/PRINT_TYPE/1) : instance of Footprint_bar type
sup (Support_objects type from Alesetup/PRINT_TYPE/1) : instance of Support_objects type
Returns: Void
PRINT_TYPELibrary "PRINT_TYPE"
Inputs
Inputs objects
Fields:
inbalance_percent (series int) : percentage coefficient to determine the Imbalance of price levels
stacked_input (series int) : minimum number of consecutive Imbalance levels required to draw extended lines
show_summary_footprint (series bool)
procent_volume_area (series int) : definition size Value area
new_imbalance_cond (series bool) : bool input for setup alert on new imbalance buy and sell
new_imbalance_line_cond (series bool) : bool input for setup alert on new imbalance line buy and sell
stop_past_imbalance_line_cond (series bool) : bool input for setup alert on stop past imbalance line buy and sell
Constants
Constants all Constants objects
Fields:
imbalance_high_char (series string) : char for printing buy imbalance
imbalance_low_char (series string) : char for printing sell imbalance
color_title_sell (series color) : color for footprint sell
color_title_buy (series color) : color for footprint buy
color_line_sell (series color) : color for sell line
color_line_buy (series color) : color for buy line
color_title_none (series color) : color None
Calculation_data
Calculation_data data for calculating
Fields:
detail_open (array) : array open from calculation timeframe
detail_high (array) : array high from calculation timeframe
detail_low (array) : array low from calculation timeframe
detail_close (array) : array close from calculation timeframe
detail_vol (array) : array volume from calculation timeframe
previos_detail_close (array) : array close from calculation timeframe
isBuyVolume (series bool) : attribute previosly bar buy or sell
Footprint_row
Footprint_row objects one footprint row
Fields:
price (series float) : row price
buy_vol (series float) : buy volume
sell_vol (series float) : sell volume
imbalance_buy (series bool) : attribute buy inbalance
imbalance_sell (series bool) : attribute sell imbalance
buy_vol_box (series box) : for ptinting buy volume
sell_vol_box (series box) : for printing sell volume
buy_vp_box (series box) : for ptinting volume profile buy
sell_vp_box (series box) : for ptinting volume profile sell
row_line (series label) : for ptinting row price
empty (series bool) : = true attribute row with zero volume buy and zero volume sell
Imbalance_line_var_object
Imbalance_line_var_object var objects printing and calculation imbalance line
Fields:
cum_buy_line (array) : line array for saving all history buy imbalance line
cum_sell_line (array) : line array for saving all history sell imbalance line
Imbalance_line
Imbalance_line objects printing and calculation imbalance line
Fields:
buy_price_line (array) : float array for saving buy imbalance price level
sell_price_line (array) : float array for saving sell imbalance price level
var_imba_line (Imbalance_line_var_object) : var objects this type
Footprint_bar
Footprint_bar all objects one bar with footprint
Fields:
foot_rows (array) : objects one row footprint
imba_line (Imbalance_line) : objects imbalance line
row_size (series float) : size rows
total_vol (series float) : total volume one footprint bar
foot_buy_vol (series float) : buy volume one footprint bar
foot_sell_vol (series float) : sell volume one footprint bar
foot_max_price_vol (map) : map with one value - price row with max volume buy + sell
calc_data (Calculation_data) : objects with detail data from calculation resolution
Support_objects
Support_objects support object for footprint calculation
Fields:
consts (Constants) : all consts objects
inp (Inputs) : all input objects
bar_index_show_condition (series bool) : calculation bool value for show all objects footprint
row_line_color (series color) : calculation value - color for row price
dop_info (series string)
show_table_cond (series bool)
[ AlgoChart ] - Pearson Index CorrelationCorrelation Indicator (Pearson Index)
The correlation indicator measures the strength and direction of the relationship between two financial assets using the Pearson Index.
Correlation values range from +100 to -100, where:
+100 indicates perfect positive correlation, meaning the two assets tend to move in the same direction.
-100 indicates perfect negative correlation, where the two assets move in opposite directions.
The neutral zone ranges from +25% to -25%, suggesting that the asset movements are independent, with no clear correlation between them.
Interpreting Correlation Levels:
Correlation above +75%: The two assets tend to move similarly and in the same direction. This may indicate a risk of overexposure if both assets are traded in the same direction, as their movements will be very similar, increasing the likelihood of double losses or gains.
Correlation below -75%: The two assets tend to move similarly but in opposite directions. This correlation level can be useful for strategies that benefit from opposing movements between assets, such as trading pairs with inverse dynamics.
Practical Use of the Indicator:
Risk management: Use the indicator to monitor asset correlations before opening positions. High correlation may indicate you are duplicating exposure, as two highly correlated assets tend to move similarly. This helps avoid excessive risk and improves portfolio diversification.
Statistical Arbitrage: During moments of temporary decorrelation between two assets, the indicator can be used for statistical arbitrage strategies. In such cases, you can take advantage of the divergence by opening positions and closing them when the correlation returns to higher or positive levels, thus potentially profiting from the reconvergence of movements.
While the correlation indicator provides valuable insights into asset relationships, it is most effective when used in conjunction with other concepts and tools. On its own, it may offer limited relevance in trading decisions.
[MAD MBS] L3 Float Operations & ML-NormalizersFirst of all:
This indicator is not a standalone tool ; it relies on other script series for its inputs.
This script is an indicator designed for multi-path float operations with integrated machine learning normalizers.
It supports up to four distinct paths, each customizable with multiple sources, factors, and operations.
Users can perform various mathematical operations on price data, including addition, subtraction, multiplication, division, and percentage changes, as well as more advanced tasks like double and triple moving averages or power operations.
The script also integrates several normalization methods (e.g., Min-Max, Z-Score, Robust) to standardize data—an important step for machine learning models.
Each path supports multiple smoothing techniques (e.g., EMA, SMA, and specialized Ehlers smoothers) to further refine the output.
Designed to handle multiple data inputs simultaneously, this tool is especially useful for traders looking to analyze and normalize data from different price sources.
The combination of advanced mathematical operations, normalization techniques, and smoothing enhances data management, aiding in more effective trading decisions.
Here you can see a single path, out of the four possible:
Details to the screenshot:
First Series
Second Series
Option to override the second series with a custom constant (or when normalizing, use the length instead)
The first selection box sets the mathematical operation or activates the normalizer.
The second selection box sets the normalization method.
The third selection box sets the final smoothing technique, followed by parameters for smoothing length.
These settings are repeated identically for Paths 2–4.
At the bottom of the setup, there's a general offset option (add the 'close' price for overlay purposes).
Additionally, there's an option to display a line at zero for centered results.
Tail ProbabilitiesThe Tail Probabilities indicator offers a sophisticated analysis of potential price distributions, providing traders with a probabilistic framework for forecasting future price behavior based on historical data. By estimating the likelihood of the price closing above or below specified thresholds, the indicator assists in evaluating market sentiment, volatility, and associated risks. The probability calculations are derived from a user-defined analysis window, which operates independently of the transform length window. The transform length parameter dictates the volume of historical data utilized in the calculations, and it must correspond to the window length applied in the mean and standard deviation lines indicator to ensure consistency in visual representation.
Overview of Plotted Probabilities
This indicator plots three core probabilities and their moving averages, involving four primary user inputs:
User Inputs
Tail Type: Allows the user to choose between analyzing the left tail (representing downside risk) or the right tail (representing upside potential).
Transform Window Length (Bars): Specifies the amount of historical data used to calculate the mean and standard deviation. This value must align with the window length applied in the mean and standard deviation lines indicator .
Analysis Period (Bars): Defines the number of historical bars used for probability analysis, setting the window over which probabilities are computed.
SMA Length (Bars): Specifies the length of the simple moving average (SMA) used to plot the historical average of the calculated probabilities. The SMA Length input allows users to plot a simple moving average of the calculated probabilities, providing a smoother historical average and helping to identify trends in the probability values over time.
Key Probabilities Plotted
Probability to Close Above or Below Upper Bound: Represents the likelihood that the price will close above or below an upper threshold derived from the mean and standard deviation lines indicator . This measure helps identify potential for significant upward or downward price movement, depending on the current price relative to the threshold.
Probability to Close Above or Below Mean: Indicates the probability of the closing price being either above or below the mean level, reflecting historical price tendencies and suggesting the presence of skewness in the price distribution.
Probability to Close Above or Below Lower Bound: Reflects the likelihood of the price closing above or below a lower threshold, offering insights into potential risk and directional movement.
The indicator adjusts based on the chosen tail type ("Left" or "Right"), thereby enabling users to assess both potential upward and downward price movements, making it adaptable to varying market conditions.
How Probabilities Are Calculated
The probabilities are calculated through a detailed analysis of historical price data over a user-specified analysis window. Below is an outline of the key steps involved in these calculations:
Calculate Mean and Standard Deviation: The mean and standard deviation are computed using the transform length window, which defines the historical data range employed.
Define Bounds: Upper, mean, and lower bounds are established based on the calculated mean and standard deviation, allowing identification of significant levels within the price distribution.
Count Events: The frequency with which the closing price crosses above or below these bounds is counted over the user-specified probability analysis window.
Calculate Probabilities: Probabilities are then computed as the percentage of observed events relative to the total number of observations in the analysis window.
For example, the probability of closing above the upper bound is calculated as:
Probability = (Number of times price closes above the upper bound) / (Total number of observations in the analysis window) * 100
Practical Usage
Risk Management: The indicator provides a quantitative measure of the probability of extreme price movements, aiding traders in setting stop-loss and take-profit levels based on statistical expectations.
Trend Analysis: The probability of closing above the mean can also serve as an indicator of potential skewness in the price distribution. Values above 50 indicate a right-skewed distribution, while values below 50 indicate a left-skewed distribution for the right tail probability. For the left tail probability, values over 50 indicate a left skew and values below 50 indicate a right skew in the distribution.
Scenario Analysis: By focusing on either the left or right tail, traders can quickly determine whether to prioritize downside protection or capitalize on upside potential. Depending on market conditions and whether the trader is long or short, both upward and downward movements can be analyzed, enabling a comprehensive risk assessment.
Limitations
While the Tail Probabilities indicator provides valuable probabilistic insights based on historical data, it is crucial to understand that historical performance does not guarantee future outcomes. Market dynamics are subject to rapid changes, and relying exclusively on historical probabilities may result in inaccurate assessments. Traders should use this indicator in conjunction with other technical analysis tools, fundamental analysis, and an understanding of broader market conditions to ensure robust decision-making.
Summary
The Tail Probabilities indicator is an advanced tool designed for traders seeking a probabilistic perspective on market behavior. By providing critical insights into the potential distribution of prices beyond significant thresholds, the indicator supports informed decision-making, whether in trending or uncertain market environments.
Universal Ratio Trend Matrix [InvestorUnknown]The Universal Ratio Trend Matrix is designed for trend analysis on asset/asset ratios, supporting up to 40 different assets. Its primary purpose is to help identify which assets are outperforming others within a selection, providing a broad overview of market trends through a matrix of ratios. The indicator automatically expands the matrix based on the number of assets chosen, simplifying the process of comparing multiple assets in terms of performance.
Key features include the ability to choose from a narrow selection of indicators to perform the ratio trend analysis, allowing users to apply well-defined metrics to their comparison.
Drawback: Due to the computational intensity involved in calculating ratios across many assets, the indicator has a limitation related to loading speed. TradingView has time limits for calculations, and for users on the basic (free) plan, this could result in frequent errors due to exceeded time limits. To use the indicator effectively, users with any paid plans should run it on timeframes higher than 8h (the lowest timeframe on which it managed to load with 40 assets), as lower timeframes may not reliably load.
Indicators:
RSI_raw: Simple function to calculate the Relative Strength Index (RSI) of a source (asset price).
RSI_sma: Calculates RSI followed by a Simple Moving Average (SMA).
RSI_ema: Calculates RSI followed by an Exponential Moving Average (EMA).
CCI: Calculates the Commodity Channel Index (CCI).
Fisher: Implements the Fisher Transform to normalize prices.
Utility Functions:
f_remove_exchange_name: Strips the exchange name from asset tickers (e.g., "INDEX:BTCUSD" to "BTCUSD").
f_remove_exchange_name(simple string name) =>
string parts = str.split(name, ":")
string result = array.size(parts) > 1 ? array.get(parts, 1) : name
result
f_get_price: Retrieves the closing price of a given asset ticker using request.security().
f_constant_src: Checks if the source data is constant by comparing multiple consecutive values.
Inputs:
General settings allow users to select the number of tickers for analysis (used_assets) and choose the trend indicator (RSI, CCI, Fisher, etc.).
Table settings customize how trend scores are displayed in terms of text size, header visibility, highlighting options, and top-performing asset identification.
The script includes inputs for up to 40 assets, allowing the user to select various cryptocurrencies (e.g., BTCUSD, ETHUSD, SOLUSD) or other assets for trend analysis.
Price Arrays:
Price values for each asset are stored in variables (price_a1 to price_a40) initialized as na. These prices are updated only for the number of assets specified by the user (used_assets).
Trend scores for each asset are stored in separate arrays
// declare price variables as "na"
var float price_a1 = na, var float price_a2 = na, var float price_a3 = na, var float price_a4 = na, var float price_a5 = na
var float price_a6 = na, var float price_a7 = na, var float price_a8 = na, var float price_a9 = na, var float price_a10 = na
var float price_a11 = na, var float price_a12 = na, var float price_a13 = na, var float price_a14 = na, var float price_a15 = na
var float price_a16 = na, var float price_a17 = na, var float price_a18 = na, var float price_a19 = na, var float price_a20 = na
var float price_a21 = na, var float price_a22 = na, var float price_a23 = na, var float price_a24 = na, var float price_a25 = na
var float price_a26 = na, var float price_a27 = na, var float price_a28 = na, var float price_a29 = na, var float price_a30 = na
var float price_a31 = na, var float price_a32 = na, var float price_a33 = na, var float price_a34 = na, var float price_a35 = na
var float price_a36 = na, var float price_a37 = na, var float price_a38 = na, var float price_a39 = na, var float price_a40 = na
// create "empty" arrays to store trend scores
var a1_array = array.new_int(40, 0), var a2_array = array.new_int(40, 0), var a3_array = array.new_int(40, 0), var a4_array = array.new_int(40, 0)
var a5_array = array.new_int(40, 0), var a6_array = array.new_int(40, 0), var a7_array = array.new_int(40, 0), var a8_array = array.new_int(40, 0)
var a9_array = array.new_int(40, 0), var a10_array = array.new_int(40, 0), var a11_array = array.new_int(40, 0), var a12_array = array.new_int(40, 0)
var a13_array = array.new_int(40, 0), var a14_array = array.new_int(40, 0), var a15_array = array.new_int(40, 0), var a16_array = array.new_int(40, 0)
var a17_array = array.new_int(40, 0), var a18_array = array.new_int(40, 0), var a19_array = array.new_int(40, 0), var a20_array = array.new_int(40, 0)
var a21_array = array.new_int(40, 0), var a22_array = array.new_int(40, 0), var a23_array = array.new_int(40, 0), var a24_array = array.new_int(40, 0)
var a25_array = array.new_int(40, 0), var a26_array = array.new_int(40, 0), var a27_array = array.new_int(40, 0), var a28_array = array.new_int(40, 0)
var a29_array = array.new_int(40, 0), var a30_array = array.new_int(40, 0), var a31_array = array.new_int(40, 0), var a32_array = array.new_int(40, 0)
var a33_array = array.new_int(40, 0), var a34_array = array.new_int(40, 0), var a35_array = array.new_int(40, 0), var a36_array = array.new_int(40, 0)
var a37_array = array.new_int(40, 0), var a38_array = array.new_int(40, 0), var a39_array = array.new_int(40, 0), var a40_array = array.new_int(40, 0)
f_get_price(simple string ticker) =>
request.security(ticker, "", close)
// Prices for each USED asset
f_get_asset_price(asset_number, ticker) =>
if (used_assets >= asset_number)
f_get_price(ticker)
else
na
// overwrite empty variables with the prices if "used_assets" is greater or equal to the asset number
if barstate.isconfirmed // use barstate.isconfirmed to avoid "na prices" and calculation errors that result in empty cells in the table
price_a1 := f_get_asset_price(1, asset1), price_a2 := f_get_asset_price(2, asset2), price_a3 := f_get_asset_price(3, asset3), price_a4 := f_get_asset_price(4, asset4)
price_a5 := f_get_asset_price(5, asset5), price_a6 := f_get_asset_price(6, asset6), price_a7 := f_get_asset_price(7, asset7), price_a8 := f_get_asset_price(8, asset8)
price_a9 := f_get_asset_price(9, asset9), price_a10 := f_get_asset_price(10, asset10), price_a11 := f_get_asset_price(11, asset11), price_a12 := f_get_asset_price(12, asset12)
price_a13 := f_get_asset_price(13, asset13), price_a14 := f_get_asset_price(14, asset14), price_a15 := f_get_asset_price(15, asset15), price_a16 := f_get_asset_price(16, asset16)
price_a17 := f_get_asset_price(17, asset17), price_a18 := f_get_asset_price(18, asset18), price_a19 := f_get_asset_price(19, asset19), price_a20 := f_get_asset_price(20, asset20)
price_a21 := f_get_asset_price(21, asset21), price_a22 := f_get_asset_price(22, asset22), price_a23 := f_get_asset_price(23, asset23), price_a24 := f_get_asset_price(24, asset24)
price_a25 := f_get_asset_price(25, asset25), price_a26 := f_get_asset_price(26, asset26), price_a27 := f_get_asset_price(27, asset27), price_a28 := f_get_asset_price(28, asset28)
price_a29 := f_get_asset_price(29, asset29), price_a30 := f_get_asset_price(30, asset30), price_a31 := f_get_asset_price(31, asset31), price_a32 := f_get_asset_price(32, asset32)
price_a33 := f_get_asset_price(33, asset33), price_a34 := f_get_asset_price(34, asset34), price_a35 := f_get_asset_price(35, asset35), price_a36 := f_get_asset_price(36, asset36)
price_a37 := f_get_asset_price(37, asset37), price_a38 := f_get_asset_price(38, asset38), price_a39 := f_get_asset_price(39, asset39), price_a40 := f_get_asset_price(40, asset40)
Universal Indicator Calculation (f_calc_score):
This function allows switching between different trend indicators (RSI, CCI, Fisher) for flexibility.
It uses a switch-case structure to calculate the indicator score, where a positive trend is denoted by 1 and a negative trend by 0. Each indicator has its own logic to determine whether the asset is trending up or down.
// use switch to allow "universality" in indicator selection
f_calc_score(source, trend_indicator, int_1, int_2) =>
int score = na
if (not f_constant_src(source)) and source > 0.0 // Skip if you are using the same assets for ratio (for example BTC/BTC)
x = switch trend_indicator
"RSI (Raw)" => RSI_raw(source, int_1)
"RSI (SMA)" => RSI_sma(source, int_1, int_2)
"RSI (EMA)" => RSI_ema(source, int_1, int_2)
"CCI" => CCI(source, int_1)
"Fisher" => Fisher(source, int_1)
y = switch trend_indicator
"RSI (Raw)" => x > 50 ? 1 : 0
"RSI (SMA)" => x > 50 ? 1 : 0
"RSI (EMA)" => x > 50 ? 1 : 0
"CCI" => x > 0 ? 1 : 0
"Fisher" => x > x ? 1 : 0
score := y
else
score := 0
score
Array Setting Function (f_array_set):
This function populates an array with scores calculated for each asset based on a base price (p_base) divided by the prices of the individual assets.
It processes multiple assets (up to 40), calling the f_calc_score function for each.
// function to set values into the arrays
f_array_set(a_array, p_base) =>
array.set(a_array, 0, f_calc_score(p_base / price_a1, trend_indicator, int_1, int_2))
array.set(a_array, 1, f_calc_score(p_base / price_a2, trend_indicator, int_1, int_2))
array.set(a_array, 2, f_calc_score(p_base / price_a3, trend_indicator, int_1, int_2))
array.set(a_array, 3, f_calc_score(p_base / price_a4, trend_indicator, int_1, int_2))
array.set(a_array, 4, f_calc_score(p_base / price_a5, trend_indicator, int_1, int_2))
array.set(a_array, 5, f_calc_score(p_base / price_a6, trend_indicator, int_1, int_2))
array.set(a_array, 6, f_calc_score(p_base / price_a7, trend_indicator, int_1, int_2))
array.set(a_array, 7, f_calc_score(p_base / price_a8, trend_indicator, int_1, int_2))
array.set(a_array, 8, f_calc_score(p_base / price_a9, trend_indicator, int_1, int_2))
array.set(a_array, 9, f_calc_score(p_base / price_a10, trend_indicator, int_1, int_2))
array.set(a_array, 10, f_calc_score(p_base / price_a11, trend_indicator, int_1, int_2))
array.set(a_array, 11, f_calc_score(p_base / price_a12, trend_indicator, int_1, int_2))
array.set(a_array, 12, f_calc_score(p_base / price_a13, trend_indicator, int_1, int_2))
array.set(a_array, 13, f_calc_score(p_base / price_a14, trend_indicator, int_1, int_2))
array.set(a_array, 14, f_calc_score(p_base / price_a15, trend_indicator, int_1, int_2))
array.set(a_array, 15, f_calc_score(p_base / price_a16, trend_indicator, int_1, int_2))
array.set(a_array, 16, f_calc_score(p_base / price_a17, trend_indicator, int_1, int_2))
array.set(a_array, 17, f_calc_score(p_base / price_a18, trend_indicator, int_1, int_2))
array.set(a_array, 18, f_calc_score(p_base / price_a19, trend_indicator, int_1, int_2))
array.set(a_array, 19, f_calc_score(p_base / price_a20, trend_indicator, int_1, int_2))
array.set(a_array, 20, f_calc_score(p_base / price_a21, trend_indicator, int_1, int_2))
array.set(a_array, 21, f_calc_score(p_base / price_a22, trend_indicator, int_1, int_2))
array.set(a_array, 22, f_calc_score(p_base / price_a23, trend_indicator, int_1, int_2))
array.set(a_array, 23, f_calc_score(p_base / price_a24, trend_indicator, int_1, int_2))
array.set(a_array, 24, f_calc_score(p_base / price_a25, trend_indicator, int_1, int_2))
array.set(a_array, 25, f_calc_score(p_base / price_a26, trend_indicator, int_1, int_2))
array.set(a_array, 26, f_calc_score(p_base / price_a27, trend_indicator, int_1, int_2))
array.set(a_array, 27, f_calc_score(p_base / price_a28, trend_indicator, int_1, int_2))
array.set(a_array, 28, f_calc_score(p_base / price_a29, trend_indicator, int_1, int_2))
array.set(a_array, 29, f_calc_score(p_base / price_a30, trend_indicator, int_1, int_2))
array.set(a_array, 30, f_calc_score(p_base / price_a31, trend_indicator, int_1, int_2))
array.set(a_array, 31, f_calc_score(p_base / price_a32, trend_indicator, int_1, int_2))
array.set(a_array, 32, f_calc_score(p_base / price_a33, trend_indicator, int_1, int_2))
array.set(a_array, 33, f_calc_score(p_base / price_a34, trend_indicator, int_1, int_2))
array.set(a_array, 34, f_calc_score(p_base / price_a35, trend_indicator, int_1, int_2))
array.set(a_array, 35, f_calc_score(p_base / price_a36, trend_indicator, int_1, int_2))
array.set(a_array, 36, f_calc_score(p_base / price_a37, trend_indicator, int_1, int_2))
array.set(a_array, 37, f_calc_score(p_base / price_a38, trend_indicator, int_1, int_2))
array.set(a_array, 38, f_calc_score(p_base / price_a39, trend_indicator, int_1, int_2))
array.set(a_array, 39, f_calc_score(p_base / price_a40, trend_indicator, int_1, int_2))
a_array
Conditional Array Setting (f_arrayset):
This function checks if the number of used assets is greater than or equal to a specified number before populating the arrays.
// only set values into arrays for USED assets
f_arrayset(asset_number, a_array, p_base) =>
if (used_assets >= asset_number)
f_array_set(a_array, p_base)
else
na
Main Logic
The main logic initializes arrays to store scores for each asset. Each array corresponds to one asset's performance score.
Setting Trend Values: The code calls f_arrayset for each asset, populating the respective arrays with calculated scores based on the asset prices.
Combining Arrays: A combined_array is created to hold all the scores from individual asset arrays. This array facilitates further analysis, allowing for an overview of the performance scores of all assets at once.
// create a combined array (work-around since pinescript doesn't support having array of arrays)
var combined_array = array.new_int(40 * 40, 0)
if barstate.islast
for i = 0 to 39
array.set(combined_array, i, array.get(a1_array, i))
array.set(combined_array, i + (40 * 1), array.get(a2_array, i))
array.set(combined_array, i + (40 * 2), array.get(a3_array, i))
array.set(combined_array, i + (40 * 3), array.get(a4_array, i))
array.set(combined_array, i + (40 * 4), array.get(a5_array, i))
array.set(combined_array, i + (40 * 5), array.get(a6_array, i))
array.set(combined_array, i + (40 * 6), array.get(a7_array, i))
array.set(combined_array, i + (40 * 7), array.get(a8_array, i))
array.set(combined_array, i + (40 * 8), array.get(a9_array, i))
array.set(combined_array, i + (40 * 9), array.get(a10_array, i))
array.set(combined_array, i + (40 * 10), array.get(a11_array, i))
array.set(combined_array, i + (40 * 11), array.get(a12_array, i))
array.set(combined_array, i + (40 * 12), array.get(a13_array, i))
array.set(combined_array, i + (40 * 13), array.get(a14_array, i))
array.set(combined_array, i + (40 * 14), array.get(a15_array, i))
array.set(combined_array, i + (40 * 15), array.get(a16_array, i))
array.set(combined_array, i + (40 * 16), array.get(a17_array, i))
array.set(combined_array, i + (40 * 17), array.get(a18_array, i))
array.set(combined_array, i + (40 * 18), array.get(a19_array, i))
array.set(combined_array, i + (40 * 19), array.get(a20_array, i))
array.set(combined_array, i + (40 * 20), array.get(a21_array, i))
array.set(combined_array, i + (40 * 21), array.get(a22_array, i))
array.set(combined_array, i + (40 * 22), array.get(a23_array, i))
array.set(combined_array, i + (40 * 23), array.get(a24_array, i))
array.set(combined_array, i + (40 * 24), array.get(a25_array, i))
array.set(combined_array, i + (40 * 25), array.get(a26_array, i))
array.set(combined_array, i + (40 * 26), array.get(a27_array, i))
array.set(combined_array, i + (40 * 27), array.get(a28_array, i))
array.set(combined_array, i + (40 * 28), array.get(a29_array, i))
array.set(combined_array, i + (40 * 29), array.get(a30_array, i))
array.set(combined_array, i + (40 * 30), array.get(a31_array, i))
array.set(combined_array, i + (40 * 31), array.get(a32_array, i))
array.set(combined_array, i + (40 * 32), array.get(a33_array, i))
array.set(combined_array, i + (40 * 33), array.get(a34_array, i))
array.set(combined_array, i + (40 * 34), array.get(a35_array, i))
array.set(combined_array, i + (40 * 35), array.get(a36_array, i))
array.set(combined_array, i + (40 * 36), array.get(a37_array, i))
array.set(combined_array, i + (40 * 37), array.get(a38_array, i))
array.set(combined_array, i + (40 * 38), array.get(a39_array, i))
array.set(combined_array, i + (40 * 39), array.get(a40_array, i))
Calculating Sums: A separate array_sums is created to store the total score for each asset by summing the values of their respective score arrays. This allows for easy comparison of overall performance.
Ranking Assets: The final part of the code ranks the assets based on their total scores stored in array_sums. It assigns a rank to each asset, where the asset with the highest score receives the highest rank.
// create array for asset RANK based on array.sum
var ranks = array.new_int(used_assets, 0)
// for loop that calculates the rank of each asset
if barstate.islast
for i = 0 to (used_assets - 1)
int rank = 1
for x = 0 to (used_assets - 1)
if i != x
if array.get(array_sums, i) < array.get(array_sums, x)
rank := rank + 1
array.set(ranks, i, rank)
Dynamic Table Creation
Initialization: The table is initialized with a base structure that includes headers for asset names, scores, and ranks. The headers are set to remain constant, ensuring clarity for users as they interpret the displayed data.
Data Population: As scores are calculated for each asset, the corresponding values are dynamically inserted into the table. This is achieved through a loop that iterates over the scores and ranks stored in the combined_array and array_sums, respectively.
Automatic Extending Mechanism
Variable Asset Count: The code checks the number of assets defined by the user. Instead of hardcoding the number of rows in the table, it uses a variable to determine the extent of the data that needs to be displayed. This allows the table to expand or contract based on the number of assets being analyzed.
Dynamic Row Generation: Within the loop that populates the table, the code appends new rows for each asset based on the current asset count. The structure of each row includes the asset name, its score, and its rank, ensuring that the table remains consistent regardless of how many assets are involved.
// Automatically extending table based on the number of used assets
var table table = table.new(position.bottom_center, 50, 50, color.new(color.black, 100), color.white, 3, color.white, 1)
if barstate.islast
if not hide_head
table.cell(table, 0, 0, "Universal Ratio Trend Matrix", text_color = color.white, bgcolor = #010c3b, text_size = fontSize)
table.merge_cells(table, 0, 0, used_assets + 3, 0)
if not hide_inps
table.cell(table, 0, 1,
text = "Inputs: You are using " + str.tostring(trend_indicator) + ", which takes: " + str.tostring(f_get_input(trend_indicator)),
text_color = color.white, text_size = fontSize), table.merge_cells(table, 0, 1, used_assets + 3, 1)
table.cell(table, 0, 2, "Assets", text_color = color.white, text_size = fontSize, bgcolor = #010c3b)
for x = 0 to (used_assets - 1)
table.cell(table, x + 1, 2, text = str.tostring(array.get(assets, x)), text_color = color.white, bgcolor = #010c3b, text_size = fontSize)
table.cell(table, 0, x + 3, text = str.tostring(array.get(assets, x)), text_color = color.white, bgcolor = f_asset_col(array.get(ranks, x)), text_size = fontSize)
for r = 0 to (used_assets - 1)
for c = 0 to (used_assets - 1)
table.cell(table, c + 1, r + 3, text = str.tostring(array.get(combined_array, c + (r * 40))),
text_color = hl_type == "Text" ? f_get_col(array.get(combined_array, c + (r * 40))) : color.white, text_size = fontSize,
bgcolor = hl_type == "Background" ? f_get_col(array.get(combined_array, c + (r * 40))) : na)
for x = 0 to (used_assets - 1)
table.cell(table, x + 1, x + 3, "", bgcolor = #010c3b)
table.cell(table, used_assets + 1, 2, "", bgcolor = #010c3b)
for x = 0 to (used_assets - 1)
table.cell(table, used_assets + 1, x + 3, "==>", text_color = color.white)
table.cell(table, used_assets + 2, 2, "SUM", text_color = color.white, text_size = fontSize, bgcolor = #010c3b)
table.cell(table, used_assets + 3, 2, "RANK", text_color = color.white, text_size = fontSize, bgcolor = #010c3b)
for x = 0 to (used_assets - 1)
table.cell(table, used_assets + 2, x + 3,
text = str.tostring(array.get(array_sums, x)),
text_color = color.white, text_size = fontSize,
bgcolor = f_highlight_sum(array.get(array_sums, x), array.get(ranks, x)))
table.cell(table, used_assets + 3, x + 3,
text = str.tostring(array.get(ranks, x)),
text_color = color.white, text_size = fontSize,
bgcolor = f_highlight_rank(array.get(ranks, x)))
Third-order moment by TonymontanovThe "Third-order moment" indicator is designed to help traders identify asymmetries and potential turning points in a financial instrument's price distribution over a specified period. By calculating the skewness of the price distribution, this indicator provides insights into the potential future movement direction of the market.
User Parameters:
- Length: This parameter defines the number of bars (or periods) used to compute the mean and third-order moment. A longer length provides a broader historical context, which may smooth out short-term volatility.
- Source: The data input for calculations, defaulting to the closing price of each bar, although users can select alternatives like open, high, low, or any custom value to suit their analysis preferences.
Operational Algorithm:
1. Mean Calculation:
- The indicator begins by calculating the arithmetic mean of the selected data source over the specified period.
2. Third-order Moment Calculation:
- A deviation from the mean is calculated for each data point. These deviations are then cubed to capture any asymmetry in the price distribution.
- The third-order moment is determined by summing these cubed deviations over the specified length and dividing by the number of periods, providing a measure of skewness.
3. Graphical Representation:
- The indicator plots the third-order moment as a column plot. The color of the columns changes based on the sign of the moment: green for positive and red for negative, suggesting bullish and bearish skewness, respectively.
- A zero line is included to help visualize transitions between positive and negative skewness clearly.
- Additionally, the background color shifts depending on whether the third-order moment is above or below zero, further highlighting the prevailing market sentiment.
The "Third-order moment" indicator is a valuable tool for traders looking to gauge the market's skewness, helping identify potential trend continuations or reversals. By understanding the dominance of positive or negative skewness, traders can make more informed decisions.
Asymmetric volatilityThe "Asymmetric Volatility" indicator is designed to visualize the differences in volatility between upward and downward price movements of a selected instrument. It operates on the principle of analyzing price movements over a specified time period, with particular focus on the symmetrical evaluation of both price rises and falls.
User Parameters:
- Length: This parameter specifies the number of bars (candles) used to calculate the average volatility. The larger the value, the longer the time period, and the smoother the volatility data will be.
- Source: This represents the input data for the indicator calculations. By default, the close value of each bar is used, but the user can choose another data source (such as open, high, low, or any custom value).
Operational Algorithm:
1. Movement Calculation:
- UpMoves: Computed as the positive difference between the current bar value and the previous bar value, if it is greater than zero.
- DownMoves: Computed as the positive difference between the previous bar value and the current bar value, if it is greater than zero.
2. Volatility Calculation:
- UpVolatility: This is the arithmetic mean of the UpMoves values over the specified period.
- DownVolatility: This is the arithmetic mean of the DownMoves values over the specified period.
3. Graphical Representation:
- The indicator displays two plots: upward and downward volatility, represented by green and red lines, respectively.
- The background color changes based on which volatility is dominant: a green background indicates that upward volatility prevails, while a red background indicates downward volatility.
The indicator allows traders to quickly assess in which direction the market is more volatile at the moment, which can be useful for making trading decisions and evaluating the current market situation.
Statistics plot1. setting the price range
At the beginning of the script, set the price range (interval). Price ranges are used to divide prices into several groups (buckets) and record how many prices have been reached within each group. For example, setting the price range to “10” will divide the price into intervals 0-10, 10-20, 20-30, and so on.
The price range can also be set manually by the user or automatically calculated based on the initial price. This allows for flexibility in adjusting price ranges for different assets and different time frames.
2. aggregate the number of times a price is reached
Record how many times the price reached each price range (e.g., 100-110, 110-120, etc.). This aggregate data is stored in a data structure called an array.
Each element of the array corresponds to a price range, and when a price reaches that range, the corresponding array value is incremented by one. This process is performed in real time, tracking price movements.
3. initializing and extending price ranges
The first bar of the script (when the chart is first loaded) divides the price ranges into several groups and initializes a count of 0 for each range.
When a price reaches a new range, the array is expanded as needed to add the new price range. This allows the script to work with any price movement, even if the price range continues to grow.
4. visualize the number of price arrivals with a histogram
The aggregated number of arrivals per price range is visually displayed in the form of a histogram. This histogram is designed to allow the user to see at a glance which price range is being reached most frequently.
For example, if prices frequently reach the 100-110 range, the histogram bar corresponding to that range will appear higher than the other ranges. This allows you to visually identify price “dwell points” or support and resistance levels.
5. display of moving averages
A moving average (MA) of the number of times a price has been reached is drawn above the histogram. Moving averages are indicators that show a smooth trend for the number of price arrivals and are useful for understanding the overall direction of price movements.
The duration of the moving average (how many data points it is calculated based on) can be set by the user. This allows for flexible analysis of short or long term price trends. 6.
6. price range tracking and labeling
The script keeps track of which price range the current price is located in. Based on this, information related to the current price range is displayed on the chart as labels.
In particular, labels indicate the beginning and end points of the price range, including which range the price was in at the beginning and which range the price reached at the end. These labels are a useful feature to visually identify price ranges on the chart.
7. labeling of current price range
To confirm which price range the current price is in, when a price reaches a specific price range, a label corresponding to that price range is displayed. This label indicates the position of the price in real-time, allowing traders to visually track where the current price is in the area.
8. calculating the start and end points of the range
The script calculates the start and end points of a range with a non-zero number of price arrivals to find the minimum and maximum of the range. This calculation allows you to see where prices are concentrated within a range.
9. out-of-range price processing
When a price reaches outside the range, the script automatically adds the array element corresponding to that price range and inserts the data in the appropriate location for the count. This allows the script to follow the price as it moves unexpectedly.
Daily Seasonality [YuL]This indicator calculates average returns for trading days across specified number of years in the past and displays this as a histogram. In addition, it displays EMA of these values as filled area plot.
Indicator uses ordinal number of trading day in a year, i.e. January 3rd may be 1st trading day, January 4th - 2nd trading day, etc.
Large green or red areas may mean that there is a strong seasonal factor at these dates that may support, launch, or break a trend.
It only works on daily timeframe at the moment. Maximum number of years it can look back is 15.