INVITE-ONLY SCRIPT

Swing Strategy Feature Set R [theEccentricTrader]

103
█  OVERVIEW


This swing strategy is part of a broader research and exploration framework designed to encourage users to experiment with a variety of technical concepts and evaluate the comparative effectiveness of different strategy configurations. For example, users can first configure a core strategy as a benchmark, then iteratively test a range of feature configurations as additional entry conditions and compare their performance against one another and against the core strategy.

Feature Set R includes concepts beginning with the letter "R" and forms part of a larger swing strategy suite that covers a wide range of technical concepts. The objective of the suite is not curve-fitting, but rather structured experimentation, exploration and statistical validation (or invalidation) of technical concepts.

Concepts exclusive to the feature set are as follows:
  • Random Walk Index
  • Range Ratio
  • Rank Correlation Index
  • Rate of Change
  • Relative Strength Index

█  OPERATIONAL


Initial Capital

The initial capital is defined as a monetary value denominated in a given base currency.

The default initial capital is set to 100,000.

The default base currency is set to the selected symbol's default base currency.

Users can adjust the initial capital and select an alternative base currency via strategy Settings/Properties.

Risk as Percentage of Equity

The equity is defined as the sum of initial capital, net profit and open profit.

The risk is defined as a percentage of equity per-trade. As a result, net profit outcomes are subject to compounding effects over time.

The default risk is set to 1% of equity.

Users can adjust the strategy's per-trade risk via strategy Settings/Inputs/STRATEGY.

For further information on how the risk is applied in practice, refer to the position sizing section below.

Unit of Value

The unit of value is defined as a decimal precision factor that converts user-defined point or pip distances into actual price units used by the selected symbol.

Different symbols express price movement using different conventions. For example, some symbols are quoted directly in whole price points, while others use pips or fractional point increments. The unit of value provides a normalisation layer that allows all distance-based logic in the strategy to operate consistently across symbols.

Examples:
  • A unit of value of 1 corresponds to a price increment of 1.0.
  • A unit of value of 10 corresponds to a price increment of 0.1.
  • A unit of value of 100 corresponds to a price increment of 0.01.
  • A unit of value of 1000 corresponds to a price increment of 0.001.
  • A unit of value of 10000 corresponds to a price increment of 0.0001.

Users should consult their broker’s published symbol specifications to confirm how price movement is defined for the symbols they intend to backtest. Incorrect configuration of the unit of value may result in misaligned stop distances, targets and/or risk calculations.

The default unit of value is set to 1.

Users can adjust the unit of value via strategy Settings/Inputs/STRATEGY.

Stop Buffer

The stop buffer is defined as the number of points or pips beyond a stop loss level required for the level to be considered clearly breached.

The default stop buffer is set to 0 points/pips.

Users can adjust the stop buffer via strategy Settings/Inputs/STRATEGY.

Risk Range

The risk range is defined as the difference between the entry price and the stop loss price (inclusive of the stop buffer) for any given trade.

Position Sizing

Position sizing determines the quantity of contracts, shares or units opened for each trade based on the user-defined risk and the selected symbol’s pricing structure.

"syminfo.pointvalue" is a built-in Pine Script variable that defines the number of underlying units contained within a single contract for any given symbol, and is critical for accurate position size calculations.

The position size is calculated as follows:
  • The risk range is multiplied by the syminfo.pointvalue to convert the price movement into its monetary equivalent.
  • The user-defined risk amount (expressed as a percentage of equity) is divided by this monetary risk per unit to determine the position size.

This ensures that each trade risks a consistent proportion of account equity regardless of point or pip based quoting conventions, symbol price scale or contract specifications.

While the strategy targets a fixed percentage of equity risk per-trade, the exact risk applied cannot always be matched precisely due to symbol-specific constraints such as contract sizing and margin requirements. In these cases, the strategy opens the largest permissible position that does not violate operational constraints, resulting in a realised risk that is as close as possible to the user-defined risk without exceeding it.

For further information on the syminfo.pointvalue variable, please refer to:

Margin

