UtilsLibrary   "Utils" 
A collection of convenience and helper functions for indicator and library authors on TradingView
 formatNumber(num) 
  My version of format number that doesn't have so many decimal places...
  Parameters:
     num (float) : (float) the number to be formatted
  Returns: (string) The formatted number
 getDateString(timestamp) 
  Convenience function returns timestamp in yyyy/MM/dd format.
  Parameters:
     timestamp (int) : (int) The timestamp to stringify
  Returns: (int) The date string
 getDateTimeString(timestamp) 
  Convenience function returns timestamp in yyyy/MM/dd hh:mm format.
  Parameters:
     timestamp (int) : (int) The timestamp to stringify
  Returns: (int) The date string
 getInsideBarCount() 
  Gets the number of inside bars for the current chart. Can also be passed to request.security to get the same for different timeframes.
  Returns: (int) The # of inside bars on the chart right now.
 getLabelStyleFromString(styleString, acceptGivenIfNoMatch) 
  Tradingview doesn't give you a nice way to put the label styles into a dropdown for configuration settings. So, I specify them in the following format:  . This function takes care of converting those custom strings back to the ones expected by tradingview scripts.
  Parameters:
     styleString (string) 
     acceptGivenIfNoMatch (bool) : (bool) If no match for styleString is found and this is true, the function will return styleString, otherwise it will return tradingview's preferred default
  Returns: (string) The string expected by tradingview functions
 getTime(hourNumber, minuteNumber) 
  Given an hour number and minute number, adds them together and returns the sum. To be used by getLevelBetweenTimes when fetching specific price levels during a time window on the day.
  Parameters:
     hourNumber (int) : (int) The hour number
     minuteNumber (int) : (int) The minute number
  Returns: (int) The sum of all the minutes
 getHighAndLowBetweenTimes(start, end) 
  Given a start and end time, returns the high or low price during that time window.
  Parameters:
     start (int) : The timestamp to start with (# of seconds)
     end (int) : The timestamp to end with (# of seconds)
  Returns: (float) The high or low value
 getPremarketHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the premarket high & low levels in a tuple.
  Returns: (tuple)  
 getAfterHoursHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the after hours high & low levels in a tuple.
  Returns: (tuple)  
 getOvernightHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the overnight high & low levels in a tuple.
  Returns: (tuple)  
 getNonRthHighsAndLows() 
  Returns an expression that can be used by request.security to fetch the high & low levels for premarket, after hours and overnight in a tuple.
  Returns: (tuple)  
 getLineStyleFromString(styleString, acceptGivenIfNoMatch) 
  Tradingview doesn't give you a nice way to put the line styles into a dropdown for configuration settings. So, I specify them in the following format:  . This function takes care of converting those custom strings back to the ones expected by tradingview scripts.
  Parameters:
     styleString (string) : (string) Plain english (or TV Standard) version of the style string
     acceptGivenIfNoMatch (bool) : (bool) If no match for styleString is found and this is true, the function will return styleString, otherwise it will return tradingview's preferred default
  Returns: (string) The string expected by tradingview functions
 getPercentFromPrice(price) 
  Get the % the current price is away from the given price.
  Parameters:
     price (float) 
  Returns: (float) The % the current price is away from the given price.
 getPositionFromString(position) 
  Tradingview doesn't give you a nice way to put the positions into a dropdown for configuration settings. So, I specify them in the following format:  . This function takes care of converting those custom strings back to the ones expected by tradingview scripts.
  Parameters:
     position (string) : (string) Plain english position string
  Returns: (string) The string expected by tradingview functions
 getTimeframeOfChart() 
  Get the timeframe of the current chart for display
  Returns: (string) The string of the current chart timeframe
 getTimeNowPlusOffset(candleOffset) 
  Helper function for drawings that use xloc.bar_time to help you know the time offset if you want to place the end of the drawing out into the future. This determines the time-size of one candle and then returns a time n candleOffsets into the future.
  Parameters:
     candleOffset (int) : (int) The number of items to find singular/plural for.
  Returns: (int) The future time
 getVolumeBetweenTimes(start, end) 
  Given a start and end time, returns the sum of all volume across bars during that time window.
  Parameters:
     start (int) : The timestamp to start with (# of seconds)
     end (int) : The timestamp to end with (# of seconds)
  Returns: (float) The volume
 isToday() 
  Returns true if the current bar occurs on today's date.
  Returns: (bool) True if current bar is today
 padLabelString(labelText, labelStyle) 
  Pads a label string so that it appears properly in or not in a label. When label.style_none is used, this will make sure it is left-aligned instead of center-aligned. When any other type is used, it adds a single space to the right so there is padding against the right end of the label.
  Parameters:
     labelText (string) : (string) The string to be padded
     labelStyle (string) : (string) The style of the label being padded for.
  Returns: (string) The padded string
 plural(num, singular, plural) 
  Helps format a string for plural/singular. By default, if you only provide num, it will just return "s" for plural and nothing for singular (eg. plural(numberOfCats)). But you can optionally specify the full singular/plural words for more complicated nomenclature (eg. plural(numberOfBenches, 'bench', 'benches'))
  Parameters:
     num (int) : (int) The number of items to find singular/plural for.
     singular (string) : (string) The string to return if num is singular. Defaults to an empty string.
     plural (string) : (string) The string to return if num is plural. Defaults to 's' so you can just add 's' to the end of a word.
  Returns: (string) The singular or plural provided strings depending on the num provided.
 timeframeInSeconds(timeframe) 
  Get the # of seconds in a given timeframe. Tradingview's timeframe.in_seconds() expects a simple string, and we often need to use series string, so this is an alternative to get you the value you need.
  Parameters:
     timeframe (string) 
  Returns: (int) The number of secondsof that timeframe
 timeframeToString(tf) 
  Convert a timeframe string to a consistent standard.
  Parameters:
     tf (string) : (string) The timeframe string to convert
  Returns: (string) The standard format for the string, or the unchanged value if it is unknown.
Cari dalam skrip untuk "one一季度财报"
Volume and Price Z-Score [Multi-Asset] - By LeviathanThis script offers in-depth Z-Score analytics on price and volume for 200 symbols. Utilizing visualizations such as scatter plots, histograms, and heatmaps, it enables traders to uncover potential trade opportunities, discern market dynamics, pinpoint outliers, delve into the relationship between price and volume, and much more.
A Z-Score is a statistical measurement indicating the number of standard deviations a data point deviates from the dataset's mean. Essentially, it provides insight into a value's relative position within a group of values (mean).
- A Z-Score of  zero  means the data point is exactly at the mean.
- A  positive  Z-Score indicates the data point is above the mean.
- A  negative  Z-Score indicates the data point is below the mean.
For instance, a Z-Score of 1 indicates that the data point is 1 standard deviation above the mean, while a Z-Score of -1 indicates that the data point is 1 standard deviation below the mean. In simple terms, the more extreme the Z-Score of a data point, the more “unusual” it is within a larger context. 
If data is normally distributed, the following properties can be observed:
- About 68% of the data will lie within ±1 standard deviation (z-score between -1 and 1).
- About 95% will lie within ±2 standard deviations (z-score between -2 and 2).
- About 99.7% will lie within ±3 standard deviations (z-score between -3 and 3).
Datasets like price and volume (in this context) are most often not normally distributed. While the interpretation in terms of percentage of data lying within certain ranges of z-scores (like the ones mentioned above) won't hold, the z-score can still be a useful measure of how "unusual" a data point is relative to the mean. 
The aim of this indicator is to offer a unique way of screening the market for trading opportunities by conveniently visualizing where current volume and price activity stands in relation to the average. It also offers features to observe the convergent/divergent relationships between asset’s price movement and volume, observe a single symbol’s activity compared to the wider market activity and much more.
Here is an overview of a few important settings.
 Z-SCORE TYPE 
◽️ Z-Score Type: Current Z-Score
Calculates the z-score by comparing current bar’s price and volume data to the mean (moving average with any custom length, default is 20 bars). This indicates how much the current bar’s price and volume data deviates from the average over the specified period. A positive z-score suggests that the current bar's price or volume is above the mean of the last 20 bars (or the custom length set by the user), while a negative z-score means it's below that mean. 
 Example: Consider an asset whose current price and volume both show deviations from their 20-bar averages. If the price's Z-Score is +1.5 and the volume's Z-Score is +2.0, it means the asset's price is 1.5 standard deviations above its average, and its trading volume is 2 standard deviations above its average. This might suggest a significant upward move with strong trading activity. 
◽️ Z-Score Type: Average Z-Score
Calculates the custom-length average of symbol's z-score. Think of it as a smoothed version of the Current Z-Score. Instead of just looking at the z-score calculated on the latest bar, it considers the average behavior over the last few bars. By doing this, it helps reduce sudden jumps and gives a clearer, steadier view of the market.
 Example: Instead of a single bar, imagine the average price and volume of an asset over the last 5 bars. If the price's 5-bar average Z-Score is +1.0 and the volume's is +1.5, it tells us that, over these recent bars, both the price and volume have been consistently above their longer-term averages, indicating sustained increase. 
◽️ Z-Score Type: Relative Z-Score
Calculates a relative z-score by comparing symbol’s current bar z-score to the mean (average z-score of all symbols in the group). This is essentially a z-score of a z-score, and it helps in understanding how a particular symbol's activity stands out not just in its own historical context, but also in relation to the broader set of symbols being analyzed. In other words, while the primary z-score tells you how unusual a bar's activity is for that specific symbol, the relative z-score informs you how that "unusualness" ranks when compared to the entire group's deviations. This can be particularly useful in identifying symbols that are outliers even among outliers, indicating exceptionally unique behaviors or opportunities.
 Example: If one asset's price Z-Score is +2.5 and volume Z-Score is +3.0, but the group's average Z-Scores are +0.5 for price and +1.0 for volume, this asset’s Relative Z-Score would be high and therefore stand out. This means that asset's price and volume activities are notably high, not just by its own standards, but also when compared to other symbols in the group. 
 DISPLAY TYPE 
◽️ Display Type: Scatter Plot
The Scatter Plot is a visual tool designed to  represent values for two variables, in this case the Z-Scores of price and volume for multiple symbols. Each symbol has it's own dot with x and y coordinates:
X-Axis:  Represents the Z-Score of price. A symbol further to the right indicates a higher positive deviation in its price from its average, while a symbol to the left indicates a negative deviation. 
Y-Axis:  Represents the Z-Score of volume. A symbol positioned higher up on the plot suggests a higher positive deviation in its trading volume from its average, while one lower down indicates a negative deviation. 
Here are some guideline insights of plot positioning:
- Top-Right Quadrant (High Volume-High Price):  Symbols in this quadrant indicate a scenario where both the trading volume and price are higher than their respective mean.  
- Top-Left Quadrant (High Volume-Low Price):  Symbols here reflect high trading volumes but prices lower than the mean.  
- Bottom-Left Quadrant (Low Volume-Low Price):  Assets in this quadrant have both low trading volume and price compared to their mean.  
- Bottom-Right Quadrant (Low Volume-High Price):  Symbols positioned here have prices that are higher than their mean, but the trading volume is low compared to the mean.  
The plot also integrates a set of concentric squares which serve as visual guides:
- 1st Square (1SD):  Encapsulates symbols that have Z-Scores within ±1 standard deviation for both price and volume. Symbols within this square are typically considered to be displaying normal behavior or within expected range. 
- 2nd Square (2SD):  Encapsulates those with Z-Scores within ±2 standard deviations. Symbols within this boundary, but outside the 1 SD square, indicate a moderate deviation from the norm. 
- 3rd Square (3SD):  Represents symbols with Z-Scores within ±3 standard deviations. Any symbol outside this square is deemed to be a significant outlier, exhibiting extreme behavior in terms of either its price, its volume, or both. 
By assessing the position of symbols relative to these squares, traders can swiftly identify which assets are behaving typically and which are showing unusual activity. This visualization simplifies the process of spotting potential outliers or unique trading opportunities within the market. The farther a symbol is from the center, the more it deviates from its typical behavior.
◽️ Display Type: Columns
In this visualization, z-scores are represented using columns, where each symbol is presented horizontally. Each symbol has two distinct nodes:
- Left Node:  Represents the z-score of volume. 
- Right Node:  Represents the z-score of price. 
The height of these nodes can vary along the y-axis between -4 and 4, based on the z-score value:
- Large Positive Columns:  Signify a high or positive z-score, indicating that the price or volume is significantly above its average. 
- Large Negative Columns:  Represent a low or negative z-score, suggesting that the price or volume is considerably below its average. 
- Short Columns Near 0:  Indicate that the price or volume is close to its mean, showcasing minimal deviation. 
This columnar representation provides a clear, intuitive view of how each symbol's price and volume deviate from their respective averages.
◽️ Display Type: Circles
In this visualization style, z-scores are depicted using circles. Each symbol is horizontally aligned and represented by:
- Solid Circle:  Represents the z-score of price. 
- Transparent Circle:  Represents the z-score of volume. 
The vertical position of these circles on the y-axis ranges between -4 and 4, reflecting the z-score value:
- Circles Near the Top:  Indicate a high or positive z-score, suggesting the price or volume is well above its average. 
- Circles Near the Bottom:  Represent a low or negative z-score, pointing to the price or volume being notably below its average. 
- Circles Around the Midline (0):  Highlight that the price or volume is close to its mean, with minimal deviation. 
◽️ Display Type: Delta Columns
There's also an option to utilize Z-Score Delta Columns. For each symbol, a single column is presented, depicting the difference between the z-score of price and the z-score of volume.
The z-score delta essentially captures the disparity between how much the price and volume deviate from their respective mean:
- Positive Delta:  Indicates that the z-score of price is greater than the z-score of volume. This suggests that the price has deviated more from its average than the volume has from its own average. Such a scenario could point to price movements being more significant or pronounced compared to the changes in volume. 
- Negative Delta:  Represents that the z-score of volume is higher than the z-score of price. This might mean that there are substantial volume changes, yet the price hasn't moved as dramatically. This can be indicative of potential build-up in trading interest without an equivalent impact on price. 
- Delta Close to 0:  Means that the z-scores for price and volume are almost equal, indicating their deviations from the average are in sync. 
◽️ Display Type: Z-Volume/Z-Price Heatmap
This visualization offers a heatmap either for volume z-scores or price z-scores across all symbols. Here's how it's presented:
Each symbol is allocated its own horizontal row. Within this row, bar-by-bar data is displayed using a color gradient to represent the z-score values. The heatmap employs a user-defined gradient scale, where a chosen "cold" color represents low z-scores and a chosen "hot" color signifies high z-scores. As the z-score increases or decreases, the colors transition smoothly along this gradient, providing an intuitive visual indication of the z-score's magnitude.
- Cold Colors:  Indicate values significantly below the mean (negative z-score) 
- Mild Colors:  Represent values close to the mean, suggesting minimal deviation. 
- Hot Colors:  Indicate values significantly above the mean (positive z-score) 
This heatmap format provides a rapid, visually impactful means to discern how each symbol's price or volume is behaving relative to its average. The color-coded rows allow you to quickly spot outliers.
 VOLUME TYPE 
The "Volume Type" input allows you to choose the nature of volume data that will be factored into the volume z-score calculation. The interpretation of indicator’s data changes based on this input. You can opt between:
- Volume (Regular Volume):  This is the classic measure of trading volume, which represents the volume traded in a given time period - bar. 
- OBV (On-Balance Volume):  OBV is a momentum indicator that accumulates volume on up bars and subtracts it on down bars, making it a cumulative indicator that sort of measures buying and selling pressure. 
Interpretation Implications:
- For Volume Type: Regular Volume:
Positive Z-Score:  Indicates that the trading volume is above its average, meaning there's unusually high trading activity .
Negative Z-Score:  Suggests that the trading volume is below its average, signifying unusually low trading activity. 
- For Volume Type: OBV:
Positive Z-Score:  Signifies that “buying pressure” is above its average. 
Negative Z-Score:  Signifies that “selling pressure” is above its average. 
When comparing Z-Score of OBV to Z-Score of price, we can observe several scenarios. If Z-Price and Z-Volume are convergent (have similar z-scores), we can say that the directional price movement is supported by volume. If Z-Price and Z-Volume are divergent (have very different z-scores or one of them being zero), it suggests a potential misalignment between price movement and volume support, which might hint at possible reversals or weakness.
Machine Learning using Neural Networks | EducationalThe script provided is a comprehensive illustration of how to implement and execute a simplistic Neural Network (NN) on TradingView using PineScript. 
It encompasses the entire workflow from data input, weight initialization, implicit neuron calculation, feedforward computation, backpropagation for weight adjustments, generating predictions, to visualizing the Mean Squared Error (MSE) Loss Curve for monitoring the training phase. 
In the visual example above, you can see that the prediction is not aligned with the actual value. This is intentional for demonstrative purposes, and by incrementing the Epochs or Learning Rate, you will see these two values converge as the accuracy increases.
 Hyperparameters: 
Learning Rate, Epochs, and the choice between Simple Backpropagation and a verbose version are declared as script inputs, allowing users to tailor the training process.
 Initialization: 
Random initialization of weight matrices (w1, w2) is performed to ensure asymmetry, promoting effective gradient updates. A seed is added for reproducibility.
 Utility Functions: 
Functions for matrix randomization, sigmoid activation, MSE loss calculation, data normalization, and standardization are defined to streamline the computation process.
 Neural Network Computation: 
The feedforward function computes the hidden and output layer values given the input.
Two variants of the backpropagation function are provided for weight adjustment, with one offering a more verbose step-by-step computation of gradients.
A wrapper train_nn function iterates through epochs, performing feedforward, loss computation, and backpropagation in each epoch while logging and collecting loss values.
 Training Invocation: 
The input data is prepared by normalizing it to a value between 0 and 1 using the maximum standardized value, and the training process is invoked only on the last confirmed bar to preserve computational resources.
 Output Forecasting and Visualization: 
Post training, the NN's output (predicted price) is computed, standardized and visualized alongside the actual price on the chart.
The MSE loss between the predicted and actual prices is visualized, providing insight into the prediction accuracy.
Optionally, the MSE Loss Curve is plotted on the chart, illustrating the loss trajectory through epochs, assisting in understanding the training performance.
 Customizable Visualization: 
Various inputs control visualization aspects like Chart Scaling, Chart Horizontal Offset, and Chart Vertical Offset, allowing users to adapt the visualization to their preference.
-------------------------------------------------------
The following is this Neural Network structure, consisting of one hidden layer, with two hidden neurons. 
  
Through understanding the steps outlined in my code, one should be able to scale the NN in any way they like, such as changing the input / output data and layers to fit their strategy ideas. 
Additionally, one could forgo the backpropagation function, and load their own trained weights into the w1 and w2 matrices, to have this code run purely for inference.
-------------------------------------------------------
While this demonstration does create a “prediction”, it is on historical data. The purpose here is educational, rather than providing a ready tool for non-programmer consumers. 
Normally in Machine Learning projects, the training process would be split into two segments, the Training and the Validation parts. For the purpose of conveying the core concept in a concise and non-repetitive way, I have foregone the Validation part. However, it is merely the application of your trained network on new data (feedforward), and monitoring the loss curve. 
Essentially, checking the accuracy on “unseen” data, while training it on “seen” data.
-------------------------------------------------------
I hope that this code will help developers create interesting machine learning applications within the Tradingview ecosystem.
Heatmap MACD Strategy - Pineconnector (Dynamic Alerts)Hello traders
This script is an upgrade of this template script.
 Heatmap MACD Strategy 
 Pineconnector 
Pineconnector is a trading bot software that forwards TradingView alerts to your Metatrader 4/5 for automating trading.
Many traders don't know how to dynamically create Pineconnector-compatible alerts using the data from their TradingView scripts.
 Traders using trading bots want their alerts to reflect the stop-loss/take-profit/trailing-stop/stop-loss to breakeven options from your script and then create the orders accordingly. 
This script showcases how to create Pineconnector alerts dynamically.
Pineconnector doesn't support alerts with multiple Take Profits.
As a workaround, for 2 TPs, I had to open two trades.
It's not optimal, as we end up paying more spreads for that extra trade - however, depending on your trading strategy, it may not be a big deal.
 TradingView Alerts 
1) You'll have to create one alert per asset X timeframe = 1 chart.
 Example : 1 alert for EUR/USD on the 5 minutes chart, 1 alert for EUR/USD on the 15-minute chart (assuming you want your bot to trade the EUR/USD on the 5 and 15-minute timeframes)
2) For each alert, the alert message is pre-configured with the text below
 {{strategy.order.alert_message}} 
Please leave it as it is.
It's a TradingView native variable that will fetch the alert text messages built by the script.
3) Don't forget to set the webhook URL in the Notifications tab of the TradingView alerts UI.
 EA configuration 
The  Pyramiding  in the EA on Metatrader must be set to  2  if you want to trade with 2 TPs => as it's opening 2 trades.
If you only want 1 TP, set the EA  Pyramiding  to 1.
Regarding the other EA settings, please refer to the Pineconnector documentation on their website.
 Logger 
The Pineconnector commands are logged in the TradingView logger.
You'll find more information about it from this  TradingView blog post 
 Important Notes 
1) This multiple MACDs strategy doesn't matter much.
I could have selected any other indicator or concept for this script post.
I wanted to share an example of how you can quickly upgrade your strategy, making it compatible with Pineconnector.
2) The backtest results aren't relevant for this  educational  script publication.
I used realistic backtesting data but didn't look too much into optimizing the results, as this isn't the point of why I'm publishing this script.
3) This template is made to take 1 trade per direction at any given time.
Pyramiding is set to 1 on TradingView.
The strategy default settings are:
 
  Initial Capital: 100000 USD
  Position Size: 1 contract
  Commission Percent: 0.075%
  Slippage: 1 tick
  No margin/leverage used
 
