Custom Performance TableThis script generates a table designed to provide a concise yet highly customizable overview of the performance of multiple financial instruments, displayed directly on the chart. The table can include up to 40 tickers, each individually configurable, with values updated in real time based on either the current chart timeframe or a specific user-selected timeframe.
NOTE : The update frequency of the table values depends on the refresh rate of the chart's main ticker to which the indicator is applied. To ensure a consistent and reliable data feed, especially when monitoring heterogeneous instruments, it is recommended to apply the indicator to a highly liquid and continuously traded asset, such as BTCUSD.
PERFORMANCE CALCULATION MODES
You can choose from three different performance calculation modes:
1) Change % (Percentage Change)
Displays the percentage change of the current price compared to the previous candle within the selected timeframe.
(Current Price - Previous Price) / Previous Price * 100
This mode provides an immediate and straightforward measure of each instrument's percentage movement, useful for quick visual comparisons of relative strength among assets.
2) Z-Score
The Z-Score measures how much the current price variation deviates from the historical average variation, relative to the standard deviation of those variations.
(Current Variation - Average Variation) / Standard Deviation of Variations
The result indicates how statistically unusual a movement is:
- Values near 0 suggest normal variations.
- Values above ±2 indicate statistically significant deviations.
This is a valuable tool for identifying overbought/oversold conditions or market stress events and is often used in mean reversion strategies.
NOTE : Due to technical constraints, Z-Score can only be calculated when the selected timeframe matches the chart's timeframe exactly.
3) RAROC (Risk-Adjusted Return on Capital)
RAROC expresses an asset's performance in relation to the risk taken, measured through its volatility (standard deviation of price).
Percentage Change / Standard Deviation of Price
It allows for an assessment of return efficiency in relation to volatility.
A high RAROC value indicates a high return relative to the risk, making it a useful tool for comparing assets with different risk profiles. It is especially suitable for portfolio selection and allocation purposes.
TABLE CONFIGURATION
Each ticker can be customized with its own label, colors, and position in the table.
Each row can display the ticker name or a custom label, which, at the user's discretion, can either replace the name or be shown as an informational tooltip.
The table can be placed anywhere on the chart using horizontal and vertical offset parameters. Thanks to offset support, you can, for example, create financial market overview layouts. This can be done by completely “cleaning” the chart from price and indicators using TradingView settings, and then displaying multiple tables simultaneously (see the example chart published here).
Advanced customization options are also available for the table's appearance, including font settings, colors, borders, and more.
CALCULATION TIMEFRAME
The indicator allows the user to force a specific timeframe (Daily, Weekly, Monthly, Yearly) when applied to intraday charts.
However, for Z-Score mode, the selected timeframe must match the chart's timeframe exactly to ensure correct computation. Otherwise, the script will halt until settings are properly adjusted.
USAGE NOTES
Custom Performance Table is a flexible and adaptable tool, suitable for both intraday operations and medium- to long-term analysis. It is designed for traders and analysts who need to compare assets based on quantitative metrics, whether simple (like percentage change) or more advanced and risk-adjusted (such as Z-Score and RAROC).
Performance
CAM | Currency Strength PerformanceOverview 📊
The "CAM | Currency Strength Performance" indicator is a powerful forex trading tool that blends traditional composite analysis with dynamic performance tracking! 🚀 It compares the strength of a currency pair’s base and quote currencies against the pair’s price movement, offering traders a clear, colorful view of market dynamics through normalized lines and an upgraded strength-based histogram. 🎨
How It Works 🛠️
🔍 Automatic Currency Detection: Instantly identifies the base (e.g., XAU in XAUUSD) and quote (e.g., USD) currencies—no setup required!
📈 Composite Strength Calculation: Measures each currency’s power by averaging its exchange rate against a basket of 10 major currencies (GBP, EUR, CHF, USD, AUD, CAD, NZD, JPY, NOK, XAU). A classic strength snapshot! 💪
📏 Normalization: Scales composites and pair prices with a smart formula (price minus moving average, divided by standard deviation) for easy comparison. ⚖️
🎨 Dynamic Visualization:
Plots 3 normalized lines with unique colors:
Base Composite
Quote Composite
Actual Pair (⚪ white)
Benefits 🌈
🧠 Simplified Analysis: Normalized composites make static strength clear, while the new histogram reveals dynamic trends.
✅ Enhanced Decisions: Color-coded lines and a performance-driven histogram pinpoint trading opportunities fast—spot when base or quote takes the lead! 🚨
⏱️ Time-Saver: Auto-detection and dual metrics (static + dynamic) streamline your workflow.
🌍 Versatile: Works across all supported pairs, with colors adapting to currencies (e.g., orange AUD, yellow XAU).
👀 Eye-Catching: Vibrant visuals (purple GBP, green USD) and a purple histogram make it engaging and intuitive.
How It Helps Traders 💡
📈 Spot Trends: Normalized lines show steady strength; the histogram tracks recent outperformance—perfect for timing trades.
⚠️ Catch Divergences: See when strength shifts (e.g., base surging, quote lagging) don’t match price—hello, reversal signals! 🔍
🛡️ Manage Risk: Levels (1, -1) and histogram swings help gauge overbought/oversold conditions for smarter stops.
🔮 Big Picture: Combines static strength with dynamic momentum, giving a fuller market view for scalping or long-term strategies.
Conclusion ✨
"CAM | Currency Strength Performance" now fuses classic strength analysis with real-time performance tracking. With its upgraded histogram, traders get a dual lens—static composites plus dynamic strength—turning complex forex data into actionable insights! 📈💰
Mar 11
Release Notes
✨ New Feature: Strength Histogram:
Tracks the performance of base and quote currencies over a customizable lookback period (default: 10 bars). 📅
Calculates strength as the currency’s percentage change minus the basket’s average change, then plots the difference (base - quote) as a purple histogram. 📊
⚙️ Customizable Settings: Adjust Scaling Period (50), Histogram Scale Factor (0.5), Lookback Bars (10), and Levels (1, -1) to fit your trading style! 🎚️
How It Differs from the Previous Version 🔄
Old Histogram:
Showed the static difference between normalized base and quote composites—a snapshot of relative strength at a single point in time. 📷
Focused on current exchange rate levels, scaled by the pair’s normalized price movement.
New Histogram:
Displays the dynamic strength difference (base strength - quote strength) over a user-defined lookback period (e.g., 10 bars). 🌊
Measures past and current performance by calculating percentage changes relative to a basket, highlighting momentum and trends. 📈
Offers a more responsive, time-based view, showing how each currency has performed recently rather than just its absolute strength.
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").
Month of Year Performance█ OVERVIEW
The Month of Year Performance indicator is designed to visualize and compare the cumulative percentage change for each month of the year. By aggregating monthly returns, it helps uncover seasonal trends and potential anomalies in financial markets.
In financial analysis, a calendar based anomaly refers to recurring patterns or tendencies associated with specific time periods, such as days of the week. By calculating the cumulative percentage change for each month (January through December) and displaying the results both graphically and in a summary table, this indicator helps identify whether certain months
consistently outperform others.
█ FEATURES
Customisable time window via Time Settings.
Calculates cumulative percentage change for each month (January to December) separately.
Built-in error check to ensure the indicator is applied on a Monthly timeframe.
Distinct visual representation for each month using unique colours.
Customisable table settings including location and font size.
Displays a performance summary table with metrics such as performance, average return, % positive, and count.
█ HOW TO USE
Add the indicator to a chart set to a Monthly timeframe.
Select your desired Start Time and End Time in the Time Settings.
Toggle the performance table on or off in the Table Settings.
Adjust the table’s location and font size as needed.
View the cumulative monthly performance plotted in distinct colours.
Colour Scheme:
January: Blue
February: Red
March: Green
April: Orange
May: Purple
June: Fuchsia
July: Teal
August: Yellow
September: Navy
October: Lime
November: Maroon
December: Aqua
Day of Week Performance█ OVERVIEW
The Day of Week Performance indicator is designed to visualise and compare the cumulative percentage change for each day of the week. This indicator explores one of the many calendar based anomalies in financial markets.
In financial analysis, a calendar based anomaly refers to recurring patterns or tendencies associated with specific time periods, such as days of the week. By calculating the cumulative percentage change for each day (Monday through Friday) and displaying the results both graphically and in a summary table, this indicator helps identify whether certain days consistently outperform others.
█ FEATURES
Customisable time window via Time Settings.
Calculates cumulative percentage change for each day (Monday to Friday) separately.
Option to use Sunday instead of Friday for CFDs and Futures analysis.
Distinct visual representation for each day using unique colours.
Customisable table settings including position and font size.
Built-in error checks to ensure the indicator is applied on a Daily timeframe.
█ HOW TO USE
Add the indicator to a chart set to a Daily timeframe.
Select your desired Start Time and End Time in the Time Settings.
Toggle the performance table on or off in the Table Settings.
Adjust the table’s location and font size as needed.
Use the "Use Sunday instead of Friday" option if your market requires it.
View the cumulative performance plotted in distinct colours.
Colour Scheme:
Monday: Blue
Tuesday: Red
Wednesday: Green
Thursday: Orange
Friday: Purple
Quarterly Performance█ OVERVIEW
The Quarterly Performance indicator is designed to visualise and compare the performance of different Quarters of the year. This indicator explores one of the many calendar based anomalies that exist in financial markets.
In the context of financial analysis, a calendar based anomaly refers to patterns or tendencies that are linked to specific time periods, such as days of the week, weeks of the month, or months of the year. This indicator helps explore whether such a calendar based anomaly exists between quarters.
By calculating cumulative quarterly performance and counting the number of quarters with positive returns, it provides a clear snapshot of whether one set of quarters tends to outperform the others, potentially highlighting a calendar based anomaly if a significant difference is observed.
█ FEATURES
Customisable time window through input settings.
Tracks cumulative returns for each quarter separately.
Easily adjust table settings like position and font size via input options.
Clear visual distinction between quarterly performance using different colours.
Built-in error checks to ensure the indicator is applied to the correct timeframe.
█ HOW TO USE
Add the indicator to a chart with a 3 Month (Quarterly) timeframe.
Choose your start and end dates in the Time Settings.
Enable or disable the performance table in the Table Settings as needed.
View the cumulative performance, with Q1 in blue, Q2 in red, Q3 in green and Q4 in purple.
Live Portfolio P<his script calculates live P&L (Profit & Loss) for up to 40 instruments — stocks, ETFs, options, futures, and Forex pairs supported by TradingView. Instead of juggling numerous inputs, you paste your portfolio in CSV format into a single text field, and the script handles the rest. It parses each position and displays a comprehensive table showing the symbol, current price, position value, total P&L, and today’s P&L—all updated in real time.
Key Features
CSV Portfolio Input – Effortlessly import all your positions at once without filling in multiple fields. You can export the position from your broker, save it in the required format, and paste it into this script.
Supports Various Asset Classes – Works with any instrument that TradingView provides data for, including futures, options, and Forex.
Up to 40 Instruments – Track a broad and diverse set of holdings in one place.
Real-Time Updates – Get immediate feedback on live price changes, total value, and current P&L.
Today’s P&L – Monitor your daily performance to gauge short-term trends.
CSV is consumed in the following format:
Symbol (supported TradingView instruments)
Entry Price
Quantity (negative for short position)
Lot Size (for futures/options, it might not be one)
For example:
AAPL,237,100,1
TSLA,400,-150,1
ESM2025,6000,5,50
Planned Enhancements
Multi-Currency Support – Automatically convert and display your positions’ values in different currencies.
Advanced Metrics – Get deeper insights with calculations for drawdown, Sharpe ratio, and more.
Risk Management Tools – Set stop-loss and take-profit levels and receive alerts when thresholds are hit.
Option Greeks & Margin Calculations – Manage complex option strategies and track margin requirements.
Questions for You
What additional features would you like to see?
Are there any specific metrics or analytics you’d find especially valuable?
How might this script fit into your current trading workflow?
Feel free to share your thoughts and suggestions. Your feedback will help shape future updates and make this tool even more helpful for traders like you!
Disclaimer
Please remember that past performance may not be indicative of future results.
Due to various factors, including changing market conditions, the strategy may no longer perform as well as in historical backtesting.
This post and the script don’t provide any financial advice.
Even vs Odd Days Performance█ OVERVIEW
The Even vs Odd Days Performance indicator is designed to visualise and compare the performance of even-numbered days versus odd-numbered days. This indicator explores one of the many calendar based anomalies that exist in financial markets.
In the context of financial analysis, a calendar based anomaly refers to patterns or tendencies that are linked to specific time periods, such as days of the week, weeks of the month, or months of the year. This indicator helps explore whether such a calendar based anomaly exists between even and odd days.
By calculating cumulative daily performance and counting the number of days with positive returns, it provides a clear snapshot of whether one set of days tends to outperform the other, potentially highlighting a calendar based anomaly if a significant difference is observed.
█ FEATURES
Customisable time window through input settings.
Tracks cumulative returns for even and odd days separately.
Easily adjust table settings like position and font size via input options.
Clear visual distinction between even and odd day performance using different colours.
Built-in error checks to ensure the indicator is applied to the correct timeframe.
█ HOW TO USE
Add the indicator to a chart with a Daily timeframe.
Choose your start and end dates in the Time Settings.
Enable or disable the performance table in the Table Settings as needed.
View the cumulative performance, with even days in green and odd days in red.
Even vs Odd Weeks Performance█ OVERVIEW
The Even vs Odd Weeks Performance indicator is designed to visualise and compare the performance of even-numbered weeks versus odd-numbered weeks. This indicator explores one of the many calendar based anomalies that exist in financial markets.
In the context of financial analysis, a calendar based anomaly refers to patterns or tendencies that are linked to specific time periods, such as days of the week, weeks of the month, or months of the year. This indicator helps explore whether such a calendar based anomaly exists between even and odd weeks.
By calculating cumulative weekly performance and counting the number of weeks with positive returns, it provides a clear snapshot of whether one set of weeks tends to outperform the other, potentially highlighting a calendar based anomaly if a significant difference is observed.
█ FEATURES
Customisable time window through input settings.
Tracks cumulative returns for even and odd weeks separately.
Easily adjust table settings like position and font size via input options.
Clear visual distinction between even and odd week performance using different colours.
Built-in error checks to ensure the indicator is applied to the correct timeframe.
█ HOW TO USE
Add the indicator to a chart with a Weekly timeframe.
Choose your start and end dates in the Time Settings.
Enable or disable the performance table in the Table Settings as needed.
View the cumulative performance, with even weeks in green and odd weeks in red.
Overnight vs Intra-day Performance█ STRATEGY OVERVIEW
The "Overnight vs Intra-day Performance" indicator quantifies price behaviour differences between trading hours and overnight periods. It calculates cumulative returns, compound growth rates, and visualizes performance components across user-defined time windows. Designed for analytical use, it helps identify whether returns are primarily generated during market hours or overnight sessions.
█ USAGE
Use this indicator on Stocks and ETFs to visualise and compare intra-day vs overnight performance
█ KEY FEATURES
Return Segmentation : Separates total returns into overnight (close-to-open) and intraday (open-to-close) components
Growth Tracking : Shows simple cumulative returns and compound annual growth rates (CAGR)
█ VISUALIZATION SYSTEM
1. Time-Series
Overnight Returns (Red)
Intraday Returns (Blue)
Total Returns (White)
2. Summary Table
Displays CAGR
3. Price Chart Labels
Floating annotations showing absolute returns and CAGR
Color-coded to match plot series
█ PURPOSE
Quantify market behaviour disparities between active trading sessions and overnight positioning
Provide institutional-grade attribution analysis for returns generation
Enable tactical adjustment of trading schedules based on historical performance patterns
Serve as foundational research for session-specific trading strategies
█ IDEAL USERS
1. Portfolio Managers
Analyse overnight risk exposure across holdings
Optimize execution timing based on return distributions
2. Quantitative Researchers
Study market microstructure through time-segmented returns
Develop alpha models leveraging session-specific anomalies
3. Market Microstructure Analysts
Identify liquidity patterns in overnight vs daytime sessions
Research ETF premium/discount mechanics
4. Day Traders
Align trading hours with highest probability return windows
Avoid overnight gaps through informed position sizing
Market Performance by Yearly Seasons [LuxAlgo]The Market Performance by Yearly Seasons tool allows traders to analyze the average returns of the four seasons of the year and the raw returns of each separate season.
🔶 USAGE
By default, the tool displays the average returns for each season over the last 10 years in the form of bars, with the current session highlighted as a bordered bar.
Traders can choose to display the raw returns by year for each season separately and select the maximum number of seasons (years) to display.
🔹 Hemispheres
Traders can select the hemisphere in which they prefer to view the data.
🔹 Season Types
Traders can select the type of seasons between meteorological (by default) and astronomical.
The meteorological seasons are as follows:
Autumn: months from September to November
Winter: months from December to February
Spring: months from March to May
Summer: months from June to August
The astronomical seasons are as follows:
Autumn: from the equinox on September 22
Winter: from the solstice on December 21
Spring: from the equinox on March 20
Summer: from the solstice on June 21
🔹 Displaying the data
Traders can choose between two display modes, average returns by season or raw returns by season and year.
🔶 SETTINGS
Max seasons: Maximum number of seasons
Hemisphere: Select NORTHERN or SOUTHERN hemisphere
Season Type: Select the type of season - ASTRONOMICAL or METEOROLOGICAL
Display: Select display mode, all four seasons, or any one of them
🔹 Style
Bar Size & Autofit: Select the size of the bars and enable/disable the autofit feature
Labels Size: Select the label size
Colors & Gradient: Select the default color for bullish and bearish returns and enable/disable the gradient feature
Annual Performance Table with Average PeformanceAn indicator that displays annual performance in a table format, providing a quick overview of yearly returns with historical context.
It calculates the performance based on the first and last monthly close prices of each year. It displays returns chronologically from left to right, concluding with an average performance column.
Features :
Works exclusively on monthly timeframes
Customizable number of years to display (1-50 years)
Shows year-by-year performance percentages
Color-coded returns (green for positive, red for negative)
Includes average performance across displayed years
Semi-transparent overlay design for better chart visibility
Performance calculation method:
Performance = ((December Close - January Close) / January Close) × 100%
Usage :
Apply to any chart on monthly timeframe
Adjust the "Number of Years to Display" parameter as needed
Table appears as an overlay with years, individual performances, and average
Note: The indicator will display an error message if applied to any timeframe other than monthly.
Relative Performance Indicator by ComLucro - 2025_V01The "Relative Performance Indicator by ComLucro - 2025_V01" is a powerful tool designed to analyze an asset's performance relative to a benchmark index over multiple timeframes. This indicator provides traders with a clear view of how their chosen asset compares to a market index in short, medium, and long-term periods.
Key Features:
Customizable Lookback Periods: Analyze performance across three adjustable periods (default: 20, 50, and 200 bars).
Relative Performance Analysis: Calculate and visualize the difference in percentage performance between the asset and the benchmark index.
Dynamic Summary Label: Displays a detailed breakdown of the asset's and index's performance for the latest bar.
User-Friendly Interface: Includes customizable colors and display options for clear visualization.
How It Works:
The script fetches closing prices of both the asset and a benchmark index.
It calculates percentage changes over the selected lookback periods.
The indicator then computes the relative performance difference between the asset and the index, plotting it on the chart for easy trend analysis.
Who Is This For?:
Traders and investors who want to compare an asset’s performance against a benchmark index.
Those looking to identify trends and deviations between an asset and the broader market.
Disclaimer:
This tool is for educational purposes only and does not constitute financial or trading advice. Always use it alongside proper risk management strategies and backtest thoroughly before applying it to live trading.
Chart Recommendation:
Use this script on clean charts for better clarity. Combine it with other technical indicators like moving averages or trendlines to enhance your analysis. Ensure you adjust the lookback periods to match your trading style and the timeframe of your analysis.
Additional Notes:
For optimal performance, ensure the benchmark index's data is available on your TradingView subscription. The script uses fallback mechanisms to avoid interruptions when index data is unavailable. Always validate the settings and test them to suit your trading strategy.
PSE, Practical Strategy EnginePSE, Practical Strategy Engine
A ready-to-use engine that is simple to connect your indicator to, simple to use, and effective at generating alerts for order-filled events during the real-time candle.
Great for
• Evaluating indicators on important metrics without the need to write a strategy script for backtesting.
• Using indicators with built-in risk management.
About The PSE
This engine accepts entry and exit signals from your indicator to provide trade signals for both long and short positions. The PSE was written for trading Funds (e.g. ETF’s), Stocks, Forex, Futures, and Cryptocurrencies. The trades on the chart indicate market, limit, and stop orders. The PSE allows for backtesting of trades along with metrics of performance based on trade-groups with many great features.
Note: A link to a video of how to connect your indicator(s) to the PSE is provided below.
Key Features
Trade-Grp’s
A Trade-Grp makes up one or more trade positions from the first position entering to the last position exiting. Using Trade-Grp’s instead of positions should help you better assess if the metric results fit your trading style.
Below are two (2) examples of a Trade-Grp with three (3) positions.
Metrics
A table of metrics is available if the “Show Metrics Table” checkbox is enabled on the Inputs tab, but metrics always show in the Data Window.
Examples of the Metrics Table are shown below.
• ROI (Return on Investment) and CAGR (Compound Annual Growth Rate) are based on the Avg Invest/Trade-Grp and are adjusted for dividends if the “Include Dividends in Profit” checkbox is enabled.
• Profit/Risked is based on Trade-Grp’s. Also known as reward/risk, as well as expectancy per amount risked. It determines the effectiveness of your strategy and provides a measure of comparison between your strategies. This is adjusted for dividends if the “Include Dividends in Profit” checkbox is enabled. In the Data Window the color is green when above the breakeven point of making a profit and red when below the breakeven point. In the Table the color is red if below the breakeven point, otherwise it is the default color. For example, using the 3 metrics tables above:
For every USD risked the profit is 1.709 USD.
For every BTC risked the profit is 0.832 BTC.
For every JPY risked the profit is 0.261 JPY.
• Winning % is based on Trade-Grp’s. In the Data Window the color is green when above the breakeven point of making a profit and red when below the breakeven point. In the Table the color is red if below the breakeven point, otherwise it is the default color.
The breakeven point is a relationship between the Profit/Risked and Winning % to indicate system profitability potential. Another way to assess trading system performance. For example, for a low Winning % a high Profit/Risked is needed for the system to be potentially profitable.
• Profit Factor (PF) is based on Trade-Grp’s. The dividend payment, if any, is not considered in the calculation of a win or loss. The “Include Dividends in Profit Factor” checkbox allows you the option to either include or not include dividends in the calculation of Profit Factor. The default is enabled.
Must enable the “Include Dividends in Profit” checkbox to include dividends in PF.
Including dividends in PF evaluates the trading strategy with a more overall profitability performance view.
Enable/Disable “Include Dividends in Profit Factor” checkbox also affects the Avg Trade-Grp Loss, and thus Equity Loss from ECL and % Equity Loss from ECL.
• Max Consecutive Losses are based on Trade-Grp’s.
• Nbr of Trade-Grp’s and Nbr of Positions.
These help you to determine if enough trades have occurred to validate your strategy. The Nbr of Positions is the count of positions on the chart. The TV list of trades in the Strategy Tester may indicate more than what is actually shown on the chart. The Data Window includes 'Nbr Strat Tester Trades', which equals the TV listing trades, to help you locate specific trades on the chart.
• Time in Market (%) is based on Trade-Grp’s and date range selected.
• Avg Invest/Trade-Grp will indicate the average amount of money invested in a Trade-Grp. This is adjusted for dividends if the “Include Dividends in Profit” checkbox is enabled.
• Equivalent Consecutive Losses, labeled as Equiv. Cons. Losses (ECL).
This value is determined by the Winning % and Nbr of Trade-Grp’s. This simulates the more likely case of a series of losses, then a small win, then another series of losses to form an equivalent consecutive losing streak. To lower the value, increase the Winning %.
• Equity Loss from ECL is the equity loss from the equivalent consecutive losses.
• % Equity Loss from ECL is the percent of equity loss from the equivalent consecutive losses.
Risk Management
• Pyramid rules enforce and maintain position sizing designated by you on the Inputs tab (% Equity to Risk, Up/Dwn Gap) & Properties tab (number of pyramids, slippage, and commission).
A pyramid position will not occur unless both its stop covers the last entry price with gap/slippage and commission cost of previous trade is covered. If take profit is enabled, a pyramid position will not occur unless commission cost of the trade is covered when take profit target is reached.
• Position sizing, stop-loss (SL), trailing stop-loss (TSL), and take profit (TP) are used.
• Wash sale prevention for applicable assets is enforced. Wash sale assets include stock and fund (e.g. ETF’s).
• No more than one entry position per candle is enforced .
Other Great Features
• Losing Trade-Grp’s indicated at the exit with label text in the color blue. Used to easily find consecutive losses affecting your strategy’s performance. The dividend payment, if any, is not considered in the calculation of a win or loss.
• Position values can be displayed on the chart. The number format is based on the min tick value, but is limited to 8 decimal places only for display purposes.
• Dividends per share and the amount can be displayed on the chart.
• Hold Days . This is the number of days to hold before allowing the next Trade-Grp. Can be a decimal number. This feature may help those trading on a cash account to avoid any settlement violations when trading the same asset.
• Date Filter. Partition the time when trading is allowed to see if the strategy works well across the date range selected. The metrics should be acceptable across all four (4) time ranges: entire range, 1st half, IQR (inter-quartile range), and 2nd half.
• Price gap amount identification. Used in determining if a pyramid entry may be profitable, and may be used in determining slippage amount to use.
• When TP is enabled, the PSE will only allow a pyramid position if the potential is profitable based on commission and price gap selected.
• Trade-Grp’s shown in background color: green for long positions and red for short positions.
• The PSE will alert you to update your stop-loss as the market changes if your exchange/broker does not allow for trailing stop-loss orders. Enable this option on the Inputs tab with Alert Chg TSL.
• The PSE will alert you if your drawdown exceeds Max % Equity Drawdown set on the Inputs tab.
• The PSE will send an alert to warn you of an expiring GTC order.
Some brokers will indicate the order is GTC, Good 'Till Cancelled, but there really is a time limit on the order and is typically 60-120 days. Therefore, the PSE will alert you if you've been in position for close to 60 days so you can refresh your order. The alert is typically a few days before the 60-day time period.
• For order fill alerts just use a {{placeholder}} in the Message of the alert. Details on how to enter placeholders is explained below.
• Identify same bar enter/exit for first entries and pyramids. This is shown in the Data Window as well. This can help you determine what stop-loss % works best for your trading style.
• Leverage trading information is displayed in the Data Window and applies to Trade-Grps.
Failed PosSize or Margin (%): Shows a zero if the failed-to-trade position size was less than 1 or shows the margin % which failed to meet the margin requirement set in the Properties tab. A flag will show on the bar where a failed-to-trade occurred. This is only applicable to the first position of a Trade-Grp. Position the cursor over the flag for the value to show in the Data Window.
Notional Value: total Trade-Grp position size x latest entry price x point value. The equity must be > notional value x margin requirement for a trade to occur.
Current Margin (%): must be greater than margin requirement set on the Properties tab in order for a trade to occur.
Margin Call Price: when enabled on the Style tab is displayed on both the chart and the Data Window as shown below.
PSE Settings
Pyramids
• Pyramiding requires the Stop Method to be set to either TSL or Both (meaning SL & TSL).
• The maximum number of pyramids is determined by the value entered in the Properties tab.
• Pyramid orders require the enter price to be higher than the previous close for Longs and lower than the previous close for Shorts.
• Pyramids also require the stop with gap/slippage to be higher than the last entry price for Longs, and lower than the last entry price for Shorts. This covers all previous positions and maintains position sizing.
• When take profit, TP, is enabled, the pyramids also require that they will be profitable when opening a position assuming they will reach TP. This is automatically adjusted by you with the Dwn Gap/Up Gap, Slippage, and Commission settings.
Inputs Tab
General Settings
Color Traded Background
Enable to change background color where in a trade. Green for long positions and red for short positions.
Show Losing Trade-Grp
Enable to show if losing Trade-Grp and is indicated by text in blue color. The last position may be at a loss, but if there was profit for the Trade-Grp, then it will not be shown as a loss .
Show Position Values
Enable to show the currency value of each position in gold color.
Include Dividends in Profit
This feature is only applicable if the asset pays dividends and the time frame period of the chart is 1D or less, otherwise ignored. The PSE assumes dividends are taken as cash and not reinvested.
Enable to adjust ROI, CAGR, Profit/Risked, Avg Invest/Trade-Grp, and Equity to include dividend payments. This feature considers if you were in position at least one day prior to the ex-dividend date and had not exited until after the ex-dividend date.
When Show Dividends is enabled it will display the payout in currency/share, as well as the total amount based on the number of shares the position(s) of the Trade-Grp are currently holding.
Include Dividends in Profit Factor
This checkbox allows you the option to either include or not include dividends in the calculation of Profit Factor. Must enable the “Include Dividends in Profit” checkbox to include dividends in PF. The dividend payment, if any, is not considered in the calculation of a win or loss.
Show Metrics Table
Options are font size and table location.
Alert Failed to Trade
Enable for the strategy to alert you when a trade did not happen due to low equity or low order size. Applicable only for the first position of a Trade-Grp.
Trade Direction
Options are 'Longs Only', 'Both', 'Shorts Only'.
Hold Days
This is the number of days to hold before allowing the next Trade-Grp. Applies only to the first trade position of a Trade-Grp. Where a Trade-Grp consists of the first position plus any pyramid positions.
The value entered will be overwritten to >= 31 to prevent wash sale for applicable assets in the event the last Trade-Grp was a loss. Wash sale assets include stock and fund (i.e. ETF’s).
The minimum value is the equivalent of 1 candle and is automatically assigned by the PSE if the entered value is equivalent to less than one candle. To calculate Hold Days in # of candles on the Hour chart divide the chart period by 24 x #candles. On the Minute chart divide the chart period by 60 then by 24 x #candles.
Show Vertical Lines at From Date & To Date
Shows a vertical dotted line at the From Date and To Date for visual inspection of the setting.
Date Filter
When enabled, trades are allowed between the From Date and To Date, i.e., the date range.
When disabled, trades are allowed for all candles.
Partition the time when trading is allowed to see if your indicator settings work well across the date range. Click 1st Half, IQR (inter-quartile range), or 2nd Half buttons to trade a portion of the date range.
Select only one at-a-time to partition the time when trading is allowed.
When 1st Half is enabled only trades for the 1st half of the date range are allowed.
When IQR is enabled only trades for the inter-quartile date range are allowed.
When 2nd Half is enabled only trades for the 2nd half of the date range are allowed.
Position Sizing
The % of Equity to Risk has been separated into two (2) areas: for initial trades and for pyramid trades. This allows for greater ability to maximize profits within your acceptable drawdown. A variation of the Anti-Martingale method from the initial trade if you choose to use it in that manner.
% Equity to Risk for Initial Trades: enter the percent of equity you want to risk per position for the initial trades of each Trade-Grp. For example, for 1% enter 1.
% Equity to Risk for Pyramid Trades: enter the percent of equity you want to risk per position for the pyramid trades of each Trade-Grp. For example, for 2% enter 2.
% Equity for Max Position Size: the position size will not exceed this amount. For example, for 25% enter 25.
Max % Equity Drawdown Warning: an alert will be triggered if the maximum drawdown exceeds this v alue. For example, for 10% enter 10.
Stop Methods
NOTE: The Stop Method must be either Both or TSL in order for the pyramids to work. This feature enforces position sizing.
Stop-loss, SL, and trailing stop-loss, TSL, are other features that enforce risk management.
The trailing stop-loss, TSL, is activated immediately if Stop Method = TSL. If Stop Method = Both, then the TSL is activated when its value is above stop-loss, SL, for Longs and below the SL for Shorts.
The calculated TSL value (shown on the chart by + symbol) of the previous bar is used for the current bar and the plot value is off by default, but you can it turn on via the Style tab. This is available so you can better understand how the TSL value used was calculated from. It is beneficial to show when monitoring the real-time candle.
Alert Chg TSL
When enabled, this feature will alert you to update your stop price if it moves greater than the change amount in %. The amount is the absolute % so will work for both Longs and Shorts. For example, for 1% enter 1 . This is provided since some exchanges/brokers do not offer TSL orders and you must manually adjust as price action plays out.
The alert will also suggest a stop limit price based on the gap selected and explained below.
The alert will occur at the close of the candle at the calculated TSL value of the candle just prior to the real-time candle.
Dwn Gap/Up Gap Input Settings
A price gap is the difference between the closing price of the previous candle and the opening price of the current candle. Dwn Gap and Up Gap are illustrated here.
The values of the Dwn Gap and Up Gap can be seen in the Data Window and are based on the settings of the Date Filter.
The options are “zero gap”, "median gap", "avg gap", "80 pct gap", "90 pct gap". The X pct gap stands for X percentile rank. For example, "80 pct gap" means that 80% of the gaps are less than or equal to the value shown in the Data Window. Select “zero gap” to disable this feature.
If Show Stop Limit is enabled, it will show a dotted-line below or above the current stop price where a stop-limit order should be taken. It is shown based on the gap option selected. Again, the PSE trades market, limit, and stop orders, but a stop-limit may be shown if you wanted to see where one would be set using the Up/Dwn Gap.
Dwn Gap: Affects Short Take Profit, Long Pyramid Entries, and to show the Long Stop Limit.
Up Gap : Affects Long Take Profit, Short Pyramid Entries, and to show the Short Stop Limit.
Fixed Take Profit (TP)
When take profit (TP) is enabled, the PSE will determine if opening a pyramid position will be in profit assuming the TP will be hit while considering commission costs (on Properties tab).
The larger of Up Gap or Slippage value is used with Long positions regarding TP.
The larger of Dwn Gap or Slippage value is used with Short positions regarding TP.
Properties Tab
• Initial Capital: Set as desired.
• Base Currency: Leave as Default. The PSE is designed to use the instrument’s currency, therefore leave as Default.
• Order Size: Leave as default. This setting has been disabled and position sizing is handled on the Inputs tab and is based on % of equity.
• Pyramiding: Set as desired.
• Commission: Set as number %. The PSE is designed to only work with commission as a percent of the position value.
• Verify Price for Limit Orders: Set as desired.
Slippage
Adjust Slippage on the Properties tab to account for a realistic bid-ask spread. You can use one of Dwn/Up Gap values or other guidelines. Again, the Dwn/Up Gap values are based on the Date Filter input settings.
Heed warnings from the TradingView Pine Script™ manual about values entered into the Slippage field.
The Slippage (ticks) have a noticeable influence on entry price and exit price especially at the beginning when the date range includes prices from $0.01 to $100,000.00 like that for BTC-USD INDEX. When this is the case, it is best to use different slippage values when partitioning time with the Date Filter.
To minimize the effects of slippage, yet account for it select ‘median gap’ on the Input Tab and use that value for slippage on the Properties tab.
The slippage value is included in the placeholder {{strategy.order.price}}.
Leverage Trading
The PSE is designed to be used both without leverage (the default) and with leverage.
These two settings apply to Trade-Grps. For example, for 5x leverage enter 20 (1/5x100=20).
Margin for Long Positions: Set as desired. The default is 100%.
Margin for Short Positions: Set as desired. The default is 100%.
This setting on the Inputs tab applies to each trade position within a Trade-Grp.
Max % Equity per Position: Set as desired. The default is 20% and intended for non-leverage trading. For leverage trading set as desired. For example, for 3x leverage enter 300 (3x100=300).
Recalculate After Order Is Filled
The PSE uses the strategy parameter calc_on_order_fills=true to allow for enter/exit on the same bar and generate alerts immediately after an order is filled. This parameter is on the Properties tab and is named ‘Recalculate After order is filled’ and is enabled by default.
Disabling this feature will cause the PSE to not work as intended.
You will see the following Caution! on the TV Strategy Tester
This occurs because the PSE has the strategy parameter calc_on_order_fills = true.
Again, the PSE will only work as intended if this parameter is enabled and set to true.
Therefore, you can close the caution sign and be confident of receiving realistic results.
Recalculate On every tick: Disable.
Fill Orders
• Using bar magnifier: Set as desired.
• On Bar Close: Disable. The PSE will not work as intended if this is enabled.
• Using Standard OHLC: Set as desired.
Using The Alert Message Box From TV Strategy Alert
Set alerts to gain access to all the alerts from PSE. This allows for both order filled alerts, as well as the alert function calls related to refresh GTC orders, drawdown exceeded, update stop-loss order, and Failed to Trade.
Example Message for Manual Trading Alerts
(This is just an example. Consult TV manual for possible placeholders to use.)
{
Alert for {{plot("position_for_alert")}} position. (long = 1; short = -1)
{{exchange}}:{{ticker}} on TF of {{interval}} at Broker Name
{{strategy.order.action}} Equity x Equity_Multiplier USD in shares at price = {{strategy.order.price}},
where Equity_Multiplier = {{strategy.order.contracts}} x {{strategy.order.price}} / {{plot("Equity")}}
or {{strategy.order.action}} {{strategy.order.contracts}} shares at price = {{strategy.order.price}}.
}
Note: Use the Equity x Equity_Multiplier method if you have several accounts with different initial capital.
Example Message for Bot Trading Alerts
(You must consult your specific bot for configuring the alert message. This is just an example.)
{
"action": "{{strategy.order.action}}",
“price”: {{strategy.order.price}}
"amount": {{strategy.order.contracts}},
"botId": "1234"
}
Connecting to the PSE
The diagram below illustrates how to connect indicators to the PSE.
The Aroon and MACD indicators are only used here as an example. Substitute your own indicators and add as many as you like.
Connection Indicator for the PSE
A video of how to connect your indicator(s) to the PSE is below.
The Connection Indicator for the PSE, also called here the connection-indicator.
Below is a description of how to connect your chosen indicators to the connection-indicator. Two (2) indicators were chosen for the example, but you may have one (1) or many indicators.
If you have source code access to your indicators you can paste the code directly into the connection-indicator to eliminate the need to have those indicators on the chart and the additional connection of them to the connection-indicator. Below will assume source code to the indicators are not available.
The MACD and Aroon Oscillator are from TV built standard indicators and are shown here just as an example for inputs (i.e. source) to the connection-indicator. They were configured as follows:
The source code for the connection-indicator is shown below. Substitute your own chosen indicators and add as many as you like to create your connection-indicator that feeds into the PSE. The MACD and Aroon Oscillator were simply chosen as an example. Configure your connection-indicator in the manner shown below.
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// This is just an example Indicator to show how to interface with the PSE.
// The indicators used in the example are standard TV built indicators.
//@version=5
indicator(title="Connection Indicator for the PSE", overlay=false, max_lines_count=500, max_labels_count=500, max_boxes_count=500)
// Ind_1 INDICATOR ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// This is just and example and used MACD histogram as the source.
Filter_Ind_1 = input.bool(false, 'Ind_1', group='Ind_1 INDICATOR ~~~~~~~~~~~~~~~~~', tooltip='Click ON to enable the indicator')
input_Ind_1 = input.source(title = "input_Ind_1", defval = close, group='Ind_1 INDICATOR ~~~~~~~~~~~~~~~~~')
Entry_Ind_1_Long = Filter_Ind_1 ? input_Ind_1 > 0 ? 1 : 0 : 0
Entry_Ind_1_Short = Filter_Ind_1 ? input_Ind_1 < 0 ? 1 : 0 : 0
Exit_Ind_1_Long = Entry_Ind_1_Short
Exit_Ind_1_Short = Entry_Ind_1_Long
// Ind_2 INDICATOR ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// This is just an example and used Aroon Oscillator as the source. Included limits to use with the oscillator to determine enter and exit.
Filter_Ind_2 = input.bool(false, "Ind_2", group='Ind_2 INDICATOR ~~~~~~~~~~~~~~', tooltip='Click ON to enable the indicator')
Filter_Ind_2_Limit = input.int(35, minval=0, step=5, group='Ind_2 INDICATOR ~~~~~~~~~~~~~~')
Filter_Ind_2_UL = Filter_Ind_2_Limit
Filter_Ind_2_LL = -Filter_Ind_2_Limit
up = input.source(title = "input_Ind_2A Up", defval = close, group='Ind_2 INDICATOR ~~~~~~~~~~~~~~')
down = input.source(title = "input_Ind_2B Down", defval = close, group='Ind_2 INDICATOR ~~~~~~~~~~~~~~')
oscillator = up - down
Entry_Ind_2_Long = Filter_Ind_2? oscillator > Filter_Ind_2_UL ? 1 : 0 : 0
Entry_Ind_2_Short = Filter_Ind_2? oscillator < Filter_Ind_2_LL ? 1 : 0 : 0
Exit_Ind_2_Long = Entry_Ind_2_Short
Exit_Ind_2_Short = Entry_Ind_2_Long
//#region ~~~~~~~ASSEMBLY OF FILTERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
// You may have as many indicators as you like. Assemble them in similar fashion as below.
// ——————— Assembly of Entry Filters
Nbr_Entries = input.int(1, minval=1, title='Min Nbr Entries', inline='nbr_in_out', group='Assembly of Indicators')
// Update the assembly based on the number of indicators connected.
EntryLongOK = Entry_Ind_1_Long + Entry_Ind_2_Long >= Nbr_Entries? true: false
EntryShortOK = Entry_Ind_1_Short + Entry_Ind_2_Short >= Nbr_Entries? true: false
entry_signal = EntryLongOK ? 1 : EntryShortOK ? -1 : 0
plot(entry_signal, title="Entry_Signal", color=color.new(color.blue, 0))
// ——————— Assembly of Exit Filters
Nbr_Exits = input.int(1, minval=1, title='Min Nbr of Exits', inline='nbr_in_out', group='Assembly of Indicators', tooltip='Enter the minimum number of entries & exits
required for a signal.')
// Update the assembly based on the number of indicators connected.
ExitLongOK = Exit_Ind_1_Long + Exit_Ind_2_Long >= Nbr_Exits? true: false
ExitShortOK = Exit_Ind_1_Short + Exit_Ind_2_Short >= Nbr_Exits? true: false
exit_signal = ExitLongOK ? 1 : ExitShortOK ? -1 : 0
plot(exit_signal, title="Exit_Signal", color=color.new(color.red, 0))
//#endregion ~~~~~~~END OF ASSEMBLY OF FILTERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
The input box for the connection-indicator is shown below. The default for input source is “close”. For Input_Ind_1 click the dropdown and select the MACD Histogram. For Input_Ind_2 click the dropdown and select Aroon Up and Aroon Down as shown.
Signal Connection Section of PSE
Below is a description of how to connect your chosen indicators to the PSE from the connection-indicator.
At the PSE Input tab, the Signal Connection Section is where you select the source of the Entry and Exit Signal to the PSE. These are the outputs from connection-indicator.
The default source is “close”. Click the dropdown and select the entry and exit signal to establish a connection as shown below.
Portfolio [Afnan]🚀 Portfolio - Advanced Portfolio Management Indicator 📊
A game-changing portfolio management tool designed to help traders stay on top of their positions and manage risk efficiently. This indicator combines detailed tracking, real-time analytics, and visual clarity to ensure traders are well-equipped for the dynamic world of financial markets.
📈 Key Features 💡
Track up to 14 positions with ease
Real-time Profit & Loss (P&L) updates and risk metrics
Visual representation of entry, stop-loss (SL), and target levels
Alerts for stop-loss breaches and target achievements
Comprehensive portfolio summaries for quick analysis
Customizable options to suit individual trading styles
🔍 Main Components ⚙️
📊 1. Position Tracking
Detailed position data: entry, stop-loss, target levels, and more
Real-time risk-reward ratios
Insights into position size and exposure percentages
Continuous updates on P&L in real-time
📉 2. Visual Indicators
Clear visual markers for entry, SL, and target prices
Price labels with detailed percentage changes
Indicators that show the current position's market status
💼 3. Portfolio Summary
Aggregate account values and exposure
Summarized P&L metrics across all positions
Risk management insights for better decision-making
Daily performance tracking to evaluate strategies
⚠️ 4. Alert System
Instant notifications for stop-loss breaches
Alerts when target prices are hit
Alerts operate for the current chart symbol
⚡ Customization Options 🎨
Show or hide specific data columns
Adjust the table's position and size for better visibility
Personalize color schemes and text styles
Switch between full portfolio view and single symbol focus
📱 How to Use 📝
Input your positions in the indicator's settings
Enable or disable specific positions dynamically
Customize display preferences to your liking
Set up alerts for proactive risk management
Monitor all your trading activities in one comprehensive dashboard
📌 Important Notes ℹ️
Compatible with any trading symbol
Updates seamlessly during market hours
Alerts are specific to the currently active chart symbol
Maximum capacity: 14 simultaneous positions
Created by: @AfnanTAjuddin
⚠️ Disclaimer ⚠️
This indicator is a tool for informational purposes only. Ensure all calculations are verified and consult a financial professional before making investment decisions.
🎯 "Stay disciplined, trade smart, and let data guide your decisions." 📊
US/JP Factor/Sector Performance RankingThis indicator is designed to help you easily understand the strengths and weaknesses of different factors and sectors in the U.S. stock market. It looks at various ETFs, ranks their performance over a specific period (20 days by default), and shows the results visually.
= How the Ranking Works
The best-performing rank is shown as -1, with lower ranks as -2, -3, -4, and so on. This setup makes it easy to see rank order in TradingView’s default view.
If you turn on the “Inverse” setting, ranks will be shown as positive numbers in order (e.g., 1, 2, 3…). In this case, it’s recommended to reverse the TradingView scale for better understanding.
= How the Indicator Reacts to Market Conditions
- Normal Market Conditions
Certain factors or sectors often stay at the top rank. For example, during the rallies at the start of 2024 and in May, the Momentum factor performed well, showing a risk-on market environment.
On the other hand, sectors at the bottom rank also tend to stay in specific positions.
- Market Tops
Capital flows within sectors slow down, and top ranks begin to change frequently. This may suggest a market turning point.
- Bear Markets or High Volatility
Rankings become more chaotic in these conditions. These large changes can help you understand market sentiment and the level of volatility.
= Way of using the Indicator
You can use this indicator in the following ways:
- To apply sector rotation strategies.
- To build positions after volatile markets calm down.
- To take long positions on strong elements (higher ranks) and short positions on weaker ones (lower ranks).
= Things to Keep in Mind
It’s a Lagging Indicator
This indicator calculates rankings using the past 20 days of data. It doesn’t provide signals for the future but is a tool for analyzing past performance. To predict the market, you should combine this with other tools or leading indicators.
However, since trends in capital flows often continue, this indicator can help you spot those trends.
= Customization
This indicator is set up for U.S. and Japanese stock markets. However, you can customize it for other markets by changing the ticker and label description in the script.
==Japanese Description==
このインジケーターは、米国株市場におけるファクターやセクターの強弱を直感的に把握するために設計されています。
各ETFを参照し、特定期間(デフォルトでは20日間)のパフォーマンスを順位付けし、それを視覚的に表示します。
= インジケーターの特徴
- ランク付けの仕様
ランク1位は-1で表され、順位が下がるごとに-2、-3、-4…と減少します。この仕様により、TradingViewの標準状態でランクの高低を直感的に把握できるようにしました。
さらに、Inverse設定をONにすると、1位から順に正の値(例: 1, 2, 3…)で表示されるようになります。この場合、TradingViewのスケールを反転させることを推奨します。
= 市況とインジケーターの動き
- 平常時の市況
特定のファクターやセクターがランク1位を維持することが多いです。
例えば、2024年の年初や同年5月の上昇相場では、Momentumファクターが効果を発揮し、リスクオンの市場環境であったことを示しています。
一方、最下位に位置するセクターも特定の順位を維持する傾向があります。
- 天井圏の市況
セクター内の資金流入や流出が停滞し、上位ランクの変動が起こり始めます。これが市場の転換点を示唆する場合があります。
- 下落相場や荒れた市況
ランク順位が大きく乱れることが特徴です。この変動の大きさは、市況の雰囲気やボラティリティの高さを感じ取る材料として活用できます。
= 活用方法
このインジケーターは以下のような投資戦略に役立てることができます:
- セクターローテーションを活用した投資戦略
- 荒れた相場が落ち着いたタイミングでのポジション構築
- 強い要素(ランク上位)のロング、弱い要素(ランク下位)のショート
= 注意点
- 遅行指標であること
本インジケーターは、過去20日間のデータを基にランクを算出します。そのため、先行的なシグナルを提供するものではなく、過去のパフォーマンスに基づいた分析ツールです。市場を先回りするには、別途先行指標や分析を組み合わせる必要があります。
ただし、特定のファクターやセクターへの資金流入・流出が継続する傾向があるため、これを見極める手助けにはなります。
= カスタマイズについて
このインジケーターは米国・日本株市場に特化しています。ただし、他国のファクターやセクターのETFや指数が利用可能であれば、スクリプト内のtickerとlabel descriptionを変更することでカスタマイズが可能です。
MultiSector Performance Tracker [LuxAlgo]The MultiSector Performance Tracker tool shows the overall performance of different crypto market sectors within a selected time frame, overlaid on a single chart for easy comparison.
Users can customize the time frame to suit their specific needs, whether daily, weekly, monthly, or yearly.
🔶 USAGE
The tool displays the performance of up to 6 crypto sectors within a selected time period, such as each day, week, month or year, or from the beginning of the year for any of the last 4 years.
The sectors and tickers within each sector are as follows:
Layer 1: CRYPTOCAP:ETH CRYPTOCAP:SOL CRYPTOCAP:TON
Layer 2: SEED_DONKEYDAN_MARKET_CAP:MATIC TSX:MNT AMEX:ARB
CEX: CRYPTOCAP:BNB CRYPTOCAP:OKB NYSE:BGB
DEX: CRYPTOCAP:UNI LSE:JUP CRYPTOCAP:RUNE
AI: CRYPTOCAP:NEAR GETTEX:TAO CRYPTOCAP:ICP
Ethereum Memes: CRYPTOCAP:PEPE CRYPTOCAP:SHIB CRYPTOCAP:FLOKI
Traders can compare the relative performance of a custom ticker against the sector of their choice and view the average of all sectors.
The tool is fully customizable, allowing traders to enable or disable any of the features or sectors.
🔹 Dashboard
The tool also displays the data in an ascending or descending sector performance dashboard, allowing traders to see at a glance which sectors are overperforming or underperforming.
Other dashboard features include custom ticker vs. sector comparison and sectors average, and traders can choose the location and size of the dashboard.
🔶 SETTINGS
Period: View all data by time period, daily, weekly, etc. Or view data from last year, last 2 years, etc.
Relative Performance Against: Enable/Disable relative performance comparison against a sector.
Use chart ticker: Enable the use of the chart ticker or a custom ticker for relative performance comparison.
🔹 Dashboard
Show Dashboard: Enable / disable Dashboard display.
Order: Choose between ascending and descending order.
Position: Selection of dashboard location.
Size: Selection of dashboard size.
🔹 Style
Show Sectors Labels: Enable / disable sector labels
Layer 1: Enable / disable Layer 1 sector
Layer 2: Enable / disable Layer 2 sector
CEX: Enable / disable CEX sector
DEX: Enable / disable DEX sector
AI: Enable / disable AI sector
Ethereum Memes: Enable / disable Ethereum Memes sector
Average: Enable / disable sectors average display
Custom Ticker: Enable / disable custom ticker display
Crypto Wallets Profitability & Performance [LuxAlgo]The Crypto Wallets Profitability & Performance indicator provides a comprehensive view of the financial status of cryptocurrency wallets by leveraging on-chain data from IntoTheBlock. It measures the percentage of wallets profiting, losing, or breaking even based on current market prices.
Additionally, it offers performance metrics across different timeframes, enabling traders to better assess market conditions.
This information can be crucial for understanding market sentiment and making informed trading decisions.
🔶 USAGE
🔹 Wallets Profitability
This indicator is designed to help traders and analysts evaluate the profitability of cryptocurrency wallets in real-time. It aggregates data gathered from the blockchain on the number of wallets that are in profit, loss, or breaking even and presents it visually on the chart.
Breaking even line demonstrates how realized gains and losses have changed, while the profit and the loss monitor unrealized gains and losses.
The signal line helps traders by providing a smoothed average and highlighting areas relative to profiting and losing levels. This makes it easier to identify and confirm trading momentum, assess strength, and filter out market noise.
🔹 Profitability Meter
The Profitability Meter is an alternative display that visually represents the percentage of wallets that are profiting, losing, or breaking even.
🔹 Performance
The script provides a view of the financial health of cryptocurrency wallets, showing the percentage of wallets in profit, loss, or breaking even. By combining these metrics with performance data across various timeframes, traders can gain valuable insights into overall wallet performance, assess trend strength, and identify potential market reversals.
🔹 Dashboard
The dashboard presents a consolidated view of key statistics. It allows traders to quickly assess the overall financial health of wallets, monitor trend strength, and gauge market conditions.
🔶 DETAILS
🔹 The Chart Occupation Option
The chart occupation option adjusts the occupation percentage of the chart to balance the visibility of the indicator.
🔹 The Height in Performance Options
Crypto markets often experience significant volatility, leading to rapid and substantial gains or losses. Hence, plotting performance graphs on top of the chart alongside other indicators can result in a cluttered display. The height option allows you to adjust the plotting for balanced visibility, ensuring a clearer and more organized chart.
🔶 SETTINGS
The script offers a range of customizable settings to tailor the analysis to your trading needs.
Chart Occupation %: Adjust the occupation percentage of the chart to balance the visibility of the indicator.
🔹 Profiting Wallets
Profiting Percentage: Toggle to display the percentage of wallets in profit.
Smoothing: Adjust the smoothing period for the profiting percentage line.
Signal Line: Choose a signal line type (SMA, EMA, RMA, or None) to overlay on the profiting percentage.
🔹 Losing Wallets
Losing Percentage: Toggle to display the percentage of wallets in loss.
Smoothing: Adjust the smoothing period for the losing percentage line.
Signal Line: Choose a signal line type (SMA, EMA, RMA, or None) to overlay on the losing percentage.
🔹 Breaking Even Wallets
Breaking-Even Percentage: Toggle to display the percentage of wallets breaking even.
Smoothing: Adjust the smoothing period for the breaking-even percentage line.
🔹 Profitability Meter
Profitability Meter: Enable or disable the meter display, set its width, and adjust the offset.
🔹 Performance
Performance Metrics: Choose the timeframe for performance metrics (Day to Date, Week to Date, etc.).
Height: Adjust the height of the chart visuals to balance the visibility of the indicator.
🔹 Dashboard
Block Profitability Stats: Toggle the display of profitability stats.
Performance Stats: Toggle the display of performance stats.
Dashboard Size and Position: Customize the size and position of the performance dashboard on the chart.
🔶 RELATED SCRIPTS
Market-Sentiment-Technicals
Multi-Chart-Widget
Momentum TrackerTo screen for momentum movers, one can filter for stocks that have made a noticeable move over a set period—this initial move defines the momentum or swing move. From this list of candidates, we can create a watchlist by selecting those showing a momentum pause, such as a pullback or consolidation, which later could set up for a continuation.
This Momentum Tracker Indicator serves as a study tool to visualize when stocks historically met these momentum conditions. It marks on the chart where a stock would have appeared on the screener, allowing us to review past momentum patterns and screener requirements.
Indicator Calculation
Bullish Momentum: Price is above the lowest point within the lookback period by the specified threshold percentage.
Bearish Momentum: Price is below the highest point within the lookback period by the specified threshold percentage.
The tool is customizable in terms of lookback period and percentage threshold to accommodate different trading styles and timeframes, allowing us to set criteria that align with specific hold times and momentum requirements.
Performance IndicatorPerformance Indicator
This TradingView indicator calculates and displays the performance of a selected price type over a specified timeframe. It also provides the option to display an additional price type with a customizable line color.
Features:
Timeframe Selection: Choose the timeframe for performance calculation (e.g., 3-Month, 1-Year).
Price Type Selection: Select the price type for performance calculation (Open, High, Low, Close).
Customizable Colors: Set colors for the box, text, and lines.
Box Positioning: Choose the position of the information box on the chart.
Additional Price Type: Display an additional price type with a separate customizable line color.
Inputs:
Timeframe: Select the timeframe for performance calculation.
Price Type: Choose the price type (Open, High, Low, Close) for performance calculation.
Box Color: Set the color of the information box.
Text Color: Set the color of the text inside the box.
Line Color: Set the color of the main performance line.
Line Width: Set the width of the main performance line.
Box Position: Choose the position of the information box (Top Right, Top Left, Bottom Right, Bottom Left).
Additional Price Type: Select an additional price type to display (Open, High, Low, Close).
Additional Line Color: Set the color of the additional price line.
How to Use:
Add the Indicator: Add the indicator to your TradingView chart.
Configure Inputs: Use the input options to configure the timeframe, price types, colors, and box position according to your preferences.
View Performance: The indicator will display the performance of the selected price type over the chosen timeframe in the information box.
Additional Price: The additional price type will also be displayed in the information box with a separate line on the chart.
Example:
If you select a 3-Month timeframe and choose “Close” as the price type, the indicator will calculate the performance of the closing price over the last 3 months. It will also display an additional price type (e.g., “Low”) with a separate line on the chart.
Sector Daily Gain/Loss TableOverview: The "Sector Daily Gain/Loss Table" is a custom TradingView indicator designed to display the daily percentage changes in selected cryptocurrency sectors. This indicator provides a comprehensive view of the performance of various cryptocurrencies organized into specific sectors, helping traders and analysts to make informed decisions based on sector performance.
Key Features:
Dynamic Data Retrieval: The indicator retrieves daily closing prices for multiple cryptocurrencies across different exchanges (Binance and Bybit) using the request.security function. This allows users to monitor real-time price movements.
Sectors Covered:
BTC Sector: Includes Bitcoin (BTC).
ETH Sector: Includes Ethereum (ETH).
RWA Sector: Comprises various assets such as OM, ONDO, POLYX, SNX, PENDLE, and HIFI.
L1/L2 Sector: Features major Layer 1 and Layer 2 solutions including ETH, BNB, SOL, XRP, TON, ADA, AVAX, DOT, SUI, APT, ICP, POL, and more.
MEME Sector: Showcases popular meme coins like DOGE, SHIB, PEPE, WIF, BONK, FLOKI, ORDI, BOME, and NEIRO, along with MEW and POPCAT from Bybit.
AI Sector: Highlights AI-related tokens such as TAO, FET, GRT, THETA, WLD, and TURBO.
DEFI Sector: Displays decentralized finance projects including UNI, AAVE, INJ, RUNE, MKR, JUP, LDO, PENDLE, CAKE, LUNA, RAY, OSMO, KAVA, and RSR.
Average Gain/Loss Calculations: For each sector, the indicator calculates the average percentage change in price based on the included cryptocurrencies, offering insights into sector-wide performance trends.
Table Display: The performance metrics are presented in a clean and organized table format on the TradingView chart, providing easy access to vital information for traders.
User-Friendly Design: The table is designed to be visually appealing and informative, with color coding and clear labeling for each sector and its corresponding percentage change.
Usage: Traders can utilize this indicator to quickly assess the performance of various cryptocurrency sectors and make informed trading decisions based on the daily changes in sector performance.
analytics_tablesLibrary "analytics_tables"
📝 Description
This library provides the implementation of several performance-related statistics and metrics, presented in the form of tables.
The metrics shown in the afforementioned tables where developed during the past years of my in-depth analalysis of various strategies in an atempt to reason about the performance of each strategy.
The visualization and some statistics where inspired by the existing implementations of the "Seasonality" script, and the performance matrix implementations of @QuantNomad and @ZenAndTheArtOfTrading scripts.
While this library is meant to be used by my strategy framework "Template Trailing Strategy (Backtester)" script, I wrapped it in a library hoping this can be usefull for other community strategy scripts that will be released in the future.
🤔 How to Guide
To use the functionality this library provides in your script you have to import it first!
Copy the import statement of the latest release by pressing the copy button below and then paste it into your script. Give a short name to this library so you can refer to it later on. The import statement should look like this:
import jason5480/analytics_tables/1 as ant
There are three types of tables provided by this library in the initial release. The stats table the metrics table and the seasonality table.
Each one shows different kinds of performance statistics.
The table UDT shall be initialized once using the `init()` method.
They can be updated using the `update()` method where the updated data UDT object shall be passed.
The data UDT can also initialized and get updated on demend depending on the use case
A code example for the StatsTable is the following:
var ant.StatsData statsData = ant.StatsData.new()
statsData.update(SideStats.new(), SideStats.new(), 0)
if (barstate.islastconfirmedhistory or (barstate.isrealtime and barstate.isconfirmed))
var statsTable = ant.StatsTable.new().init(ant.getTablePos('TOP', 'RIGHT'))
statsTable.update(statsData)
A code example for the MetricsTable is the following:
var ant.StatsData statsData = ant.StatsData.new()
statsData.update(ant.SideStats.new(), ant.SideStats.new(), 0)
if (barstate.islastconfirmedhistory or (barstate.isrealtime and barstate.isconfirmed))
var metricsTable = ant.MetricsTable.new().init(ant.getTablePos('BOTTOM', 'RIGHT'))
metricsTable.update(statsData, 10)
A code example for the SeasonalityTable is the following:
var ant.SeasonalData seasonalData = ant.SeasonalData.new().init(Seasonality.monthOfYear)
seasonalData.update()
if (barstate.islastconfirmedhistory or (barstate.isrealtime and barstate.isconfirmed))
var seasonalTable = ant.SeasonalTable.new().init(seasonalData, ant.getTablePos('BOTTOM', 'LEFT'))
seasonalTable.update(seasonalData)
🏋️♂️ Please refer to the "EXAMPLE" regions of the script for more advanced and up to date code examples!
Special thanks to @Mrcrbw for the proposal to develop this library and @DCNeu for the constructive feedback 🏆.
getTablePos(ypos, xpos)
Get table position compatible string
Parameters:
ypos (simple string) : The position on y axise
xpos (simple string) : The position on x axise
Returns: The position to be passed to the table
method init(this, pos, height, width, positiveTxtColor, negativeTxtColor, neutralTxtColor, positiveBgColor, negativeBgColor, neutralBgColor)
Initialize the stats table object with the given colors in the given position
Namespace types: StatsTable
Parameters:
this (StatsTable) : The stats table object
pos (simple string) : The table position string
height (simple float) : The height of the table as a percentage of the charts height. By default, 0 auto-adjusts the height based on the text inside the cells
width (simple float) : The width of the table as a percentage of the charts height. By default, 0 auto-adjusts the width based on the text inside the cells
positiveTxtColor (simple color) : The text color when positive
negativeTxtColor (simple color) : The text color when negative
neutralTxtColor (simple color) : The text color when neutral
positiveBgColor (simple color) : The background color with transparency when positive
negativeBgColor (simple color) : The background color with transparency when negative
neutralBgColor (simple color) : The background color with transparency when neutral
method init(this, pos, height, width, neutralBgColor)
Initialize the metrics table object with the given colors in the given position
Namespace types: MetricsTable
Parameters:
this (MetricsTable) : The metrics table object
pos (simple string) : The table position string
height (simple float) : The height of the table as a percentage of the charts height. By default, 0 auto-adjusts the height based on the text inside the cells
width (simple float) : The width of the table as a percentage of the charts width. By default, 0 auto-adjusts the width based on the text inside the cells
neutralBgColor (simple color) : The background color with transparency when neutral
method init(this, seas)
Initialize the seasonal data
Namespace types: SeasonalData
Parameters:
this (SeasonalData) : The seasonal data object
seas (simple Seasonality) : The seasonality of the matrix data
method init(this, data, pos, maxNumOfYears, height, width, extended, neutralTxtColor, neutralBgColor)
Initialize the seasonal table object with the given colors in the given position
Namespace types: SeasonalTable
Parameters:
this (SeasonalTable) : The seasonal table object
data (SeasonalData) : The seasonality data of the table
pos (simple string) : The table position string
maxNumOfYears (simple int) : The maximum number of years that fit into the table
height (simple float) : The height of the table as a percentage of the charts height. By default, 0 auto-adjusts the height based on the text inside the cells
width (simple float) : The width of the table as a percentage of the charts width. By default, 0 auto-adjusts the width based on the text inside the cells
extended (simple bool) : The seasonal table with extended columns for performance
neutralTxtColor (simple color) : The text color when neutral
neutralBgColor (simple color) : The background color with transparency when neutral
method update(this, wins, losses, numOfInconclusiveExits)
Update the strategy info data of the strategy
Namespace types: StatsData
Parameters:
this (StatsData) : The strategy statistics object
wins (SideStats)
losses (SideStats)
numOfInconclusiveExits (int) : The number of inconclusive trades
method update(this, stats, positiveTxtColor, negativeTxtColor, negativeBgColor, neutralBgColor)
Update the stats table object with the given data
Namespace types: StatsTable
Parameters:
this (StatsTable) : The stats table object
stats (StatsData) : The stats data to update the table
positiveTxtColor (simple color) : The text color when positive
negativeTxtColor (simple color) : The text color when negative
negativeBgColor (simple color) : The background color with transparency when negative
neutralBgColor (simple color) : The background color with transparency when neutral
method update(this, stats, buyAndHoldPerc, positiveTxtColor, negativeTxtColor, positiveBgColor, negativeBgColor)
Update the metrics table object with the given data
Namespace types: MetricsTable
Parameters:
this (MetricsTable) : The metrics table object
stats (StatsData) : The stats data to update the table
buyAndHoldPerc (float) : The buy and hold percetage
positiveTxtColor (simple color) : The text color when positive
negativeTxtColor (simple color) : The text color when negative
positiveBgColor (simple color) : The background color with transparency when positive
negativeBgColor (simple color) : The background color with transparency when negative
method update(this)
Update the seasonal data based on the season and eon timeframe
Namespace types: SeasonalData
Parameters:
this (SeasonalData) : The seasonal data object
method update(this, data, positiveTxtColor, negativeTxtColor, neutralTxtColor, positiveBgColor, negativeBgColor, neutralBgColor, timeBgColor)
Update the seasonal table object with the given data
Namespace types: SeasonalTable
Parameters:
this (SeasonalTable) : The seasonal table object
data (SeasonalData) : The seasonal cell data to update the table
positiveTxtColor (simple color) : The text color when positive
negativeTxtColor (simple color) : The text color when negative
neutralTxtColor (simple color) : The text color when neutral
positiveBgColor (simple color) : The background color with transparency when positive
negativeBgColor (simple color) : The background color with transparency when negative
neutralBgColor (simple color) : The background color with transparency when neutral
timeBgColor (simple color) : The background color of the time gradient
SideStats
Object that represents the strategy statistics data of one side win or lose
Fields:
numOf (series int)
sumFreeProfit (series float)
freeProfitStDev (series float)
sumProfit (series float)
profitStDev (series float)
sumGain (series float)
gainStDev (series float)
avgQuantityPerc (series float)
avgCapitalRiskPerc (series float)
avgTPExecutedCount (series float)
avgRiskRewardRatio (series float)
maxStreak (series int)
StatsTable
Object that represents the stats table
Fields:
table (series table) : The actual table
rows (series int) : The number of rows of the table
columns (series int) : The number of columns of the table
StatsData
Object that represents the statistics data of the strategy
Fields:
wins (SideStats)
losses (SideStats)
numOfInconclusiveExits (series int)
avgFreeProfitStr (series string)
freeProfitStDevStr (series string)
lossFreeProfitStDevStr (series string)
avgProfitStr (series string)
profitStDevStr (series string)
lossProfitStDevStr (series string)
avgQuantityStr (series string)
MetricsTable
Object that represents the metrics table
Fields:
table (series table) : The actual table
rows (series int) : The number of rows of the table
columns (series int) : The number of columns of the table
SeasonalData
Object that represents the seasonal table dynamic data
Fields:
seasonality (series Seasonality)
eonToMatrixRow (map)
numOfEons (series int)
mostRecentMatrixRow (series int)
balances (matrix)
returnPercs (matrix)
maxDDs (matrix)
eonReturnPercs (array)
eonCAGRs (array)
eonMaxDDs (array)
SeasonalTable
Object that represents the seasonal table
Fields:
table (series table) : The actual table
headRows (series int) : The number of head rows of the table
headColumns (series int) : The number of head columns of the table
eonRows (series int) : The number of eon rows of the table
seasonColumns (series int) : The number of season columns of the table
statsRows (series int)
statsColumns (series int) : The number of stats columns of the table
rows (series int) : The number of rows of the table
columns (series int) : The number of columns of the table
extended (series bool) : Whether the table has additional performance statistics
Relative Performance AnalysisRelative Performance Analysis Script
This Pine Script creates a detailed table on your TradingView chart to compare the performance of a specified asset against a benchmark over multiple time frames. The table is fully customizable, allowing you to select its location on the chart and display performance metrics for different periods.
Features:
Customizable Table Location: Choose where the table appears on your chart from a range of predefined positions (e.g., bottom left, top center).
Dynamic Column Headers: The table includes columns for the ticker, description, and performance metrics for various time periods (1 day, 1 week, 1 month, 3 months, 6 months, and 1 year).
Performance Calculation: Calculates the percentage change in performance between the current close price and the previous close price for each time frame.
Color-Coded Performance: Uses a color scheme to highlight performance levels, with specific colors for positive and negative changes to easily visualize performance trends.
Benchmark and Asset Comparison: Displays performance metrics for both a benchmark (e.g., SPY) and the asset currently viewed on the chart, providing a clear comparison.
Inputs:
Benchmark Symbol: Specify the symbol of the benchmark asset (e.g., SPY).
Benchmark Description: Provide a description for the benchmark asset.
Chart Symbol: Automatically uses the symbol of the chart for comparison.
Usage:
Add the script to your TradingView chart.
Configure the benchmark symbol and description as needed.
The table will automatically populate with performance data and be positioned according to your selection.
Disclaimer:
This script is for informational and educational purposes only and is not intended as financial advice. The performance data displayed in the table is based on historical prices and is not indicative of future performance. Trading involves risk, and you should always do your own research and consult with a qualified financial advisor before making any investment decisions. The creator of this script assumes no responsibility for any losses or damages incurred as a result of using this tool.