The margin is defined as the minimum percentage of a position’s notional value that must be covered by the strategy’s available equity in order for TradingView's strategy tester to simulate opening and maintaining that position. For example, a margin setting of 25% means the simulated account must hold equity equal to at least 25% of the position’s notional value in order to enter or maintain that trade, the remaining 75% is considered provided by the simulated broker.

A lower margin percentage allows the account to open larger positions relative to its equity, because the required equity portion is smaller. Conversely, a higher margin percentage demands more of the account's equity be committed to any given position.

When the account’s equity falls below the required margin, the strategy tester emulates a margin call event, in which the broker emulator forcibly closes or reduces positions so that remaining positions no longer exceed available equity relative to the margin requirement. This behaviour is documented as part of TradingView’s margin/leverage feature for strategies.

Margin settings in a strategy are used solely for simulation purposes and do not automatically match any broker’s real-world margin requirements (which can vary by broker, asset class and symbol). Users should consult their broker’s published specifications for further details.

The default margin is set to 25% for both long and short positions.

Users can adjust the margin for long and short positions independently via strategy Settings/Properties/MARGIN.

For further information on the strategy tester's margin functionality, please refer to:

Pyramiding

The pyramiding count is defined as the maximum number of open positions permitted at any one time. TradingView's strategy tester does not facilitate hedging, as such, long entries will close any open short positions and short entries will close any open long positions.

The default pyramiding count is set to 100.

Users can adjust the pyramiding count via strategy Settings/Properties.


For further information on TradingView's strategy tester and broker emulator, please refer to:

Spread

The spread is defined as the difference between a given symbol's bid (buy) price and ask (sell) price.

Typical spreads vary by broker and symbol. Some brokers offer fixed spreads on certain symbols, while others offer variable spreads that fluctuate with market conditions. Users should consult their broker's published specifications for further details.

Commission

The commission is defined as a transaction cost applied by a broker and may be expressed as a percentage of position size, a per-contract fee or a fixed fee per-transaction.

Commission structures vary by broker and symbol. Some brokers charge no explicit commission and instead generate revenue through the spread or other indirect sources, while others will typically apply one of the three aforementioned commission types, depending on the product offered. Users should consult their broker's published specifications for further details.

The default commission is set to 0.005% of position size.

Users can select and adjust the commission type via strategy Settings/Properties/COST SIMULATION.


█  CORE STRATEGY


Green and Red Candles

A green candle is defined as a candle that closes at or above its open price and a red candle is defined as a candle that closes below its open price.

Swing Highs and Swing Lows

A swing high is defined as a green candle, or a series of consecutive green candles, followed by a single red candle that completes the swing and forms the peak.

A swing low is defined as a red candle, or a series of consecutive red candles, followed by a single green candle that completes the swing and forms the trough.

Peak and Trough Prices

The peak price of a complete swing high is either the high of the red candle that completes the swing high or the high of the preceding green candle, depending on which is higher.

The trough price of a complete swing low is either the low of the green candle that completes the swing low or the low of the preceding red candle, depending on which is lower.

Fixed Reward-to-Risk

Fixed reward-to-risk is defined as a user-defined reward multiple for a given unit of risk.

Variable Reward-to-Risk

Variable reward-to-risk is defined as a path-dependent reward multiple for a given unit of risk.

Swing High Swing Low (SHSL) Strategy

The SHSL strategy uses swing lows for core long entry conditions and swing highs for core short entry conditions. The strategy is designed for standard OHLC candlestick charts only and will not behave as intended on other chart types.

All entries are processed at candle close and use the candle close price for the entry price.

Long stop losses are anchored to the most recent trough and short stop losses are anchored to the most recent peak.

Users can choose between long-only and short-only configurations, or alternatively simulate trades in both directions (long-short). However, when the "Both" option is selected, long entries will close any open short positions and short entries will close any open long positions (as mentioned in the pyramiding sub-section above). This can and will result in variable reward-to-risk outcomes.

The default direction is set to "Long" for a long-only configuration.

The default exit type is set to "Target" for a fixed reward-to-risk configuration.

Long targets are determined by adding a user-defined multiple of the risk range to the entry price and short targets are determined by subtracting a user-defined multiple of the risk range from the entry price.