For example, those are realistic settings for trading CFD indices with low timeframes but not the best possible settings for all assets/timeframes.
 Concept 
The Heatmap MACD Strategy allows selecting one MACD in five different timeframes.
You'll get an exit signal whenever one of the 5 MACDs changes direction.
Then, the strategy re-enters whenever all the MACDs are in the same direction again.
It takes:
 
  long trades when all the 5 MACD histograms are bullish
  short trades when all the 5 MACD histograms are bearish
  
You can select the same timeframe multiple times if you don't need five timeframes.
For example, if you only need the 30min, the 1H, and 2H, you can set your timeframes as follow:
 
  30m
  30m
  30m
  1H
  2H
 
 Risk Management Features 
All the features below are pips-based.
 
  Stop-Loss
  Trailing Stop-Loss
  Stop-Loss to Breakeven after a certain amount of pips has been reached
  Take Profit 1st level and closing X% of the trade
  Take Profit 2nd level and close the remaining of the trade
 
 Custom Exit 
I added the option ON/OFF to close the opened trade whenever one of the MACD diverges with the others.
 Help me help the community 
If you see any issue when adding your strategy logic to that template regarding the orders fills on your Metatrader, please let me know in the comments.
I'll use your feedback to make this template more robust. :)
 What's next? 
I'll publish a more generic template built as a connector so you can connect any indicator to that Pineconnector template.
Then, I'll publish a template for Capitalise AI, ProfitView, AutoView, and Alertatron.
Thank you
Dave
Fractals 5/7/9/11/13 ModifiedDescription: 
The Modified Fractals Indicator is designed to help traders identify specific fractal patterns on a chart. Unlike traditional Williams Fractals, this indicator focuses on highlighting two distinct types of fractals:
- UpFractals: These fractals are identified when each preceding candle has a higher high than the one before it, and each succeeding candle has a higher high than the one following it.
- DownFractals: Conversely, DownFractals are detected when each preceding candle has a lower low than the one before it, and each succeeding candle has a lower low than the one following it.
This unique approach sets it apart from standard Fractal indicators.
 Features: 
1. Originality and Uniqueness: This indicator employs a distinctive algorithm to detect and display modified fractals, providing a fresh perspective on price reversals.
2. Customizable Parameters: Users can fine-tune the indicator to their trading strategy by adjusting the candle count and arrow size.
3. Easy-to-Understand Chart: The Modified Fractals Indicator is designed to provide clear and easily identifiable signals on your chart, enhancing your trading experience.
4. User-Friendly Interface: This indicator is user-friendly and can be easily integrated into your TradingView setup.
 How it Works: 
The Modified Fractals Indicator scans the price action on your chart and identifies specific fractal patterns based on the criteria mentioned above for both UpFractals and DownFractals.
 Usage: 
- Add the Modified Fractals Indicator to your TradingView chart.
- Customize the settings, including the candle count and arrow size, to align with your trading strategy.
- Observe the chart for the appearance of UpFractals and DownFractals as marked by the indicator's arrows.
- Use the signals provided by the indicator to inform your trading decisions, such as potential entry or exit points.
Please note that this Modified Fractals Indicator offers a unique approach to fractal analysis, focusing on specific price patterns that differ from traditional Williams Fractals. It provides traders with an additional tool for identifying potential trend reversals and market opportunities.
Machine Learning: MFI Heat Map [YinYangAlgorithms]Overview: 
MFI Heat Maps are a visually appealing way to display the values of 29 different MFIs at the same time while being able to make sense of it. Each plot within the Indicator represents a different MFI value. The higher you get up, the longer the length that was used for this MFI. This Indicator also features the use of Machine Learning to help balance the MFI levels. It doesn’t solely rely upon Machine Learning but instead incorporates a growing length MFI averaged with the Machine Learning MFI at any given index.
For instance, say we are calculating the 10th plot from the bottom, the MFI would be an average of:
 
 MFI(source, 11)
 Machine Learning MFI at Index of 10
 
We do it this way as they both help smooth each other out without relying solely on just one calculation method.
Due to plot limitations, you are capped at 28 Plot Amounts within this indicator, but that is still quite a bit of information you can glean from a Heat Map.
The Machine Learning used in this indicator is of the K-Nearest Neighbor (KNN). It uses a Fast and Slow MFI calculation then sorts through them over Machine Learning Length and calculates the differences between them. It then slices off KNN length to create our Max/Min Distances allotted. It adds the average between Fast and Slow MFIs to a Viable Distances array if their distances are within the KNN Min/Max distance. It then averages all distances in the Viable Distances array and returns the result.
The result of the KNN Function is saved to another ML Data array whose length is that of Plot Amount (Heat Map Size). This way each Index of the ML Data array can be indexed according to the Heat Map Size.
The Average of the ML Data array is the MFI line (white) that you’ll see plotted on the Indicator. There is also the SMA of the MFI Average (orange) which is likewise plotted. These plots allow you to visualize where the ML MFI is sitting and can potentially be useful for seeing when the MFI Average and SMA cross over and under each other.
We’ve heard many people talk highly of RSI, but sadly not too many even refer to MFI. MFI oftentimes may be overlooked, especially with new traders who may not even know what it is. Essentially MFI is an RSI but it also incorporates Volume into its calculations, which in our opinion leads to a more accurate reading; afterall, what is price movement without Volume.
 Tutorial: 
You may be thinking, this Indicator looks appealing to the eye, but how do I benefit from it trading wise?
Before we get into our visual examples, let's talk briefly about what makes Heat Maps in general a useful tool for trading. Heat Maps give us the ability to visualize and understand lots of data while removing the clutter. We can understand the data of 29 different MFIs without having to look at and decipher 29 different MFI plots. When you overlay too many MFI lines on top of each other, they can be very difficult to read and oftentimes end up actually hindering your Technical Analysis. For this reason, we have a simple solution to this problem; Heat Maps. This MFI Heat Map allows you to easily know (in a relative %) what the MFI level is for varying lengths. For Instance, the First (bottom) plot indexes an MFI of (K(0) (loop of Plot Amount) + Smoothing Length (default 1)) = 1. Since this is indexing (usually) a very low length, it will change much quicker. Whereas the Last (top) plot indexes an MFI of (K(27) (loop of Plot Amount) + Smoothing Length (default 1)) = 28. This is indexing a much higher length of MFI which results in the MFI the higher you go up in the Heat Map to move much slower.
Heat Maps give us the ability to see changes happening over multiple MFIs at the same time, which can be very useful for seeing shifts in MFI / Momentum. Remember, MFI incorporates Volume, so even if the price goes up a lot, if there was low volume, the MFI won’t move as much as an RSI would. However, likewise, if there is high volume but low price movement, the MFI will move slightly more than the RSI.
Heat Maps change color based on their MFI level. If the MFI is >= 90 it is HOT (red), if the MFI <= 9 it is COLD (teal, think of ICE). Green represents an MFI of 50-59 and Dark Blue represents an MFI of 40-49. Green and Dark blue are the most common colors as all the others are more ‘Extreme’ MFI levels.
Okay, time to get to the  Examples :
  
Since there is so much going on in Heat Maps, we’ve decided to focus this tutorial to this specific area and talk about individual locations before talking about it as a whole.
If you refer to the example above where there are 2 white circles; these white circles are highlighting a key location you’ll be wanting to identify within your Heat Maps, many things are happening here:
 
 The MFI crossed over the SMA (bullish).
 The Heat Map started changing from mid/dark Blue (30-50 MFI) to Green (50-59 MFI) around the midline (the 50% dashed like).
 The Lower levels of the Heat Map are turning Yellow/Orange/Red (60-100 MFI).
 The Upper Levels of the Heat Map are still Light Blue - Green  (10-50 MFI).
 
The 4 Key points above, all point towards potential Bullish Momentum changes. You’re likely wondering, but why? Let's discuss about each one in more specific detail:
1. The MFI crossed over the SMA (bullish): What this tells us is that the current MFI Average is now greater than its average over the last (default) 16 bars. This means there's been a large amount of Money Flow (Price and Volume) recently (subjectively based on the last (default) 16 average). This is one of the leading Bullish / Bearish signals you will see within this Indicator. You can enable Signals within the Settings and/or even add Alerts for when these crossings occur.
2. The Heat Map started changing from mid/dark Blue (30-50 MFI) to Green (50-59 MFI) around the midline (the 50% dashed like): This shows us that the index’s in the mid (if using all 28 heat map plots it would be at 14) has already received some of this momentum change. If you look at the second white circle (right), you’ll also notice the higher MFI plot indexes are also green. This is because since their length is long they still have some momentum and strength from the first white circle (left). Just because the first white circle failed in its bullish push, doesn’t mean it didn’t achieve momentum that would later on help to push the price up.
3. The Lower levels of the Heat Map are turning Yellow/Orange/Red (60-100 MFI): It occurred somewhat in the left white circle, but mainly in the right white circle. This shows us the MFI is very high on the lower lengths, this may lead to the current, middle and higher length MFIs following suit soon. Remember it has to work its way up, the higher levels can’t go red unless the lower levels go red first and the higher levels can also lag quite a bit behind and take awhile to catch up, this is normal, expected and meant to happen. Vice versa is also true with getting higher levels to go cold (light teal (think of ICE)).
4. The Upper Levels of the Heat Map are still Light Blue - Green  (10-50 MFI): You might think at first that this is a bad thing, but it's not! Remember you want to be Fearful when others are Greedy and Greedy when others are Fearful! You don’t want to buy when the higher levels have a high MFI, you want to buy when you see the momentum pushing up in the lower MFI levels (getting yellow/orange/red in the low levels) while it is still Cold in the higher levels (BLUE OR GREEN, nothing higher than green as it is already slightly too high). There will be many times that it is Yellow or possibly Orange in the high levels and the bullish push still happens, but this is much more risky! The key to trading is to minimize risks while maximizing potential.
Hopefully now you’re getting an idea of how to spot potential bullish momentum changes, but what about bearish momentum changes? Technically they are the exact opposite, so we don’t need to go into as much detail, but lets still take a look at a few examples:
  
In the example above we marked the 3 times where it was displaying overly bullish characteristics. We marked the bullish momentum occurring with arrows. If you look closely at the start of the arrow to where it finishes, you’ll notice how the heat (HOT)(RED) works its way up from the lower levels to the higher levels. We then see the MFI to SMA cross under. In all 3 of these examples the heat made it all the way to the top of the chart. These are all very bearish signals that represent a bearish momentum movement that may occur soon.
Also, please note, the level the MFI is at DOES matter! That line isn’t there simply for you to see when there are crosses over and under. The MFI is considered to be Overbought when it is greater than 70 (the upper white dashed line, it is just formatted to be on a different scale cause there are 28 plots, but it represents 70). The MFI is considered to be Oversold when it is less than 30 (the lower white dashed line).
  
If we look to the left a little here where a big drop in price occurred shortly after our MFI and SMA crossed, would we have been able to identify it using the Heat Maps? Likely, No. There was some color change in the lower levels a few bars prior that went yellow/orange/red but before this cross happened they all went back to Dark Blue. In the middle section when the cross happened it was only Green and Yellow and in the upper section we are Blue. This would be a very risky trade to go on as the only real Bearish Indication was the MFI to SMA cross under. Remember, you want to reduce risk, you don’t want to simply trade on everytime the MFI and SMA cross each other or you’ll be getting yourself into many risky trades based on false signals.
  
Based on what you’ve learned above, can you see the signs that are indicating where this white circle may have potential for a bullish momentum change?
Now that we are more zoomed in, you may also be noticing there are colors to the price bars. This can be disabled in the settings, but just so you know what they mean, let’s zoom in a little more and talk about it.
  
We’ve condensed the Indicator a bit so you can see the bars better here. The colors that are displayed on these bars are the Heat Map value for your MFI (the white line in the Indicator). This way you can better see when the Price is Hot and Cold. As you may see while looking, the colors generally go from cold to hot when bullish momentum is happening and hot to cold when bearish momentum is happening. We don’t recommend solely looking at the bars as indicators to MFI momentum change, as seeing the Heat Map will give you much more data; however it can be nice to see the Heat Map projected on the bars rather than trying to eyeball it yourself or hover over each bar specifically to see their levels.
We will conclude our Tutorial here. Hopefully this has given you some insight to how useful Heat Maps can be and why it works well with a Machine Learning (KNN) Model applied to the MFI.
 PLEASE NOTE:  You can adjust the line width for the Heat Map within the settings. If you condense the Indicator a lot or have a small screen, likely use a length of 1-2. If you have it stretched out or a large screen, a length of 2-3 will work nice. You just don’t want to have the lines overlapping or it defeats the purpose of a Heat Map. Also, the bigger the linewidth, generally you’ll want to increase the Transparency within the Settings also as it can get quite bright and hurt your eyes over time.
 Settings: 
MFI:
 
 Show MFI and SMA Crossing Signals: MFI and SMA Crossing is one of the leading Bullish and Bearish Signals in this Indicator. You can also add alerts for these signals.
 Plot Amount: How many plots are used in this Heat Map. (2 - 28).
 Source: The Source to use in all MFI calculations.
 Smooth Initial MFI Length: How much to smooth the Fast and Slow MFI calculation by. 1 = No smoothing.
 MFI SMA Length: What length we smooth the MFI Average over to get our MFI SMA.
 
Machine Learning:
 
 Average MFI data by adding a lookback to the Source: While populating our Heat Map with the MFI's, should use use the Source each MFI Length increase or should we also lookback a Source each MFI Length Increase.
 KNN Distance Requirement: To be a valid KNN, it needs to abide by a Distance calculation. Generally only Max is used, but you can change it if it suits your trading style better.
 Machine Learning Length: How much ML data should we store? The longer the length generally the smoother the result; which may not be as accurate for something like a Heat Map, so keeping this relatively low may lead to more accurate results.
 KNN Length: How many KNN are used in the slice to calculate max/min distance allowed.
 Fast Length: Fast MFI length used in KNN to calculate distances by comparing its distance with the Slow MFI Length.
 Slow Length: Slow MFI length used in KNN to calculate distances by comparing its distance with the Fast MFI Length.
 Smoothing Length: When populating our Heat Map, at what length do we start our MFI calculations with (A Higher value with result in a slower and more smoothed MFI / Heat Map).
 
Colors:
 
 Change Bar Color: Change bar colors to MFI Avg Color.
 Heat Map Transparency: If there isn't any transparency it can be a little hard on the eyes. The Greater the Line Width, generally the more transparency you'll want for your eyes.
 Line Width: Set how wide the Heat Map lines are
 MFI 90-100 Color: Color when the MFI is between these levels.
 MFI 80-89 Color: Color when the MFI is between these levels.
 MFI 70-79 Color: Color when the MFI is between these levels.
 MFI 60-69 Color: Color when the MFI is between these levels.
 MFI 50-59 Color: Color when the MFI is between these levels.
 MFI 40-49 Color: Color when the MFI is between these levels.
 MFI 30-39 Color: Color when the MFI is between these levels.
 MFI 20-29 Color: Color when the MFI is between these levels.
 MFI 10-19 Color: Color when the MFI is between these levels.
 MFI 0-100 Color: Color when the MFI is between these levels.
 
If you have any questions, comments, ideas or concerns please don't hesitate to contact us.
 HAPPY TRADING!
Tribute to David PaulI made this indicator as a tribute to the late  David Paul .
He mentioned quite a lot about 89 periods moving average (especially on 4h), also the 21 and 55.
I put up some entries when three ma are crossed by price in the same direction, bull/bear backgrounds and a color code for candles because who doesn't love the feeling of a lasting trend.
To be more specific :
The indicator plots sma21, sma55, sma89 and AMA = (sma21+sma55+sma89)/3
When the closing price crosses the highest of the 3 sma, it is considered a bullish confirmation.
At this moment two lines appear, one on the bottom of the candle that crossed, one on the crossing point.
The lowest line can be used as the stop loss value of a long.
The highest line can be used as an entry point for a long.
When the closing price crosses the lowest of the 3 sma, it is considered a bearish confirmation.
At this moment two lines appear, one on the top of the candle that crossed, one on the crossing point.
The highest line can be used as the stop loss value of a short.
The lowest line can be used as an entry point for shorts.
When the closing price is above AMA, it is considered a bullish confirmation.
At this time a blue background appears at the crossing point.
The highest line can be used as the stop loss value for a long.
The starting point of the background can be used as the entry point for a long.
When the closing price is below AMA, it is considered a bearish confirmation.
At this time a red background appears at the crossing point.
The highest line can be used as the stop loss value for a short.
The starting point of the background can be used as the entry point for a short.
When the price is above 3 sma the candles turn blue. Signifying an upward trend.
When the price is below 3 sma the candles turn red. Signifying a bearish trend.
When the price is neither simultaneously above nor below the 3 sma, the candles are gray and the background linked to AMA becomes less vivid. Meaning a loss of vitality of the current trend or an absence of a clear trend.
Ideally, you should take a position towards "Real Long/Short Entry", set your stop loss towards "Ideal Long/Short Entry", and close the trade either when the background ends (riskier but more potential), or when the candles become gray (more conservative but noisier).
In the inputs, you can modify the display rules (explained in the tooltips), by default everything is displayed.
RSI Trend Detector PSAR BasedRSI Trend Detector is based on the Direction of PSAR. This indicator helps the easy detection of Trend Direction and Sideways Movement of Price. It was difficult to determine the RSI Trend Direction in a basic RSI indicator. one cannot decide the exact entry point where to enter. 
RSI Trend Detector helps with the direction of trend using PSAR direction which is almost instant direction changing indicator with Zero Lag. The color of the RSI changes immediately based on PSAR direction. One can determine the trend whether its in UP / Down or Sideways.
  
One can easily detect Pullback and entry points using this indicator.
The basic working can be interpreted with a normal default RSI, The only additional feature is the direction of trend using a SAR signal.
Oversold Zone is below 30
Overbought Zone is above 70
how ever RSI above 50 is treated a UP trend and Below 50 as Down Trend.
when RSI is between 40 and 60 price must be considered as Sideways. One can easily interpret the TREND.
 
 Yellow Line = RSI Moving Average
 RED and Green Line= RSI 
 Grey Zone = Sideways
 Horizontal line = RSI level 50
 
Settings can be changed as required.
RSI Line:
 
 RSI Above 50 up trend and Entry when color is green
 RSI Below 50 down trend and Entry when color is Red
 RSI in Grey Zone is sideways, wait for a breakout 
 RSI above 50 and color is red then its a pullback in uptrend
 RSI below 50 and color is green then its a pullback in downtrend
 
