CSCMultiTimeframeToolsLibrary "CSCMultiTimeframeTools"
Calculates instant higher timeframe values for higher timeframe analysis with zero lag.
getAdjustedLookback(current_tf_minutes, higher_tf_minutes, length)
Calculate adjusted lookback period for higher timeframe conversion.
Parameters:
current_tf_minutes (int) : Current chart timeframe in minutes (e.g., 5 for 5m).
higher_tf_minutes (int) : Target higher timeframe in minutes (e.g., 15 for 15m).
length (int) : Base length value (e.g., 14 for RSI/MFI).
Returns: Adjusted lookback period (length × multiplier).
Purpose and Benefits of the TimeframeTools Library
This library is designed to solve a critical pain point for traders who rely on higher timeframe (HTF) indicator values while analyzing lower timeframe (LTF) charts. Traditional methods require waiting for multiple candles to close—for example, to see a 1-hour RSI on a 5-minute chart, you’d need 12 closed candles (5m × 12 = 60m) before the value updates. This lag means missed opportunities, delayed signals, and inefficient decision-making.
Why Traders Need This
Whether you’re scalping (5M/15M) or swing trading (1H/4H), this library bridges the gap between timeframes, giving you HTF context in real time—so you can act faster, with confidence.
How This Library Eliminates the Waiting Game
By dynamically calculating the adjusted lookback period, the library allows:
Real-time HTF values on LTF charts – No waiting for candle closes.
Accurate conversions – A 14-period RSI on a 1-hour chart translates to 168 periods (14 × 12) on a 5-minute chart, ensuring mathematical precision.
Flexible application – Works with common indicators like RSI, MFI, CCI, and moving averages (though confirmations should be done before publishing under your own secondary use).
Key Advantages Over Manual Methods
Speed: Instantly reflects HTF values without waiting for candle resolutions.
Adaptability: Adjusts automatically if the user changes timeframes or lengths.
Consistency: Removes human error in manual period calculations.
Limitations to Note
Not a magic bullet – While it solves the lag issue, traders should still:
Validate signals with price action or additional confirmations.
Be mindful of extreme lookback lengths (e.g., a 200-period daily SMA on a 1-minute chart requires 28,800 periods, which may strain performance).
Komut dosyalarını "28年大学生毕业人数" için ara
Intrinsic Event (Multi DC OS)Overview
This indicator implements an event-based approach to analyze price movements in the foreign exchange market, inspired by the intrinsic time framework introduced in Fractals and Intrinsic Time - A Challenge to Econometricians by U. A. Müller et al. (1995). It identifies significant price events using an intrinsic time perspective and supports multi-agent analysis to reflect the heterogeneous nature of financial markets. The script plots these events as lines and labels on the chart, offering a visual tool for traders to understand market dynamics at different scales.
Key Features
Intrinsic Events : The indicator detects directional change (DC) and overshoot (OS) events based on user-defined thresholds (delta), aligning with the paper’s concept of intrinsic time (Section 6). Intrinsic time redefines time based on market activity, expanding during volatile periods and contracting during inactive ones, rather than relying on a physical clock.
Multi-Agent Analysis : Supports up to five agents, each with its own threshold and color settings, reflecting the heterogeneous market hypothesis (Section 5). This allows the indicator to capture the perspectives of market participants with different time horizons, such as short-term FX dealers and long-term central banks.
How It Works
Intrinsic Events Detection : The script identifies two types of events using intrinsic time principles:
Directional Change (DC) : Triggered when the price reverses by the threshold (delta) against the current trend (e.g., a drop by delta in an uptrend signals a "Down DC").
Overshoot (OS) : Occurs when the price continues in the trend direction by the threshold (e.g., a rise by delta in an uptrend signals an "Up OS").
DC events are plotted as solid lines, and OS events as dashed lines, with labels like "Up DC" or "OS Down" for clarity. The label style adjusts based on the trend to ensure visibility.
Multi-Agent Setup : Each agent operates independently with its own threshold, mimicking market participants with varying time horizons (Section 5). Smaller thresholds detect frequent, short-term events, while larger thresholds capture broader, long-term movements.
Settings
Each agent can be configured with:
Enable Agent : Toggle the agent on or off.
Threshold (%) : The percentage threshold (delta) for detecting DC and OS events (default values: 0.1%, 0.2%, 0.5%, 1%, 2% for agents 1–5).
Up Mode Color : Color for lines and labels in up mode (DC events).
Down Mode Color : Color for lines and labels in down mode (OS events).
Usage Notes
This indicator is designed for the foreign exchange market, leveraging its high liquidity, as noted in the paper (Section 1). Adjust the threshold values based on the instrument’s volatility—higher volatility leads to more intrinsic events (Section 4). It can be adapted to other markets where event-based analysis applies.
Reference
The methodology is based on:
Fractals and Intrinsic Time - A Challenge to Econometricians by U. A. Müller, M. M. Dacorogna, R. D. Davé, O. V. Pictet, R. B. Olsen, and J. R. Ward (June 28, 1995). Olsen & Associates Preprint.
Vulkan Profit
Overview
The Vulkan Profit indicator is a trend-following tool that identifies potential entry and exit points by monitoring the relationship between short-term and long-term moving averages. It generates clear buy and sell signals when specific moving average conditions align, making it useful for traders looking to confirm trend changes across multiple timeframes.
How It Works
The indicator utilizes four different moving averages:
Fast WMA (period 3) - A highly responsive weighted moving average
Medium WMA (period 8) - A less sensitive weighted moving average
Fast EMA (period 18) - A responsive exponential moving average
Slow EMA (period 28) - A slower exponential moving average
These moving averages are grouped into two categories:
Short-term MAs: Fast WMA and Medium WMA
Long-term MAs: Fast EMA and Slow EMA
Signal Generation Logic
The Vulkan Profit indicator generates signals based on the relative positions of these moving averages:
Buy Signal (Green Triangle)
A buy signal appears when the minimum value of the short-term MAs becomes greater than the maximum value of the long-term MAs. In other words, when both short-term MAs cross above both long-term MAs.
Sell Signal (Red Triangle)
A sell signal appears when the maximum value of the short-term MAs becomes less than the minimum value of the long-term MAs. In other words, when both short-term MAs cross below both long-term MAs.
Visual Components
Moving Averages - All four moving averages can be displayed or hidden
Signal Arrows - Green triangles for buy signals, red triangles for sell signals
Colored Line - A line that changes color based on the current market stance (green for bullish, red for bearish)
Customization Options
The indicator offers several customization settings:
Toggle the visibility of moving averages
Toggle the visibility of buy/sell signals
Adjust the color, width, and position of the signal line
Choose between different line styles (Line, Stepline, Histogram)
Practical Trading Applications
Trend Identification: The relative positioning of all moving averages helps identify the current market trend
Entry/Exit Points: The buy and sell signals can be used as potential entry and exit points
Trend Confirmation: The colored line provides ongoing confirmation of the trend direction
Filter: Can be used in conjunction with other indicators as a trend filter
Trading Strategy Suggestions
Trend Following: Enter long positions on buy signals and exit on sell signals during trending markets
Confirmation Tool: Use the signals to confirm trades identified by other indicators
Timeframe Analysis: Apply the indicator across multiple timeframes for stronger confirmation
Risk Management: Place stop-loss orders below recent swing lows for long positions and above recent swing highs for short positions
Tips for Best Results
The indicator performs best in trending markets and may generate false signals in ranging or highly volatile markets
Consider the broader market context before taking trades based solely on these signals
Use appropriate position sizing and risk management regardless of the indicator's signals
The longer timeframes generally produce more reliable signals with fewer false positives
The Vulkan Profit indicator combines the responsiveness of short-term averages with the stability of long-term averages to capture significant trend changes while filtering out minor price fluctuations.
Optimized WPR Strategy with Filters (Debug)Identifying Market Trends:
The 200-period EMA is used to determine the short-term trend of the market.
When the price is above the 200-period EMA, it suggests a potential bullish market and an uptrend, and the strategy will only look for buying opportunities.
When the price is below the 200-period EMA, it suggests a potential bearish market and a downtrend, and the strategy will only look for selling opportunities.
When the 200-period EMA intersects with the price, it indicates that the market may be in a directionless consolidation phase.
Identifying Potential Reversal Points:
The strategy employs two Williams %R (WPR) indicators: one with a 9-period (fast WPR) and another with a 28-period (slow WPR).
WPR is a momentum indicator used to identify overbought and oversold conditions in the market. Its value oscillates between -100 and 0, with values near -100 indicating oversold conditions and values near 0 indicating overbought conditions.
In an uptrend (when the price is above the 200 EMA), the strategy seeks buying opportunities when both WPR indicators cross above -80 (the oversold zone) from below. This is considered a bullish signal, suggesting the market may be about to rebound. Sell signals are ignored at this time.
In a downtrend (when the price is below the 200 EMA), the strategy seeks selling opportunities when both WPR indicators cross below -20 (the overbought zone) from above. This is considered a bearish signal, suggesting the market may be about to reverse downward. Buy signals are ignored at this time.
Summary:
In summary, this strategy first uses the 200-period EMA to determine the overall trend direction of the market. Then, within the confirmed trend direction, it utilizes the simultaneous crossing of the overbought or oversold zones by the dual WPR indicators to identify potential reversal points as entry signals for trading. The strategy emphasizes that trading signals are only valid when both WPR indicators meet the conditions.
Astro: Moon SizeThe Astro: Moon Size indicator, built using AstroLib , calculates the distance and visualizes the apparent size of the Moon based on astronomical positioning. This script is tailored for the 1D timeframe and provides insights into lunar perigees (closest approach) and apogees (farthest distance), making it useful for astrologically-informed trading strategies.
New Astro Indicators Feature:
By setting the Julian Date to X number of days in the future, and offsetting the plot by X number of bars accordingly, it is now possible to visualize future projections of TradingView indicators that reference the AstroLib . This feature has been long requested and is far overdue, so thank you to everyone who pushed for this feature release. Enjoy, time travelers from the future!!
Key Features:
Moon Size Calculation: Uses Julian Date (J2000) conversion and AstroLib functions to determine the Moon's apparent distance.
Future Projection: Displays the Moon's distance from 28 up to 500 days ahead, with color gradients indicating proximity/size.
Pivot Identification: Marks local maxima (apogees) and minima (perigees) with labeled date stamps for easy reference.
Dynamic Labeling: Adapts label positioning and size based on the Moon's current trend and relative size.
Usage Notes:
⚠️ Timeframe Restriction: For now, the script only functions on the 1D timeframe and will prompt an error otherwise.
⚠️ Asset Restriction: This script is meant to be loaded on charts for assets that trade 24/7, like BTCUSD historical index.
G-VIDYA | QuantEdgeBIntroducing G-VIDYA by QuantEdgeB
____
🔹 Overview
The G-VIDYA | QuantEdgeB is a dynamic trend-following indicator that enhances market trend detection using Gaussian smoothing and an adaptive Variable Index Dynamic Average (VIDYA). It is designed to reduce noise, improve responsiveness, and adapt to volatility, making it a powerful tool for traders looking to capture long-term trends efficiently.
By integrating ATR-based filtering, the indicator creates a dynamic support and resistance band around VIDYA, allowing for more accurate trend confirmations. Additionally, traders have the option to enable trade labels for clearer visual signals.
This indicator is well-suited for medium to long-term trend traders, combining mathematical precision with market adaptability for robust trading strategies.
_____
🚀 Key Features
1. Gaussian Smoothing → Reduces market noise and smoothens price action.
2. VIDYA Adaptive Calculation → Adjusts dynamically based on market volatility.
3. ATR-Based Filtering → Creates a volatility-driven range around VIDYA.
4. Dynamic Trend Confirmation → Identifies bullish and bearish momentum shifts.
5. Trade Labels (Optional) → Can display Long/Cash labels on chart for better clarity.
6. Customizable Color Modes → Offers multiple visual themes for personalized experience.
7. Automated Alerts → Sends buy/sell alerts for crossover trend changes.
_____
📊 How It Works
1. Gaussian Smoothing is applied to the closing price to remove noise and improve signal clarity.
2. VIDYA Calculation dynamically adjusts to price movements, making it more reactive during high-volatility periods and stable in low-volatility environments.
3. ATR-Based Filtering establishes a dynamic range (Upper & Lower ATR Bands) around VIDYA:
- If price breaks above the upper ATR band, it signals a potential long trend.
- If price breaks below the lower ATR band, it signals a potential short trend.
4. The indicator assigns color-coded candles based on trend direction:
- Bullish Trend → Blue/Green (Uptrend)
- Bearish Trend → Red/Maroon (Downtrend)
5. Labels & Alerts (Optional)
- Users can activate Long/Cash labels to mark buy/sell opportunities.
- Built-in alerts trigger automatic notifications when trend direction changes.
_____
🎨 Visual Representation
- VIDYA Line → A smooth, trend-following line that dynamically adjusts to market conditions.
- Upper & Lower ATR Bands → Establishes a volatility-based corridor around VIDYA.
- Bar Coloring → Candles change color according to the detected trend.
- Long/Short Labels (Optional) → Displays trade entry/exit signals (can be enabled/disabled).
- Alerts → Generates trade notifications based on trend reversals.
______
⚙️ Default Settings
- Gaussian Smoothing
- Length: 4
- Sigma: 2.0
- VIDYA Settings
- VIDYA Length: 46
- Standard Deviation Length: 28
- ATR Settings
- ATR Length: 14
- ATR Multiplier: 1.3
____
💡 Who Should Use It?
✅ Trend Traders → Those who rely on medium-to-long-term trends for trading decisions.
✅ Swing Traders → Ideal for traders who want to capture trend reversals and ride momentum.
✅ Quantitative Analysts → Provides statistically driven smoothing and adaptive trend detection.
✅ Risk-Averse Traders → ATR filtering helps manage market volatility effectively.
_____
Conclusion
The G-VIDYA | QuantEdgeB is an advanced trend-following indicator that combines Gaussian smoothing, adaptive VIDYA filtering, and ATR-based dynamic trend analysis to deliver robust and reliable trade signals.
✅ Key Takeaways
📌 Adaptive & Dynamic: Adjusts to market conditions, making it effective for trend-following strategies.
📌 Noise Reduction: Gaussian smoothing helps filter out short-term fluctuations, improving signal clarity.
📌 Volatility Awareness: ATR-based filtering ensures better handling of market swings and trend reversals.
By blending mathematical precision and quantitative market analysis, G-VIDYA | QuantEdgeB offers a powerful edge in trend trading strategies.
🔹 Disclaimer: Past performance is not indicative of future results. No trading strategy can guarantee success in financial markets.
🔹 Strategic Advice: Always backtest, optimize, and align parameters with your trading objectives and risk tolerance before live trading.
ValueAtTime█ OVERVIEW
This library is a Pine Script® programming tool for accessing historical values in a time series using UNIX timestamps . Its data structure and functions index values by time, allowing scripts to retrieve past values based on absolute timestamps or relative time offsets instead of relying on bar index offsets.
█ CONCEPTS
UNIX timestamps
In Pine Script®, a UNIX timestamp is an integer representing the number of milliseconds elapsed since January 1, 1970, at 00:00:00 UTC (the UNIX Epoch ). The timestamp is a unique, absolute representation of a specific point in time. Unlike a calendar date and time, a UNIX timestamp's meaning does not change relative to any time zone .
This library's functions process series values and corresponding UNIX timestamps in pairs , offering a simplified way to identify values that occur at or near distinct points in time instead of on specific bars.
Storing and retrieving time-value pairs
This library's `Data` type defines the structure for collecting time and value information in pairs. Objects of the `Data` type contain the following two fields:
• `times` – An array of "int" UNIX timestamps for each recorded value.
• `values` – An array of "float" values for each saved timestamp.
Each index in both arrays refers to a specific time-value pair. For instance, the `times` and `values` elements at index 0 represent the first saved timestamp and corresponding value. The library functions that maintain `Data` objects queue up to one time-value pair per bar into the object's arrays, where the saved timestamp represents the bar's opening time .
Because the `times` array contains a distinct UNIX timestamp for each item in the `values` array, it serves as a custom mapping for retrieving saved values. All the library functions that return information from a `Data` object use this simple two-step process to identify a value based on time:
1. Perform a binary search on the `times` array to find the earliest saved timestamp closest to the specified time or offset and get the element's index.
2. Access the element from the `values` array at the retrieved index, returning the stored value corresponding to the found timestamp.
Value search methods
There are several techniques programmers can use to identify historical values from corresponding timestamps. This library's functions include three different search methods to locate and retrieve values based on absolute times or relative time offsets:
Timestamp search
Find the value with the earliest saved timestamp closest to a specified timestamp.
Millisecond offset search
Find the value with the earliest saved timestamp closest to a specified number of milliseconds behind the current bar's opening time. This search method provides a time-based alternative to retrieving historical values at specific bar offsets.
Period offset search
Locate the value with the earliest saved timestamp closest to a defined period offset behind the current bar's opening time. The function calculates the span of the offset based on a period string . The "string" must contain one of the following unit tokens:
• "D" for days
• "W" for weeks
• "M" for months
• "Y" for years
• "YTD" for year-to-date, meaning the time elapsed since the beginning of the bar's opening year in the exchange time zone.
The period string can include a multiplier prefix for all supported units except "YTD" (e.g., "2W" for two weeks).
Note that the precise span covered by the "M", "Y", and "YTD" units varies across time. The "1M" period can cover 28, 29, 30, or 31 days, depending on the bar's opening month and year in the exchange time zone. The "1Y" period covers 365 or 366 days, depending on leap years. The "YTD" period's span changes with each new bar, because it always measures the time from the start of the current bar's opening year.
█ CALCULATIONS AND USE
This library's functions offer a flexible, structured approach to retrieving historical values at or near specific timestamps, millisecond offsets, or period offsets for different analytical needs.
See below for explanations of the exported functions and how to use them.
Retrieving single values
The library includes three functions that retrieve a single stored value using timestamp, millisecond offset, or period offset search methods:
• `valueAtTime()` – Locates the saved value with the earliest timestamp closest to a specified timestamp.
• `valueAtTimeOffset()` – Finds the saved value with the earliest timestamp closest to the specified number of milliseconds behind the current bar's opening time.
• `valueAtPeriodOffset()` – Finds the saved value with the earliest timestamp closest to the period-based offset behind the current bar's opening time.
Each function has two overloads for advanced and simple use cases. The first overload searches for a value in a user-specified `Data` object created by the `collectData()` function (see below). It returns a tuple containing the found value and the corresponding timestamp.
The second overload maintains a `Data` object internally to store and retrieve values for a specified `source` series. This overload returns a tuple containing the historical `source` value, the corresponding timestamp, and the current bar's `source` value, making it helpful for comparing past and present values from requested contexts.
Retrieving multiple values
The library includes the following functions to retrieve values from multiple historical points in time, facilitating calculations and comparisons with values retrieved across several intervals:
• `getDataAtTimes()` – Locates a past `source` value for each item in a `timestamps` array. Each retrieved value's timestamp represents the earliest time closest to one of the specified timestamps.
• `getDataAtTimeOffsets()` – Finds a past `source` value for each item in a `timeOffsets` array. Each retrieved value's timestamp represents the earliest time closest to one of the specified millisecond offsets behind the current bar's opening time.
• `getDataAtPeriodOffsets()` – Finds a past value for each item in a `periods` array. Each retrieved value's timestamp represents the earliest time closest to one of the specified period offsets behind the current bar's opening time.
Each function returns a tuple with arrays containing the found `source` values and their corresponding timestamps. In addition, the tuple includes the current `source` value and the symbol's description, which also makes these functions helpful for multi-interval comparisons using data from requested contexts.
Processing period inputs
When writing scripts that retrieve historical values based on several user-specified period offsets, the most concise approach is to create a single text input that allows users to list each period, then process the "string" list into an array for use in the `getDataAtPeriodOffsets()` function.
This library includes a `getArrayFromString()` function to provide a simple way to process strings containing comma-separated lists of periods. The function splits the specified `str` by its commas and returns an array containing every non-empty item in the list with surrounding whitespaces removed. View the example code to see how we use this function to process the value of a text area input .
Calculating period offset times
Because the exact amount of time covered by a specified period offset can vary, it is often helpful to verify the resulting times when using the `valueAtPeriodOffset()` or `getDataAtPeriodOffsets()` functions to ensure the calculations work as intended for your use case.
The library's `periodToTimestamp()` function calculates an offset timestamp from a given period and reference time. With this function, programmers can verify the time offsets in a period-based data search and use the calculated offset times in additional operations.
For periods with "D" or "W" units, the function calculates the time offset based on the absolute number of milliseconds the period covers (e.g., `86400000` for "1D"). For periods with "M", "Y", or "YTD" units, the function calculates an offset time based on the reference time's calendar date in the exchange time zone.
Collecting data
All the `getDataAt*()` functions, and the second overloads of the `valueAt*()` functions, collect and maintain data internally, meaning scripts do not require a separate `Data` object when using them. However, the first overloads of the `valueAt*()` functions do not collect data, because they retrieve values from a user-specified `Data` object.
For cases where a script requires a separate `Data` object for use with these overloads or other custom routines, this library exports the `collectData()` function. This function queues each bar's `source` value and opening timestamp into a `Data` object and returns the object's ID.
This function is particularly useful when searching for values from a specific series more than once. For instance, instead of using multiple calls to the second overloads of `valueAt*()` functions with the same `source` argument, programmers can call `collectData()` to store each bar's `source` and opening timestamp, then use the returned `Data` object's ID in calls to the first `valueAt*()` overloads to reduce memory usage.
The `collectData()` function and all the functions that collect data internally include two optional parameters for limiting the saved time-value pairs to a sliding window: `timeOffsetLimit` and `timeframeLimit`. When either has a non-na argument, the function restricts the collected data to the maximum number of recent bars covered by the specified millisecond- and timeframe-based intervals.
NOTE : All calls to the functions that collect data for a `source` series can execute up to once per bar or realtime tick, because each stored value requires a unique corresponding timestamp. Therefore, scripts cannot call these functions iteratively within a loop . If a call to these functions executes more than once inside a loop's scope, it causes a runtime error.
█ EXAMPLE CODE
The example code at the end of the script demonstrates one possible use case for this library's functions. The code retrieves historical price data at user-specified period offsets, calculates price returns for each period from the retrieved data, and then populates a table with the results.
The example code's process is as follows:
1. Input a list of periods – The user specifies a comma-separated list of period strings in the script's "Period list" input (e.g., "1W, 1M, 3M, 1Y, YTD"). Each item in the input list represents a period offset from the latest bar's opening time.
2. Process the period list – The example calls `getArrayFromString()` on the first bar to split the input list by its commas and construct an array of period strings.
3. Request historical data – The code uses a call to `getDataAtPeriodOffsets()` as the `expression` argument in a request.security() call to retrieve the closing prices of "1D" bars for each period included in the processed `periods` array.
4. Display information in a table – On the latest bar, the code uses the retrieved data to calculate price returns over each specified period, then populates a two-row table with the results. The cells for each return percentage are color-coded based on the magnitude and direction of the price change. The cells also include tooltips showing the compared daily bar's opening date in the exchange time zone.
█ NOTES
• This library's architecture relies on a user-defined type (UDT) for its data storage format. UDTs are blueprints from which scripts create objects , i.e., composite structures with fields containing independent values or references of any supported type.
• The library functions search through a `Data` object's `times` array using the array.binary_search_leftmost() function, which is more efficient than looping through collected data to identify matching timestamps. Note that this built-in works only for arrays with elements sorted in ascending order .
• Each function that collects data from a `source` series updates the values and times stored in a local `Data` object's arrays. If a single call to these functions were to execute in a loop , it would store multiple values with an identical timestamp, which can cause erroneous search behavior. To prevent looped calls to these functions, the library uses the `checkCall()` helper function in their scopes. This function maintains a counter that increases by one each time it executes on a confirmed bar. If the count exceeds the total number of bars, indicating the call executes more than once in a loop, it raises a runtime error .
• Typically, when requesting higher-timeframe data with request.security() while using barmerge.lookahead_on as the `lookahead` argument, the `expression` argument should be offset with the history-referencing operator to prevent lookahead bias on historical bars. However, the call in this script's example code enables lookahead without offsetting the `expression` because the script displays results only on the last historical bar and all realtime bars, where there is no future data to leak into the past. This call ensures the displayed results use the latest data available from the context on realtime bars.
Look first. Then leap.
█ EXPORTED TYPES
Data
A structure for storing successive timestamps and corresponding values from a dataset.
Fields:
times (array) : An "int" array containing a UNIX timestamp for each value in the `values` array.
values (array) : A "float" array containing values corresponding to the timestamps in the `times` array.
█ EXPORTED FUNCTIONS
getArrayFromString(str)
Splits a "string" into an array of substrings using the comma (`,`) as the delimiter. The function trims surrounding whitespace characters from each substring, and it excludes empty substrings from the result.
Parameters:
str (series string) : The "string" to split into an array based on its commas.
Returns: (array) An array of trimmed substrings from the specified `str`.
periodToTimestamp(period, referenceTime)
Calculates a UNIX timestamp representing the point offset behind a reference time by the amount of time within the specified `period`.
Parameters:
period (series string) : The period string, which determines the time offset of the returned timestamp. The specified argument must contain a unit and an optional multiplier (e.g., "1Y", "3M", "2W", "YTD"). Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the `referenceTime` value's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
referenceTime (series int) : The millisecond UNIX timestamp from which to calculate the offset time.
Returns: (int) A millisecond UNIX timestamp representing the offset time point behind the `referenceTime`.
collectData(source, timeOffsetLimit, timeframeLimit)
Collects `source` and `time` data successively across bars. The function stores the information within a `Data` object for use in other exported functions/methods, such as `valueAtTimeOffset()` and `valueAtPeriodOffset()`. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to collect. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: (Data) A `Data` object containing collected `source` values and corresponding timestamps over the allowed time range.
method valueAtTime(data, timestamp)
(Overload 1 of 2) Retrieves value and time data from a `Data` object's fields at the index of the earliest timestamp closest to the specified `timestamp`. Callable as a method or a function.
Parameters:
data (series Data) : The `Data` object containing the collected time and value data.
timestamp (series int) : The millisecond UNIX timestamp to search. The function returns data for the earliest saved timestamp that is closest to the value.
Returns: ( ) A tuple containing the following data from the `Data` object:
- The stored value corresponding to the identified timestamp ("float").
- The earliest saved timestamp that is closest to the specified `timestamp` ("int").
valueAtTime(source, timestamp, timeOffsetLimit, timeframeLimit)
(Overload 2 of 2) Retrieves `source` and time information for the earliest bar whose opening timestamp is closest to the specified `timestamp`. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timestamp (series int) : The millisecond UNIX timestamp to search. The function returns data for the earliest bar whose timestamp is closest to the value.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : (simple string) Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple containing the following data:
- The `source` value corresponding to the identified timestamp ("float").
- The earliest bar's timestamp that is closest to the specified `timestamp` ("int").
- The current bar's `source` value ("float").
method valueAtTimeOffset(data, timeOffset)
(Overload 1 of 2) Retrieves value and time data from a `Data` object's fields at the index of the earliest saved timestamp closest to `timeOffset` milliseconds behind the current bar's opening time. Callable as a method or a function.
Parameters:
data (series Data) : The `Data` object containing the collected time and value data.
timeOffset (series int) : The millisecond offset behind the bar's opening time. The function returns data for the earliest saved timestamp that is closest to the calculated offset time.
Returns: ( ) A tuple containing the following data from the `Data` object:
- The stored value corresponding to the identified timestamp ("float").
- The earliest saved timestamp that is closest to `timeOffset` milliseconds before the current bar's opening time ("int").
valueAtTimeOffset(source, timeOffset, timeOffsetLimit, timeframeLimit)
(Overload 2 of 2) Retrieves `source` and time information for the earliest bar whose opening timestamp is closest to `timeOffset` milliseconds behind the current bar's opening time. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffset (series int) : The millisecond offset behind the bar's opening time. The function returns data for the earliest bar's timestamp that is closest to the calculated offset time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple containing the following data:
- The `source` value corresponding to the identified timestamp ("float").
- The earliest bar's timestamp that is closest to `timeOffset` milliseconds before the current bar's opening time ("int").
- The current bar's `source` value ("float").
method valueAtPeriodOffset(data, period)
(Overload 1 of 2) Retrieves value and time data from a `Data` object's fields at the index of the earliest timestamp closest to a calculated offset behind the current bar's opening time. The calculated offset represents the amount of time covered by the specified `period`. Callable as a method or a function.
Parameters:
data (series Data) : The `Data` object containing the collected time and value data.
period (series string) : The period string, which determines the calculated time offset. The specified argument must contain a unit and an optional multiplier (e.g., "1Y", "3M", "2W", "YTD"). Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the current bar's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
Returns: ( ) A tuple containing the following data from the `Data` object:
- The stored value corresponding to the identified timestamp ("float").
- The earliest saved timestamp that is closest to the calculated offset behind the bar's opening time ("int").
valueAtPeriodOffset(source, period, timeOffsetLimit, timeframeLimit)
(Overload 2 of 2) Retrieves `source` and time information for the earliest bar whose opening timestamp is closest to a calculated offset behind the current bar's opening time. The calculated offset represents the amount of time covered by the specified `period`. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
period (series string) : The period string, which determines the calculated time offset. The specified argument must contain a unit and an optional multiplier (e.g., "1Y", "3M", "2W", "YTD"). Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the current bar's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple containing the following data:
- The `source` value corresponding to the identified timestamp ("float").
- The earliest bar's timestamp that is closest to the calculated offset behind the current bar's opening time ("int").
- The current bar's `source` value ("float").
getDataAtTimes(timestamps, source, timeOffsetLimit, timeframeLimit)
Retrieves `source` and time information for each bar whose opening timestamp is the earliest one closest to one of the UNIX timestamps specified in the `timestamps` array. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
timestamps (array) : An array of "int" values representing UNIX timestamps. The function retrieves `source` and time data for each element in this array.
source (series float) : The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple of the following data:
- An array containing a `source` value for each identified timestamp (array).
- An array containing an identified timestamp for each item in the `timestamps` array (array).
- The current bar's `source` value ("float").
- The symbol's description from `syminfo.description` ("string").
getDataAtTimeOffsets(timeOffsets, source, timeOffsetLimit, timeframeLimit)
Retrieves `source` and time information for each bar whose opening timestamp is the earliest one closest to one of the time offsets specified in the `timeOffsets` array. Each offset in the array represents the absolute number of milliseconds behind the current bar's opening time. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
timeOffsets (array) : An array of "int" values representing the millisecond time offsets used in the search. The function retrieves `source` and time data for each element in this array. For example, the array ` ` specifies that the function returns data for the timestamps closest to one day and one week behind the current bar's opening time.
source (float) : (series float) The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple of the following data:
- An array containing a `source` value for each identified timestamp (array).
- An array containing an identified timestamp for each offset specified in the `timeOffsets` array (array).
- The current bar's `source` value ("float").
- The symbol's description from `syminfo.description` ("string").
getDataAtPeriodOffsets(periods, source, timeOffsetLimit, timeframeLimit)
Retrieves `source` and time information for each bar whose opening timestamp is the earliest one closest to a calculated offset behind the current bar's opening time. Each calculated offset represents the amount of time covered by a period specified in the `periods` array. Any call to this function cannot execute more than once per bar or realtime tick.
Parameters:
periods (array) : An array of period strings, which determines the time offsets used in the search. The function retrieves `source` and time data for each element in this array. For example, the array ` ` specifies that the function returns data for the timestamps closest to one day, week, and month behind the current bar's opening time. Each "string" in the array must contain a unit and an optional multiplier. Supported units are:
- "Y" for years.
- "M" for months.
- "W" for weeks.
- "D" for days.
- "YTD" (Year-to-date) for the span from the start of the current bar's year in the exchange time zone. An argument with this unit cannot contain a multiplier.
source (float) : (series float) The source series to analyze. The function stores each value in the series with an associated timestamp representing its corresponding bar's opening time.
timeOffsetLimit (simple int) : Optional. A time offset (range) in milliseconds. If specified, the function limits the collected data to the maximum number of bars covered by the range, with a minimum of one bar. If the call includes a non-empty `timeframeLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
timeframeLimit (simple string) : Optional. A valid timeframe string. If specified and not empty, the function limits the collected data to the maximum number of bars covered by the timeframe, with a minimum of one bar. If the call includes a non-na `timeOffsetLimit` value, the function limits the data using the largest number of bars covered by the two ranges. The default is `na`.
Returns: ( ) A tuple of the following data:
- An array containing a `source` value for each identified timestamp (array).
- An array containing an identified timestamp for each period specified in the `periods` array (array).
- The current bar's `source` value ("float").
- The symbol's description from `syminfo.description` ("string").
RSI Divergence[UgurTash] – Real-Time📈 RSI Divergence – Real-Time, Adaptive, and Intelligent RSI Divergence Detection
🚀 What Does This Indicator Do?
RSI Divergence is a real-time divergence detection tool that helps traders identify bullish and bearish divergences between price and the Relative Strength Index (RSI). Unlike traditional RSI-based indicators, this script offers:
✅ Real-time detection – No need to wait for bar closes or repainting.
✅ Dynamic time-frame adaptation – The script automatically adjusts RSI settings based on the selected chart time frame.
✅ Multi-layered divergence analysis – Supports short-term, medium-term, and long-term divergence detection with an optional all-term mode that dynamically selects the best configuration.
🛠 How Does It Work?
Pivot-Based Divergence Detection:
The script analyzes pivot points on both price and RSI to determine valid divergences.
Bullish divergence occurs when price forms a lower low but RSI trends higher, indicating potential upward momentum.
Bearish divergence occurs when price forms a higher high but RSI trends lower, signaling possible weakness.
Adaptive RSI Calculation:
The RSI length is dynamically adjusted based on the chosen time frame:
Short-Term: RSI (7) for 1-5 min charts.
Medium-Term: RSI (14) for 15-60 min charts.
Long-Term: RSI (28) for 4H+ charts.
In All-Term Mode, the script automatically determines the best RSI length based on the active chart timeframe.
Smart Visualization & Alerts:
Bullish divergences are marked with green lines & labels.
Bearish divergences are highlighted in red.
Users can customize symbol size, divergence labels, and colors.
Instant alerts notify traders as soon as a divergence is detected.
🎯 How to Use This Indicator?
📌 For Trend Reversals: Look for bullish divergences at key support levels and bearish divergences at resistance zones.
📌 For Trend Continuation: Combine divergence signals with moving averages, volume analysis, or price action strategies to confirm trades.
📌 For Scalping & Swing Trading: Adjust the time-frame settings to match your trading style.
🏆 What Makes This Indicator Original?
🔹 Unlike standard RSI divergence indicators, this script features real-time analysis with no repainting, allowing for instant trading decisions.
🔹 The time-frame adaptive RSI makes it dynamic and suitable for any market condition.
🔹 The multi-term divergence detection offers flexibility, giving traders a precise view of both short-term & long-term market structure.
⚠ Note: No indicator guarantees 100% accuracy. Always use additional confirmations and sound risk management strategies.
If you find this tool useful, don’t forget to support & share! 🚀
Crypto Scanner v4This guide explains a version 6 Pine Script that scans a user-provided list of cryptocurrency tokens to identify high probability tradable opportunities using several technical indicators. The script combines trend, momentum, and volume-based analyses to generate potential buying or selling signals, and it displays the results in a neatly formatted table with alerts for trading setups. Below is a detailed walkthrough of the script’s design, how traders can interpret its outputs, and recommendations for optimizing indicator inputs across different timeframes.
## Overview and Key Components
The script is designed to help traders assess multiple tokens by calculating several indicators for each one. The key components include:
- **Input Settings:**
- A comma-separated list of symbols to scan.
- Adjustable parameters for technical indicators such as ADX, RSI, MFI, and a custom Wave Trend indicator.
- Options to enable alerts and set update frequencies.
- **Indicator Calculations:**
- **ADX (Average Directional Index):** Measures trend strength. A value above the provided threshold indicates a strong trend, which is essential for validating momentum before entering a trade.
- **RSI (Relative Strength Index):** Helps determine overbought or oversold conditions. When the RSI is below the oversold level, it may present a buying opportunity, while an overbought condition (not explicitly part of this setup) could suggest selling.
- **MFI (Money Flow Index):** Similar in concept to RSI but incorporates volume, thus assessing buying and selling pressure. Values below the designated oversold threshold indicate potential undervaluation.
- **Wave Trend:** A custom indicator that calculates two components (WT1 and WT2); a crossover where WT1 moves from below to above WT2 (particularly near oversold levels) may signal a reversal and a potential entry point.
- **Scanning and Trading Zone:**
- The script identifies a *bullish setup* when the following conditions are met for a token:
- ADX exceeds the threshold (strong trend).
- Both RSI and MFI are below their oversold levels (indicating potential buying opportunities).
- A Wave Trend crossover confirms near-term reversal dynamics.
- A *trading zone* condition is also defined by specific ranges for ADX, RSI, MFI, and a limited difference between WT1 and WT2. This zone suggests that the token might be in a consolidation phase where even small moves may be significant.
- **Alerts and Table Reporting:**
- A table is generated, with each row corresponding to a token. The table contains columns for the symbol, ADX, RSI, MFI, WT1, WT2, and the trading zone status.
- Visual cues—such as different background colors—highlight tokens with a bullish setup or that are within the trading zone.
- Alerts are issued based on the detection of a bullish setup or entry into a trading zone. These alerts are limited per bar to avoid flooding the trader with notifications.
## How to Interpret the Indicator Outputs
Traders should use the indicator values as guidance, verifying them against their own analysis before making any trading decision. Here’s how to assess each output:
- **ADX:**
- **High values (above threshold):** Indicate strong trends. If other indicators confirm an oversold condition, a trader may consider a long position for a corrective reversal.
- **Low values:** Suggest that the market is not trending strongly, and caution should be taken when considering entry.
- **RSI and MFI:**
- **Below oversold levels:** These conditions are traditionally seen as signals that an asset is undervalued, potentially triggering a bounce.
- **Above typical resistance levels (not explicitly used here):** Would normally caution a trader against entering a long position.
- **Wave Trend (WT1 and WT2):**
- A crossover where WT1 moves upward above WT2 in an oversold environment can signal the beginning of a recovery or reversal, thereby reinforcing buy signals.
- **Trading Zone:**
- Being “in zone” means that the asset’s current values for ADX, RSI, MFI, and the closeness of the Wave Trend lines indicate a period of consolidation. This scenario might be suitable for both short-term scalping or as an early exit indicator, depending on further market analysis.
## Timeframe Optimization Input Table
Traders can optimize indicator inputs depending on the timeframe they use. The following table provides a set of recommended input values for various timeframes. These values are suggestions and should be adjusted based on market conditions and individual trading styles.
Timeframe ADX RSI MFI ADX RSI MFI WT Channel WT Average
5-min 10 10 10 20 30 20 7 15
15-min 12 12 12 22 30 20 9 18
1-hour 14 14 14 25 30 20 10 21
4-hour 16 16 16 27 30 20 12 24
1-day 18 18 18 30 30 20 14 28
Adjust these parameters directly in the script’s input settings to match the selected timeframe. For shorter timeframes (e.g., 5-min or 15-min), the shorter lengths help filter high-frequency noise. For longer timeframes (e.g., 1-day), longer input values may reduce false signals and capture more significant trends.
## Best Practices and Usage Tips
- **Token Limit:**
- Limit the number of tokens scanned to 10 per query line. If you need to scan more tokens, initiate a new query line. This helps manage screen real estate and ensures the table remains legible.
- **Confirming Signals:**
- Use this script as a starting point for identifying high potential trades. Each indicator’s output should be used to confirm your trading decision. Always cross-reference with additional technical analysis tools or market context.
- **Regular Review:**
- Since the script updates the table every few bars (as defined by the update frequency), review the table and alerts regularly. Market conditions change rapidly, so timely decisions are crucial.
## Conclusion
This Pine Script provides a comprehensive approach for scanning multiple cryptocurrencies using a combination of trend strength (ADX), momentum (RSI and MFI), and reversal signals (Wave Trend). By using the provided recommendation table for different timeframes and limiting the tokens to 20 per query line (with a maximum of four query lines), traders can streamline their scanning process and more effectively identify high probability tradable tokens. Ultimately, the outputs should be critically evaluated and combined with additional market research before executing any trades.
WaridTR15 Dakika ve Üzeri Periyotlar İçin Önerilen Ayarlar:
EMA Uzunlukları:
Kısa EMA: 9 yerine 12 veya 14 kullanılabilir.
Uzun EMA: 21 yerine 26 veya 50 kullanılabilir.
Golden Cross için 50 EMA ve 200 EMA zaten uzun vadeli trendleri yakalar, bu nedenle değiştirmeye gerek yok.
RSI Uzunluğu:
RSI uzunluğu 14 yerine 21 veya 28 yapılabilir. Bu, daha uzun vadeli aşırı alım/aşırı satım bölgelerini daha doğru tespit eder.
Volume Filtresi:
Volume ortalaması için 20 periyot yerine 50 veya 100 periyot kullanılabilir. Bu, daha uzun vadeli hacim eğilimlerini yakalar.
Ichimoku Parametreleri:
Ichimoku, varsayılan olarak 9-26-52 periyotlarıyla çalışır. Bu, zaten uzun vadeli trendleri yakalamak için uygundur. Ancak, daha uzun periyotlar için:
Tenkan-Sen: 9 yerine 14.
Kijun-Sen: 26 yerine 52.
Senkou Span B: 52 yerine 104.
Dynamic Volatility Heatmap (ATR)How the Script Works
Dynamic Thresholds:
atrLow and atrHigh are calculated as percentiles (20% and 80% by default) of ATR values over the last double the ATR period (28 days if ATR is 14).
This creates thresholds that adapt to recent market conditions.
Background Heatmap:
Green: ATR is below the low threshold, indicating calm markets (options are cheap).
Red: ATR is above the high threshold, signaling elevated volatility (options are expensive).
Yellow: ATR is within the normal range, showing neutral market conditions.
Overlay Lines:
]Dynamic lines for atrLow and atrHigh help visualize thresholds on the chart.
Interpretation for Trading
Green Zone (Low ATR):
Interpretation: The market is calm, and options are likely underpriced.
Trade Setup: Favor buying options (e.g., long straddles or long calls/puts) to profit from potential volatility increases.
Red Zone (High ATR):
Interpretation: The market is volatile, and options are likely overpriced.
Trade Setup: Favor selling options (e.g., credit spreads or iron condors) to benefit from volatility decay.
Yellow Zone (Neutral ATR):
Interpretation: Volatility is within typical levels, offering no strong signal.
Trade Setup: Combine with other indicators, such as gamma levels or Bollinger Bands, for confirmation.
5. Enhancing with Other Indicators
Combine with Bollinger Bands:
Overlay Bollinger Bands to identify price extremes and align them with volatility heatmap signals.
[3Commas] Signal BuilderSignal Builder is a tool designed to help traders create custom buy and sell signals by combining multiple technical indicators. Its flexibility allows traders to set conditions based on their specific strategy, whether they’re into scalping, swing trading, or long-term investing. Additionally, its integration with 3Commas bots makes it a powerful choice for those looking to automate their trades, though it’s also ideal for traders who prefer receiving alerts and making manual decisions.
🔵 How does Signal Builder work?
Signal Builder allows users to define custom conditions using popular technical indicators, which, when met, generate clear buy or sell signals. These signals can be used to trigger TradingView alerts, ensuring that you never miss a market opportunity. Additionally, all conditions are evaluated using "AND" logic, meaning signals are only activated when all user-defined conditions are met. This increases precision and helps avoid false signals.
🔵 Available indicators and recommended settings:
Signal Builder provides access to a wide range of technical indicators, each customizable to popular settings that maximize effectiveness:
RSI (Relative Strength Index): An oscillator that measures the relative strength of price over a specific period. Traders typically configure it with 14 periods, using levels of 30 (oversold) and 70 (overbought) to identify potential reversals.
MACD (Moving Average Convergence Divergence): A key indicator tracking the crossover between two moving averages. Common settings include 12 and 26 periods for the moving averages, with a 9-period signal line to detect trend changes.
Ultimate Oscillator: Combines three different time frames to offer a comprehensive view of buying and selling pressure. Popular settings are 7, 14, and 28 periods.
Bollinger Bands %B: Provides insight into where the price is relative to its upper and lower bands. Standard settings include a 20-period moving average and a standard deviation of 2.
ADX (Average Directional Index): Measures the strength of a trend. Values above 25 typically indicate a strong trend, while values below suggest weak or sideways movement.
Stochastic Oscillator: A momentum indicator comparing the closing price to its range over a defined period. Popular configurations include 14 periods for %K and 3 for %D smoothing.
Parabolic SAR: Ideal for identifying trend reversals and entry/exit points. Commonly configured with a 0.02 step and a 0.2 maximum.
Money Flow Index (MFI): Similar to RSI but incorporates volume into the calculation. Standard settings use 14 periods, with levels of 20 and 80 as oversold and overbought thresholds.
Commodity Channel Index (CCI): Measures the deviation of price from its average. Traders often use a 20-period setting with levels of +100 and -100 to identify extreme overbought or oversold conditions.
Heikin Ashi Candles: These candles smooth out price fluctuations to show clearer trends. Commonly used in trend-following strategies to filter market noise.
🔵 How to use Signal Builder:
Configure indicators: Select the indicators that best fit your strategy and adjust their settings as needed. You can combine multiple indicators to define precise entry and exit conditions.
Define custom signals: Create buy or sell conditions that trigger when your selected indicators meet the criteria you’ve set. For example, configure a buy signal when RSI crosses above 30 and MACD confirms with a bullish crossover.
TradingView alerts: Set up alerts in TradingView to receive real-time notifications when the conditions you’ve defined are met, allowing you to react quickly to market opportunities without constantly monitoring charts.
Monitor with the panel: Signal Builder includes a visual panel that shows active conditions for each indicator in real time, helping you keep track of signals without manually checking each indicator.
🔵 3Commas integration:
In addition to being a valuable tool for any trader, Signal Builder is optimized to work seamlessly with 3Commas bots through Webhooks. This allows you to automate your trades based on the signals you’ve configured, ensuring that no opportunity is missed when your defined conditions are met. If you prefer automation, Signal Builder can send buy or sell signals to your 3Commas bots, enhancing your trading process and helping you manage multiple trades more efficiently.
🔵 Example of use:
Imagine you trade in volatile markets and want to trigger a sell signal when:
Stochastic Oscillator indicates overbought conditions with the %K value crossing below 80.
Bollinger Bands %B shows the price has surpassed the upper band, suggesting a potential reversal.
ADX is below 20, indicating that the trend is weak and could be about to change.
With Signal Builder , you can configure these conditions to trigger a sell signal only when all are met simultaneously. Then, you can set up a TradingView alert to notify you as soon as the signal is activated, giving you the opportunity to react quickly and adjust your strategy accordingly.
👨🏻💻💭 If this tool helps your trading strategy, don’t forget to give it a boost! Feel free to share in the comments how you're using it or if you have any questions.
_________________________________________________________________
The information and publications within the 3Commas TradingView account are not meant to be and do not constitute financial, investment, trading, or other types of advice or recommendations supplied or endorsed by 3Commas and any of the parties acting on behalf of 3Commas, including its employees, contractors, ambassadors, etc.
Multi-Length RSI **Multi-Length RSI Indicator**
This script creates a custom Relative Strength Index (RSI) indicator with the ability to plot three different RSI lengths on the same chart, allowing traders to analyze momentum across various timeframes simultaneously. The script also includes features to enhance visual clarity and usability.
**Key Features:**
1. **Customizable RSI Lengths:**
- The script allows you to input and customize three different RSI lengths (7, 14, and 28 by default) via user inputs. This flexibility enables you to track short-term, medium-term, and long-term momentum in the market.
2. **Dynamic Colour Coding:**
- The RSI lines are color-coded based on their current value:
- **Above 70 (Overbought)**: The line turns red.
- **Below 30 (Oversold)**: The line turns green.
- **Between 30 and 70**: The line retains its user-defined colour (blue, yellow, orange by default).
- This dynamic colouring helps to quickly identify overbought and oversold conditions.
3. **Adjustable Line Widths and Colours:**
- Users can customize the colour and thickness of each RSI line, allowing for a personalized visual experience that fits different trading strategies.
4. **Overbought, Oversold, and Midline Levels:**
- The script includes static horizontal lines at the 70 (Overbought) and 30 (Oversold) levels, with a red and green colour, respectively.
- A midline at the 50 level is also included in gray and dashed, helping to visualize the neutral zone.
5. **Dynamic RSI Value Labels:**
- The current values of each RSI line are displayed directly on the chart as labels at the most recent bar, with colours matching their corresponding lines. This feature provides an immediate reference to the exact RSI values without the need to hover or look at the data window.
6. **Alerts for Crosses:**
- The script includes built-in alert conditions for when any of the RSI values cross above the overbought level (70) or below the oversold level (30). These alerts can be configured to notify you in real-time when significant momentum shifts occur.
**How to Use:**
1. **Customization**:
- Input your preferred RSI lengths, colours, and line widths through the script’s settings menu.
2. **Visual Analysis**:
- The indicator plots all three RSI values on a separate pane below the price chart. Use the color-coded lines and levels to quickly identify overbought, oversold, and neutral conditions across multiple timeframes.
3. **Set Alerts**:
- You can configure alerts based on the built-in alert conditions to get notified when the RSI crosses critical levels.
**Ideal For:**
- **Traders looking to analyze momentum across multiple timeframes**: The ability to view short-term, medium-term, and long-term RSIs simultaneously offers a comprehensive view of market strength.
- **Those who prefer visual clarity**: The dynamic colouring, clear labels, and customizable settings make it easy to interpret RSI data at a glance.
- **Traders who rely on alerts**: The built-in alert system allows for proactive trading based on significant RSI level crossings.
---
This script is a powerful tool for any trader looking to leverage RSI analysis across multiple timeframes, offering both customization and clarity in a single indicator.
MACD with SAR Indicator [CHE] MACD with SAR Indicator
Introduction
"The whole is greater than the sum of its parts. " The "MACD with SAR Indicator" is an innovative technical analysis tool that combines the strengths of the Moving Average Convergence Divergence (MACD) indicator with the Parabolic Stop and Reverse (SAR) indicator. This indicator provides traders with an enhanced method to detect trend changes and determine optimal entry and exit points in the market by using the SAR based on the MACD line to better identify reversal points. The combination generates clear trend reversal signals, which are visually represented through long (L) and short (S) signals on the chart.
Originality and Usefulness
This indicator differs from traditional MACD or SAR indicators by combining the trend-following calculations of the SAR with the trend strength and momentum calculations of the MACD. This enables a more precise identification of trend changes and provides clear buy and sell signals, which is particularly useful for manual traders.
Key Features and Functionality
1. Combination of MACD and SAR
- Why this Combination?: The MACD is known for its ability to measure the strength and direction of a trend, while the SAR is specifically designed to identify reversal points. By combining these two indicators, traders can better understand both the trend strength and potential turning points in the market.
- How Components Work Together: The MACD measures the difference between fast and slow moving averages, indicating market momentum. The SAR follows the MACD line instead of the price and marks potential reversal points more accurately. When the MACD signals a new trend and the SAR confirms it, the indicator provides reliable trading opportunities.
2. Adjustable Parameters
- MACD Settings: Users can adjust the lengths of the fast and slow moving averages (default: 28 and 38 periods) and the signal smoothing (default: 9 periods) to tailor the indicator to different market conditions.
- SAR Settings: Users can adjust the start value (default: 0.01), increment (default: 0.01), and maximum value (default: 0.18) of the SAR to control sensitivity and responsiveness.
3. Visual Representation and Signals
- Color-Coded Histograms: The histogram shows the difference between the MACD and signal line and is color-coded to highlight the direction of the trend.
- Signal Labels: The indicator automatically adds "L" (Long) and "S" (Short) labels on the chart to show the current positions to traders.
4. Alert Settings
- Custom Alerts: Alerts can be set to notify traders when the MACD and SAR experience significant state changes, such as when the histogram switches from rising to falling or vice versa.
5. Toggle Display
- Display Mode: Users can toggle the display of the MACD_SAR oscillator and MACD to focus on the information most relevant to their trading strategy.
Application and Benefits
- Versatility: This indicator can be used in various market conditions and for different trading strategies, including trend following and reversal trading.
- Ease of Interpretation: The clear visual representation and automatic signals make it easier for traders to identify trading opportunities and track trends.
- Customizability: With numerous settings options, the indicator can be tailored to individual preferences and specific market conditions.
Conclusion
The "MACD with SAR Indicator" is a valuable tool for traders seeking precise and reliable signals to identify market trends and make profitable trading decisions. With its extensive customization options, powerful features, and the ability to toggle displays, this indicator provides excellent support for technical analysis.
By emphasizing the synergy between the MACD and SAR indicators, highlighting the default settings, and clarifying that the SAR is based on the MACD line and generates clear trend reversal signals through long and short labels, this revised description should help users understand the functionalities and advantages of your indicator while meeting TradingView's publication requirements.
Best regards Chervolino
Money Flow Index Crossover IndicatorThe "Money Flow Index Crossover Indicator" is a specialized technical analysis tool designed to assist traders by providing a clear visualization of potential buy and sell signals based on the Money Flow Index (MFI) and its smoothed moving average (SMA). This indicator delineates overbought and oversold zones, offering valuable insights into market dynamics. It operates as an oscillator on a separate pane, helping traders identify bullish and bearish market conditions with greater precision. By incorporating k-Nearest Neighbor (KNN) machine learning techniques, this indicator enhances the reliability and accuracy of the signals provided.
Originality and Usefulness:
This script is not just a simple mashup of existing indicators but integrates multiple components to create a unique and comprehensive analysis tool. The combined information from the MFI, its smoothed moving average, and the KNN machine learning techniques influence the form and accuracy of the Money Flow Index Average line and the Smoothed Money Flow Index line giving a visually helpful representation of overbought and oversold conditions. These lines are displayed in an oscillator style crossover, allowing users to visualize potential buy and sell zones for setting up potential signals. The user can adjust various settings of these tools behind the code to fine-tune the behavior and sensitivity of these lines. This integration provides a more robust and insightful trading tool that can adapt to different market conditions and trading styles.
How It Works:
Inputs:
MFI Settings:
Show Signals: Allows users to toggle the display of MFI and SMA crossing signals, which are critical for identifying potential market reversals.
Plot Amount: Determines the number of plots in the heat map, ranging from 2 to 28, enabling customization based on user preference.
Source: Defines the data source for MFI calculations, typically set to OHLC4 for a balanced view of price movements.
Smooth Initial MFI Length: Specifies the smoothing length for the initial MFI calculations to reduce noise and enhance signal clarity.
MFI SMA Length: Sets the length for the SMA used to smooth the MFI average, providing a more stable reference line.
Machine Learning Settings:
Use KInSource: Option to average MFI data by adding a lookback to the source, improving the accuracy of historical comparisons.
KNN Distance Requirement: Defines the distance calculation method for KNN (Max, Min, Both) to refine the data filtering process.
Machine Learning Length: Specifies the amount of machine learning data stored for smoothing results, balancing between responsiveness and stability.
KNN Length: Sets the number of KNN used to calculate the allowable distance range, enhancing the precision of the machine learning model.
Fast and Slow Lengths: Defines the lengths for fast and slow MFI calculations, allowing the indicator to capture different market dynamics.
Smoothing Length: Determines the length at which MFI calculations start for a more smoothed result, reducing false signals.
Variables and Functions:
KNN Function: Filters machine learning data to calculate valid distances based on defined criteria, ensuring more accurate MFI averages.
MFI Calculations: Computes both fast and slow MFI values, applies smoothing, and stores them for KNN processing to refine signal generation.
MFI KNN Calculation: Uses the KNN function to calculate the machine learning average of MFI values, enhancing signal reliability.
MFI Average and SMA: Calculates the average and smoothed MFI values, which are crucial for determining crossover signals.
Calculations:
MFI Values: Calculates current fast and slow MFI values and applies smoothing to reduce market noise.
Storage Arrays: Stores MFI data in arrays for KNN processing, enabling historical comparison and pattern recognition.
KNN Processing: Computes the machine learning average of MFI values using the KNN function, improving the robustness of signals.
MFI Average: Scales the MFI average to fit the heat map and calculates the smoothed SMA, providing a clear visual representation of trends.
Crossover Signals: Identifies bullish (MFI crossing above SMA) and bearish (MFI crossing below SMA) signals, which are key for making trading decisions.
Plots and Visuals:
MFI Average and SMA Lines: Plots the MFI average and smoothed SMA on the chart, allowing traders to easily visualize market trends and potential reversals.
Zones: Defines and plots overbought, neutral, and oversold zones for easy visualization. The recommended settings for these zones are:
Overbought Zone: Level set to approximately 24.6, indicating a potential market top.
Neutral Zone: Level set to 14, representing a balanced market condition.
Oversold Zone: Level set to 5.4, signaling a potential market bottom.
Crossover Marks: Plots circles on the chart to indicate bullish and bearish crossover signals, making it easier to spot entry and exit points.
Visual Alerts:
Bullish and Bearish Alerts: one can see overbought and oversold conditions and up alert conditions for bullish and bearish MFI crossover signals, enabling traders to have access to visual cues when these events are on trajectory to occur and, if they occur, act promptly with the visual representation of its zones.
Why It's Helpful:
The "Money Flow Index Crossover Indicator" provides traders with a sophisticated tool to identify potential buy and sell conditions based on the combined information of the MFI and its smoothed moving average. The KNN machine learning techniques enhance the accuracy of this indicator's clear visual representation of overbought, neutral, and oversold zones. This combination of data represented on the chart helps traders make informed decisions about market conditions. This indicator is particularly useful for traders looking to refine their entry and exit points by leveraging advanced data analysis in respect to overbought and oversold conditions.
Disclaimer:
This indicator is intended to assist traders in making informed decisions based on technical analysis. However, it is not a guarantee of future performance and should be used in conjunction with other analysis techniques and risk management practices. Past performance is not indicative of future results, and traders should exercise caution and perform their own due diligence before making any trading decisions.
Session MasterSession Master Indicator
Overview
The "Session Master" indicator is a unique tool designed to enhance trading decisions by providing visual cues and relevant information during the critical last 15 minutes of a trading session. It also integrates advanced trend analysis using the Average Directional Index (ADX) and Directional Movement Index (DI) to offer insights into market trends and potential entry/exit points.
Originality and Functionality
This script combines session timing, visual alerts, and trend analysis in a cohesive manner to give traders a comprehensive view of market behavior as the trading day concludes. Here’s a breakdown of its key features:
Last 15 Minutes Highlight : The script identifies the last 15 minutes of the trading session and highlights this period with a semi-transparent blue background, helping traders focus on end-of-day price movements.
Previous Session High and Low : The script dynamically plots the high and low of the previous trading session. These levels are crucial for identifying support and resistance and are highlighted with dashed lines and labeled for easy identification during the last 15 minutes of the current session.
Directional Movement and Trend Analysis : Using a combination of ADX and DI, the script calculates and plots trend strength and direction. A 21-period Exponential Moving Average (EMA) is plotted with color coding (green for bullish and red for bearish) based on the DI difference, offering clear visual cues about the market trend.
Technical Explanation
Last 15 Minutes Highlight:
The script checks the current time and compares it to the session’s last 15 minutes.
If within this period, the background color is changed to a semi-transparent blue to alert the trader.
Previous Session High and Low:
The script retrieves the high and low of the previous daily session.
During the last 15 minutes of the session, these levels are plotted as dashed lines and labeled appropriately.
ADX and DI Calculation:
The script calculates the True Range, Directional Movement (both positive and negative), and smoothes these values over a specified length (28 periods by default).
It then computes the Directional Indicators (DI+ and DI-) and the ADX to gauge trend strength.
The 21-period EMA is plotted with dynamic color changes based on the DI difference to indicate trend direction.
How to Use
Highlight Key Moments: Use the blue background highlight to concentrate on market movements in the critical last 15 minutes of the trading session.
Identify Key Levels: Pay attention to the plotted high and low of the previous session as they often act as significant support and resistance levels.
Assess Trend Strength: Use the ADX and DI values to understand the strength and direction of the market trend, aiding in making informed trading decisions.
EMA for Entry/Exit: Use the color-coded 21-period EMA for potential entry and exit signals based on the trend direction indicated by the DI.
Conclusion
The "Session Master" indicator is a powerful tool designed to help traders make informed decisions during the crucial end-of-session period. By combining session timing, previous session levels, and advanced trend analysis, it provides a comprehensive overview that is both informative and actionable. This script is particularly useful for intraday traders looking to optimize their strategies around session close times.
Slow Volume Strength Index (SVSI)The Slow Volume Strength Index (SVSI), introduced by Vitali Apirine in Stocks & Commodities (Volume 33, Chapter 6, Page 28-31), is a momentum oscillator inspired by the Relative Strength Index (RSI). It gauges buying and selling pressure by analyzing the disparity between average volume on up days and down days, relative to the underlying price trend. Positive volume signifies closes above the exponential moving average (EMA), while negative volume indicates closes below. Flat closes register zero volume. The SVSI then applies a smoothing technique to this data and transforms it into an oscillator with values ranging from 0 to 100.
Traders can leverage the SVSI in several ways:
1. Overbought/Oversold Levels: Standard thresholds of 80 and 20 define overbought and oversold zones, respectively.
2. Centerline Crossovers and Divergences: Signals can be generated by the indicator line crossing a midline or by divergences from price movements.
3. Confirmation for Slow RSI: The SVSI can be used to confirm signals generated by the Slow Relative Strength Index (SRSI), another oscillator developed by Apirine.
🔹 Algorithm
In the original article, the SVSI is calculated using the following formula:
SVSI = 100 - (100 / (1 + SVS))
where:
SVS = Average Positive Volume / Average Negative Volume
* Volume is considered positive when the closing price is higher than the six-day EMA.
* Volume is considered negative when the closing price is lower than the six-day EMA.
* Negative volume values are expressed as absolute values (positive).
* If the closing price equals the six-day EMA, volume is considered zero (no change).
* When calculating the average volume, the indicator utilizes Wilder's smoothing technique, as described in his book "New Concepts In Technical Trading Systems."
Note that this indicator, the formula has been simplified to be
SVSI = 100 * Average Positive Volume / (Average Positive Volume + Average Negative Volume)
This formula achieves the same result as the original article's proposal, but in a more concise way and without the need for special handling of division by zero
🔹 Parameters
The SVSI calculation offers configurable parameters that can be adjusted to suit individual trading styles and goals. While the default lookback periods are 6 for the EMA and 14 for volume smoothing, alternative values can be explored. Additionally, the standard overbought and oversold thresholds of 80 and 20 can be adapted to better align with the specific security being analyzed.
Statistics • Chi Square • P-value • SignificanceThe Statistics • Chi Square • P-value • Significance publication aims to provide a tool for combining different conditions and checking whether the outcome is significant using the Chi-Square Test and P-value.
🔶 USAGE
The basic principle is to compare two or more groups and check the results of a query test, such as asking men and women whether they want to see a romantic or non-romantic movie.
–––––––––––––––––––––––––––––––––––––––––––––
| | ROMANTIC | NON-ROMANTIC | ⬅︎ MOVIE |
–––––––––––––––––––––––––––––––––––––––––––––
| MEN | 2 | 8 | 10 |
–––––––––––––––––––––––––––––––––––––––––––––
| WOMEN | 7 | 3 | 10 |
–––––––––––––––––––––––––––––––––––––––––––––
|⬆︎ SEX | 10 | 10 | 20 |
–––––––––––––––––––––––––––––––––––––––––––––
We calculate the Chi-Square Formula, which is:
Χ² = Σ ( (Observed Value − Expected Value)² / Expected Value )
In this publication, this is:
chiSquare = 0.
for i = 0 to rows -1
for j = 0 to colums -1
observedValue = aBin.get(i).aFloat.get(j)
expectedValue = math.max(1e-12, aBin.get(i).aFloat.get(colums) * aBin.get(rows).aFloat.get(j) / sumT) //Division by 0 protection
chiSquare += math.pow(observedValue - expectedValue, 2) / expectedValue
Together with the 'Degree of Freedom', which is (rows − 1) × (columns − 1) , the P-value can be calculated.
In this case it is P-value: 0.02462
A P-value lower than 0.05 is considered to be significant. Statistically, women tend to choose a romantic movie more, while men prefer a non-romantic one.
Users have the option to choose a P-value, calculated from a standard table or through a math.ucla.edu - Javascript-based function (see references below).
Note that the population (10 men + 10 women = 20) is small, something to consider.
Either way, this principle is applied in the script, where conditions can be chosen like rsi, close, high, ...
🔹 CONDITION
Conditions are added to the left column ('CONDITION')
For example, previous rsi values (rsi ) between 0-100, divided in separate groups
🔹 CLOSE
Then, the movement of the last close is evaluated
UP when close is higher then previous close (close )
DOWN when close is lower then previous close
EQUAL when close is equal then previous close
It is also possible to use only 2 columns by adding EQUAL to UP or DOWN
UP
DOWN/EQUAL
or
UP/EQUAL
DOWN
In other words, when previous rsi value was between 80 and 90, this resulted in:
19 times a current close higher than previous close
14 times a current close lower than previous close
0 times a current close equal than previous close
However, the P-value tells us it is not statistical significant.
NOTE: Always keep in mind that past behaviour gives no certainty about future behaviour.
A vertical line is drawn at the beginning of the chosen population (max 4990)
Here, the results seem significant.
🔹 GROUPS
It is important to ensure that the groups are formed correctly. All possibilities should be present, and conditions should only be part of 1 group.
In the example above, the two top situations are acceptable; close against close can only be higher, lower or equal.
The two examples at the bottom, however, are very poorly constructed.
Several conditions can be placed in more than 1 group, and some conditions are not integrated into a group. Even if the results are significant, they are useless because of the group formation.
A population count is added as an aid to spot errors in group formation.
In this example, there is a discrepancy between the population and total count due to the absence of a condition.
The results when rsi was between 5-25 are not included, resulting in unreliable results.
🔹 PRACTICAL EXAMPLES
In this example, we have specific groups where the condition only applies to that group.
For example, the condition rsi > 55 and rsi <= 65 isn't true in another group.
Also, every possible rsi value (0 - 100) is present in 1 of the groups.
rsi > 15 and rsi <= 25 28 times UP, 19 times DOWN and 2 times EQUAL. P-value: 0.01171
When looking in detail and examining the area 15-25 RSI, we see this:
The population is now not representative (only checking for RSI between 15-25; all other RSI values are not included), so we can ignore the P-value in this case. It is merely to check in detail. In this case, the RSI values 23 and 24 seem promising.
NOTE: We should check what the close price did without any condition.
If, for example, the close price had risen 100 times out of 100, this would make things very relative.
In this case (at least two conditions need to be present), we set 1 condition at 'always true' and another at 'always false' so we'll get only the close values without any condition:
Changing the population or the conditions will change the P-value.
In the following example, the outcome is evaluated when:
close value from 1 bar back is higher than the close value from 2 bars back
close value from 1 bar back is lower/equal than the close value from 2 bars back
Or:
close value from 1 bar back is higher than the close value from 2 bars back
close value from 1 bar back is equal than the close value from 2 bars back
close value from 1 bar back is lower than the close value from 2 bars back
In both examples, all possibilities of close against close are included in the calculations. close can only by higher, equal or lower than close
Both examples have the results without a condition included (5 = 5 and 5 < 5) so one can compare the direction of current close.
🔶 NOTES
• Always keep in mind that:
Past behaviour gives no certainty about future behaviour.
Everything depends on time, cycles, events, fundamentals, technicals, ...
• This test only works for categorical data (data in categories), such as Gender {Men, Women} or color {Red, Yellow, Green, Blue} etc., but not numerical data such as height or weight. One might argue that such tests shouldn't use rsi, close, ... values.
• Consider what you're measuring
For example rsi of the current bar will always lead to a close higher than the previous close, since this is inherent to the rsi calculations.
• Be careful; often, there are na -values at the beginning of the series, which are not included in the calculations!
• Always keep in mind considering what the close price did without any condition
• The numbers must be large enough. Each entry must be five or more. In other words, it is vital to make the 'population' large enough.
• The code can be developed further, for example, by splitting UP, DOWN in close UP 1-2%, close UP 2-3%, close UP 3-4%, ...
• rsi can be supplemented with stochRSI, MFI, sma, ema, ...
🔶 SETTINGS
🔹 Population
• Choose the population size; in other words, how many bars you want to go back to. If fewer bars are available than set, this will be automatically adjusted.
🔹 Inputs
At least two conditions need to be chosen.
• Users can add up to 11 conditions, where each condition can contain two different conditions.
🔹 RSI
• Length
🔹 Levels
• Set the used levels as desired.
🔹 Levels
• P-value: P-value retrieved using a standard table method or a function.
• Used function, derived from Chi-Square Distribution Function; JavaScript
LogGamma(Z) =>
S = 1
+ 76.18009173 / Z
- 86.50532033 / (Z+1)
+ 24.01409822 / (Z+2)
- 1.231739516 / (Z+3)
+ 0.00120858003 / (Z+4)
- 0.00000536382 / (Z+5)
(Z-.5) * math.log(Z+4.5) - (Z+4.5) + math.log(S * 2.50662827465)
Gcf(float X, A) => // Good for X > A +1
A0=0., B0=1., A1=1., B1=X, AOLD=0., N=0
while (math.abs((A1-AOLD)/A1) > .00001)
AOLD := A1
N += 1
A0 := A1+(N-A)*A0
B0 := B1+(N-A)*B0
A1 := X*A0+N*A1
B1 := X*B0+N*B1
A0 := A0/B1
B0 := B0/B1
A1 := A1/B1
B1 := 1
Prob = math.exp(A * math.log(X) - X - LogGamma(A)) * A1
1 - Prob
Gser(X, A) => // Good for X < A +1
T9 = 1. / A
G = T9
I = 1
while (T9 > G* 0.00001)
T9 := T9 * X / (A + I)
G := G + T9
I += 1
G *= math.exp(A * math.log(X) - X - LogGamma(A))
Gammacdf(x, a) =>
GI = 0.
if (x<=0)
GI := 0
else if (x
Chisqcdf = Gammacdf(Z/2, DF/2)
Chisqcdf := math.round(Chisqcdf * 100000) / 100000
pValue = 1 - Chisqcdf
🔶 REFERENCES
mathsisfun.com, Chi-Square Test
Chi-Square Distribution Function
BAERMThe Bitcoin Auto-correlation Exchange Rate Model: A Novel Two Step Approach
THIS IS NOT FINANCIAL ADVICE. THIS ARTICLE IS FOR EDUCATIONAL AND ENTERTAINMENT PURPOSES ONLY.
If you enjoy this software and information, please consider contributing to my lightning address
Prelude
It has been previously established that the Bitcoin daily USD exchange rate series is extremely auto-correlated
In this article, we will utilise this fact to build a model for Bitcoin/USD exchange rate. But not a model for predicting the exchange rate, but rather a model to understand the fundamental reasons for the Bitcoin to have this exchange rate to begin with.
This is a model of sound money, scarcity and subjective value.
Introduction
Bitcoin, a decentralised peer to peer digital value exchange network, has experienced significant exchange rate fluctuations since its inception in 2009. In this article, we explore a two-step model that reasonably accurately captures both the fundamental drivers of Bitcoin’s value and the cyclical patterns of bull and bear markets. This model, whilst it can produce forecasts, is meant more of a way of understanding past exchange rate changes and understanding the fundamental values driving the ever increasing exchange rate. The forecasts from the model are to be considered inconclusive and speculative only.
Data preparation
To develop the BAERM, we used historical Bitcoin data from Coin Metrics, a leading provider of Bitcoin market data. The dataset includes daily USD exchange rates, block counts, and other relevant information. We pre-processed the data by performing the following steps:
Fixing date formats and setting the dataset’s time index
Generating cumulative sums for blocks and halving periods
Calculating daily rewards and total supply
Computing the log-transformed price
Step 1: Building the Base Model
To build the base model, we analysed data from the first two epochs (time periods between Bitcoin mining reward halvings) and regressed the logarithm of Bitcoin’s exchange rate on the mining reward and epoch. This base model captures the fundamental relationship between Bitcoin’s exchange rate, mining reward, and halving epoch.
where Yt represents the exchange rate at day t, Epochk is the kth epoch (for that t), and epsilont is the error term. The coefficients beta0, beta1, and beta2 are estimated using ordinary least squares regression.
Base Model Regression
We use ordinary least squares regression to estimate the coefficients for the betas in figure 2. In order to reduce the possibility of over-fitting and ensure there is sufficient out of sample for testing accuracy, the base model is only trained on the first two epochs. You will notice in the code we calculate the beta2 variable prior and call it “phaseplus”.
The code below shows the regression for the base model coefficients:
\# Run the regression
mask = df\ < 2 # we only want to use Epoch's 0 and 1 to estimate the coefficients for the base model
reg\_X = df.loc\ [mask, \ \].shift(1).iloc\
reg\_y = df.loc\ .iloc\
reg\_X = sm.add\_constant(reg\_X)
ols = sm.OLS(reg\_y, reg\_X).fit()
coefs = ols.params.values
print(coefs)
The result of this regression gives us the coefficients for the betas of the base model:
\
or in more human readable form: 0.029, 0.996869586, -0.00043. NB that for the auto-correlation/momentum beta, we did NOT round the significant figures at all. Since the momentum is so important in this model, we must use all available significant figures.
Fundamental Insights from the Base Model
Momentum effect: The term 0.997 Y suggests that the exchange rate of Bitcoin on a given day (Yi) is heavily influenced by the exchange rate on the previous day. This indicates a momentum effect, where the price of Bitcoin tends to follow its recent trend.
Momentum effect is a phenomenon observed in various financial markets, including stocks and other commodities. It implies that an asset’s price is more likely to continue moving in its current direction, either upwards or downwards, over the short term.
The momentum effect can be driven by several factors:
Behavioural biases: Investors may exhibit herding behaviour or be subject to cognitive biases such as confirmation bias, which could lead them to buy or sell assets based on recent trends, reinforcing the momentum.
Positive feedback loops: As more investors notice a trend and act on it, the trend may gain even more traction, leading to a self-reinforcing positive feedback loop. This can cause prices to continue moving in the same direction, further amplifying the momentum effect.
Technical analysis: Many traders use technical analysis to make investment decisions, which often involves studying historical exchange rate trends and chart patterns to predict future exchange rate movements. When a large number of traders follow similar strategies, their collective actions can create and reinforce exchange rate momentum.
Impact of halving events: In the Bitcoin network, new bitcoins are created as a reward to miners for validating transactions and adding new blocks to the blockchain. This reward is called the block reward, and it is halved approximately every four years, or every 210,000 blocks. This event is known as a halving.
The primary purpose of halving events is to control the supply of new bitcoins entering the market, ultimately leading to a capped supply of 21 million bitcoins. As the block reward decreases, the rate at which new bitcoins are created slows down, and this can have significant implications for the price of Bitcoin.
The term -0.0004*(50/(2^epochk) — (epochk+1)²) accounts for the impact of the halving events on the Bitcoin exchange rate. The model seems to suggest that the exchange rate of Bitcoin is influenced by a function of the number of halving events that have occurred.
Exponential decay and the decreasing impact of the halvings: The first part of this term, 50/(2^epochk), indicates that the impact of each subsequent halving event decays exponentially, implying that the influence of halving events on the Bitcoin exchange rate diminishes over time. This might be due to the decreasing marginal effect of each halving event on the overall Bitcoin supply as the block reward gets smaller and smaller.
This is antithetical to the wrong and popular stock to flow model, which suggests the opposite. Given the accuracy of the BAERM, this is yet another reason to question the S2F model, from a fundamental perspective.
The second part of the term, (epochk+1)², introduces a non-linear relationship between the halving events and the exchange rate. This non-linear aspect could reflect that the impact of halving events is not constant over time and may be influenced by various factors such as market dynamics, speculation, and changing market conditions.
The combination of these two terms is expressed by the graph of the model line (see figure 3), where it can be seen the step from each halving is decaying, and the step up from each halving event is given by a parabolic curve.
NB - The base model has been trained on the first two halving epochs and then seeded (i.e. the first lag point) with the oldest data available.
Constant term: The constant term 0.03 in the equation represents an inherent baseline level of growth in the Bitcoin exchange rate.
In any linear or linear-like model, the constant term, also known as the intercept or bias, represents the value of the dependent variable (in this case, the log-scaled Bitcoin USD exchange rate) when all the independent variables are set to zero.
The constant term indicates that even without considering the effects of the previous day’s exchange rate or halving events, there is a baseline growth in the exchange rate of Bitcoin. This baseline growth could be due to factors such as the network’s overall growth or increasing adoption, or changes in the market structure (more exchanges, changes to the regulatory environment, improved liquidity, more fiat on-ramps etc).
Base Model Regression Diagnostics
Below is a summary of the model generated by the OLS function
OLS Regression Results
\==============================================================================
Dep. Variable: logprice R-squared: 0.999
Model: OLS Adj. R-squared: 0.999
Method: Least Squares F-statistic: 2.041e+06
Date: Fri, 28 Apr 2023 Prob (F-statistic): 0.00
Time: 11:06:58 Log-Likelihood: 3001.6
No. Observations: 2182 AIC: -5997.
Df Residuals: 2179 BIC: -5980.
Df Model: 2
Covariance Type: nonrobust
\==============================================================================
coef std err t P>|t| \
\------------------------------------------------------------------------------
const 0.0292 0.009 3.081 0.002 0.011 0.048
logprice 0.9969 0.001 1012.724 0.000 0.995 0.999
phaseplus -0.0004 0.000 -2.239 0.025 -0.001 -5.3e-05
\==============================================================================
Omnibus: 674.771 Durbin-Watson: 1.901
Prob(Omnibus): 0.000 Jarque-Bera (JB): 24937.353
Skew: -0.765 Prob(JB): 0.00
Kurtosis: 19.491 Cond. No. 255.
\==============================================================================
Below we see some regression diagnostics along with the regression itself.
Diagnostics: We can see that the residuals are looking a little skewed and there is some heteroskedasticity within the residuals. The coefficient of determination, or r2 is very high, but that is to be expected given the momentum term. A better r2 is manually calculated by the sum square of the difference of the model to the untrained data. This can be achieved by the following code:
\# Calculate the out-of-sample R-squared
oos\_mask = df\ >= 2
oos\_actual = df.loc\
oos\_predicted = df.loc\
residuals\_oos = oos\_actual - oos\_predicted
SSR = np.sum(residuals\_oos \*\* 2)
SST = np.sum((oos\_actual - oos\_actual.mean()) \*\* 2)
R2\_oos = 1 - SSR/SST
print("Out-of-sample R-squared:", R2\_oos)
The result is: 0.84, which indicates a very close fit to the out of sample data for the base model, which goes some way to proving our fundamental assumption around subjective value and sound money to be accurate.
Step 2: Adding the Damping Function
Next, we incorporated a damping function to capture the cyclical nature of bull and bear markets. The optimal parameters for the damping function were determined by regressing on the residuals from the base model. The damping function enhances the model’s ability to identify and predict bull and bear cycles in the Bitcoin market. The addition of the damping function to the base model is expressed as the full model equation.
This brings me to the question — why? Why add the damping function to the base model, which is arguably already performing extremely well out of sample and providing valuable insights into the exchange rate movements of Bitcoin.
Fundamental reasoning behind the addition of a damping function:
Subjective Theory of Value: The cyclical component of the damping function, represented by the cosine function, can be thought of as capturing the periodic fluctuations in market sentiment. These fluctuations may arise from various factors, such as changes in investor risk appetite, macroeconomic conditions, or technological advancements. Mathematically, the cyclical component represents the frequency of these fluctuations, while the phase shift (α and β) allows for adjustments in the alignment of these cycles with historical data. This flexibility enables the damping function to account for the heterogeneity in market participants’ preferences and expectations, which is a key aspect of the subjective theory of value.
Time Preference and Market Cycles: The exponential decay component of the damping function, represented by the term e^(-0.0004t), can be linked to the concept of time preference and its impact on market dynamics. In financial markets, the discounting of future cash flows is a common practice, reflecting the time value of money and the inherent uncertainty of future events. The exponential decay in the damping function serves a similar purpose, diminishing the influence of past market cycles as time progresses. This decay term introduces a time-dependent weight to the cyclical component, capturing the dynamic nature of the Bitcoin market and the changing relevance of past events.
Interactions between Cyclical and Exponential Decay Components: The interplay between the cyclical and exponential decay components in the damping function captures the complex dynamics of the Bitcoin market. The damping function effectively models the attenuation of past cycles while also accounting for their periodic nature. This allows the model to adapt to changing market conditions and to provide accurate predictions even in the face of significant volatility or structural shifts.
Now we have the fundamental reasoning for the addition of the function, we can explore the actual implementation and look to other analogies for guidance —
Financial and physical analogies to the damping function:
Mathematical Aspects: The exponential decay component, e^(-0.0004t), attenuates the amplitude of the cyclical component over time. This attenuation factor is crucial in modelling the diminishing influence of past market cycles. The cyclical component, represented by the cosine function, accounts for the periodic nature of market cycles, with α determining the frequency of these cycles and β representing the phase shift. The constant term (+3) ensures that the function remains positive, which is important for practical applications, as the damping function is added to the rest of the model to obtain the final predictions.
Analogies to Existing Damping Functions: The damping function in the BAERM is similar to damped harmonic oscillators found in physics. In a damped harmonic oscillator, an object in motion experiences a restoring force proportional to its displacement from equilibrium and a damping force proportional to its velocity. The equation of motion for a damped harmonic oscillator is:
x’’(t) + 2γx’(t) + ω₀²x(t) = 0
where x(t) is the displacement, ω₀ is the natural frequency, and γ is the damping coefficient. The damping function in the BAERM shares similarities with the solution to this equation, which is typically a product of an exponential decay term and a sinusoidal term. The exponential decay term in the BAERM captures the attenuation of past market cycles, while the cosine term represents the periodic nature of these cycles.
Comparisons with Financial Models: In finance, damped oscillatory models have been applied to model interest rates, stock prices, and exchange rates. The famous Black-Scholes option pricing model, for instance, assumes that stock prices follow a geometric Brownian motion, which can exhibit oscillatory behavior under certain conditions. In fixed income markets, the Cox-Ingersoll-Ross (CIR) model for interest rates also incorporates mean reversion and stochastic volatility, leading to damped oscillatory dynamics.
By drawing on these analogies, we can better understand the technical aspects of the damping function in the BAERM and appreciate its effectiveness in modelling the complex dynamics of the Bitcoin market. The damping function captures both the periodic nature of market cycles and the attenuation of past events’ influence.
Conclusion
In this article, we explored the Bitcoin Auto-correlation Exchange Rate Model (BAERM), a novel 2-step linear regression model for understanding the Bitcoin USD exchange rate. We discussed the model’s components, their interpretations, and the fundamental insights they provide about Bitcoin exchange rate dynamics.
The BAERM’s ability to capture the fundamental properties of Bitcoin is particularly interesting. The framework underlying the model emphasises the importance of individuals’ subjective valuations and preferences in determining prices. The momentum term, which accounts for auto-correlation, is a testament to this idea, as it shows that historical price trends influence market participants’ expectations and valuations. This observation is consistent with the notion that the price of Bitcoin is determined by individuals’ preferences based on past information.
Furthermore, the BAERM incorporates the impact of Bitcoin’s supply dynamics on its price through the halving epoch terms. By acknowledging the significance of supply-side factors, the model reflects the principles of sound money. A limited supply of money, such as that of Bitcoin, maintains its value and purchasing power over time. The halving events, which reduce the block reward, play a crucial role in making Bitcoin increasingly scarce, thus reinforcing its attractiveness as a store of value and a medium of exchange.
The constant term in the model serves as the baseline for the model’s predictions and can be interpreted as an inherent value attributed to Bitcoin. This value emphasizes the significance of the underlying technology, network effects, and Bitcoin’s role as a medium of exchange, store of value, and unit of account. These aspects are all essential for a sound form of money, and the model’s ability to account for them further showcases its strength in capturing the fundamental properties of Bitcoin.
The BAERM offers a potential robust and well-founded methodology for understanding the Bitcoin USD exchange rate, taking into account the key factors that drive it from both supply and demand perspectives.
In conclusion, the Bitcoin Auto-correlation Exchange Rate Model provides a comprehensive fundamentally grounded and hopefully useful framework for understanding the Bitcoin USD exchange rate.
MicroStrategy / Bitcoin Market Cap RatioThis indicator offers a unique analytical perspective by comparing the market capitalization of MicroStrategy (MSTR) with that of Bitcoin (BTC) . Designed for investors and analysts interested in the correlation between MicroStrategy's financial performance and the Bitcoin market, the script calculates and visualizes the ratio of MSTR's market capitalization to Bitcoin's market capitalization.
Key Features:
Start Date: The script considers data starting from July 28, 2020, aligning with MicroStrategy's initial announcement to invest in Bitcoin.
Data Sources: It retrieves real-time data for MSTR's total shares outstanding, MSTR's stock price, and BTC's market capitalization.
Market Cap Calculations: The script calculates MicroStrategy's market cap by multiplying its stock price with the total shares outstanding. It then forms a ratio of MSTR's market cap to BTC's market cap.
Bollinger Bands: To add a layer of analysis, the script includes Bollinger Bands around the ratio, with customizable parameters for length and multiplier. These bands can help identify overbought or oversold conditions in the relationship between MSTR's and BTC's market values.
The indicator plots the MSTR/BTC market cap ratio and the Bollinger Bands, providing a clear visual representation of the relationship between these two market values over time.
This indicator is ideal for users who are tracking the impact of Bitcoin's market movements on MicroStrategy's valuation or vice versa. It provides a novel way to visualize and analyze the interconnectedness of a leading cryptocurrency asset and a major corporate investor in the space.
Elliott's Quadratic Momentum - Strategy [presentTrading]█ Introduction and How It Is Different
The "Elliott's Quadratic Momentum - Strategy" is a unique and innovative approach in the realm of technical trading. This strategy is a fusion of multiple SuperTrend indicators combined with an Elliott Wave-like pattern analysis, offering a comprehensive and dynamic trading tool. It stands apart from conventional strategies by incorporating multiple layers of trend analysis, thereby providing a more robust and nuanced view of market movements.
*Although the script doesn't explicitly analyze Elliott Wave patterns, it employs a wave-like approach by considering multiple SuperTrend indicators. Elliott Wave theory is based on the premise that markets move in predictable wave patterns. While this script doesn't identify specific Elliott Wave structures like impulsive and corrective waves, the sequential checking of trend conditions across multiple SuperTrend indicators mimics a wave-like progression.
BTC 8hr Long/Short Performance
Local Detail
█ Strategy, How It Works: Detailed Explanation
The core of this strategy lies in its multi-tiered approach:
1. Multiple SuperTrend Indicators:
The strategy employs four different SuperTrend indicators, each with unique ATR lengths and multipliers. These indicators offer various perspectives on market trends, ranging from short to long-term views.
By analyzing the convergence of these indicators, the strategy can pinpoint robust entry signals for both long and short positions.
2. Elliott Wave-like Pattern Recognition:
While not directly applying Elliott Wave theory, the strategy takes inspiration from its pattern recognition approach. It looks for alignments in market movements that resemble the characteristic waves of Elliott's theory.
This pattern recognition aids in confirming the signals provided by the SuperTrend indicators, adding an extra layer of validation to the trading signals.
3. Comprehensive Market Analysis:
By combining multiple indicators and pattern analysis, the strategy offers a holistic view of the market. This allows for capturing potential trend reversals and significant market moves early.
█ Trade Direction
The strategy is designed with flexibility in mind, allowing traders to select their preferred trading direction – Long, Short, or Both. This adaptability is key for traders looking to tailor their approach to different market conditions or personal trading styles. The strategy automatically adjusts its logic based on the chosen direction, ensuring that traders are always aligned with their strategic objectives.
█ Usage
To utilize the "Elliott's Quadratic Momentum - Strategy" effectively:
Traders should first determine their trading direction and adjust the SuperTrend settings according to their market analysis and risk appetite.
The strategy is versatile and can be applied across various time frames and asset classes, making it suitable for a wide range of trading scenarios.
It's particularly effective in trending markets, where the alignment of multiple SuperTrend indicators can provide strong trade signals.
█ Default Settings
Trading Direction: Configurable (Long, Short, Both)
SuperTrend Settings:
SuperTrend 1: ATR Length 7, Multiplier 4.0
SuperTrend 2: ATR Length 14, Multiplier 3.618
SuperTrend 3: ATR Length 21, Multiplier 3.5
SuperTrend 4: ATR Length 28, Multiplier 3.382
Additional Settings: Gradient effect for trend visualization, customizable color schemes for upward and downward trends.
7 consecutive closes above/below the 5-periodThis script looks for 7 consecutive closes above/below the 5-period SMA. The indicator is inspired by legendary trader Linda Raschke's work.
First are the two models for which the indicator was created, both inspired by Raschke:
1) Persistency of trend / Extended run setup.
Around 10-12 times per year we get a persistency of trend in instruments in general.
After 7 consecutive closes above/below the 5-period as price pulls back we can look to enter in the direction of the main trend as it moves up/down above/below 5 ma again. You should use price action trading to pinpoint the entries. Now try to hold this as long as possible. Way longer than you can percieve or think is possible. Up to 24-28 periods is what we are looking for in these cases.
2) Normal usage.
When the trend is not persistent, it is possible to use this as an oscillating signal, for a shorter term trade, where we can look for a short or long term reversal setup in price action.
3) I also use it at as a learning to see the swing trades clearer. You can also use it as a visual aid for developing new variances of the classic swing trading setup.
Read and listen to Linda Raschkes work to learn more.
7 Closes above/below 5 SMAThis script looks for 7 consecutive closes above/below the 5-period SMA. The indicator is inspired by legendary trader Linda Raschke's work.
Usage
The script can can be used in three main ways. I think you will find more uses.
First are the two models for which the indicator was created, both inspired by Raschke:
1) Persistency of trend / Extended run setup.
Around 10-12 times per year we get a persistency of trend in instruments in general.
After 7 consecutive closes above/below the 5-period as price pulls back we can look to enter in the direction of the main trend as it moves up/down above/below 5 ma again. You should use price action trading to pinpoint the entries. Now try to hold this as long as possible. Way longer than you can percieve or think is possible. Up to 24-28 periods is what we are looking for in these cases.
2) Normal usage.
When the trend is not persistent, it is possible to use this as an oscillating signal, for a shorter term trade, where we can look for a short or long term reversal setup in price action.
3) I also use it at as a learning to see the swing trades clearer. You can also use it as a visual aid for developing new variances of the classic swing trading setup.
Read and listen to Linda Raschkes work to learn more.
TIme frames
The principles works in all time frames but may change depending on calendar differences. We will see more instances/year in shorter time frames.
Why closes above the 5 SMA
As you may or may not know the 5 SMA is a very important indicator. You can think of it like this, If price is above 5, it is innocent until proven guilty but if price is below 5 we use the french law system which means it is guilty until proven innocent. 7 closes above 5 is a very good predictor of possible short term direction changes.
Use together with:
I prefer to use this indicator together with either regular SMA:s, one short and one macro term. For example 10 ma and 100 ma.
Or you can use it with a a Hull 21-period MA together with a 240-period WMA.
Settings:
I added settings so you can change preferences for changing shape, where to display the shape and in what color
Visual aid
I wanted to keep one dot for each consecutive day, this way we will get a grouping of days and dots. The amount in this group can be of use in itself to inform you of the strength of trend. This can inform you if this oscillation predicts a short term eversal or a continuation. You need skills in reading price action to use this to your advantage.