Even when using a fixed reward-to-risk configuration, realised reward-to-risk outcomes may vary due to market gaps, particularly when positions are held across session boundaries or market closures. Gaps can cause stop losses or exits to be executed at prices materially different from those implied by the strategy’s static distance calculations. Users who wish to minimise gap-related variability may consider applying the close at end of session filter (see core filters section below), accepting that this introduces its own form of reward-to-risk variability.

The default reward-to-risk is set to 1.

Users can adjust strategy parameters via strategy Settings/Inputs/STRATEGY. Selecting a non-target exit type removes profit targets and renders the reward-to-risk input inactive.

Trailing Stop Loss

A trailing stop loss is defined as an exit type that dynamically moves a stop loss level in a favourable direction when a predefined condition is met. For example, a predefined point move or the formation of a higher trough or lower peak.

Risk Range Trailing Stop Loss

The risk range trailing stop loss is defined as a trailing stop mechanism that activates once price has moved favourably by one full risk range. Upon activation, the stop loss is moved to breakeven and subsequently trails favourable price movement by the risk range into profit.

Users can apply this exit type by selecting "Trail" via strategy Settings/Inputs/STRATEGY.

Trend Trailing Stop Loss

The trend trailing stop loss is defined as a trailing stop mechanism that dynamically moves a stop loss level to newly formed higher troughs (for longs) or lower peaks (for shorts).

Users can apply this exit type by selecting "Trend Trail" via strategy Settings/Inputs/STRATEGY.

Candle Trailing Stop Loss

The candle trailing stop loss is defined as a trailing stop mechanism that dynamically moves a stop loss level to newly formed higher candle lows (for longs) or lower candle highs (for shorts).

Users can apply this exit type by selecting "Candle Trail" via strategy Settings/Inputs/STRATEGY.

Opposing Candle Colour Close

The opposing candle colour close exit type is defined as an exit condition that closes any long positions when a new red candle forms and closes any short positions when a new green candle forms.

Users can apply this exit type by selecting "Opposing Candle" via strategy Settings/Inputs/STRATEGY.


█  CORE FILTERS


Minimum Risk Range Filter

The minimum risk range filter is defined as an entry filter that invalidates trade signals with a risk range below a user-defined threshold.

The default minimum risk range is set to 4 points/pips.

Users can adjust the minimum risk range via strategy Settings/Inputs/RISK RANGE FILTER.

It is recommended that users set the minimum risk range at least 1–2 points/pips above the selected symbol’s spread to invalidate trades that would be completely impractical under realistic trading conditions.

Time Zone

The time zone is defined using either an IANA region identifier (e.g. Europe/London, America/New_York) or a fixed UTC/GMT offset (e.g. UTC+1, GMT-05:30). Fixed offsets do not account for daylight saving time.

The default time zone is set to Europe/London.

Users can change the time zone via strategy Settings/Inputs/TIME ZONE.

For further information on time zone configuration, please refer to:

Session Filter

The session filter is defined as an entry filter that invalidates trade signals that fall outside a user-defined intraday trading session, with session start and end times bound to the strategy time zone.

TradingView candle timestamps represent the candle open time, not the candle close time. As a result, session boundaries are evaluated based on when a candle opens, even though entries and exits are processed at candle close.

To avoid trades being entered or held beyond the intended session end, users should configure the session end time at least one full timeframe period earlier than the desired practical session close. For example, on a 5-minute chart with a desired session end at 22:00, the session should typically be configured to end at 21:55. This ensures that no new trades are taken at the final session close and that any session-dependent exit logic is applied before the session ends in practice.

When using custom or non-standard timeframes where the desired session end does not align cleanly with candle boundaries, it is recommended that users set the session end two full timeframe periods earlier than the desired session end. This provides an additional safety buffer, ensuring the strategy avoids taking trades near the session boundary.

By default, the session filter is set to false and the default session is set to "2300-2155".

Users can apply the session filter and adjust session boundaries via strategy Settings/Inputs/SESSION FILTER.

Close At End of Session Filter