ALERTS:
Up signal and Down Signal are provided when ever RSI crosses RSIMA
Up Signal:  RSI crosses RSI Moving Average upwards
Down Signal: RSI crosses RSI Moving Average Downwards
Hope the Tradingview community likes this.
Volume Crossover StrategyThis script shows us the strength and acceleration of the trend, not the direction. ! . The indicator is built on the collision of two volumes (the collision of one-hour and four-hour volumes), where as a result one upward arrow shows us (acceleration, pressing the gas on the pedal), and the downward one shows deceleration (i.e. braking).
Recommendation: Be sure to attach:
a) any trend direction indicator (SMA, EMA), through which we will have an idea where the market is going and going:
b) volatility indicator
c) AD accumulation distribution (let's have a real picture, is there a buying or selling trend)
It is suitable for a one-hour timeframe
P.S. The script does not make any guarantee of profit, it is published only for the purpose of sharing my opinion about this strategy.
an hour ago
Comment:
The green  signal is the start of the marathon, and the red signal is the end. For example, if the downward trend has ended (we can see it through the blue signal), it does not mean that the next marathon will necessarily be a reflected trend. It is not excluded that the next marathon will also develop on a downward trend...and therefore in the opposite case as well..
Composite Momentum IndicatorComposite Momentum Indicator" combines the signals from several oscillators, including Stochastic, RSI, Ultimate Oscillator, and Commodity Channel Index (CCI) by averaging the standardized values (Z-Scores). Since it is a Z-Score based indicators the values will be typically be bound between +3 and -3 oscillating around 0.  Here's a summary of the code:
Input Parameters: Users can customize the look-back period and set threshold values for overbought and oversold conditions. They can also choose which oscillators to include in the composite calculation.
Oscillator Calculations: The code calculates four separate oscillators - Stochastic, RSI, Ultimate Oscillator, and CCI - each measuring different aspects of market momentum.
Z-Scores Calculation: For each oscillator, the code calculates a Z-Score, which normalizes the oscillator's values based on its historical standard deviation and mean. This allows for a consistent comparison of oscillator values across different timeframes.
Composite Z-Score: The code aggregates the Z-Scores from the selected oscillators, taking into account user preferences (whether to include each oscillator). It then calculates an average Z-Score to create the "Composite Momentum Oscillator."
Conditional Color Coding: The composite oscillator is color-coded based on its average Z-Score value. It turns green when it's above the overbought threshold, red when it's below the oversold threshold, and blue when it's within the specified range.
Horizontal Lines: The code plots horizontal lines at key levels, including 0, ±3, ±2, and ±1, to help users identify important momentum levels.
Gradient Fills: It adds gradient fills above the overbought threshold and below the oversold threshold to visually highlight extreme momentum conditions.
Combining the Stochastic, RSI, Ultimate Oscillator, and Commodity Channel Index (CCI) into one composite indicator offers several advantages for traders and technical analysts:
Comprehensive Insight: Each of these oscillators measures different aspects of market momentum and price action. Combining them into one indicator provides a more comprehensive view of the market's behavior, as it takes into account various dimensions of momentum simultaneously.
Reduced Noise: Standalone oscillators can generate conflicting signals and produce noisy readings, especially during choppy market conditions. A composite indicator smoothes out these discrepancies by averaging the signals from multiple indicators, potentially reducing false signals.
Confirmation and Divergence: By combining multiple oscillators, traders can seek confirmation or divergence signals. When multiple oscillators align in the same direction, it can strengthen a trading signal. Conversely, divergence between the oscillators can warn of potential reversals or weakening trends.
Customization: Traders can tailor the composite indicator to their specific trading strategies and preferences. They have the flexibility to include or exclude specific oscillators, adjust look-back periods, and set threshold levels. This adaptability allows for a more personalized approach to technical analysis.
Clarity and Efficiency: Rather than cluttering the chart with multiple individual oscillators, a composite indicator condenses the information into a single plot. This enhances the clarity of the chart and makes it easier for traders to quickly interpret market conditions.
Overbought/Oversold Identification: Combining these oscillators can improve the identification of overbought and oversold conditions. It reduces the likelihood of false signals since multiple indicators must align to trigger these extreme conditions.
Educational Tool: For novice traders and analysts, a composite indicator can serve as an educational tool by demonstrating how different oscillators interact and influence each other's signals. It allows users to learn about multiple technical indicators in one glance.
Efficient Use of Screen Space: A single composite indicator occupies less screen space compared to multiple separate indicators. This is especially beneficial when analyzing multiple markets or timeframes simultaneously.
Holistic Approach: Instead of relying on a single indicator, a composite approach encourages a more holistic assessment of market conditions. Traders can consider a broader range of factors before making trading decisions.
Increased Confidence: A composite indicator can boost traders' confidence in their decisions. When multiple reliable indicators align, it can provide a stronger basis for taking action in the market.
In summary, combining the Stochastic, RSI, Ultimate Oscillator, and CCI into one composite indicator enhances the depth and reliability of technical analysis. It simplifies the decision-making process, reduces noise, and offers a more complete picture of market momentum, ultimately helping traders make more informed and well-rounded trading decisions.
* Feel free to compare against individual oscillatiors*
[GTH decimals heatmap] (wide screen advised)Preface 
I share my personal general view on indicators below; skip ahead to the Description below if you are not interested.
It is my personal conviction that most - if not all - indicators rely mainly on trader's belief that they work, and in a feedback system like free markets they might become a self-fulfilling prophecy as a result, if (!) a big part of the traders believes in it, because some famous trader releases an indicator, or such person's public statement goes viral.
One of those voodoo indicators is the famous "follow-through day". There is zero statistical evidence for its validity, beyond the validity of a statement like "If it's bright at day it's usually the sun shining". The uselessness was proven exactly on its inventor's YT channel, Investors Business Daily. According to the examiner, its inventor William J. O'Neil himself could not explain the values used for this indicator. It might have been an incidental observation at some point without general validity. A.k.a "curve fitting". Still, it's being used by many today.
Another one of those indicators is the three points reversal on the S&P 500 Volatility Index (VIX) which allegedly might potentially maybe indicate a possible shift in trend. Both indicators share an immediately problematic feature: They use absolute values. Nothing is ever absolute in a highly subjective and emotionally driven game like the markets where a lot of money can be made and lost. 
Most indicators can not produce additional information since they can only re-pack price/volume action. Many times an interpretion of the distance between price and a moving average and/or the slope of a moving average deliver very similar - if not better - results than MACD, RSI etc., especially with standard settings, the origin of which are usually unknown (always a warning sign). Very few indicators can deliver information which is otherwise hard to quantify, e. g. market noise (Kaufman's Efficiency Ratio or Price Density) or volatility, standard deviation etc.
It is common knowledge that trading the markets is a game of probability. No indicator works all the time (or at all, see above). In order to make decisions based on any indicator, the probability for its validity and the conditions under which validity seemed to have occurred, must be known. Otherwise it is just coffee grounds reading under the illusion of adding to the edge, when in fact it is only adding to the trees, making it even harder to see the forest.
 Description 
A common belief is that whole or half-dollar prices tend to be attraction points in price action, so a number of traders include those into decision making. But are they really...?
Spoiler Alert:
Generally, it is safe to say that for the big majority of stocks there is very thin evidence for it. It depends vastly on the asset, the timeframe used and the market period (pre/post/main trading times). If at all, there seems to be an above random but still thin evidence for whole prices being significant attraction points. Interesting/surprising patterns are visible on many stocks/timeframes/session periods, though.
The screenshot shows TSLA, 30m timeframe, two heatmaps added. The top one shows pre/post-market data only, the bottom one main market data only. The cyan fields indicate the strongest occurrence, the dark blue fields indicate the weakest occurrence of open/high/low/close prices at the respective decimal. The red field indicates the current/last price decimal.
Clearly, TSLA displays a strong pre-market attraction for .00, followed by .33 and .67 and .50. This pattern of thirds seems to be a unique feature of TSLA. In the main trading session it is being diluted by a more random distribution.
Other interesting equities to examine:
 
 SPY: No significant pattern on any timeframe!
 META: Generally weak patterns on all timeframes, but interestingly on the 1D there is evidence for less randomness on O and H, more on L and most on C.
 AAPL: 1D, foggy attraction areas around .35 and .12. Whole price is no attraction area at all! Very weak attraction around .73.
 AMD: Strong pattern on D, W, M, attraction areas around 1/16th intervals. No patterns on lower timeframes.
 AMZN: Significant differences between pre/post and main session. Strong 1/16th pattern below D in pre/post.
 TAOP: Strong 1/5th pattern on all timeframes.
 
 
Read the tool tips and go explore!
Support & Resistance AI (K means/median) [ThinkLogicAI]█  OVERVIEW 
K-means is a clustering algorithm commonly used in machine learning to group data points into distinct clusters based on their similarities. While K-means is not typically used directly for identifying support and resistance levels in financial markets, it can serve as a tool in a broader analysis approach.
Support and resistance levels are price levels in financial markets where the price tends to react or reverse. Support is a level where the price tends to stop falling and might start to rise, while resistance is a level where the price tends to stop rising and might start to fall. Traders and analysts often look for these levels as they can provide insights into potential price movements and trading opportunities.
█  BACKGROUND 
The K-means algorithm has been around since the late 1950s, making it more than six decades old. The algorithm was introduced by Stuart Lloyd in his 1957 research paper "Least squares quantization in PCM" for telecommunications applications. However, it wasn't widely known or recognized until James MacQueen's 1967 paper "Some Methods for Classification and Analysis of Multivariate Observations," where he formalized the algorithm and referred to it as the "K-means" clustering method.
So, while K-means has been around for a considerable amount of time, it continues to be a widely used and influential algorithm in the fields of machine learning, data analysis, and pattern recognition due to its simplicity and effectiveness in clustering tasks.
█  COMPARE AND CONTRAST SUPPORT AND RESISTANCE METHODS 
 1)   K-means Approach: 
 
 Cluster Formation:  After applying the K-means algorithm to historical price change data and visualizing the resulting clusters, traders can identify distinct regions on the price chart where clusters are formed. Each cluster represents a group of similar price change patterns.
 Cluster Analysis:  Analyze the clusters to identify areas where clusters tend to form. These areas might correspond to regions of price behavior that repeat over time and could be indicative of support and resistance levels.
 Potential Support and Resistance Levels:  Based on the identified areas of cluster formation, traders can consider these regions as potential support and resistance levels. A cluster forming at a specific price level could suggest that this level has been historically significant, causing similar price behavior in the past.
 Cluster Standard Deviation:  In addition to looking at the means (centroids) of the clusters, traders can also calculate the standard deviation of price changes within each cluster. Standard deviation is a measure of the dispersion or volatility of data points around the mean. A higher standard deviation indicates greater price volatility within a cluster.
 Low Standard Deviation:  If a cluster has a low standard deviation, it suggests that prices within that cluster are relatively stable and less likely to exhibit sudden and large price movements. Traders might consider placing tighter stop-loss orders for trades within these clusters.
 High Standard Deviation:  Conversely, if a cluster has a high standard deviation, it indicates greater price volatility within that cluster. Traders might opt for wider stop-loss orders to allow for potential price fluctuations without getting stopped out prematurely.
 Cluster Density:  Each  data point is assigned to a cluster so a cluster that is more dense will act more like gravity and 
 
 2)  Traditional Approach: 
 
 Trendlines:  Draw trendlines connecting significant highs or lows on a price chart to identify potential support and resistance levels.
 Chart Patterns:  Identify chart patterns like double tops, double bottoms, head and shoulders, and triangles that often indicate potential reversal points.
 Moving Averages:  Use moving averages to identify levels where the price might find support or resistance based on the average price over a specific period.
 Psychological Levels:  Identify round numbers or levels that traders often pay attention to, which can act as support and resistance.
 Previous Highs and Lows:  Identify significant previous price highs and lows that might act as support or resistance.
 
The key difference lies in the approach and the foundation of these methods. Traditional methods are based on well-established principles of technical analysis and market psychology, while the K-means approach involves clustering price behavior without necessarily incorporating market sentiment or specific price patterns.
It's important to note that while the K-means approach might provide an interesting way to analyze price data, it should be used cautiously and in conjunction with other traditional methods. Financial markets are influenced by a wide range of factors beyond just price behavior, and the effectiveness of any method for identifying support and resistance levels should be thoroughly tested and validated. Additionally, developments in trading strategies and analysis techniques could have occurred since my last update.
█  K MEANS ALGORITHM 
The algorithm for K means is as follows:
 
 Initialize cluster centers
 assign data to clusters based on minimum distance
 calculate cluster center by taking the average or median of the clusters
 repeat steps 1-3 until cluster centers stop moving
 
█  LIMITATIONS OF K MEANS 
There are 3 main limitations of this algorithm:
 
 Sensitive to Initializations: K-means is sensitive to the initial placement of centroids. Different initializations can lead to different cluster assignments and final results. 
 Assumption of Equal Sizes and Variances: K-means assumes that clusters have roughly equal sizes and spherical shapes. This may not hold true for all types of data. It can struggle with identifying clusters with uneven densities, sizes, or shapes.
 Impact of Outliers: K-means is sensitive to outliers, as a single outlier can significantly affect the position of cluster centroids. Outliers can lead to the creation of spurious clusters or distortion of the true cluster structure.
 
█  LIMITATIONS IN APPLICATION OF K MEANS IN TRADING 
Trading data often exhibits characteristics that can pose challenges when applying indicators and analysis techniques. Here's how the limitations of outliers, varying scales, and unequal variance can impact the use of indicators in trading:
 
 Outliers  are data points that significantly deviate from the rest of the dataset. In trading, outliers can represent extreme price movements caused by rare events, news, or market anomalies. Outliers can have a significant impact on trading indicators and analyses:
   Indicator Distortion:  Outliers can skew the calculations of indicators, leading to   misleading signals. For instance, a single extreme price spike could cause indicators like moving averages or RSI (Relative Strength Index) to give false signals.
   Risk Management:  Outliers can lead to overly aggressive trading decisions if not  properly accounted for. Ignoring outliers might result in unexpected losses or missed opportunities to adjust trading strategies.
 Different Scales:  Trading data often includes multiple indicators with varying units and scales. For example, prices are typically in dollars, volume in units traded, and oscillators have their own scale. Mixing indicators with different scales can complicate analysis:
  Normalization:  Indicators on different scales need to be normalized or standardized to ensure they contribute equally to the analysis. Failure to do so can lead to one indicator dominating the analysis due to its larger magnitude.
  Comparability:  Without normalization, it's challenging to directly compare the significance of indicators. Some indicators might have a larger numerical range and could overshadow others.
 Unequal Variance:   Unequal variance in trading data refers to the fact that some indicators might exhibit higher volatility than others. This can impact the interpretation of signals and the performance of trading strategies:
  Volatility Adjustment:  When combining indicators with varying volatility, it's essential to adjust for their relative volatilities. Failure to do so might lead to overemphasizing or underestimating the importance of certain indicators in the trading strategy.
  Risk Assessment:  Unequal variance can impact risk assessment. Indicators with higher volatility might lead to riskier trading decisions if not properly taken into account.
 
█  APPLICATION OF THIS INDICATOR 
This indicator can be used in 2 ways:
 1) Make a directional trade: 
 
 If a trader thinks price will go higher or lower and price is within a cluster zone, The trader can take a position and place a stop on the 1 sd band around the cluster.  As one can see below, the trader can go long the green arrow and place a stop on the one standard deviation mark for that cluster below it at the red arrow.  using this we can calculate a risk to reward ratio.
 
 Calculating risk to reward:   targeting a risk reward ratio of 2:1, the trader could clearly make that given that the next resistance area above that in the orange cluster exceeds this risk reward ratio.
 
  
 2) Take a reversal Trade: 
 
 We can use cluster centers (support and resistance levels) to go in the opposite direction that price is currently moving in hopes of price forming a pivot and reversing off this level.    
 Similar to the directional trade, we can use the standard deviation of the cluster to place a stop just in case we are wrong.  
 In this example below we can see that shorting on the red arrow and placing a stop at the one standard deviation above this cluster would give us a profitable trade with minimal risk.
 Using the cluster density table in the upper right informs the trader just how dense the cluster is.  Higher density clusters will give a higher likelihood of a pivot forming at  these levels and price being rejected and switching direction  with a larger move.
 
  
█  FEATURES & SETTINGS 
 General Settings: 
 
 Number of clusters:  The user can select from 3 to five clusters.  A good rule of thumb is that if you are trading intraday, less is more  (Think 3 rather than 5).  For daily 4 to 5 clusters is good.
 Cluster Method:  To get around the outlier limitation of k means clustering,  The median was added.   This gives the user the ability to choose either k means or k median clustering.  K means is the preferred method if the user things there are no large outliers, and if there appears to be large outliers or it is assumed there are then K medians is preferred.
 Bars back To train on:  This will be the amount of bars to include in the clustering.  This number is important so that the user includes bars that are recent but not so far back that they are out of the scope of where price can be.  For example the last 2 years we have been in a range on the sp500 so 505 days in this setting would be more relevant than say looking back 5 years ago because price would have to move far to get there.
 Show SD Bands:  Select this to show the 1 standard deviation bands around the support and resistance level or unselect this to just show the support and resistance level by itself.
 
 Features: 
Besides the support and resistance levels and standard deviation bands, this indicator gives a table in the upper right hand corner to show the density of each cluster (support and resistance level) and is color coded to the cluster line on the chart.  Higher density clusters mean price has been there previously more than lower density clusters and could mean a higher likelihood of a reversal when price reaches these areas.
█  WORKS CITED 
 
 Victor Sim, "Using K-means Clustering to Create Support and Resistance", 2020, towardsdatascience.com
 Chris Piech, "K means", stanford.edu
 
█  ACKNOLWEDGMENTS 
@jdehorty- Thanks for the publish template.  It made organizing my thoughts and work alot easier.
Doji TrenderDoji Trender searches multiple timeframes for candles where open and close are less than dojiPercent apart (default 0.025%), and plots the trends between them.
Experiment with dojiPercent to change the number of "dojis" detected. I will add doji sub-type indication if it appears to be meaningful.
By default, it plots the 5m (red), 15m (orange), 1h (yellow), 4h (green), and chart (cyan). If the chart timeframe is any of the configurable ones, the chart copy won't be drawn. (I might reverse that, so that cyan is always drawn.)
Since doji points are somewhat sparse, and the lookback is short (default 10), the EMA's make drastic corrections toward new indecision. (I'm not convinced the EMA's are useful and/or relevant.)
This works on any timeframe, but seems to work best on the 1D. (5m is somewhat irrelevant on the 1D, so there are tweaks to be made.)
Dojis from a timeframe are corrections to a doji trend from a higher timeframe.
Red corrects to orange, corrects to yellow, corrects to green.
If the chart timeframe is > 4h, the others will correct to cyan.
Otherwise, cyan will fit in-between the adjacent timeframes.
Multiple indecision candles within a short timespan forming sharp peaks indicate retests, backtests, rejections, and bounces off of support/resistance.
With a correct larger-timeframe channel, one would expect lower-timeframe indecision at/along typical levels.
Although the doji's have unpredictable wicks, the dots printed by this indicator do not. Matched with volume, they reveal the prices where the most violent battles between bulls and bears took place, and are likely to take place, again.
One could:
1) Put trends on the longest segments, then look for confluence along them, and/or near the intersections.
2) Use lower-timeframe doji trends to estimate the direction of the higher-timeframe doji trends, before they become detectable to Doji Trender. Confirm by looking for confluence where those trends intersect with horizontal support/resistance, this indicator, and/or others.
3) Notice that multiple legs on the same trend line are close to parallel, if not colinear.
4) Notice that many of the doji segments point toward (very-distant) future dojis.
5) Drop horizontal lines on the dots where we previously reversed, and find confluence in VRVP when we revisit them.
6) Create parallel (fib/whatever) channels that more-closely match MM's intent. The segments one uses to set the angle of the channel, and those used to align the channel, vertically, are not always the same:
   a) Match the channel slope to as many doji slopes as possible, considering every trend.
   b) Figure out where the channel actually belongs, re-considering every trend.