The close at end of session filter is defined as an exit filter that closes all open positions when the active trading session ends, provided that the session filter is appropriately configured and applied.

When enabled, the strategy monitors the session filter state and detects the transition from an active session to an inactive session. All open trades are closed on the first candle that falls outside the defined session window. This ensures that no positions are carried beyond the user-defined trading session.

The close at end of session filter operates independently of entry conditions and other exit types. When enabled, it will force the closure of all open positions at session end regardless of the selected exit configuration.

Enabling the close at end of session filter can result in variable reward-to-risk outcomes. Because positions are forcibly closed at session end regardless of stop loss or target placement, exits may occur at prices that differ from those implied by the fixed reward-to-risk configuration. This behaviour is intentional and reflects a design trade-off between enforcing strict session boundaries and allowing trades to reach their predefined directional objectives, regardless of how severely distorted the realised reward-to-risk outcomes could be in the event of price gaps.

By default, the close at end of session filter is set to false.

Users can apply the close at end of session filter via strategy Settings/Inputs/CLOSE AT END OF SESSION FILTER.

Users should also ensure that the session filter is applied and that session boundaries are configured appropriately with respect to candle timestamp behaviour, as described in the session filter section above.

Sample Period Filter

The sample period filter is defined as an entry filter that invalidates trade signals that fall outside a user-defined date-time range, with start and end date-times bound to the strategy time zone.

TradingView candle timestamps represent the candle open time, not the candle close time. As a result, sample period boundaries are evaluated based on when a candle opens, even though entries and exits are processed at candle close.

To avoid trades being entered beyond the intended sample period end, users should configure the sample period end date-time at least one full timeframe period earlier than the desired practical sample period end date-time. For example, on a 5-minute chart with a desired end date-time of 01/01/2026 22:00, the end date-time should typically be configured to 01/01/2026 21:55.

The default sample period start and end date-times are set to 01/01/1900 00:00 and 01/01/3000 00:00, respectively.

Users can adjust the sample period via strategy Settings/Inputs/SAMPLE PERIOD FILTER.


█  GENERIC FILTERS


Generic Filter Behaviour

Unless otherwise stated:
  • "None" inputs return true.
  • Filters return true only when their selected condition is satisfied.

Minimum and Maximum Boundary Filters

Minimum and maximum boundary filters are defined as entry filters used to constrain time-series values to predefined minimum and/or maximum thresholds, invalidating trade signals that do not satisfy a user-defined threshold criteria. The filters consist of two independent threshold components, minimum (above-equal) and maximum (below-equal), which may be applied individually or together.

When both components are applied simultaneously the filters act as a value range constraint, invalidating trade signals that fall outside of the specified bounds.

"Above-Equal" returns true when the evaluated value is greater than or equal to the user-defined minimum boundary.

"Below-Equal" returns true when the evaluated value is less than or equal to the user-defined maximum boundary.

Minimum Percentage Change Positive-Flat/Negative Filter

The minimum percentage change filter is an entry filter that measures the relative change of a time-series value over a configurable historical window and applies a directional threshold condition, invalidating trade signals that do not meet the directional threshold criteria.

The filter compares the current value to its value n bars ago and computes the percentage difference. A signal returns true only if this percentage change satisfies both:
  • The selected directional requirement.
  • The user-defined minimum percentage change magnitude.

"Positive-Flat" direction logic:
  • Accepts values that have increased or remained unchanged, provided the percentage change is greater than or equal to the minimum threshold.

"Negative" direction logic:
  • Accepts values that have decreased, provided the magnitude of the decrease meets or exceeds the minimum threshold.

When the minimum threshold is set to 0%, the filter behaves as a pure directional check:
  • "Positive-Flat" accepts ≥ 0% changes.
  • "Negative" accepts < 0% changes only.

Basic and Multi-Part Trend Filters

Basic and multi-part trend filters are defined as entry filters that evaluate changes in time-series values from one period to the next and invalidate trade signals that do not satisfy a user-defined trend condition.

Basic trends operate independently of prior trend state, whereas multi-part trends are defined by the presence or absence of preceding trend sequences. The multi-part trend states are distinguished numerically and the conditions are bound to a user-defined trend count.