SuperTrend AI (Clustering) [LuxAlgo]The SuperTrend AI indicator is a novel take on bridging the gap between the K-means clustering machine learning method & technical indicators. In this case, we apply K-Means clustering to the famous SuperTrend indicator.
🔶  USAGE 
  
Users can interpret the SuperTrend AI trailing stop similarly to the regular SuperTrend indicator. Using higher minimum/maximum factors will return longer-term signals.
The displayed performance metrics displayed on each signal allow for a deeper interpretation of the indicator. Whereas higher values could indicate a higher potential for the market to be heading in the direction of the trend when compared to signals with lower values such as 1 or 0 potentially indicating retracements.
  
In the image above, we can notice more clear examples of the performance metrics on signals indicating trends, however, these performance metrics cannot perform or predict every signal reliably.
  
We can see in the image above that the trailing stop and its adaptive moving average can also act as support & resistance. Using higher values of the  performance memory  setting allows users to obtain a longer-term adaptive moving average of the returned trailing stop.
🔶  DETAILS 
🔹  K-Means Clustering 
  
When observing data points within a specific space, we can sometimes observe that some are closer to each other, forming groups, or "Clusters". At first sight, identifying those clusters and finding their associated data points can seem easy but doing so mathematically can be more challenging. This is where cluster analysis comes into play, where we seek to group data points into various clusters such that data points within one cluster are closer to each other. This is a common branch of AI/machine learning.
Various methods exist to find clusters within data, with the one used in this script being  K-Means Clustering , a simple iterative unsupervised clustering method that finds a user-set amount of clusters.
A naive form of the K-Means algorithm would perform the following steps in order to find  K  clusters:
 
 (1) Determine the amount (K) of clusters to detect.
 (2) Initiate our K centroids (cluster centers) with random values.
 (3) Loop over the data points, and determine which is the closest centroid from each data point, then associate that data point with the centroid.
 (4) Update centroids by taking the average of the data points associated with a specific centroid.
 Repeat steps 3 to 4 until convergence, that is until the centroids no longer change.
 
To explain how K-Means works graphically let's take the example of a one-dimensional dataset (which is the dimension used in our script) with two apparent clusters:
  
This is of course a simple scenario, as  K  will generally be higher, as well the amount of data points. Do note that this method can be very sensitive to the initialization of the centroids, this is why it is generally run multiple times, keeping the run returning the best centroids.
🔹  Adaptive SuperTrend Factor Using K-Means 
The proposed indicator rationale is based on the following hypothesis:
 Given multiple instances of an indicator using different settings, the optimal setting choice at time  t  is given by the best-performing instance with setting  s(t) . 
Performing the calculation of the indicator using the best setting at time  t  would return an indicator whose characteristics adapt based on its performance. However, what if the setting of the best-performing instance and second best-performing instance of the indicator have a high degree of disparity without a high difference in performance? 
Even though this specific case is rare its however not uncommon to see that performance can be similar for a group of specific settings (this could be observed in a parameter optimization heatmap), then filtering out desirable settings to only use the best-performing one can seem too strict. We can as such reformulate our first hypothesis:
 Given multiple instances of an indicator using different settings, an optimal setting choice at time  t  is given by the average of the best-performing instances with settings  s(t) . 
Finding this group of best-performing instances could be done using the previously described K-Means clustering method, assuming three groups of interest (K = 3) defined as worst performing, average performing, and best performing.
We first obtain an analog of performance  P(t, factor)  described as:
 P(t, factor) = P(t-1, factor) + α * (∆C(t) × S(t-1, factor) - P(t-1, factor)) 
where 1 >  α  > 0, which is the performance memory determining the degree to which older inputs affect the current output.  C(t)  is the closing price, and  S(t, factor)  is the SuperTrend signal generating function with multiplicative factor  factor .
We run this performance function for multiple  factor  settings and perform K-Means clustering on the multiple obtained performances to obtain the best-performing cluster. We initiate our centroids using quartiles of the obtained performances for faster centroids convergence.
  
The average of the factors associated with the best-performing cluster is then used to obtain the final factor setting, which is used to compute the final SuperTrend output.
Do note that we give the liberty for the user to get the final factor from the best, average, or worst cluster for experimental purposes.
🔶  SETTINGS 
 
 ATR Length: ATR period used for the calculation of the SuperTrends.
 Factor Range: Determine the minimum and maximum factor values for the calculation of the SuperTrends.
 Step: Increments of the factor range.
 Performance Memory: Determine the degree to which older inputs affect the current output, with higher values returning longer-term performance measurements.
 From Cluster: Determine which cluster is used to obtain the final factor.
 
🔹  Optimization 
This group of settings affects the runtime performances of the script.
 
 Maximum Iteration Steps: Maximum number of iterations allowed for finding centroids. Excessively low values can return a better script load time but poor clustering.
 Historical Bars Calculation: Calculation window of the script (in bars).
Trend Correlation HeatmapHello everyone!
I am excited to release my trend correlation heatmap, or trend heatmap for short. 
Per usual, I think its important to explain the theory before we get into the use of the indicator, so let's get into the theory! 
 The theory:  
 So what is a correlation?  
Correlation is the relationship one variable has to another. Correlations are the basis of everything I do as a quantitative trader. From the correlation between the same variables (i.e. autocorrelation), the correlation between other variables (i.e. VIX and SPY, SPY High and SPY Low, DXY and ES1! close, etc.) and, as well, the correlation between price and time (time series correlation). 
This may sound very familiar to you, especially if you are a user, observer or follower of my ideas and/or indicators. Ninety-five percent of my indicators are a function of one of those three things. Whether it be a time series based indicator (i.e.my time series indicator), whether it be autocorrelation (my autoregressive cloud indicator or my autocorrelation oscillator) or whether it be regressive in nature (i.e. my SPY Volume weighted close, or even my expected move which uses averages in lieu of regressive approaches but is foundational in regression principles. Or even my VIX oscillator which relies on the premise of correlations between tickers.) So correlation is extremely important to me and while its true I am more of a regression trader than anything, I would argue that I am more of a correlation trader, because correlations are the backbone of how I develop math models of stocks. 
What I am trying to stress here is the importance of correlations. They really truly are foundational to any type of quantitative analysis for stocks. And as such, understanding the current relationship a stock has to time is pivotal for any meaningful analysis to be conducted.
So what is correlation to time and what does it tell us? 
Correlation to time, otherwise known and commonly referred to as "Time Series", is the relationship a ticker's price has to the passing of time. It is displayed in the traditional Pearson Correlation Coefficient or R value and can be any value from -1 (strong negative relationship, i.e. a strong downtrend) to + 1 (i.e. a strong positive relationship, i.e. a strong uptrend). The higher or lower the value the stronger the up or downtrend is. 
As such, correlation to time tells us two very important things. These are:
a) The direction of the stock; and 
b) The strength of the trend. 
 Let's take a look at an example:  
Above we have a chart of QQQ. We can see a trendline that seems to fit well. The questions we ask as traders are:
1. What is the likelihood QQQ breaks down from this trendline? 
2. What is the likelihood QQQ continues up? 
3. What is the likelihood QQQ does a false breakdown? 
There are numerous mathematical approaches we can take to answer these questions. For example, 1 and 2 can be answered by use of a Cumulative Distribution Density analysis (CDDA) or even a linear or loglinear regression analysis and 3 can be answered, more or less, with a linear regression analysis and standard error ascertainment, or even just a general comparison using a data science approach (such as cosine similarity or Manhattan distance). 
But, the reality is, all 3 of these questions can be visualized, at least in some way, by simply looking at the correlation to time. Let's look at this chart again, this time with the correlation heatmap applied:
If we look at the indicator we can see some pivotal things. These are:
1. We have 4, very strong uptrends that span both higher AND lower timeframes. We have a strong uptrend of 0.96 on the 5 minute, 50 candle period. We have a strong uptrend at the 300 candle lookback period on the 1 minute, we have a strong uptrend on the 100 day lookback on the daily timeframe period and we have a strong uptrend on the 5 minute on the 500 candle lookback period. 
2. By comparison, we have 3 downtrends, all of which have correlations less than the 4 uptrends. All of the downtrends have a correlation above -0.8 (which we would want lower than -0.8 to be very strong), and all of the uptrends are greater than + 0.80. 
3. We can also see that the uptrends are not confined to the smaller timeframes. We have multiple uptrends on multiple timeframes and both short term (50 to 100 candles) and long term (up to 500 candles). 
4. The overall trend is strengthening to the upside manifested by a positive Max Change and a Positive Min change (to be discussed later more in-depth). 
With this, we can see that QQQ is actually very strong and likely will continue at least some upside. If we let this play out:
We continued up, had one test and then bounced. 
Now, I want to specify, this indicator is not a panacea for all trading. And in relation to the 3 questions posed, they are best answered, at least quantitatively, not only by correlation but also by the aforementioned methods (CDDA, etc.)  but correlation will help you get a feel for the strength or weakness present with a stock. 
What are some tangible applications of the indicator? 
For me, this indicator is used in many ways. Let me outline some ways I generally apply this indicator in my day and swing trading:
1. Gauging the strength of the stock: The indictor tells you the most prevalent behavior of the stock. Are there more downtrends than uptrends present? Are the downtrends present on the larger timeframes vs uptrends on the shorter indicating a possible bullish reversal? or vice versa? Are the trends strengthening or weakening? All of these things can be visualized with the indicator. 
2. Setting parameters for other indicators: If you trade EMAs or SMAs, you may have a "one size fits all" approach. However, its actually better to adjust your EMA or SMA length to the actual trend itself. Take a look at this:
This is QQQ on the 1 hour with the 200 EMA with 200 standard deviation bands added. If we look at the heatmap, we can see, yes indeed 200 has a fairly strong uptrend correlation of 0.70. But the strongest hourly uptrend is actually at 400 candles, with a correlation of 0.91. So what happens if we change the EMA length and standard deviation to 400? This:
The exact areas are circled and colour coded. You can see, the 400 offers more of a better reference point of supports and resistances as well as a better overall trend fit. And this is why I never advocate for getting married to a specific EMA. If you are an EMA 200 lover or 21 or 51, know that these are not always the best depending on the trend and situation. 
 Components of the indicator:  
Ah okay, now for the boring stuff. Let's go over the functionality of the indicator. I tried to keep it simple, so it is pretty straight forward. If we open the menu here are our options:
We have the ability to toggle whichever timeframes we want. We also have the ability to toggle on or off the legend that displays the colour codes and the Max and Min highest change.
Max and Min highest change: The max and min highest change simply display the change in correlation over the previous 14 candles. An increasing Max change means that the Max trend is strengthening. If we see an increasing Max change and an increasing Min change (the Min correlation is moving up), this means the stock is bullish. Why? Because the min (i.e. ideally a big negative number) is going up closer to the positives. Therefore, the downtrend is weakening. 
If we see both the Max and Min declining (red), that means the uptrend is weakening and downtrend is strengthening. Here are some examples:
Final Thoughts:
And that is the indicator and the theory behind the indicator. 
In a nutshell, to summarize, the indicator simply tracks the correlation of a ticker to time on multiple timeframes. This will allow you to make judgements about strength, sentiment and also help you adjust which tools and timeframes you are using to perform your analyses. 
As well, to make the indicator more user friendly, I tried to make the colours distinctively different. I was going to do different shades but it was a little difficult to visualize. As such, I have included a toggle-able legend with a breakdown of the colour codes! 
That's it my friends, I hope you find it useful! 
Safe trades and leave your questions, comments and feedback below! 
Supply and Demand Based Pattern [RH]This indicator focuses on detecting RBR and DBD patterns, which signify periods of increased momentum and potential continuation or reversal of the prevailing trend.
The RBR pattern consists of a rally (upward movement), followed by a base (consolidation or retracement), and then another rally. It suggests that the upward momentum may persist and provide trading opportunities.
On the other hand, the DBD pattern comprises a drop (downward movement), followed by a base, and then another drop. It indicates that the downward momentum might continue, offering potential shorting opportunities.
Bullish(RBR) example:
Bearish(DBD) example:
1. The bullish (RBR) and bearish (DBD) patterns share the same underlying logic, only differing in their directionality.
2. For both RBR and DBD patterns, the first rise/drop can consist of one or multiple candles. However, in the case of multiple candles, all candles must exhibit a bullish nature for RBR and a bearish nature for DBD.
Example:
3. It is a prerequisite for the first rise/drop to include at least one candle with a defined percentage of health, as determined by the user.
4. The base, following the first rise/drop, may comprise one or multiple candles.
Example:
5. To maintain consistency, the base is not allowed to retrace beyond 80%, although this value can be adjusted by the user.
6. Similar to the first rise/drop, the second rise/drop in both RBR and DBD patterns can consist of one or multiple candles. However, all candles within this phase must demonstrate a bullish nature for RBR and a bearish nature for DBD.
7. Confirmation of the bullish (RBR) pattern occurs when a candle closes above the high of the first rise. Conversely, the bearish (DBD) pattern is confirmed when a candle closes below the low of the first drop.
Example: 
Alerts can be set for all bullish and bearish pattern or for the first pattern in the range of similar pattern. 
[DisDev] D-I-Y Gridbot🟩 This script is a “do-it-yourself” Grid Bot Simulator, used for visualizing support and resistance levels. Prices are divided into grids, or trade zones, that will trigger signals each time a new zone is entered. During ranging markets, each transaction is followed by a “take profit.” As the market starts to trend, transactions are stacked (compare to DCA ), until the market consolidates. No signals are triggered above the upper gridline or below the lower gridline. Unlike the previous version, all grids may be adjusted in real-time by dragging the gridlines up and down to the desired support and resistance levels. 
When adding the indicator to a new chart, you must choose six grid levels by clicking on the desired support or resistance price. You can change all of these levels at any time directly on the chart.
⚡  OVERVIEW  ⚡
The D-I-Y Gridbot is an interactive tool designed for visualizing support and resistance levels. As a continuation of the original  Gridbot Simulator , which has received significant recognition on TradingView, earning over 4000 boosts and an Editor's Pick status. This tool serves not only as an evolved version of its predecessor, but also as an open-source template for developing future gridbots. It aims to foster discussions and facilitate innovations around grid-trading strategies.
One of the new features of this gridbot is the real-time adjustability of all gridlines. Users can move these lines up and down to set their desired support and resistance levels in response to changing market conditions. Additionally, the D-I-Y Gridbot is compatible with multiple timeframes and can be used on most TradingView charts.
  
 Drag gridlines up or down to desired price level. 
 Key Features  🔑 
 
  All gridlines are adjustable in real-time, directly on the chart
  Signals can be filtered by a customizable moving average or by VWAP
  Customizable support and resistance levels
  Potentially increases profitability in ranging markets 
 Benefits  💸
 
   Customizable Support and Resistance Levels : The D-I-Y Gridbot allows users to set their preferred support and resistance levels, which can be changed at any time directly on the chart. This provides users with the ability to customize their trading parameters based on their strategy and risk tolerance.
   Various Trading Strategies : The D-I-Y Gridbot supports various trading strategies, including Mean Reversion, Ranging Markets, and Dollar-cost averaging (DCA). This allows users to capitalize on price reversals, execute buy and sell orders at predetermined levels, and buy more of an asset as the price falls, respectively.
   Multi-Timeframe and Versatility : The D-I-Y Gridbot is compatible with multiple timeframes and can be used on any TradingView chart.
   Experimental and Educational : The D-I-Y Gridbot is considered a proof-of-concept tool that is both experimental and educational. This can provide traders with a deeper understanding of grid trading strategies and the ability to experiment with different trading parameters and strategies.  
⚙️  CONFIGURATION & SETTINGS  ⚙️
  
 Inputs  🔧
 
 Trigger :  Candle location to trigger the signal. "Wick" will use either high or low, depending on the signal direction. "Close" will use the close price. “MA” will use the selected moving average or VWAP.
 Confirmation : Market direction to confirm the candle trigger. "Reverse" will confirm the signal when the price crosses back over the trigger. "Breakout" will confirm when the price breaks out of the trigger. 
 Number of Support/Resistance zones : 1 = Only Top Grid is Support/Only Bottom Grid is Resistance. 2 = Top two grids are Resistance/Bottom two grids are Support. 3 = Top three grids are Resistance/Bottom three grids are Support   
 MA Type : Exponential Moving Average (EMA), Hull Moving Average (HMA), Simple Moving Average (SMA), Triple Exponential Moving Average (TEMA), Volume Weighted Moving Average (VWMA), Volume Weighted Average Price (VWAP)
 MA Filter : Use Moving Average as a reversion filter for signals. When enabled, no buys when above MA, no sells when below. Use in conjunction with S/R zones to reduce false signals.
 Allow Repeat Signals . When enabled, signals will reset when nearest gridline is triggered. When disabled, only one signal will be triggered per gridline.
   Line/Fill colors 
   Gridlines . Adjusts gridline prices manually.
 
  
 Left : Trigger = Wick. Confirm = Breakout. Buys are signaled when LOW breaks below gridline. Sells are triggered when HIGH breaks above gridline.
 Right : Trigger = Close. Confirm = Breakout. Buys are signaled when the candle CLOSES below the gridline. Sells are triggered when the candle CLOSES above the gridline. 
  
 Left : Confirm=Breakout. Signals on breaking through the next gridline. 
 Right : Confirm=Reverse. Signals only when crossing back from the gridline. 
  
 S/R Zones=1. Upper gridline is Resistance / Lower is Support. Middle 4 are neutral. 
  
S/R Zones = 3. Upper three gridlines are  Resistance / Lower three are Support 
Notes: 
 
  If gridlines are dragged out of order on a live chart, they will auto-sort into the correct order.
  Price levels may be entered in settings, or adjusted in real-time directly on the chart.
  When changing symbols, remember to adjust the gridlines to accommodate the new symbol. 
 Alerts  🔔
 
  Users can set alerts based on their chosen parameters for triggers, confirmations, number of support/resistance zones, and smoothing type, enabling precise control over alert conditions.
  
 
💡  USAGE & STRATEGY  💡
 Trading Strategies  📈
 
  Mean Reversion: The script can be used to capitalize on price reversals back to the mean.
  Ranging Markets: The script excels in ranging markets, executing buy and sell orders at predetermined levels.
  Dollar-cost averaging (DCA): The script can be used to execute DCA orders, buying more of an asset as the price falls, and lowering the average cost per unit. 
 Timeframes and Symbols  ⌚
 
  Multi-Timeframe: The indicator is compatible with multiple timeframes.
  Versatile: Can be used on any crypto trading pair on TradingView. 
🤖  DETAILS & METHODOLOGY  🤖
 Algorithm and Calculation  🛡️
 
  Grids are set and adjusted when loading the indicator on the chart and may be customized anytime afterward by clicking and dragging the gridlines on the chart.
  Gridlines are updated, sorted, and stored in a float array.
  Signals are calculated based on candle trigger, market direction, and previous price level. 
📚  ADDITIONAL RESOURCES  📚
 Chart Examples  📊
  
 S/R Zones = 3: Three  Support and Three Resistance. Filter = 50-period Triple Exponential Moving Average (TEMA) 
  
 S/R Zones = 1: One Support, One Resistance, and Four Neutral Zones. Support Zones: Buys only. Resistance Zones: Sells only. Neutral Zones: Grid-dependent 
  
 When MA filter is enabled, Buys are only triggered below Moving Average, and Sells are only triggered above. 
  
 Trigger = Wick. Confirmation = Breakout. Buys are signaled when Low breaks above the next grid level. Sells are signaled when High breaks below the next grid level. 
🚀  CONCLUSION  🚀
The D-I-Y Gridbot is a proof-of-concept, emphasizing its experimental and educational nature. In future versions, we will aim to incorporate concepts such as auto-adjusting grids and angled grids for trending markets.  The script is designed to evolve through user feedback and suggestions, shaping its future iterations.
Credit: This is a continuation of the  Gridbot series by xxattaxx-DisDev . Explicit permission was granted by user xxattaxx-disdev to re-use all Gridbot code and all materials without restrictions.
⚠️  DISCLAIMER  ⚠️
 This indicator is a proof-of-concept and is considered experimental and educational. When gridlines are drawn in hindsight, signals appear to be predictive and valid. Future results may always vary when the trend direction changes. Comments and suggestions are encouraged. 
 This indicator is provided as a tool for traders and should not be used as the sole basis for making trading decisions. Always conduct your own research and consider your risk tolerance before entering any trades.