"Basic Uptrend" returns true when a time-series value is greater than the preceding value. For example, a basic volume uptrend filter returns true if the most recent candle's volume is greater than the preceding candle's volume.

"Basic Downtrend" returns true when a time-series value is less than the preceding value. For example, a basic volume downtrend filter returns true if the most recent candle's volume is less than the preceding candle's volume.

"Uptrend" returns true while a multi-part uptrend state is valid. The uptrend state begins when a new basic uptrend forms following a basic downtrend and remains valid until a new basic downtrend forms. The user-defined trend count will determine which multi-part trend condition is selected. For example, if the user-defined trend count is set to 3, then only 3-part uptrend conditions will return true.

"Downtrend" returns true while a multi-part downtrend state is valid. The downtrend state begins when a new basic downtrend forms following a basic uptrend and remains valid until a new basic uptrend forms. The user-defined trend count will determine which multi-part trend condition is selected. For example, if the user-defined trend count is set to 3, then only 3-part downtrend conditions will return true.


█  FEATURE SET R SPECIFIC FILTERS


All feature set specific indicators use the same calculations as the built-in TradingView indicators unless otherwise stated in the relevant filter sub-section. While users do not need to apply the indicators for the strategy to function, they can of course apply the relevant indicators as visual aids if they so desire.

For further information on how to apply built-in TradingView indicators, please refer to:

Random Walk Index (RWI) Filters

As there is no built-in indicator for the RWI values used in this script, users can build their own RWI indicator in Pine Script by copying the following code and pasting it into a new indicator:

Pine Script®
//@version=6 indicator(title = "Random Walk Index", shorttitle = "RWI", overlay = false) import TradingView/ta/12 as ta rwi_length = input.int(title = 'RWI Length', defval = 14, minval = 1, group = 'Random Walk Index (RWI)') [rwi_high, rwi_low] = ta.rwi(rwi_length) plot(rwi_high, color = color.green) plot(rwi_low, color = color.red)


For further information on how to build Pine Script indicators, please refer to:


By default, the RWI length is set to 14.

Users can adjust the RWI length via strategy Settings/Inputs/RANDOM WALK INDEX (RWI).

The RWI high above-equal/below RWI low filter is defined as an entry filter that evaluates the relative positioning of the RWI high and RWI low values and invalidates trade signals that do not satisfy a user-defined directional condition.

The default mode for the RWI high above-equal/below RWI low filter is set to "None".

The RWI high above-equal/below zero filter is defined as an entry filter that evaluates the RWI high value relative to the zero line and invalidates trade signals that do not satisfy a user-defined directional condition.

The default mode for the RWI high above-equal/below zero filter is set to "None".

The RWI low above-equal/below zero filter is defined as an entry filter that evaluates the RWI low value relative to the zero line and invalidates trade signals that do not satisfy a user-defined directional condition.

The default mode for the RWI low above-equal/below zero filter is set to "None".

The RWI bandwidth increasing/decreasing filter is defined as an entry filter that evaluates whether the distance between the RWI high and RWI low values is expanding or contracting over a configurable lookback period.

The default mode for the RWI bandwidth increasing/decreasing filter is set to "None".

The default RWI bandwidth increasing/decreasing lookback is set to 3.

The RWI high minimum percent change positive-flat/negative filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Minimum percent change is set to 0.
  • Lookback is set to 3.

The RWI low minimum percent change positive-flat/negative filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Minimum percent change is set to 0.
  • Lookback is set to 3.

The RWI high trend filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Trend count is set to 3.

The RWI low trend filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Trend count is set to 3.

Users can apply the RWI filters and adjust filter parameters via strategy Settings/Inputs/RWI FILTERS.

Range Ratio Filters

The range ratio value calculations used in this script are the same as those included in my retracement and extension ratios indicator. Link below:
  • Retracement and Extension Ratios [theEccentricTrader]

For long trades, the range ratio filters evaluate swing low range ratios. Conversely, for short trades, the range ratio filters evaluate swing high range ratios.