Double Top Patterns [theEccentricTrader]█   OVERVIEW 
This indicator automatically draws double top patterns and price projections derived from the ranges that constitute the patterns.
█   CONCEPTS 
 Green and Red Candles 
• A green candle is one that closes with a close price equal to or above the price it opened.
• A red candle is one that closes with a close price that is lower than the price it opened.
 Swing Highs and Swing Lows 
• A swing high is a green candle or series of consecutive green candles followed by a single red candle to complete the swing and form the peak.
• A swing low is a red candle or series of consecutive red candles followed by a single green candle to complete the swing and form the trough.
 Peak and Trough Prices (Basic) 
• The peak price of a complete swing high is the high price of either the red candle that completes the swing high or the high price of the preceding green candle, depending on which is higher.
• The trough price of a complete swing low is the low price of either the green candle that completes the swing low or the low price of the preceding red candle, depending on which is lower.
 Historic Peaks and Troughs 
The current, or most recent, peak and trough occurrences are referred to as occurrence zero. Previous peak and trough occurrences are referred to as historic and ordered numerically from right to left, with the most recent historic peak and trough occurrences being occurrence one.
 Broken and Unbroken Peaks and Troughs 
Upon the completion of a new swing low the high of the green candle that completes the swing low will be above, below or equal to the current peak price. And similarly, upon the completion of a new swing high the low of the red candle that completes the swing high will be above, below or equal to the current trough price.
If the high price of the green candle that completes the current swing low is higher than or equal to the current peak price then the current peak is broken. If the high of the green candle that completes the current swing low is below the current peak price, then the current peak is unbroken. 
Similarly, if the low price of the red candle that completes the current swing high is lower than or equal to the current trough price then the current trough is broken. If the low price of the red candle that completes the current swing high is above the current trough price, then the current trough is unbroken. 
 Range 
The range is simply the difference between the current peak and current trough prices, generally expressed in terms of points or pips.
 Retracement and Extension Ratios 
Retracement and extension ratios are calculated by dividing the current range by the preceding range and multiplying the answer by 100. Retracement ratios are those that are equal to or below 100% of the preceding range and extension ratios are those that are above 100% of the preceding range.
 Double Bottom and Double Top Patterns 
• Double bottom patterns are composed of one peak and two troughs, with the second trough being roughly equal to the first trough.
• Double top patterns are composed of one trough and two peaks,  with the second peak being roughly equal to the first peak.
 Measurement Tolerances 
In general, tolerance in measurements refers to the allowable variation or deviation from a specific value or dimension. It is the range within which a particular measurement is considered to be acceptable or accurate. In this script I have applied this concept to the measurement of double bottom and double top patterns to increase to the frequency of pattern occurrences.
For example, a perfect double bottom is very rare. We can increase the frequency of pattern occurrences by setting a tolerance. A ratio tolerance of 10% to both downside and upside, which is the default setting, means we would have a tolerable ratio measurement range between 90-110% for the second trough, thus increasing the frequency of occurrence.
█   FEATURES 
 Inputs 
• Unbroken Troughs
• Lower Tolerance
• Upper Tolerance
• Pattern Color
• Neckline Color
• Extend Current Neckline
• Show Labels
• Label Color
• Show Projection Lines
• Extend Current Projection Lines
 Alerts 
Users can set alerts for when the patterns occur. 
█   LIMITATIONS 
All green and red candle calculations are based on differences between open and close prices, as such I have made no attempt to account for green candles that gap lower and close below the close price of the preceding candle, or red candles that gap higher and close above the close price of the preceding candle. This may cause some unexpected behaviour on some markets and timeframes. I can only recommend using 24-hour markets, if and where possible, as there are far fewer gaps and, generally, more data to work with.
Double Bottom Patterns [theEccentricTrader]█   OVERVIEW 
This indicator automatically draws double bottom patterns and price projections derived from the ranges that constitute the patterns.
█   CONCEPTS 
 Green and Red Candles 
• A green candle is one that closes with a close price equal to or above the price it opened.
• A red candle is one that closes with a close price that is lower than the price it opened.
 Swing Highs and Swing Lows 
• A swing high is a green candle or series of consecutive green candles followed by a single red candle to complete the swing and form the peak.
• A swing low is a red candle or series of consecutive red candles followed by a single green candle to complete the swing and form the trough.
 Peak and Trough Prices (Basic) 
• The peak price of a complete swing high is the high price of either the red candle that completes the swing high or the high price of the preceding green candle, depending on which is higher.
• The trough price of a complete swing low is the low price of either the green candle that completes the swing low or the low price of the preceding red candle, depending on which is lower.
 Historic Peaks and Troughs 
The current, or most recent, peak and trough occurrences are referred to as occurrence zero. Previous peak and trough occurrences are referred to as historic and ordered numerically from right to left, with the most recent historic peak and trough occurrences being occurrence one.
 Broken and Unbroken Peaks and Troughs 
Upon the completion of a new swing low the high of the green candle that completes the swing low will be above, below or equal to the current peak price. And similarly, upon the completion of a new swing high the low of the red candle that completes the swing high will be above, below or equal to the current trough price.
If the high price of the green candle that completes the current swing low is higher than or equal to the current peak price then the current peak is broken. If the high of the green candle that completes the current swing low is below the current peak price, then the current peak is unbroken. 
Similarly, if the low price of the red candle that completes the current swing high is lower than or equal to the current trough price then the current trough is broken. If the low price of the red candle that completes the current swing high is above the current trough price, then the current trough is unbroken. 
 Range 
The range is simply the difference between the current peak and current trough prices, generally expressed in terms of points or pips.
 Retracement and Extension Ratios 
Retracement and extension ratios are calculated by dividing the current range by the preceding range and multiplying the answer by 100. Retracement ratios are those that are equal to or below 100% of the preceding range and extension ratios are those that are above 100% of the preceding range.
 Double Bottom and Double Top Patterns 
• Double bottom patterns are composed of one peak and two troughs, with the second trough being roughly equal to the first trough.
• Double top patterns are composed of one trough and two peaks,  with the second peak being roughly equal to the first peak.
 Measurement Tolerances 
In general, tolerance in measurements refers to the allowable variation or deviation from a specific value or dimension. It is the range within which a particular measurement is considered to be acceptable or accurate. In this script I have applied this concept to the measurement of double bottom and double top patterns to increase to the frequency of pattern occurrences.
For example, a perfect double bottom is very rare. We can increase the frequency of pattern occurrences by setting a tolerance. A ratio tolerance of 10% to both downside and upside, which is the default setting, means we would have a tolerable ratio measurement range between 90-110% for the second trough, thus increasing the frequency of occurrence.
█   FEATURES 
 Inputs 
• Unbroken Peaks
• Lower Tolerance
• Upper Tolerance
• Pattern Color
• Neckline Color
• Extend Current Neckline
• Show Labels
• Label Color
• Show Projection Lines
• Extend Current Projection Lines
 Alerts 
Users can set alerts for when the patterns occur. 
█   LIMITATIONS 
All green and red candle calculations are based on differences between open and close prices, as such I have made no attempt to account for green candles that gap lower and close below the close price of the preceding candle, or red candles that gap higher and close above the close price of the preceding candle. This may cause some unexpected behaviour on some markets and timeframes. I can only recommend using 24-hour markets, if and where possible, as there are far fewer gaps and, generally, more data to work with.
Bearish Alternate Flag Patterns [theEccentricTrader]█   OVERVIEW 
This indicator automatically draws bearish alternate flag patterns and price projections derived from the ranges that constitute the patterns.
█   CONCEPTS 
 Green and Red Candles 
• A green candle is one that closes with a close price equal to or above the price it opened.
• A red candle is one that closes with a close price that is lower than the price it opened.
 Swing Highs and Swing Lows 
• A swing high is a green candle or series of consecutive green candles followed by a single red candle to complete the swing and form the peak.
• A swing low is a red candle or series of consecutive red candles followed by a single green candle to complete the swing and form the trough.
 Peak and Trough Prices (Basic) 
• The peak price of a complete swing high is the high price of either the red candle that completes the swing high or the high price of the preceding green candle, depending on which is higher.
• The trough price of a complete swing low is the low price of either the green candle that completes the swing low or the low price of the preceding red candle, depending on which is lower.
 Historic Peaks and Troughs 
The current, or most recent, peak and trough occurrences are referred to as occurrence zero. Previous peak and trough occurrences are referred to as historic and ordered numerically from right to left, with the most recent historic peak and trough occurrences being occurrence one.
 Broken and Unbroken Peaks and Troughs 
Upon the completion of a new swing low the high of the green candle that completes the swing low will be above, below or equal to the current peak price. And similarly, upon the completion of a new swing high the low of the red candle that completes the swing high will be above, below or equal to the current trough price.
If the high price of the green candle that completes the current swing low is higher than or equal to the current peak price then the current peak is broken. If the high of the green candle that completes the current swing low is below the current peak price, then the current peak is unbroken. 
Similarly, if the low price of the red candle that completes the current swing high is lower than or equal to the current trough price then the current trough is broken. If the low price of the red candle that completes the current swing high is above the current trough price, then the current trough is unbroken. 
 Range 
The range is simply the difference between the current peak and current trough prices, generally expressed in terms of points or pips.
 Upper Trends 
• A return line uptrend is formed when the current peak price is higher than the preceding peak price.
• A downtrend is formed when the current peak price is lower than the preceding peak price.
• A double-top is formed when the current peak price is equal to the preceding peak price.
 Lower Trends 
• An uptrend is formed when the current trough price is higher than the preceding trough price.
• A return line downtrend is formed when the current trough price is lower than the preceding trough price.
• A double-bottom is formed when the current trough price is equal to the preceding trough price.
 Wave Cycles 
A wave cycle is here defined as a complete two-part move between a swing high and a swing low, or a swing low and a swing high. The first swing high or swing low will set the course for the sequence of wave cycles that follow; for example a chart that begins with a swing low will form its first complete wave cycle upon the formation of the first complete swing high and vice versa. 
Figure 1. 
 Retracement and Extension Ratios 
Retracement and extension ratios are calculated by dividing the current range by the preceding range and multiplying the answer by 100. Retracement ratios are those that are equal to or below 100% of the preceding range and extension ratios are those that are above 100% of the preceding range.
 Bullish and Bearish Alternate Flag Patterns 
• Bullish alternate flags are composed of one peak and two troughs. The second trough being higher than the first.
• Bearish alternate flags are composed of one trough and two peaks. The second peak being lower than the first.  
In this script I have used minimum and maximum retracement and extension ratios to set parameters for pattern identification: 
• Wave 1 of the pattern, referred to as AB, is set to a minimum ratio of 100%.
• Wave 2 of the pattern, referred to as BC, is set to a maximum ratio of 30%.
█   FEATURES 
 Inputs 
• Unbroken Troughs
• AB Minimum Ratio
• BC Maximum Ratio
• Pole Color
• Flag Color
• Extend Current Flag Lines
• Show Labels
• Label Color
• Show Projection Lines
• Extend Current Projection Lines
 Alerts 
Users can set alerts for when the patterns occur. 
█   LIMITATIONS 
All green and red candle calculations are based on differences between open and close prices, as such I have made no attempt to account for green candles that gap lower and close below the close price of the preceding candle, or red candles that gap higher and close above the close price of the preceding candle. This may cause some unexpected behaviour on some markets and timeframes. I can only recommend using 24-hour markets, if and where possible, as there are far fewer gaps and, generally, more data to work with.
Bullish Alternate Flag Patterns [theEccentricTrader]█   OVERVIEW 
This indicator automatically draws bullish alternate flag patterns and price projections derived from the ranges that constitute the patterns.
█   CONCEPTS 
 Green and Red Candles 
• A green candle is one that closes with a close price equal to or above the price it opened.
• A red candle is one that closes with a close price that is lower than the price it opened.
 Swing Highs and Swing Lows 
• A swing high is a green candle or series of consecutive green candles followed by a single red candle to complete the swing and form the peak.
• A swing low is a red candle or series of consecutive red candles followed by a single green candle to complete the swing and form the trough.
 Peak and Trough Prices (Basic) 
• The peak price of a complete swing high is the high price of either the red candle that completes the swing high or the high price of the preceding green candle, depending on which is higher.
• The trough price of a complete swing low is the low price of either the green candle that completes the swing low or the low price of the preceding red candle, depending on which is lower.
 Historic Peaks and Troughs 
The current, or most recent, peak and trough occurrences are referred to as occurrence zero. Previous peak and trough occurrences are referred to as historic and ordered numerically from right to left, with the most recent historic peak and trough occurrences being occurrence one.
 Broken and Unbroken Peaks and Troughs 
Upon the completion of a new swing low the high of the green candle that completes the swing low will be above, below or equal to the current peak price. And similarly, upon the completion of a new swing high the low of the red candle that completes the swing high will be above, below or equal to the current trough price.
If the high price of the green candle that completes the current swing low is higher than or equal to the current peak price then the current peak is broken. If the high of the green candle that completes the current swing low is below the current peak price, then the current peak is unbroken. 
Similarly, if the low price of the red candle that completes the current swing high is lower than or equal to the current trough price then the current trough is broken. If the low price of the red candle that completes the current swing high is above the current trough price, then the current trough is unbroken. 
 Range 
The range is simply the difference between the current peak and current trough prices, generally expressed in terms of points or pips.
 Upper Trends 
• A return line uptrend is formed when the current peak price is higher than the preceding peak price.
• A downtrend is formed when the current peak price is lower than the preceding peak price.
• A double-top is formed when the current peak price is equal to the preceding peak price.
 Lower Trends 
• An uptrend is formed when the current trough price is higher than the preceding trough price.
• A return line downtrend is formed when the current trough price is lower than the preceding trough price.
• A double-bottom is formed when the current trough price is equal to the preceding trough price.
 Wave Cycles 
A wave cycle is here defined as a complete two-part move between a swing high and a swing low, or a swing low and a swing high. The first swing high or swing low will set the course for the sequence of wave cycles that follow; for example a chart that begins with a swing low will form its first complete wave cycle upon the formation of the first complete swing high and vice versa. 
Figure 1. 
 Retracement and Extension Ratios 
Retracement and extension ratios are calculated by dividing the current range by the preceding range and multiplying the answer by 100. Retracement ratios are those that are equal to or below 100% of the preceding range and extension ratios are those that are above 100% of the preceding range.
 Bullish and Bearish Alternate Flag Patterns 
• Bullish alternate flags are composed of one peak and two troughs. The second trough being higher than the first.
• Bearish alternate flags are composed of one trough and two peaks. The second peak being lower than the first.  
In this script I have used minimum and maximum retracement and extension ratios to set parameters for pattern identification: 
• Wave 1 of the pattern, referred to as AB, is set to a minimum ratio of 100%.
• Wave 2 of the pattern, referred to as BC, is set to a maximum ratio of 30%.
█   FEATURES 
 Inputs 
• Unbroken Peaks
• AB Minimum Ratio
• BC Maximum Ratio
• Pole Color
• Flag Color
• Extend Current Flag Lines
• Show Labels
• Label Color
• Show Projection Lines
• Extend Current Projection Lines
 Alerts 
Users can set alerts for when the patterns occur. 
█   LIMITATIONS 
All green and red candle calculations are based on differences between open and close prices, as such I have made no attempt to account for green candles that gap lower and close below the close price of the preceding candle, or red candles that gap higher and close above the close price of the preceding candle. This may cause some unexpected behaviour on some markets and timeframes. I can only recommend using 24-hour markets, if and where possible, as there are far fewer gaps and, generally, more data to work with.
Goertzel Cycle Composite Wave [Loxx]As the financial markets become increasingly complex and data-driven, traders and analysts must leverage powerful tools to gain insights and make informed decisions. One such tool is the Goertzel Cycle Composite Wave indicator, a sophisticated technical analysis indicator that helps identify cyclical patterns in financial data. This powerful tool is capable of detecting cyclical patterns in financial data, helping traders to make better predictions and optimize their trading strategies. With its unique combination of mathematical algorithms and advanced charting capabilities, this indicator has the potential to revolutionize the way we approach financial modeling and trading.
*** To decrease the load time of this indicator, only XX many bars back will render to the chart. You can control this value with the setting "Number of Bars to Render". This doesn't have anything to do with repainting or the indicator being endpointed***
 █ Brief Overview of the Goertzel Cycle Composite Wave 
The Goertzel Cycle Composite Wave is a sophisticated technical analysis tool that utilizes the Goertzel algorithm to analyze and visualize cyclical components within a financial time series. By identifying these cycles and their characteristics, the indicator aims to provide valuable insights into the market's underlying price movements, which could potentially be used for making informed trading decisions.
The Goertzel Cycle Composite Wave is considered a non-repainting and endpointed indicator. This means that once a value has been calculated for a specific bar, that value will not change in subsequent bars, and the indicator is designed to have a clear start and end point. This is an important characteristic for indicators used in technical analysis, as it allows traders to make informed decisions based on historical data without the risk of hindsight bias or future changes in the indicator's values. This means traders can use this indicator trading purposes. 
The repainting version of this indicator with forecasting, cycle selection/elimination options, and data output table can be found here:
 Goertzel Browser 
  
 The primary purpose of this indicator is to: 
1. Detect and analyze the dominant cycles present in the price data.
2. Reconstruct and visualize the composite wave based on the detected cycles.
To achieve this, the indicator performs several tasks:
1. Detrending the price data: The indicator preprocesses the price data using various detrending techniques, such as Hodrick-Prescott filters, zero-lag moving averages, and linear regression, to remove the underlying trend and focus on the cyclical components.
2. Applying the Goertzel algorithm: The indicator applies the Goertzel algorithm to the detrended price data, identifying the dominant cycles and their characteristics, such as amplitude, phase, and cycle strength.
3. Constructing the composite wave: The indicator reconstructs the composite wave by combining the detected cycles, either by using a user-defined list of cycles or by selecting the top N cycles based on their amplitude or cycle strength.
4. Visualizing the composite wave: The indicator plots the composite wave, using solid lines for the cycles. The color of the lines indicates whether the wave is increasing or decreasing.
This indicator is a powerful tool that employs the Goertzel algorithm to analyze and visualize the cyclical components within a financial time series. By providing insights into the underlying price movements, the indicator aims to assist traders in making more informed decisions.
 █ What is the Goertzel Algorithm? 
The Goertzel algorithm, named after Gerald Goertzel, is a digital signal processing technique that is used to efficiently compute individual terms of the Discrete Fourier Transform (DFT). It was first introduced in 1958, and since then, it has found various applications in the fields of engineering, mathematics, and physics.
The Goertzel algorithm is primarily used to detect specific frequency components within a digital signal, making it particularly useful in applications where only a few frequency components are of interest. The algorithm is computationally efficient, as it requires fewer calculations than the Fast Fourier Transform (FFT) when detecting a small number of frequency components. This efficiency makes the Goertzel algorithm a popular choice in applications such as:
1. Telecommunications: The Goertzel algorithm is used for decoding Dual-Tone Multi-Frequency (DTMF) signals, which are the tones generated when pressing buttons on a telephone keypad. By identifying specific frequency components, the algorithm can accurately determine which button has been pressed.
2. Audio processing: The algorithm can be used to detect specific pitches or harmonics in an audio signal, making it useful in applications like pitch detection and tuning musical instruments.
3. Vibration analysis: In the field of mechanical engineering, the Goertzel algorithm can be applied to analyze vibrations in rotating machinery, helping to identify faulty components or signs of wear.
4. Power system analysis: The algorithm can be used to measure harmonic content in power systems, allowing engineers to assess power quality and detect potential issues.
 The Goertzel algorithm is used in these applications because it offers several advantages over other methods, such as the FFT: 