The range ratio increasing/decreasing filter is defined as an entry filter that evaluates whether the most recent range ratio has expanded or contracted relative to the preceding value, invalidating trade signals that do not satisfy user-defined criteria.

The default mode for the range ratio increasing/decreasing filter is set to "None".

The range ratio minimum and maximum boundary filter (see generic filters section above) defaults are as follows:
  • Apply range ratio above-equal is set to false.
  • Range ratio above-equal threshold is set to 0.
  • Apply range ratio below-equal is set to false.
  • Range ratio below-equal threshold is set to 100.

Users can apply the range ratio filters and adjust filter parameters via strategy Settings/Inputs/RANGE RATIO FILTERS.

Rank Correlation Index (RCI) Filters

The RCI indicator defaults are as follows:
  • Source is set to "Close".
  • Length is set to 10.

Users can adjust the RCI inputs via strategy Settings/Inputs/RANK CORRELATION INDEX (RCI).

The RCI minimum and maximum boundary filter (see generic filters section above) defaults are as follows:
  • Apply RCI above-equal is set to false.
  • RCI above-equal threshold is set to -100.
  • Apply RCI below-equal is set to false.
  • RCI below-equal threshold is set to 100.

The RCI minimum percent change positive-flat/negative filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Minimum percent change is set to 0.
  • Lookback is set to 3.

The RCI trend filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Trend count is set to 3.

Users can apply the RCI filters and adjust filter parameters via strategy Settings/Inputs/RCI FILTERS.

Rate of Change (ROC) Filters

The ROC indicator defaults are as follows:
  • Source is set to "Close".
  • Length is set to 9.

Users can adjust the ROC inputs via strategy Settings/Inputs/RATE OF CHANGE (ROC).

The ROC above-equal/below zero filter is defined as an entry filter that evaluates the ROC value relative to the zero line and invalidates trade signals that do not satisfy a user-defined directional condition.

The default mode for the ROC above-equal/below zero filter is set to "None".

The ROC minimum percent change positive-flat/negative filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Minimum percent change is set to 0.
  • Lookback is set to 3.

The ROC trend filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Trend count is set to 3.

Users can apply the ROC filters and adjust filter parameters via strategy Settings/Inputs/ROC FILTERS.

Relative Strength Index (RSI) Filters

The RSI indicator defaults are as follows:
  • Source is set to "Close".
  • Length is set to 14.

Users can adjust the RSI inputs via strategy Settings/Inputs/RELATIVE STRENGTH INDEX (RSI).

The RSI minimum and maximum boundary filter (see generic filters section above) defaults are as follows:
  • Apply RSI above-equal is set to false.
  • RSI above-equal threshold is set to 0.
  • Apply RSI below-equal is set to false.
  • RSI below-equal threshold is set to 100.

The RSI minimum percent change positive-flat/negative filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Minimum percent change is set to 0.
  • Lookback is set to 3.

The RSI trend filter (see generic filters section above) defaults are as follows:
  • Mode is set to "None".
  • Trend count is set to 3.

Users can apply the RSI filters and adjust filter parameters via strategy Settings/Inputs/RSI FILTERS.


█  ALERTS


Users can set alerts for any given strategy configuration via the alerts dialogue box.

Users must first ensure that the correct condition (the strategy title) is selected from the first drop-down list in the alert dialogue box's condition field.

Default alert messages have been configured for both entries and exits so that users can more effectively distinguish between long and short entries and exits while using long-short configurations.

To get alerts for both entries and exits the user should change the value in the condition field's second drop-down list from "Order fills only and alert() function calls" to "Order fills only". When using "Order fills only" with long-short configurations, it is recommended that users define their alert via the alert name field and use only the default {{strategy.order.alert_message}} call in the alert message field.

Alert conditions generated by "Order fills only" are evaluated after entry conditions have been satisfied and operational constraints (risk, position size and margin requirements) have been applied. As such, trade signals that would result in position sizes exceeding the simulated account's margin constraints will not generate alerts.

To get alerts for entries only the user should change the value in the condition field's second drop-down list from "Order fills only and alert() function calls" to "alert() function calls only".

The default alert messages generated by "Order fills only" are as follows:
  • "long entry".
  • "long exit".
  • "short entry".
  • "short exit".

The default alert messages generated by "alert() function calls only" are as follows:
  • "long entry".
  • "short entry".

Alert conditions generated by "alert() function calls only" are operational-constraint-agnostic and will generate alerts whenever entry conditions are satisfied, regardless of the simulated account's margin constraints.

For further information on setting and managing alerts, please refer to:

█  LIMITATIONS AND CONSIDERATIONS


Backtesting

Backtest results should always be interpreted cautiously. Strategy performance can vary significantly across time periods and sample sets. While strong historical performance does not guarantee future results, poor historical performance reliably indicates a weak strategy when sample sizes are statistically meaningful.

Statistical Significance and Path-Dependent Outcomes (Overfitting)

In statistical practice, sample sizes of 100 observations are sometimes cited as a rough lower bound for certain forms of basic significance testing. In the context of trading strategy evaluation, such sample sizes are rarely sufficient to produce results that are meaningfully reliable or replicable. Based on practical experience, sample sizes closer to 1,000 observations or more are generally required before performance characteristics begin to stabilise. As a general rule, larger sample sizes increase the reliability and replicability of observed results.

Path dependence refers to situations in which outcomes are determined not only by initial conditions, but by the specific and unique sequence of price movements over a given time period.

Even with large sample sizes, favourable net profit outcomes should be interpreted with caution when they are primarily driven by either variable reward-to-risk configurations or fixed reward-to-risk configurations that employ unrealistically high reward multiples. In both cases, performance is often strongly influenced by path-dependent effects, making such outcomes less reliable and less replicable.

Fixed reward-to-risk configurations are generally less susceptible to path dependence when the reward multiple is kept within reasonable bounds. However, empirical studies and practitioner research suggest that reward multiples above approximately 3:1 increasingly exhibit the same path-dependent characteristics observed in variable reward-to-risk strategies.

Bar Magnifier

Due to the limitations of OHLC data, intra-bar price movement cannot be precisely determined.

When both stop loss and target levels are reached within the same candle, assumptions are made by the strategy tester.

Pine Script's bar magnifier partially mitigates this limitation by evaluating lower-timeframe data. However, this feature is available only to TradingView Premium users and remains inherently limited.

For further information on the bar magnifier functionality, please refer to:

TradingView Premium users can enable bar magnifier via strategy Settings/Properties/FILL ORDERS.

Processing Orders at Candle Close

Backtests cannot accurately account for slippage between signal generation and trade execution.

A practical mitigation is to use fixed-distance stop losses and targets rather than absolute price levels, a feature supported by many brokers and APIs.

Empirical Probabilities

Empirical probabilities are derived directly from observed outcomes rather than from theoretical models or assumed distributions. In the context of trading, they are calculated by measuring the relative frequency of events (such as wins and losses) across a large sample of historical trades.

Unlike conditional or model-based probabilities, empirical probabilities make no assumptions. Their validity relies primarily on sample size and the consistency of the rules used to generate observations, making them particularly relevant for trading systems evaluated under the law of large numbers.

Empirical probabilities are most useful for comparative analysis, such as assessing how different configurations, filters or exit mechanisms alter the statistical behaviour of a strategy under identical conditions. They are not intended to represent true predictive probabilities or to imply stable future performance.

To study empirical probabilities for comparative purposes, it is recommended that users set commission and both long and short margin values to 0% in order to maximise sample size. However, users should not interpret any resulting profits as realistic. Setting commission and margin (in particular) to 0% produces highly distorted outcomes that are not representative of realistic live trading conditions.


█  DISCLAIMER


This Pine Script strategy is provided for educational purposes only and does not constitute financial advice in any form.

כתב ויתור

המידע והפרסומים אינם מיועדים להיות, ואינם מהווים, ייעוץ או המלצה פיננסית, השקעתית, מסחרית או מכל סוג אחר המסופקת או מאושרת על ידי TradingView. קרא עוד ב־תנאי השימוש.