1. Computational efficiency: The Goertzel algorithm requires fewer calculations when detecting a small number of frequency components, making it more computationally efficient than the FFT in these cases.
2. Real-time analysis: The algorithm can be implemented in a streaming fashion, allowing for real-time analysis of signals, which is crucial in applications like telecommunications and audio processing.
3. Memory efficiency: The Goertzel algorithm requires less memory than the FFT, as it only computes the frequency components of interest.
4. Precision: The algorithm is less susceptible to numerical errors compared to the FFT, ensuring more accurate results in applications where precision is essential.
The Goertzel algorithm is an efficient digital signal processing technique that is primarily used to detect specific frequency components within a signal. Its computational efficiency, real-time capabilities, and precision make it an attractive choice for various applications, including telecommunications, audio processing, vibration analysis, and power system analysis. The algorithm has been widely adopted since its introduction in 1958 and continues to be an essential tool in the fields of engineering, mathematics, and physics.
 █ Goertzel Algorithm in Quantitative Finance: In-Depth Analysis and Applications 
The Goertzel algorithm, initially designed for signal processing in telecommunications, has gained significant traction in the financial industry due to its efficient frequency detection capabilities. In quantitative finance, the Goertzel algorithm has been utilized for uncovering hidden market cycles, developing data-driven trading strategies, and optimizing risk management. This section delves deeper into the applications of the Goertzel algorithm in finance, particularly within the context of quantitative trading and analysis.
 Unveiling Hidden Market Cycles: 
Market cycles are prevalent in financial markets and arise from various factors, such as economic conditions, investor psychology, and market participant behavior. The Goertzel algorithm's ability to detect and isolate specific frequencies in price data helps trader analysts identify hidden market cycles that may otherwise go unnoticed. By examining the amplitude, phase, and periodicity of each cycle, traders can better understand the underlying market structure and dynamics, enabling them to develop more informed and effective trading strategies.
 Developing Quantitative Trading Strategies: 
The Goertzel algorithm's versatility allows traders to incorporate its insights into a wide range of trading strategies. By identifying the dominant market cycles in a financial instrument's price data, traders can create data-driven strategies that capitalize on the cyclical nature of markets.
For instance, a trader may develop a mean-reversion strategy that takes advantage of the identified cycles. By establishing positions when the price deviates from the predicted cycle, the trader can profit from the subsequent reversion to the cycle's mean. Similarly, a momentum-based strategy could be designed to exploit the persistence of a dominant cycle by entering positions that align with the cycle's direction.
 Enhancing Risk Management: 
The Goertzel algorithm plays a vital role in risk management for quantitative strategies. By analyzing the cyclical components of a financial instrument's price data, traders can gain insights into the potential risks associated with their trading strategies.
By monitoring the amplitude and phase of dominant cycles, a trader can detect changes in market dynamics that may pose risks to their positions. For example, a sudden increase in amplitude may indicate heightened volatility, prompting the trader to adjust position sizing or employ hedging techniques to protect their portfolio. Additionally, changes in phase alignment could signal a potential shift in market sentiment, necessitating adjustments to the trading strategy.
 Expanding Quantitative Toolkits: 
Traders can augment the Goertzel algorithm's insights by combining it with other quantitative techniques, creating a more comprehensive and sophisticated analysis framework. For example, machine learning algorithms, such as neural networks or support vector machines, could be trained on features extracted from the Goertzel algorithm to predict future price movements more accurately.
Furthermore, the Goertzel algorithm can be integrated with other technical analysis tools, such as moving averages or oscillators, to enhance their effectiveness. By applying these tools to the identified cycles, traders can generate more robust and reliable trading signals.
The Goertzel algorithm offers invaluable benefits to quantitative finance practitioners by uncovering hidden market cycles, aiding in the development of data-driven trading strategies, and improving risk management. By leveraging the insights provided by the Goertzel algorithm and integrating it with other quantitative techniques, traders can gain a deeper understanding of market dynamics and devise more effective trading strategies.
 █ Indicator Inputs 
src: This is the source data for the analysis, typically the closing price of the financial instrument.
 detrendornot:  This input determines the method used for detrending the source data. Detrending is the process of removing the underlying trend from the data to focus on the cyclical components.
 The available options are: 
hpsmthdt: Detrend using Hodrick-Prescott filter centered moving average.
zlagsmthdt: Detrend using zero-lag moving average centered moving average.
logZlagRegression: Detrend using logarithmic zero-lag linear regression.
hpsmth: Detrend using Hodrick-Prescott filter.
zlagsmth: Detrend using zero-lag moving average.
 DT_HPper1 and DT_HPper2:  These inputs define the period range for the Hodrick-Prescott filter centered moving average when detrendornot is set to hpsmthdt.
 DT_ZLper1 and DT_ZLper2:  These inputs define the period range for the zero-lag moving average centered moving average when detrendornot is set to zlagsmthdt.
 DT_RegZLsmoothPer:  This input defines the period for the zero-lag moving average used in logarithmic zero-lag linear regression when detrendornot is set to logZlagRegression.
 HPsmoothPer:  This input defines the period for the Hodrick-Prescott filter when detrendornot is set to hpsmth.
 ZLMAsmoothPer:  This input defines the period for the zero-lag moving average when detrendornot is set to zlagsmth.
 MaxPer:  This input sets the maximum period for the Goertzel algorithm to search for cycles.
 squaredAmp:  This boolean input determines whether the amplitude should be squared in the Goertzel algorithm.
 useAddition:  This boolean input determines whether the Goertzel algorithm should use addition for combining the cycles.
 useCosine:  This boolean input determines whether the Goertzel algorithm should use cosine waves instead of sine waves.
 UseCycleStrength:  This boolean input determines whether the Goertzel algorithm should compute the cycle strength, which is a normalized measure of the cycle's amplitude.
 WindowSizePast:  These inputs define the window size for the composite wave.
 FilterBartels:  This boolean input determines whether Bartel's test should be applied to filter out non-significant cycles.
 BartNoCycles:  This input sets the number of cycles to be used in Bartel's test.
 BartSmoothPer:  This input sets the period for the moving average used in Bartel's test.
 BartSigLimit:  This input sets the significance limit for Bartel's test, below which cycles are considered insignificant.
 SortBartels:  This boolean input determines whether the cycles should be sorted by their Bartel's test results.
 StartAtCycle:  This input determines the starting index for selecting the top N cycles when UseCycleList is set to false. This allows you to skip a certain number of cycles from the top before selecting the desired number of cycles.
 UseTopCycles:  This input sets the number of top cycles to use for constructing the composite wave when UseCycleList is set to false. The cycles are ranked based on their amplitudes or cycle strengths, depending on the UseCycleStrength input.
 SubtractNoise:  This boolean input determines whether to subtract the noise (remaining cycles) from the composite wave. If set to true, the composite wave will only include the top N cycles specified by UseTopCycles.
 █ Exploring Auxiliary Functions 
The following functions demonstrate advanced techniques for analyzing financial markets, including zero-lag moving averages, Bartels probability, detrending, and Hodrick-Prescott filtering. This section examines each function in detail, explaining their purpose, methodology, and applications in finance. We will examine how each function contributes to the overall performance and effectiveness of the indicator and how they work together to create a powerful analytical tool.
 Zero-Lag Moving Average: 
The zero-lag moving average function is designed to minimize the lag typically associated with moving averages. This is achieved through a two-step weighted linear regression process that emphasizes more recent data points. The function calculates a linearly weighted moving average (LWMA) on the input data and then applies another LWMA on the result. By doing this, the function creates a moving average that closely follows the price action, reducing the lag and improving the responsiveness of the indicator.
The zero-lag moving average function is used in the indicator to provide a responsive, low-lag smoothing of the input data. This function helps reduce the noise and fluctuations in the data, making it easier to identify and analyze underlying trends and patterns. By minimizing the lag associated with traditional moving averages, this function allows the indicator to react more quickly to changes in market conditions, providing timely signals and improving the overall effectiveness of the indicator.
 Bartels Probability: 
The Bartels probability function calculates the probability of a given cycle being significant in a time series. It uses a mathematical test called the Bartels test to assess the significance of cycles detected in the data. The function calculates coefficients for each detected cycle and computes an average amplitude and an expected amplitude. By comparing these values, the Bartels probability is derived, indicating the likelihood of a cycle's significance. This information can help in identifying and analyzing dominant cycles in financial markets.
The Bartels probability function is incorporated into the indicator to assess the significance of detected cycles in the input data. By calculating the Bartels probability for each cycle, the indicator can prioritize the most significant cycles and focus on the market dynamics that are most relevant to the current trading environment. This function enhances the indicator's ability to identify dominant market cycles, improving its predictive power and aiding in the development of effective trading strategies.
 Detrend Logarithmic Zero-Lag Regression: 
The detrend logarithmic zero-lag regression function is used for detrending data while minimizing lag. It combines a zero-lag moving average with a linear regression detrending method. The function first calculates the zero-lag moving average of the logarithm of input data and then applies a linear regression to remove the trend. By detrending the data, the function isolates the cyclical components, making it easier to analyze and interpret the underlying market dynamics.
The detrend logarithmic zero-lag regression function is used in the indicator to isolate the cyclical components of the input data. By detrending the data, the function enables the indicator to focus on the cyclical movements in the market, making it easier to analyze and interpret market dynamics. This function is essential for identifying cyclical patterns and understanding the interactions between different market cycles, which can inform trading decisions and enhance overall market understanding.
 Bartels Cycle Significance Test: 
The Bartels cycle significance test is a function that combines the Bartels probability function and the detrend logarithmic zero-lag regression function to assess the significance of detected cycles. The function calculates the Bartels probability for each cycle and stores the results in an array. By analyzing the probability values, traders and analysts can identify the most significant cycles in the data, which can be used to develop trading strategies and improve market understanding.
The Bartels cycle significance test function is integrated into the indicator to provide a comprehensive analysis of the significance of detected cycles. By combining the Bartels probability function and the detrend logarithmic zero-lag regression function, this test evaluates the significance of each cycle and stores the results in an array. The indicator can then use this information to prioritize the most significant cycles and focus on the most relevant market dynamics. This function enhances the indicator's ability to identify and analyze dominant market cycles, providing valuable insights for trading and market analysis.
 Hodrick-Prescott Filter: 
The Hodrick-Prescott filter is a popular technique used to separate the trend and cyclical components of a time series. The function applies a smoothing parameter to the input data and calculates a smoothed series using a two-sided filter. This smoothed series represents the trend component, which can be subtracted from the original data to obtain the cyclical component. The Hodrick-Prescott filter is commonly used in economics and finance to analyze economic data and financial market trends.
The Hodrick-Prescott filter is incorporated into the indicator to separate the trend and cyclical components of the input data. By applying the filter to the data, the indicator can isolate the trend component, which can be used to analyze long-term market trends and inform trading decisions. Additionally, the cyclical component can be used to identify shorter-term market dynamics and provide insights into potential trading opportunities. The inclusion of the Hodrick-Prescott filter adds another layer of analysis to the indicator, making it more versatile and comprehensive.
 Detrending Options: Detrend Centered Moving Average: 
The detrend centered moving average function provides different detrending methods, including the Hodrick-Prescott filter and the zero-lag moving average, based on the selected detrending method. The function calculates two sets of smoothed values using the chosen method and subtracts one set from the other to obtain a detrended series. By offering multiple detrending options, this function allows traders and analysts to select the most appropriate method for their specific needs and preferences.
The detrend centered moving average function is integrated into the indicator to provide users with multiple detrending options, including the Hodrick-Prescott filter and the zero-lag moving average. By offering multiple detrending methods, the indicator allows users to customize the analysis to their specific needs and preferences, enhancing the indicator's overall utility and adaptability. This function ensures that the indicator can cater to a wide range of trading styles and objectives, making it a valuable tool for a diverse group of market participants.
The auxiliary functions functions discussed in this section demonstrate the power and versatility of mathematical techniques in analyzing financial markets. By understanding and implementing these functions, traders and analysts can gain valuable insights into market dynamics, improve their trading strategies, and make more informed decisions. The combination of zero-lag moving averages, Bartels probability, detrending methods, and the Hodrick-Prescott filter provides a comprehensive toolkit for analyzing and interpreting financial data. The integration of advanced functions in a financial indicator creates a powerful and versatile analytical tool that can provide valuable insights into financial markets. By combining the zero-lag moving average,
 █ In-Depth Analysis of the Goertzel Cycle Composite Wave Code
 
The Goertzel Cycle Composite Wave code is an implementation of the Goertzel Algorithm, an efficient technique to perform spectral analysis on a signal. The code is designed to detect and analyze dominant cycles within a given financial market data set. This section will provide an extremely detailed explanation of the code, its structure, functions, and intended purpose.
 Function signature and input parameters: 
The Goertzel Cycle Composite Wave function accepts numerous input parameters for customization, including source data (src), the current bar (forBar), sample size (samplesize), period (per), squared amplitude flag (squaredAmp), addition flag (useAddition), cosine flag (useCosine), cycle strength flag (UseCycleStrength), past sizes (WindowSizePast), Bartels filter flag (FilterBartels), Bartels-related parameters (BartNoCycles, BartSmoothPer, BartSigLimit), sorting flag (SortBartels), and output buffers (goeWorkPast, cyclebuffer, amplitudebuffer, phasebuffer, cycleBartelsBuffer).
 Initializing variables and arrays: 
The code initializes several float arrays (goeWork1, goeWork2, goeWork3, goeWork4) with the same length as twice the period (2 * per). These arrays store intermediate results during the execution of the algorithm.
 Preprocessing input data: 
The input data (src) undergoes preprocessing to remove linear trends. This step enhances the algorithm's ability to focus on cyclical components in the data. The linear trend is calculated by finding the slope between the first and last values of the input data within the sample.
 Iterative calculation of Goertzel coefficients: 
The core of the Goertzel Cycle Composite Wave algorithm lies in the iterative calculation of Goertzel coefficients for each frequency bin. These coefficients represent the spectral content of the input data at different frequencies. The code iterates through the range of frequencies, calculating the Goertzel coefficients using a nested loop structure.
 Cycle strength computation: 
The code calculates the cycle strength based on the Goertzel coefficients. This is an optional step, controlled by the UseCycleStrength flag. The cycle strength provides information on the relative influence of each cycle on the data per bar, considering both amplitude and cycle length. The algorithm computes the cycle strength either by squaring the amplitude (controlled by squaredAmp flag) or using the actual amplitude values.
 Phase calculation: 
The Goertzel Cycle Composite Wave code computes the phase of each cycle, which represents the position of the cycle within the input data. The phase is calculated using the arctangent function (math.atan) based on the ratio of the imaginary and real components of the Goertzel coefficients.
 Peak detection and cycle extraction: 
The algorithm performs peak detection on the computed amplitudes or cycle strengths to identify dominant cycles. It stores the detected cycles in the cyclebuffer array, along with their corresponding amplitudes and phases in the amplitudebuffer and phasebuffer arrays, respectively.
 Sorting cycles by amplitude or cycle strength: 
The code sorts the detected cycles based on their amplitude or cycle strength in descending order. This allows the algorithm to prioritize cycles with the most significant impact on the input data.
 Bartels cycle significance test: 
If the FilterBartels flag is set, the code performs a Bartels cycle significance test on the detected cycles. This test determines the statistical significance of each cycle and filters out the insignificant cycles. The significant cycles are stored in the cycleBartelsBuffer array. If the SortBartels flag is set, the code sorts the significant cycles based on their Bartels significance values.
 Waveform calculation: 
The Goertzel Cycle Composite Wave code calculates the waveform of the significant cycles for specified time windows. The windows are defined by the WindowSizePast parameters, respectively. The algorithm uses either cosine or sine functions (controlled by the useCosine flag) to calculate the waveforms for each cycle. The useAddition flag determines whether the waveforms should be added or subtracted.
 Storing waveforms in a matrix: 
The calculated waveforms for the cycle is stored in the matrix - goeWorkPast. This matrix holds the waveforms for the specified time windows. Each row in the matrix represents a time window position, and each column corresponds to a cycle.
 Returning the number of cycles: 
The Goertzel Cycle Composite Wave function returns the total number of detected cycles (number_of_cycles) after processing the input data. This information can be used to further analyze the results or to visualize the detected cycles.
The Goertzel Cycle Composite Wave code is a comprehensive implementation of the Goertzel Algorithm, specifically designed for detecting and analyzing dominant cycles within financial market data. The code offers a high level of customization, allowing users to fine-tune the algorithm based on their specific needs. The Goertzel Cycle Composite Wave's combination of preprocessing, iterative calculations, cycle extraction, sorting, significance testing, and waveform calculation makes it a powerful tool for understanding cyclical components in financial data.
 █ Generating and Visualizing Composite Waveform 
The indicator calculates and visualizes the composite waveform for specified time windows based on the detected cycles. Here's a detailed explanation of this process:
 Updating WindowSizePast: 
The WindowSizePast is updated to ensure they are at least twice the MaxPer (maximum period).
 Initializing matrices and arrays: 
The matrix goeWorkPast is initialized to store the Goertzel results for specified time windows. Multiple arrays are also initialized to store cycle, amplitude, phase, and Bartels information.
 Preparing the source data (srcVal) array: 
The source data is copied into an array, srcVal, and detrended using one of the selected methods (hpsmthdt, zlagsmthdt, logZlagRegression, hpsmth, or zlagsmth).
 Goertzel function call: 
The Goertzel function is called to analyze the detrended source data and extract cycle information. The output, number_of_cycles, contains the number of detected cycles.
 Initializing arrays for waveforms: 
The goertzel array is initialized to store the endpoint Goertzel.
 Calculating composite waveform (goertzel array): 
The composite waveform is calculated by summing the selected cycles (either from the user-defined cycle list or the top cycles) and optionally subtracting the noise component.
 Drawing composite waveform (pvlines): 
The composite waveform is drawn on the chart using solid lines. The color of the lines is determined by the direction of the waveform (green for upward, red for downward).
To summarize, this indicator generates a composite waveform based on the detected cycles in the financial data. It calculates the composite waveforms and visualizes them on the chart using colored lines.
 █ Enhancing the Goertzel Algorithm-Based Script for Financial Modeling and Trading 
The Goertzel algorithm-based script for detecting dominant cycles in financial data is a powerful tool for financial modeling and trading. It provides valuable insights into the past behavior of these cycles. However, as with any algorithm, there is always room for improvement. This section discusses potential enhancements to the existing script to make it even more robust and versatile for financial modeling, general trading, advanced trading, and high-frequency finance trading.
 Enhancements for Financial Modeling 
Data preprocessing: One way to improve the script's performance for financial modeling is to introduce more advanced data preprocessing techniques. This could include removing outliers, handling missing data, and normalizing the data to ensure consistent and accurate results.
Additional detrending and smoothing methods: Incorporating more sophisticated detrending and smoothing techniques, such as wavelet transform or empirical mode decomposition, can help improve the script's ability to accurately identify cycles and trends in the data.
Machine learning integration: Integrating machine learning techniques, such as artificial neural networks or support vector machines, can help enhance the script's predictive capabilities, leading to more accurate financial models.
 Enhancements for General and Advanced Trading 
Customizable indicator integration: Allowing users to integrate their own technical indicators can help improve the script's effectiveness for both general and advanced trading. By enabling the combination of the dominant cycle information with other technical analysis tools, traders can develop more comprehensive trading strategies.
Risk management and position sizing: Incorporating risk management and position sizing functionality into the script can help traders better manage their trades and control potential losses. This can be achieved by calculating the optimal position size based on the user's risk tolerance and account size.
Multi-timeframe analysis: Enhancing the script to perform multi-timeframe analysis can provide traders with a more holistic view of market trends and cycles. By identifying dominant cycles on different timeframes, traders can gain insights into the potential confluence of cycles and make better-informed trading decisions.
 Enhancements for High-Frequency Finance Trading 
Algorithm optimization: To ensure the script's suitability for high-frequency finance trading, optimizing the algorithm for faster execution is crucial. This can be achieved by employing efficient data structures and refining the calculation methods to minimize computational complexity.
Real-time data streaming: Integrating real-time data streaming capabilities into the script can help high-frequency traders react to market changes more quickly. By continuously updating the cycle information based on real-time market data, traders can adapt their strategies accordingly and capitalize on short-term market fluctuations.
Order execution and trade management: To fully leverage the script's capabilities for high-frequency trading, implementing functionality for automated order execution and trade management is essential. This can include features such as stop-loss and take-profit orders, trailing stops, and automated trade exit strategies.
While the existing Goertzel algorithm-based script is a valuable tool for detecting dominant cycles in financial data, there are several potential enhancements that can make it even more powerful for financial modeling, general trading, advanced trading, and high-frequency finance trading. By incorporating these improvements, the script can become a more versatile and effective tool for traders and financial analysts alike.
 █ Understanding the Limitations of the Goertzel Algorithm 
While the Goertzel algorithm-based script for detecting dominant cycles in financial data provides valuable insights, it is important to be aware of its limitations and drawbacks. Some of the key drawbacks of this indicator are:
 Lagging nature: 
As with many other technical indicators, the Goertzel algorithm-based script can suffer from lagging effects, meaning that it may not immediately react to real-time market changes. This lag can lead to late entries and exits, potentially resulting in reduced profitability or increased losses.
 Parameter sensitivity: 
The performance of the script can be sensitive to the chosen parameters, such as the detrending methods, smoothing techniques, and cycle detection settings. Improper parameter selection may lead to inaccurate cycle detection or increased false signals, which can negatively impact trading performance.
 Complexity: 
The Goertzel algorithm itself is relatively complex, making it difficult for novice traders or those unfamiliar with the concept of cycle analysis to fully understand and effectively utilize the script. This complexity can also make it challenging to optimize the script for specific trading styles or market conditions.
 Overfitting risk: 
As with any data-driven approach, there is a risk of overfitting when using the Goertzel algorithm-based script. Overfitting occurs when a model becomes too specific to the historical data it was trained on, leading to poor performance on new, unseen data. This can result in misleading signals and reduced trading performance.
 Limited applicability:  
The Goertzel algorithm-based script may not be suitable for all markets, trading styles, or timeframes. Its effectiveness in detecting cycles may be limited in certain market conditions, such as during periods of extreme volatility or low liquidity.
While the Goertzel algorithm-based script offers valuable insights into dominant cycles in financial data, it is essential to consider its drawbacks and limitations when incorporating it into a trading strategy. Traders should always use the script in conjunction with other technical and fundamental analysis tools, as well as proper risk management, to make well-informed trading decisions.
 █ Interpreting Results 
The Goertzel Cycle Composite Wave indicator can be interpreted by analyzing the plotted lines. The indicator plots two lines: composite waves. The composite wave represents the composite wave of the price data.
The composite wave line displays a solid line, with green indicating a bullish trend and red indicating a bearish trend.
Interpreting the Goertzel Cycle Composite Wave indicator involves identifying the trend of the composite wave lines and matching them with the corresponding bullish or bearish color. 
 █ Conclusion 
The Goertzel Cycle Composite Wave indicator is a powerful tool for identifying and analyzing cyclical patterns in financial markets. Its ability to detect multiple cycles of varying frequencies and strengths make it a valuable addition to any trader's technical analysis toolkit. However, it is important to keep in mind that the Goertzel Cycle Composite Wave indicator should be used in conjunction with other technical analysis tools and fundamental analysis to achieve the best results. With continued refinement and development, the Goertzel Cycle Composite Wave indicator has the potential to become a highly effective tool for financial modeling, general trading, advanced trading, and high-frequency finance trading. Its accuracy and versatility make it a promising candidate for further research and development.
 █ Footnotes 
 What is the Bartels Test for Cycle Significance? 
The Bartels Cycle Significance Test is a statistical method that determines whether the peaks and troughs of a time series are statistically significant. The test is named after its inventor, George Bartels, who developed it in the mid-20th century.
The Bartels test is designed to analyze the cyclical components of a time series, which can help traders and analysts identify trends and cycles in financial markets. The test calculates a Bartels statistic, which measures the degree of non-randomness or autocorrelation in the time series.
The Bartels statistic is calculated by first splitting the time series into two halves and calculating the range of the peaks and troughs in each half. The test then compares these ranges using a t-test, which measures the significance of the difference between the two ranges.
If the Bartels statistic is greater than a critical value, it indicates that the peaks and troughs in the time series are non-random and that there is a significant cyclical component to the data. Conversely, if the Bartels statistic is less than the critical value, it suggests that the peaks and troughs are random and that there is no significant cyclical component.
The Bartels Cycle Significance Test is particularly useful in financial analysis because it can help traders and analysts identify significant cycles in asset prices, which can in turn inform investment decisions. However, it is important to note that the test is not perfect and can produce false signals in certain situations, particularly in noisy or volatile markets. Therefore, it is always recommended to use the test in conjunction with other technical and fundamental indicators to confirm trends and cycles.
 Deep-dive into the Hodrick-Prescott Fitler 
The Hodrick-Prescott (HP) filter is a statistical tool used in economics and finance to separate a time series into two components: a trend component and a cyclical component. It is a powerful tool for identifying long-term trends in economic and financial data and is widely used by economists, central banks, and financial institutions around the world.
The HP filter was first introduced in the 1990s by economists Robert Hodrick and Edward Prescott. It is a simple, two-parameter filter that separates a time series into a trend component and a cyclical component. The trend component represents the long-term behavior of the data, while the cyclical component captures the shorter-term fluctuations around the trend.
The HP filter works by minimizing the following objective function:
Minimize: (Sum of Squared Deviations) + λ (Sum of Squared Second Differences)
Where:
1. The first term represents the deviation of the data from the trend.
2. The second term represents the smoothness of the trend.
3. λ is a smoothing parameter that determines the degree of smoothness of the trend.
The smoothing parameter λ is typically set to a value between 100 and 1600, depending on the frequency of the data. Higher values of λ lead to a smoother trend, while lower values lead to a more volatile trend.
The HP filter has several advantages over other smoothing techniques. It is a non-parametric method, meaning that it does not make any assumptions about the underlying distribution of the data. It also allows for easy comparison of trends across different time series and can be used with data of any frequency.
However, the HP filter also has some limitations. It assumes that the trend is a smooth function, which may not be the case in some situations. It can also be sensitive to changes in the smoothing parameter λ, which may result in different trends for the same data. Additionally, the filter may produce unrealistic trends for very short time series.
Despite these limitations, the HP filter remains a valuable tool for analyzing economic and financial data. It is widely used by central banks and financial institutions to monitor long-term trends in the economy, and it can be used to identify turning points in the business cycle. The filter can also be used to analyze asset prices, exchange rates, and other financial variables.
The Hodrick-Prescott filter is a powerful tool for analyzing economic and financial data. It separates a time series into a trend component and a cyclical component, allowing for easy identification of long-term trends and turning points in the business cycle. While it has some limitations, it remains a valuable tool for economists, central banks, and financial institutions around the world.
Goertzel Browser [Loxx]As the financial markets become increasingly complex and data-driven, traders and analysts must leverage powerful tools to gain insights and make informed decisions. One such tool is the Goertzel Browser indicator, a sophisticated technical analysis indicator that helps identify cyclical patterns in financial data. This powerful tool is capable of detecting cyclical patterns in financial data, helping traders to make better predictions and optimize their trading strategies. With its unique combination of mathematical algorithms and advanced charting capabilities, this indicator has the potential to revolutionize the way we approach financial modeling and trading.
 █ Brief Overview of the Goertzel Browser 
The Goertzel Browser is a sophisticated technical analysis tool that utilizes the Goertzel algorithm to analyze and visualize cyclical components within a financial time series. By identifying these cycles and their characteristics, the indicator aims to provide valuable insights into the market's underlying price movements, which could potentially be used for making informed trading decisions.
The primary purpose of this indicator is to:
1. Detect and analyze the dominant cycles present in the price data.
2. Reconstruct and visualize the composite wave based on the detected cycles.
3. Project the composite wave into the future, providing a potential roadmap for upcoming price movements.
To achieve this, the indicator performs several tasks:
1. Detrending the price data: The indicator preprocesses the price data using various detrending techniques, such as Hodrick-Prescott filters, zero-lag moving averages, and linear regression, to remove the underlying trend and focus on the cyclical components.
2. Applying the Goertzel algorithm: The indicator applies the Goertzel algorithm to the detrended price data, identifying the dominant cycles and their characteristics, such as amplitude, phase, and cycle strength.
3. Constructing the composite wave: The indicator reconstructs the composite wave by combining the detected cycles, either by using a user-defined list of cycles or by selecting the top N cycles based on their amplitude or cycle strength.
4. Visualizing the composite wave: The indicator plots the composite wave, using solid lines for the past and dotted lines for the future projections. The color of the lines indicates whether the wave is increasing or decreasing.
5. Displaying cycle information: The indicator provides a table that displays detailed information about the detected cycles, including their rank, period, Bartel's test results, amplitude, and phase.
This indicator is a powerful tool that employs the Goertzel algorithm to analyze and visualize the cyclical components within a financial time series. By providing insights into the underlying price movements and their potential future trajectory, the indicator aims to assist traders in making more informed decisions.
 █ What is the Goertzel Algorithm? 
The Goertzel algorithm, named after Gerald Goertzel, is a digital signal processing technique that is used to efficiently compute individual terms of the Discrete Fourier Transform (DFT). It was first introduced in 1958, and since then, it has found various applications in the fields of engineering, mathematics, and physics.
The Goertzel algorithm is primarily used to detect specific frequency components within a digital signal, making it particularly useful in applications where only a few frequency components are of interest. The algorithm is computationally efficient, as it requires fewer calculations than the Fast Fourier Transform (FFT) when detecting a small number of frequency components. This efficiency makes the Goertzel algorithm a popular choice in applications such as:
1. Telecommunications: The Goertzel algorithm is used for decoding Dual-Tone Multi-Frequency (DTMF) signals, which are the tones generated when pressing buttons on a telephone keypad. By identifying specific frequency components, the algorithm can accurately determine which button has been pressed.
2. Audio processing: The algorithm can be used to detect specific pitches or harmonics in an audio signal, making it useful in applications like pitch detection and tuning musical instruments.
3. Vibration analysis: In the field of mechanical engineering, the Goertzel algorithm can be applied to analyze vibrations in rotating machinery, helping to identify faulty components or signs of wear.
4. Power system analysis: The algorithm can be used to measure harmonic content in power systems, allowing engineers to assess power quality and detect potential issues.
The Goertzel algorithm is used in these applications because it offers several advantages over other methods, such as the FFT:
1. Computational efficiency: The Goertzel algorithm requires fewer calculations when detecting a small number of frequency components, making it more computationally efficient than the FFT in these cases.
2. Real-time analysis: The algorithm can be implemented in a streaming fashion, allowing for real-time analysis of signals, which is crucial in applications like telecommunications and audio processing.
3. Memory efficiency: The Goertzel algorithm requires less memory than the FFT, as it only computes the frequency components of interest.
4. Precision: The algorithm is less susceptible to numerical errors compared to the FFT, ensuring more accurate results in applications where precision is essential.
The Goertzel algorithm is an efficient digital signal processing technique that is primarily used to detect specific frequency components within a signal. Its computational efficiency, real-time capabilities, and precision make it an attractive choice for various applications, including telecommunications, audio processing, vibration analysis, and power system analysis. The algorithm has been widely adopted since its introduction in 1958 and continues to be an essential tool in the fields of engineering, mathematics, and physics.
 █ Goertzel Algorithm in Quantitative Finance: In-Depth Analysis and Applications 
The Goertzel algorithm, initially designed for signal processing in telecommunications, has gained significant traction in the financial industry due to its efficient frequency detection capabilities. In quantitative finance, the Goertzel algorithm has been utilized for uncovering hidden market cycles, developing data-driven trading strategies, and optimizing risk management. This section delves deeper into the applications of the Goertzel algorithm in finance, particularly within the context of quantitative trading and analysis.
 Unveiling Hidden Market Cycles: 
Market cycles are prevalent in financial markets and arise from various factors, such as economic conditions, investor psychology, and market participant behavior. The Goertzel algorithm's ability to detect and isolate specific frequencies in price data helps trader analysts identify hidden market cycles that may otherwise go unnoticed. By examining the amplitude, phase, and periodicity of each cycle, traders can better understand the underlying market structure and dynamics, enabling them to develop more informed and effective trading strategies.
 Developing Quantitative Trading Strategies: 
The Goertzel algorithm's versatility allows traders to incorporate its insights into a wide range of trading strategies. By identifying the dominant market cycles in a financial instrument's price data, traders can create data-driven strategies that capitalize on the cyclical nature of markets.
For instance, a trader may develop a mean-reversion strategy that takes advantage of the identified cycles. By establishing positions when the price deviates from the predicted cycle, the trader can profit from the subsequent reversion to the cycle's mean. Similarly, a momentum-based strategy could be designed to exploit the persistence of a dominant cycle by entering positions that align with the cycle's direction.
 Enhancing Risk Management: 
The Goertzel algorithm plays a vital role in risk management for quantitative strategies. By analyzing the cyclical components of a financial instrument's price data, traders can gain insights into the potential risks associated with their trading strategies.
By monitoring the amplitude and phase of dominant cycles, a trader can detect changes in market dynamics that may pose risks to their positions. For example, a sudden increase in amplitude may indicate heightened volatility, prompting the trader to adjust position sizing or employ hedging techniques to protect their portfolio. Additionally, changes in phase alignment could signal a potential shift in market sentiment, necessitating adjustments to the trading strategy.
 Expanding Quantitative Toolkits: 
Traders can augment the Goertzel algorithm's insights by combining it with other quantitative techniques, creating a more comprehensive and sophisticated analysis framework. For example, machine learning algorithms, such as neural networks or support vector machines, could be trained on features extracted from the Goertzel algorithm to predict future price movements more accurately.
Furthermore, the Goertzel algorithm can be integrated with other technical analysis tools, such as moving averages or oscillators, to enhance their effectiveness. By applying these tools to the identified cycles, traders can generate more robust and reliable trading signals.
The Goertzel algorithm offers invaluable benefits to quantitative finance practitioners by uncovering hidden market cycles, aiding in the development of data-driven trading strategies, and improving risk management. By leveraging the insights provided by the Goertzel algorithm and integrating it with other quantitative techniques, traders can gain a deeper understanding of market dynamics and devise more effective trading strategies. 
 █ Indicator Inputs 
 src:  This is the source data for the analysis, typically the closing price of the financial instrument.
 detrendornot:  This input determines the method used for detrending the source data. Detrending is the process of removing the underlying trend from the data to focus on the cyclical components. 
The available options are:
hpsmthdt: Detrend using Hodrick-Prescott filter centered moving average.
zlagsmthdt: Detrend using zero-lag moving average centered moving average.
logZlagRegression: Detrend using logarithmic zero-lag linear regression.
hpsmth: Detrend using Hodrick-Prescott filter.
zlagsmth: Detrend using zero-lag moving average.
 DT_HPper1 and DT_HPper2:  These inputs define the period range for the Hodrick-Prescott filter centered moving average when detrendornot is set to hpsmthdt.
 DT_ZLper1 and DT_ZLper2:  These inputs define the period range for the zero-lag moving average centered moving average when detrendornot is set to zlagsmthdt.
 DT_RegZLsmoothPer:  This input defines the period for the zero-lag moving average used in logarithmic zero-lag linear regression when detrendornot is set to logZlagRegression.
 HPsmoothPer:  This input defines the period for the Hodrick-Prescott filter when detrendornot is set to hpsmth.
 ZLMAsmoothPer:  This input defines the period for the zero-lag moving average when detrendornot is set to zlagsmth.
 MaxPer:  This input sets the maximum period for the Goertzel algorithm to search for cycles.
 squaredAmp:  This boolean input determines whether the amplitude should be squared in the Goertzel algorithm.
 useAddition:  This boolean input determines whether the Goertzel algorithm should use addition for combining the cycles.
 useCosine:  This boolean input determines whether the Goertzel algorithm should use cosine waves instead of sine waves.
 UseCycleStrength:  This boolean input determines whether the Goertzel algorithm should compute the cycle strength, which is a normalized measure of the cycle's amplitude.
 WindowSizePast and WindowSizeFuture:  These inputs define the window size for past and future projections of the composite wave.
 FilterBartels:  This boolean input determines whether Bartel's test should be applied to filter out non-significant cycles.
 BartNoCycles:  This input sets the number of cycles to be used in Bartel's test.
 BartSmoothPer:  This input sets the period for the moving average used in Bartel's test.
 BartSigLimit:  This input sets the significance limit for Bartel's test, below which cycles are considered insignificant.
 SortBartels:  This boolean input determines whether the cycles should be sorted by their Bartel's test results.
 UseCycleList:  This boolean input determines whether a user-defined list of cycles should be used for constructing the composite wave. If set to false, the top N cycles will be used.
 Cycle1, Cycle2, Cycle3, Cycle4, and Cycle5:  These inputs define the user-defined list of cycles when 'UseCycleList' is set to true. If using a user-defined list, each of these inputs represents the period of a specific cycle to include in the composite wave.
 StartAtCycle:  This input determines the starting index for selecting the top N cycles when UseCycleList is set to false. This allows you to skip a certain number of cycles from the top before selecting the desired number of cycles.
 UseTopCycles:  This input sets the number of top cycles to use for constructing the composite wave when UseCycleList is set to false. The cycles are ranked based on their amplitudes or cycle strengths, depending on the UseCycleStrength input.
 SubtractNoise:  This boolean input determines whether to subtract the noise (remaining cycles) from the composite wave. If set to true, the composite wave will only include the top N cycles specified by UseTopCycles.
 █ Exploring Auxiliary Functions 
The following functions demonstrate advanced techniques for analyzing financial markets, including zero-lag moving averages, Bartels probability, detrending, and Hodrick-Prescott filtering. This section examines each function in detail, explaining their purpose, methodology, and applications in finance. We will examine how each function contributes to the overall performance and effectiveness of the indicator and how they work together to create a powerful analytical tool.
 Zero-Lag Moving Average: 
The zero-lag moving average function is designed to minimize the lag typically associated with moving averages. This is achieved through a two-step weighted linear regression process that emphasizes more recent data points. The function calculates a linearly weighted moving average (LWMA) on the input data and then applies another LWMA on the result. By doing this, the function creates a moving average that closely follows the price action, reducing the lag and improving the responsiveness of the indicator.
The zero-lag moving average function is used in the indicator to provide a responsive, low-lag smoothing of the input data. This function helps reduce the noise and fluctuations in the data, making it easier to identify and analyze underlying trends and patterns. By minimizing the lag associated with traditional moving averages, this function allows the indicator to react more quickly to changes in market conditions, providing timely signals and improving the overall effectiveness of the indicator.
 Bartels Probability: 
The Bartels probability function calculates the probability of a given cycle being significant in a time series. It uses a mathematical test called the Bartels test to assess the significance of cycles detected in the data. The function calculates coefficients for each detected cycle and computes an average amplitude and an expected amplitude. By comparing these values, the Bartels probability is derived, indicating the likelihood of a cycle's significance. This information can help in identifying and analyzing dominant cycles in financial markets.
The Bartels probability function is incorporated into the indicator to assess the significance of detected cycles in the input data. By calculating the Bartels probability for each cycle, the indicator can prioritize the most significant cycles and focus on the market dynamics that are most relevant to the current trading environment. This function enhances the indicator's ability to identify dominant market cycles, improving its predictive power and aiding in the development of effective trading strategies.
 Detrend Logarithmic Zero-Lag Regression: 
The detrend logarithmic zero-lag regression function is used for detrending data while minimizing lag. It combines a zero-lag moving average with a linear regression detrending method. The function first calculates the zero-lag moving average of the logarithm of input data and then applies a linear regression to remove the trend. By detrending the data, the function isolates the cyclical components, making it easier to analyze and interpret the underlying market dynamics.
The detrend logarithmic zero-lag regression function is used in the indicator to isolate the cyclical components of the input data. By detrending the data, the function enables the indicator to focus on the cyclical movements in the market, making it easier to analyze and interpret market dynamics. This function is essential for identifying cyclical patterns and understanding the interactions between different market cycles, which can inform trading decisions and enhance overall market understanding.
 Bartels Cycle Significance Test: 
The Bartels cycle significance test is a function that combines the Bartels probability function and the detrend logarithmic zero-lag regression function to assess the significance of detected cycles. The function calculates the Bartels probability for each cycle and stores the results in an array. By analyzing the probability values, traders and analysts can identify the most significant cycles in the data, which can be used to develop trading strategies and improve market understanding.
The Bartels cycle significance test function is integrated into the indicator to provide a comprehensive analysis of the significance of detected cycles. By combining the Bartels probability function and the detrend logarithmic zero-lag regression function, this test evaluates the significance of each cycle and stores the results in an array. The indicator can then use this information to prioritize the most significant cycles and focus on the most relevant market dynamics. This function enhances the indicator's ability to identify and analyze dominant market cycles, providing valuable insights for trading and market analysis.
 Hodrick-Prescott Filter: 
The Hodrick-Prescott filter is a popular technique used to separate the trend and cyclical components of a time series. The function applies a smoothing parameter to the input data and calculates a smoothed series using a two-sided filter. This smoothed series represents the trend component, which can be subtracted from the original data to obtain the cyclical component. The Hodrick-Prescott filter is commonly used in economics and finance to analyze economic data and financial market trends.
The Hodrick-Prescott filter is incorporated into the indicator to separate the trend and cyclical components of the input data. By applying the filter to the data, the indicator can isolate the trend component, which can be used to analyze long-term market trends and inform trading decisions. Additionally, the cyclical component can be used to identify shorter-term market dynamics and provide insights into potential trading opportunities. The inclusion of the Hodrick-Prescott filter adds another layer of analysis to the indicator, making it more versatile and comprehensive.
 Detrending Options: Detrend Centered Moving Average: 
The detrend centered moving average function provides different detrending methods, including the Hodrick-Prescott filter and the zero-lag moving average, based on the selected detrending method. The function calculates two sets of smoothed values using the chosen method and subtracts one set from the other to obtain a detrended series. By offering multiple detrending options, this function allows traders and analysts to select the most appropriate method for their specific needs and preferences.
The detrend centered moving average function is integrated into the indicator to provide users with multiple detrending options, including the Hodrick-Prescott filter and the zero-lag moving average. By offering multiple detrending methods, the indicator allows users to customize the analysis to their specific needs and preferences, enhancing the indicator's overall utility and adaptability. This function ensures that the indicator can cater to a wide range of trading styles and objectives, making it a valuable tool for a diverse group of market participants.
The auxiliary functions functions discussed in this section demonstrate the power and versatility of mathematical techniques in analyzing financial markets. By understanding and implementing these functions, traders and analysts can gain valuable insights into market dynamics, improve their trading strategies, and make more informed decisions. The combination of zero-lag moving averages, Bartels probability, detrending methods, and the Hodrick-Prescott filter provides a comprehensive toolkit for analyzing and interpreting financial data. The integration of advanced functions in a financial indicator creates a powerful and versatile analytical tool that can provide valuable insights into financial markets. By combining the zero-lag moving average,
 █ In-Depth Analysis of the Goertzel Browser Code 
The Goertzel Browser code is an implementation of the Goertzel Algorithm, an efficient technique to perform spectral analysis on a signal. The code is designed to detect and analyze dominant cycles within a given financial market data set. This section will provide an extremely detailed explanation of the code, its structure, functions, and intended purpose.
 Function signature and input parameters: 
The Goertzel Browser function accepts numerous input parameters for customization, including source data (src), the current bar (forBar), sample size (samplesize), period (per), squared amplitude flag (squaredAmp), addition flag (useAddition), cosine flag (useCosine), cycle strength flag (UseCycleStrength), past and future window sizes (WindowSizePast, WindowSizeFuture), Bartels filter flag (FilterBartels), Bartels-related parameters (BartNoCycles, BartSmoothPer, BartSigLimit), sorting flag (SortBartels), and output buffers (goeWorkPast, goeWorkFuture, cyclebuffer, amplitudebuffer, phasebuffer, cycleBartelsBuffer).
 Initializing variables and arrays: 
The code initializes several float arrays (goeWork1, goeWork2, goeWork3, goeWork4) with the same length as twice the period (2 * per). These arrays store intermediate results during the execution of the algorithm.
 Preprocessing input data: 
The input data (src) undergoes preprocessing to remove linear trends. This step enhances the algorithm's ability to focus on cyclical components in the data. The linear trend is calculated by finding the slope between the first and last values of the input data within the sample.
 Iterative calculation of Goertzel coefficients: 
The core of the Goertzel Browser algorithm lies in the iterative calculation of Goertzel coefficients for each frequency bin. These coefficients represent the spectral content of the input data at different frequencies. The code iterates through the range of frequencies, calculating the Goertzel coefficients using a nested loop structure.
 Cycle strength computation: 
The code calculates the cycle strength based on the Goertzel coefficients. This is an optional step, controlled by the UseCycleStrength flag. The cycle strength provides information on the relative influence of each cycle on the data per bar, considering both amplitude and cycle length. The algorithm computes the cycle strength either by squaring the amplitude (controlled by squaredAmp flag) or using the actual amplitude values.
 Phase calculation: 
The Goertzel Browser code computes the phase of each cycle, which represents the position of the cycle within the input data. The phase is calculated using the arctangent function (math.atan) based on the ratio of the imaginary and real components of the Goertzel coefficients.
 Peak detection and cycle extraction: 
The algorithm performs peak detection on the computed amplitudes or cycle strengths to identify dominant cycles. It stores the detected cycles in the cyclebuffer array, along with their corresponding amplitudes and phases in the amplitudebuffer and phasebuffer arrays, respectively.
 Sorting cycles by amplitude or cycle strength: 
The code sorts the detected cycles based on their amplitude or cycle strength in descending order. This allows the algorithm to prioritize cycles with the most significant impact on the input data.
 Bartels cycle significance test: 
If the FilterBartels flag is set, the code performs a Bartels cycle significance test on the detected cycles. This test determines the statistical significance of each cycle and filters out the insignificant cycles. The significant cycles are stored in the cycleBartelsBuffer array. If the SortBartels flag is set, the code sorts the significant cycles based on their Bartels significance values.
 Waveform calculation: 
The Goertzel Browser code calculates the waveform of the significant cycles for both past and future time windows. The past and future windows are defined by the WindowSizePast and WindowSizeFuture parameters, respectively. The algorithm uses either cosine or sine functions (controlled by the useCosine flag) to calculate the waveforms for each cycle. The useAddition flag determines whether the waveforms should be added or subtracted.
 Storing waveforms in matrices: 
The calculated waveforms for each cycle are stored in two matrices - goeWorkPast and goeWorkFuture. These matrices hold the waveforms for the past and future time windows, respectively. Each row in the matrices represents a time window position, and each column corresponds to a cycle.
 Returning the number of cycles: 
The Goertzel Browser function returns the total number of detected cycles (number_of_cycles) after processing the input data. This information can be used to further analyze the results or to visualize the detected cycles.
The Goertzel Browser code is a comprehensive implementation of the Goertzel Algorithm, specifically designed for detecting and analyzing dominant cycles within financial market data. The code offers a high level of customization, allowing users to fine-tune the algorithm based on their specific needs. The Goertzel Browser's combination of preprocessing, iterative calculations, cycle extraction, sorting, significance testing, and waveform calculation makes it a powerful tool for understanding cyclical components in financial data.
 █ Generating and Visualizing Composite Waveform 
The indicator calculates and visualizes the composite waveform for both past and future time windows based on the detected cycles. Here's a detailed explanation of this process:
 Updating WindowSizePast and WindowSizeFuture: 
The WindowSizePast and WindowSizeFuture are updated to ensure they are at least twice the MaxPer (maximum period).
 Initializing matrices and arrays: 
Two matrices, goeWorkPast and goeWorkFuture, are initialized to store the Goertzel results for past and future time windows. Multiple arrays are also initialized to store cycle, amplitude, phase, and Bartels information.
 Preparing the source data (srcVal) array: 
The source data is copied into an array, srcVal, and detrended using one of the selected methods (hpsmthdt, zlagsmthdt, logZlagRegression, hpsmth, or zlagsmth).
 Goertzel function call: 
The Goertzel function is called to analyze the detrended source data and extract cycle information. The output, number_of_cycles, contains the number of detected cycles.
 Initializing arrays for past and future waveforms: 
Three arrays, epgoertzel, goertzel, and goertzelFuture, are initialized to store the endpoint Goertzel, non-endpoint Goertzel, and future Goertzel projections, respectively.
 Calculating composite waveform for past bars (goertzel array): 
The past composite waveform is calculated by summing the selected cycles (either from the user-defined cycle list or the top cycles) and optionally subtracting the noise component.
 Calculating composite waveform for future bars (goertzelFuture array): 
The future composite waveform is calculated in a similar way as the past composite waveform.
 Drawing past composite waveform (pvlines): 
The past composite waveform is drawn on the chart using solid lines. The color of the lines is determined by the direction of the waveform (green for upward, red for downward).
 Drawing future composite waveform (fvlines): 
The future composite waveform is drawn on the chart using dotted lines. The color of the lines is determined by the direction of the waveform (fuchsia for upward, yellow for downward).
 Displaying cycle information in a table (table3): 
A table is created to display the cycle information, including the rank, period, Bartel value, amplitude (or cycle strength), and phase of each detected cycle.
 Filling the table with cycle information: 
The indicator iterates through the detected cycles and retrieves the relevant information (period, amplitude, phase, and Bartel value) from the corresponding arrays. It then fills the table with this information, displaying the values up to six decimal places.
To summarize, this indicator generates a composite waveform based on the detected cycles in the financial data. It calculates the composite waveforms for both past and future time windows and visualizes them on the chart using colored lines. Additionally, it displays detailed cycle information in a table, including the rank, period, Bartel value, amplitude (or cycle strength), and phase of each detected cycle.
 █ Enhancing the Goertzel Algorithm-Based Script for Financial Modeling and Trading 
The Goertzel algorithm-based script for detecting dominant cycles in financial data is a powerful tool for financial modeling and trading. It provides valuable insights into the past behavior of these cycles and potential future impact. However, as with any algorithm, there is always room for improvement. This section discusses potential enhancements to the existing script to make it even more robust and versatile for financial modeling, general trading, advanced trading, and high-frequency finance trading.
 Enhancements for Financial Modeling 
Data preprocessing: One way to improve the script's performance for financial modeling is to introduce more advanced data preprocessing techniques. This could include removing outliers, handling missing data, and normalizing the data to ensure consistent and accurate results.
Additional detrending and smoothing methods: Incorporating more sophisticated detrending and smoothing techniques, such as wavelet transform or empirical mode decomposition, can help improve the script's ability to accurately identify cycles and trends in the data.
Machine learning integration: Integrating machine learning techniques, such as artificial neural networks or support vector machines, can help enhance the script's predictive capabilities, leading to more accurate financial models.
 Enhancements for General and Advanced Trading 
Customizable indicator integration: Allowing users to integrate their own technical indicators can help improve the script's effectiveness for both general and advanced trading. By enabling the combination of the dominant cycle information with other technical analysis tools, traders can develop more comprehensive trading strategies.
Risk management and position sizing: Incorporating risk management and position sizing functionality into the script can help traders better manage their trades and control potential losses. This can be achieved by calculating the optimal position size based on the user's risk tolerance and account size.
Multi-timeframe analysis: Enhancing the script to perform multi-timeframe analysis can provide traders with a more holistic view of market trends and cycles. By identifying dominant cycles on different timeframes, traders can gain insights into the potential confluence of cycles and make better-informed trading decisions.
 Enhancements for High-Frequency Finance Trading 
Algorithm optimization: To ensure the script's suitability for high-frequency finance trading, optimizing the algorithm for faster execution is crucial. This can be achieved by employing efficient data structures and refining the calculation methods to minimize computational complexity.
Real-time data streaming: Integrating real-time data streaming capabilities into the script can help high-frequency traders react to market changes more quickly. By continuously updating the cycle information based on real-time market data, traders can adapt their strategies accordingly and capitalize on short-term market fluctuations.
Order execution and trade management: To fully leverage the script's capabilities for high-frequency trading, implementing functionality for automated order execution and trade management is essential. This can include features such as stop-loss and take-profit orders, trailing stops, and automated trade exit strategies.
While the existing Goertzel algorithm-based script is a valuable tool for detecting dominant cycles in financial data, there are several potential enhancements that can make it even more powerful for financial modeling, general trading, advanced trading, and high-frequency finance trading. By incorporating these improvements, the script can become a more versatile and effective tool for traders and financial analysts alike.
 █ Understanding the Limitations of the Goertzel Algorithm 
While the Goertzel algorithm-based script for detecting dominant cycles in financial data provides valuable insights, it is important to be aware of its limitations and drawbacks. Some of the key drawbacks of this indicator are:
 Lagging nature: 
As with many other technical indicators, the Goertzel algorithm-based script can suffer from lagging effects, meaning that it may not immediately react to real-time market changes. This lag can lead to late entries and exits, potentially resulting in reduced profitability or increased losses.
 Parameter sensitivity:  
The performance of the script can be sensitive to the chosen parameters, such as the detrending methods, smoothing techniques, and cycle detection settings. Improper parameter selection may lead to inaccurate cycle detection or increased false signals, which can negatively impact trading performance.
 Complexity:  
The Goertzel algorithm itself is relatively complex, making it difficult for novice traders or those unfamiliar with the concept of cycle analysis to fully understand and effectively utilize the script. This complexity can also make it challenging to optimize the script for specific trading styles or market conditions.
 Overfitting risk: 
As with any data-driven approach, there is a risk of overfitting when using the Goertzel algorithm-based script. Overfitting occurs when a model becomes too specific to the historical data it was trained on, leading to poor performance on new, unseen data. This can result in misleading signals and reduced trading performance.
No guarantee of future performance: While the script can provide insights into past cycles and potential future trends, it is important to remember that past performance does not guarantee future results. Market conditions can change, and relying solely on the script's predictions without considering other factors may lead to poor trading decisions.
Limited applicability: The Goertzel algorithm-based script may not be suitable for all markets, trading styles, or timeframes. Its effectiveness in detecting cycles may be limited in certain market conditions, such as during periods of extreme volatility or low liquidity.
While the Goertzel algorithm-based script offers valuable insights into dominant cycles in financial data, it is essential to consider its drawbacks and limitations when incorporating it into a trading strategy. Traders should always use the script in conjunction with other technical and fundamental analysis tools, as well as proper risk management, to make well-informed trading decisions.
 █ Interpreting Results 
The Goertzel Browser indicator can be interpreted by analyzing the plotted lines and the table presented alongside them. The indicator plots two lines: past and future composite waves. The past composite wave represents the composite wave of the past price data, and the future composite wave represents the projected composite wave for the next period.
The past composite wave line displays a solid line, with green indicating a bullish trend and red indicating a bearish trend. On the other hand, the future composite wave line is a dotted line with fuchsia indicating a bullish trend and yellow indicating a bearish trend.
The table presented alongside the indicator shows the top cycles with their corresponding rank, period, Bartels, amplitude or cycle strength, and phase. The amplitude is a measure of the strength of the cycle, while the phase is the position of the cycle within the data series.
Interpreting the Goertzel Browser indicator involves identifying the trend of the past and future composite wave lines and matching them with the corresponding bullish or bearish color. Additionally, traders can identify the top cycles with the highest amplitude or cycle strength and utilize them in conjunction with other technical indicators and fundamental analysis for trading decisions.
This indicator is considered a repainting indicator because the value of the indicator is calculated based on the past price data. As new price data becomes available, the indicator's value is recalculated, potentially causing the indicator's past values to change. This can create a false impression of the indicator's performance, as it may appear to have provided a profitable trading signal in the past when, in fact, that signal did not exist at the time.
The Goertzel indicator is also non-endpointed, meaning that it is not calculated up to the current bar or candle. Instead, it uses a fixed amount of historical data to calculate its values, which can make it difficult to use for real-time trading decisions. For example, if the indicator uses 100 bars of historical data to make its calculations, it cannot provide a signal until the current bar has closed and become part of the historical data. This can result in missed trading opportunities or delayed signals.
 █ Conclusion 
The Goertzel Browser indicator is a powerful tool for identifying and analyzing cyclical patterns in financial markets. Its ability to detect multiple cycles of varying frequencies and strengths make it a valuable addition to any trader's technical analysis toolkit. However, it is important to keep in mind that the Goertzel Browser indicator should be used in conjunction with other technical analysis tools and fundamental analysis to achieve the best results. With continued refinement and development, the Goertzel Browser indicator has the potential to become a highly effective tool for financial modeling, general trading, advanced trading, and high-frequency finance trading. Its accuracy and versatility make it a promising candidate for further research and development.
 █  Footnotes  
 What is the Bartels Test for Cycle Significance? 
The Bartels Cycle Significance Test is a statistical method that determines whether the peaks and troughs of a time series are statistically significant. The test is named after its inventor, George Bartels, who developed it in the mid-20th century.
The Bartels test is designed to analyze the cyclical components of a time series, which can help traders and analysts identify trends and cycles in financial markets. The test calculates a Bartels statistic, which measures the degree of non-randomness or autocorrelation in the time series.
The Bartels statistic is calculated by first splitting the time series into two halves and calculating the range of the peaks and troughs in each half. The test then compares these ranges using a t-test, which measures the significance of the difference between the two ranges.
If the Bartels statistic is greater than a critical value, it indicates that the peaks and troughs in the time series are non-random and that there is a significant cyclical component to the data. Conversely, if the Bartels statistic is less than the critical value, it suggests that the peaks and troughs are random and that there is no significant cyclical component.
The Bartels Cycle Significance Test is particularly useful in financial analysis because it can help traders and analysts identify significant cycles in asset prices, which can in turn inform investment decisions. However, it is important to note that the test is not perfect and can produce false signals in certain situations, particularly in noisy or volatile markets. Therefore, it is always recommended to use the test in conjunction with other technical and fundamental indicators to confirm trends and cycles.
 Deep-dive into the Hodrick-Prescott Fitler 
The Hodrick-Prescott (HP) filter is a statistical tool used in economics and finance to separate a time series into two components: a trend component and a cyclical component. It is a powerful tool for identifying long-term trends in economic and financial data and is widely used by economists, central banks, and financial institutions around the world.
The HP filter was first introduced in the 1990s by economists Robert Hodrick and Edward Prescott. It is a simple, two-parameter filter that separates a time series into a trend component and a cyclical component. The trend component represents the long-term behavior of the data, while the cyclical component captures the shorter-term fluctuations around the trend.
The HP filter works by minimizing the following objective function:
Minimize: (Sum of Squared Deviations) + λ (Sum of Squared Second Differences)
Where:
The first term represents the deviation of the data from the trend.
The second term represents the smoothness of the trend.
λ is a smoothing parameter that determines the degree of smoothness of the trend.
The smoothing parameter λ is typically set to a value between 100 and 1600, depending on the frequency of the data. Higher values of λ lead to a smoother trend, while lower values lead to a more volatile trend.
The HP filter has several advantages over other smoothing techniques. It is a non-parametric method, meaning that it does not make any assumptions about the underlying distribution of the data. It also allows for easy comparison of trends across different time series and can be used with data of any frequency.
However, the HP filter also has some limitations. It assumes that the trend is a smooth function, which may not be the case in some situations. It can also be sensitive to changes in the smoothing parameter λ, which may result in different trends for the same data. Additionally, the filter may produce unrealistic trends for very short time series.
Despite these limitations, the HP filter remains a valuable tool for analyzing economic and financial data. It is widely used by central banks and financial institutions to monitor long-term trends in the economy, and it can be used to identify turning points in the business cycle. The filter can also be used to analyze asset prices, exchange rates, and other financial variables.
The Hodrick-Prescott filter is a powerful tool for analyzing economic and financial data. It separates a time series into a trend component and a cyclical component, allowing for easy identification of long-term trends and turning points in the business cycle. While it has some limitations, it remains a valuable tool for economists, central banks, and financial institutions around the world.






















