ICT Macro Zone Boxes w/ Individual H/L Tracking v3.1ICT Macro Zones (Grey Box Version
This indicator dynamically highlights key intraday time-based macro sessions using a clean, minimalistic grey box overlay, helping traders align with institutional trading cycles. Inspired by ICT (Inner Circle Trader) concepts, it tracks real-time highs and lows for each session and optionally extends the zone box after the session ends — making it a precision tool for intraday setups, order flow analysis, and macro-level liquidity sweeps.
### 🔍 **What It Does**
- Plots **six predefined macro sessions** used in Smart Money Concepts:
- AM Macro (09:50–10:10)
- London Close (10:50–11:10)
- Lunch Macro (11:30–13:30)
- PM Macro (14:50–15:10)
- London SB (03:00–04:00)
- PM SB (15:00–16:00)
- Each zone:
- **Tracks high and low dynamically** throughout the session.
- **Draws a consistent grey shaded box** to visualize price boundaries.
- **Displays a label** at the first bar of the session (optional).
- **Optionally extends** the box to the right after the session closes.
### 🧠 **How It Works**
- Uses Pine Script arrays to define each session’s time window, label, and color.
- Detects session entry using `time()` within a New York timezone context.
- High/Low values are updated per bar inside the session window.
- Once a session ends, the box is optionally closed and fixed in place.
- All visual zones use a standardized grey tone for clarity and consistency across charts.
### 🛠️ **Settings**
- **Shade Zone High→Low:** Enable/disable the grey macro box.
- **Extend Box After Session:** Keep the zone visible after it ends.
- **Show Entry Label:** Display a label at the start of each session.
### 🎯 **Why This Script is Unique**
Unlike basic session markers or colored backgrounds, this tool:
- Focuses on **macro moments of liquidity and reversal**, not just open/close times.
- Uses **per-session logic** to individually track price behavior inside key time windows.
- Supports **real-time high/low tracking and clean zone drawing**, ideal for Smart Money and ICT-style strategies.
Perfect — based on your list, here's a **bundle-style description** that not only explains the function of each script but also shows how they **work together** in a Smart Money/ICT workflow. This kind of cross-script explanation is exactly what TradingView wants to see to justify closed-source mashups or interdependent tools.
---
📚 ICT SMC Toolkit — Script Integration Guide
This set of advanced Smart Money Concept (SMC) tools is designed for traders who follow ICT-based methodologies, combining liquidity theory, time-based precision, and engineered confluences for high-probability trades. Each indicator is optimized to work both independently and synergistically, forming a comprehensive trading framework.
---
First FVG Custom Time Range
**Purpose:**
Plots the **first Fair Value Gap (FVG)** that appears within a defined session (e.g., NY Kill Zone, Custom range). Includes optional retest alerts.
**Best Used With:**
- Use with **ICT Macro Zones (Grey Box Version)** to isolate FVGs during high-probability times like AM Macro or PM SB.
- Combine with **Liquidity Levels** to assess whether FVGs form near swing points or liquidity voids.
---
ICT SMC Liquidity Grabs and OB s
**Purpose:**
Detects **liquidity grabs** (stop hunts above/below swing highs/lows) and **bullish/bearish order blocks**. Includes optional Fibonacci OTE levels for sniper entries.
**Best Used With:**
- Use with **ICT Turtle Soup (Reversal)** for confirmation after a liquidity grab.
- Combine with **Macro Zones** to catch order blocks forming inside timed macro windows.
- Match with **Smart Swing Levels** to confirm structure breaks before entry.
ICT SMC Liquidity Levels (Smart Swing Lows)
**Purpose:**
Automatically marks swing highs/lows based on user-defined lookbacks. Tracks whether those levels have been breached or respected.
**Best Used With:**
- Combine with **Turtle Soup** to detect if a swing level was swept, then reversed.
- Use with **Liquidity Grabs** to confirm a grab occurred at a meaningful structural point.
- Align with **Macro Zones** to understand when liquidity events occur within macro session timing.
ICT Turtle Soup (Liquidity Reversal)
**Purpose:**
Implements the classic ICT Turtle Soup model. Looks for swing failure and quick reversals after a liquidity sweep — ideal for catching traps.
Best Used With:
- Confirm with **Liquidity Grabs + OBs** to identify institutional activity at the reversal point.
- Use **Liquidity Levels** to ensure the reversal is happening at valid previous swing highs/lows.
- Amplify probability when pattern appears during **Macro Zones** or near the **First FVG**.
ICT Turtle Soup Ultimate V2
**Purpose:**
An enhanced, multi-layer version of the Turtle Soup setup that includes built-in liquidity checks, OTE levels, structure validation, and customizable visual output.
**Best Used With:**
- Use as an **entry signal generator** when other indicators (e.g., OBs, liquidity grabs) are aligned.
- Pair with **Macro Zones** for high-precision timing.
- Combine with **First FVG** to anticipate price rebalancing before explosive moves.
---
## 🧠 Workflow Example:
1. **Start with Macro Zones** to focus only on institutional trading windows.
2. Look for **Liquidity Grabs or Swing Sweeps** around key highs/lows.
3. Check for a **Turtle Soup Reversal** or **Order Block Reaction** near that level.
4. Confirm confluence with a **Fair Value Gap**.
5. Execute using the **OTE level** from the Liquidity Grabs + OB script.
---
Let me know which script you want to publish first — I’ll tailor its **individual TradingView description** and flag its ideal **“Best Used With” partners** to help users see the value in your ecosystem.
Komut dosyalarını "如何用wind搜索股票的发行价和份数" için ara
Bullish Reversal Bar Strategy [Skyrexio]Overview
Bullish Reversal Bar Strategy leverages the combination of candlestick pattern Bullish Reversal Bar (description in Methodology and Justification of Methodology), Williams Alligator indicator and Williams Fractals to create the high probability setups. Candlestick pattern is used for the entering into trade, while the combination of Williams Alligator and Fractals is used for the trend approximation as close condition. Strategy uses only long trades.
Unique Features
No fixed stop-loss and take profit: Instead of fixed stop-loss level strategy utilizes technical condition obtained by Fractals and Alligator or the candlestick pattern invalidation to identify when current uptrend is likely to be over (more information in "Methodology" and "Justification of Methodology" paragraphs)
Configurable Trading Periods: Users can tailor the strategy to specific market windows, adapting to different market conditions.
Trend Trade Filter: strategy uses Alligator and Fractal combination as high probability trend filter.
Methodology
The strategy opens long trade when the following price met the conditions:
1.Current candle's high shall be below the Williams Alligator's lines (Jaw, Lips, Teeth)(all details in "Justification of Methodology" paragraph)
2.Price shall create the candlestick pattern "Bullish Reversal Bar". Optionally if MFI and AO filters are enabled current candle shall have the decreasing AO and at least one of three recent bars shall have the squat state on the MFI (all details in "Justification of Methodology" paragraph)
3.If price breaks through the high of the candle marked as the "Bullish Reversal Bar" the long trade is open at the price one tick above the candle's high
4.Initial stop loss is placed at the Bullish Reversal Bar's candle's low
5.If price hit the Bullish Reversal Bar's low before hitting the entry price potential trade is cancelled
6.If trade is active and initial stop loss has not been hit, trade is closed when the combination of Alligator and Williams Fractals shall consider current trend change from upward to downward.
Strategy settings
In the inputs window user can setup strategy setting:
Enable MFI (if true trades are filtered using Market Facilitation Index (MFI) condition all details in "Justification of Methodology" paragraph), by default = false)
Enable AO (if true trades are filtered using Awesome Oscillator (AO) condition all details in "Justification of Methodology" paragraph), by default = false)
Justification of Methodology
Let's explore the key concepts of this strategy and understand how they work together. The first and key concept is the Bullish Reversal Bar candlestick pattern. This is just the single bar pattern. The rules are simple:
Candle shall be closed in it's upper half
High of this candle shall be below all three Alligator's lines (Jaw, Lips, Teeth)
Next, let’s discuss the short-term trend filter, which combines the Williams Alligator and Williams Fractals. Williams Alligator
Developed by Bill Williams, the Alligator is a technical indicator that identifies trends and potential market reversals. It consists of three smoothed moving averages:
Jaw (Blue Line): The slowest of the three, based on a 13-period smoothed moving average shifted 8 bars ahead.
Teeth (Red Line): The medium-speed line, derived from an 8-period smoothed moving average shifted 5 bars forward.
Lips (Green Line): The fastest line, calculated using a 5-period smoothed moving average shifted 3 bars forward.
When the lines diverge and align in order, the "Alligator" is "awake," signaling a strong trend. When the lines overlap or intertwine, the "Alligator" is "asleep," indicating a range-bound or sideways market. This indicator helps traders determine when to enter or avoid trades.
Fractals, another tool by Bill Williams, help identify potential reversal points on a price chart. A fractal forms over at least five consecutive bars, with the middle bar showing either:
Up Fractal: Occurs when the middle bar has a higher high than the two preceding and two following bars, suggesting a potential downward reversal.
Down Fractal: Happens when the middle bar shows a lower low than the surrounding two bars, hinting at a possible upward reversal.
Traders often use fractals alongside other indicators to confirm trends or reversals, enhancing decision-making accuracy.
How do these tools work together in this strategy? Let’s consider an example of an uptrend.
When the price breaks above an up fractal, it signals a potential bullish trend. This occurs because the up fractal represents a shift in market behavior, where a temporary high was formed due to selling pressure. If the price revisits this level and breaks through, it suggests the market sentiment has turned bullish.
The breakout must occur above the Alligator’s teeth line to confirm the trend. A breakout below the teeth is considered invalid, and the downtrend might still persist. Conversely, in a downtrend, the same logic applies with down fractals.
How we can use all these indicators in this strategy? This strategy is a counter trend one. Candle's high shall be below all Alligator's lines. During this market stage the bullish reversal bar candlestick pattern shall be printed. This bar during the downtrend is a high probability setup for the potential reversal to the upside: bulls were able to close the price in the upper half of a candle. The breaking of its high is a high probability signal that trend change is confirmed and script opens long trade. If market continues going down and break down the bullish reversal bar's low potential trend change has been invalidated and strategy close long trade.
If market really reversed and started moving to the upside strategy waits for the trend change form the downtrend to the uptrend according to approximation of Alligator and Fractals combination. If this change happens strategy close the trade. This approach helps to stay in the long trade while the uptrend continuation is likely and close it if there is a high probability of the uptrend finish.
Optionally users can enable MFI and AO filters. First of all, let's briefly explain what are these two indicators. The Awesome Oscillator (AO), created by Bill Williams, is a momentum-based indicator that evaluates market momentum by comparing recent price activity to a broader historical context. It assists traders in identifying potential trend reversals and gauging trend strength.
AO = SMA5(Median Price) − SMA34(Median Price)
where:
Median Price = (High + Low) / 2
SMA5 = 5-period Simple Moving Average of the Median Price
SMA 34 = 34-period Simple Moving Average of the Median Price
This indicator is filtering signals in the following way: if current AO bar is decreasing this candle can be interpreted as a bullish reversal bar. This logic is applicable because initially this strategy is a trend reversal, it is searching for the high probability setup against the current trend. Decreasing AO is the additional high probability filter of a downtrend.
Let's briefly look what is MFI. The Market Facilitation Index (MFI) is a technical indicator that measures the price movement per unit of volume, helping traders gauge the efficiency of price movement in relation to trading volume. Here's how you can calculate it:
MFI = (High−Low)/Volume
MFI can be used in combination with volume, so we can divide 4 states. Bill Williams introduced these to help traders interpret the interaction between volume and price movement. Here’s a quick summary:
Green Window (Increased MFI & Increased Volume): Indicates strong momentum with both price and volume increasing. Often a sign of trend continuation, as both buying and selling interest are rising.
Fake Window (Increased MFI & Decreased Volume): Shows that price is moving but with lower volume, suggesting weak support for the trend. This can signal a potential end of the current trend.
Squat Window (Decreased MFI & Increased Volume): Shows high volume but little price movement, indicating a tug-of-war between buyers and sellers. This often precedes a breakout as the pressure builds.
Fade Window (Decreased MFI & Decreased Volume): Indicates a lack of interest from both buyers and sellers, leading to lower momentum. This typically happens in range-bound markets and may signal consolidation before a new move.
For our purposes we are interested in squat bars. This is the sign that volume cannot move the price easily. This type of bar increases the probability of trend reversal. In this indicator we added to enable the MFI filter of reversal bars. If potential reversal bar or two preceding bars have squat state this bar can be interpret as a reversal one.
Backtest Results
Operating window: Date range of backtests is 2023.01.01 - 2024.12.31. It is chosen to let the strategy to close all opened positions.
Commission and Slippage: Includes a standard Binance commission of 0.1% and accounts for possible slippage over 5 ticks.
Initial capital: 10000 USDT
Percent of capital used in every trade: 50%
Maximum Single Position Loss: -5.29%
Maximum Single Profit: +29.99%
Net Profit: +5472.66 USDT (+54.73%)
Total Trades: 103 (33.98% win rate)
Profit Factor: 1.634
Maximum Accumulated Loss: 1231.15 USDT (-8.32%)
Average Profit per Trade: 53.13 USDT (+0.94%)
Average Trade Duration: 76 hours
How to Use
Add the script to favorites for easy access.
Apply to the desired timeframe and chart (optimal performance observed on 4h ETH/USDT).
Configure settings using the dropdown choice list in the built-in menu.
Set up alerts to automate strategy positions through web hook with the text: {{strategy.order.alert_message}}
Disclaimer:
Educational and informational tool reflecting Skyrex commitment to informed trading. Past performance does not guarantee future results. Test strategies in a simulated environment before live implementation
These results are obtained with realistic parameters representing trading conditions observed at major exchanges such as Binance and with realistic trading portfolio usage parameters.
chrono_utilsLibrary "chrono_utils"
Collection of objects and common functions that are related to datetime windows session days and time
ranges. The main purpose of this library is to handle time-related functionality and make it easy to reason about a
future bar checking if it will be part of a predefined session and/or inside a datetime window. All existing session
functionality I found in the documentation e.g. "not na(time(timeframe, session, timezone))" are not suitable for
strategy scripts, since the execution of the orders is delayed by one bar, due to the script execution happening at
the bar close. Moreover, a history operator with a negative value that looks forward is not allowed in any pinescript
expression. So, a prediction for the next bar using the bars_back argument of "time()"" and "time_close()" was
necessary. Thus, I created this library to overcome this small but very important limitation. In the meantime, I
added useful functionality to handle session-based behavior. An interesting utility that emerged from this
development is the data anomaly detection where a comparison between the prediction and the actual value is happening.
If those two values are different then a data inconsistency happened between the prediction bar and the actual bar
(probably due to a holiday, half session day, a timezone change etc..)
exTimezone(timezone)
exTimezone - Convert extended timezone to timezone string
Parameters:
timezone (simple string) : - The timezone or a special string
Returns: string representing the timezone
nameOfDay(day)
nameOfDay - Convert the day id into a short nameOfDay
Parameters:
day (int) : - The day id to convert
Returns: - The short name of the day
today()
today - Get the day id of this day
Returns: - The day id
nthDayAfter(day, n)
nthDayAfter - Get the day id of n days after the given day
Parameters:
day (int) : - The day id of the reference day
n (int) : - The number of days to go forward
Returns: - The day id of the day that is n days after the reference day
nextDayAfter(day)
nextDayAfter - Get the day id of next day after the given day
Parameters:
day (int) : - The day id of the reference day
Returns: - The day id of the next day after the reference day
nthDayBefore(day, n)
nthDayBefore - Get the day id of n days before the given day
Parameters:
day (int) : - The day id of the reference day
n (int) : - The number of days to go forward
Returns: - The day id of the day that is n days before the reference day
prevDayBefore(day)
prevDayBefore - Get the day id of previous day before the given day
Parameters:
day (int) : - The day id of the reference day
Returns: - The day id of the previous day before the reference day
tomorrow()
tomorrow - Get the day id of the next day
Returns: - The next day day id
normalize(num, min, max)
normalizeHour - Check if number is inthe range of
Parameters:
num (int)
min (int)
max (int)
Returns: - The normalized number
normalizeHour(hourInDay)
normalizeHour - Check if hour is valid and return a noralized hour range from
Parameters:
hourInDay (int)
Returns: - The normalized hour
normalizeMinute(minuteInHour)
normalizeMinute - Check if minute is valid and return a noralized minute from
Parameters:
minuteInHour (int)
Returns: - The normalized minute
monthInMilliseconds(mon)
monthInMilliseconds - Calculate the miliseconds in one bar of the timeframe
Parameters:
mon (int) : - The month of reference to get the miliseconds
Returns: - The number of milliseconds of the month
barInMilliseconds()
barInMilliseconds - Calculate the miliseconds in one bar of the timeframe
Returns: - The number of milliseconds in one bar
method to_string(this)
to_string - Formats the time window into a human-readable string
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object with the from and to datetimes
Returns: - The string of the time window
method to_string(this)
to_string - Formats the session days into a human-readable string with short day names
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
Returns: - The string of the session day short names
method to_string(this)
to_string - Formats the session time into a human-readable string
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The string of the session time
method to_string(this)
to_string - Formats the session time into a human-readable string
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The string of the session time
method to_string(this)
to_string - Formats the session into a human-readable string
Namespace types: Session
Parameters:
this (Session) : - The session object with the day and the time range selection
Returns: - The string of the session
method init(this, fromDateTime, toDateTime)
init - Initialize the time window object from boolean values of each session day
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object that will hold the from and to datetimes
fromDateTime (int) : - The starting datetime of the time window
toDateTime (int) : - The ending datetime of the time window
Returns: - The time window object
method init(this, refTimezone, chTimezone, fromDateTime, toDateTime)
init - Initialize the time window object from boolean values of each session day
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object that will hold the from and to datetimes
refTimezone (simple string) : - The timezone of reference of the 'from' and 'to' dates
chTimezone (simple string) : - The target timezone to convert the 'from' and 'to' dates
fromDateTime (int) : - The starting datetime of the time window
toDateTime (int) : - The ending datetime of the time window
Returns: - The time window object
method init(this, sun, mon, tue, wed, thu, fri, sat)
init - Initialize the session days object from boolean values of each session day
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object that will hold the day selection
sun (bool) : - Is Sunday a trading day?
mon (bool) : - Is Monday a trading day?
tue (bool) : - Is Tuesday a trading day?
wed (bool) : - Is Wednesday a trading day?
thu (bool) : - Is Thursday a trading day?
fri (bool) : - Is Friday a trading day?
sat (bool) : - Is Saturday a trading day?
Returns: - The session days object
method init(this, unixTime)
init - Initialize the object from the hour and minute of the session time in exchange timezone (syminfo.timezone)
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
unixTime (int) : - The unix time
Returns: - The session time object
method init(this, hourInDay, minuteInHour)
init - Initialize the object from the hour and minute of the session time in exchange timezone (syminfo.timezone)
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
hourInDay (int) : - The hour of the time
minuteInHour (int) : - The minute of the time
Returns: - The session time object
method init(this, hourInDay, minuteInHour, refTimezone)
init - Initialize the object from the hour and minute of the session time
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
hourInDay (int) : - The hour of the time
minuteInHour (int) : - The minute of the time
refTimezone (string) : - The timezone of reference of the 'hour' and 'minute'
Returns: - The session time object
method init(this, startTime, endTime)
init - Initialize the object from the start and end session time in exchange timezone (syminfo.timezone)
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
startTime (SessionTime) : - The time the session begins
endTime (SessionTime) : - The time the session ends
Returns: - The session time range object
method init(this, startTimeHour, startTimeMinute, endTimeHour, endTimeMinute, refTimezone)
init - Initialize the object from the start and end session time
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
startTimeHour (int) : - The time hour the session begins
startTimeMinute (int) : - The time minute the session begins
endTimeHour (int) : - The time hour the session ends
endTimeMinute (int) : - The time minute the session ends
refTimezone (string)
Returns: - The session time range object
method init(this, days, timeRanges)
init - Initialize the session object from session days and time range
Namespace types: Session
Parameters:
this (Session) : - The session object that will hold the day and the time range selection
days (SessionDays) : - The session days object that defines the days the session is happening
timeRanges (array) : - The array of all the session time ranges during a session day
Returns: - The session object
method init(this, days, timeRanges, names, colors)
init - Initialize the session object from session days and time range
Namespace types: SessionView
Parameters:
this (SessionView) : - The session view object that will hold the session, the names and the color selections
days (SessionDays) : - The session days object that defines the days the session is happening
timeRanges (array) : - The array of all the session time ranges during a session day
names (array) : - The array of the names of the sessions
colors (array) : - The array of the colors of the sessions
Returns: - The session object
method get_size_in_secs(this)
get_size_in_secs - Count the seconds from start to end in the given timeframe
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object with the from and to datetimes
Returns: - The number of seconds inside the time widow for the given timeframe
method get_size_in_secs(this)
get_size_in_secs - Calculate the seconds inside the session
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The number of seconds inside the session
method get_size_in_bars(this)
get_size_in_bars - Count the bars from start to end in the given timeframe
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object with the from and to datetimes
Returns: - The number of bars inside the time widow for the given timeframe
method get_size_in_bars(this)
get_size_in_bars - Calculate the bars inside the session
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The number of bars inside the session for the given timeframe
method is_bar_included(this, offset_forward)
is_bar_included - Check if the given bar is between the start and end dates of the window
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object with the from and to datetimes
offset_forward (simple int) : - The number of bars forward. Default is 1
Returns: - Whether the current bar is inside the datetime window
method is_bar_included(this, offset_forward)
is_bar_included - Check if the given bar is inside the session as defined by the input params (what "not na(time(timeframe.period, this.to_sess_string()) )" should return if you could write it
Namespace types: Session
Parameters:
this (Session) : - The session with the day and the time range selection
offset_forward (simple int) : - The bar forward to check if it is between the from and to datetimes. Default is 1
Returns: - Whether the current time is inside the session
method to_sess_string(this)
to_sess_string - Formats the session days into a session string with day ids
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object
Returns: - The string of the session day ids
method to_sess_string(this)
to_sess_string - Formats the session time into a session string
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The string of the session time
method to_sess_string(this)
to_sess_string - Formats the session time into a session string
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The string of the session time
method to_sess_string(this)
to_sess_string - Formats the session into a session string
Namespace types: Session
Parameters:
this (Session) : - The session object with the day and the time range selection
Returns: - The string of the session
method from_sess_string(this, sess)
from_sess_string - Initialize the session days object from the session string
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object that will hold the day selection
sess (string) : - The session string part that represents the days
Returns: - The session days object
method from_sess_string(this, sess)
from_sess_string - Initialize the session time object from the session string in exchange timezone (syminfo.timezone)
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object that will hold the hour and minute of the time
sess (string) : - The session string part that represents the time HHmm
Returns: - The session time object
method from_sess_string(this, sess, refTimezone)
from_sess_string - Initialize the session time object from the session string
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object that will hold the hour and minute of the time
sess (string) : - The session string part that represents the time HHmm
refTimezone (simple string) : - The timezone of reference of the 'hour' and 'minute'
Returns: - The session time object
method from_sess_string(this, sess)
from_sess_string - Initialize the session time range object from the session string in exchange timezone (syminfo.timezone)
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
sess (string) : - The session string part that represents the time range HHmm-HHmm
Returns: - The session time range object
method from_sess_string(this, sess, refTimezone)
from_sess_string - Initialize the session time range object from the session string
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
sess (string) : - The session string part that represents the time range HHmm-HHmm
refTimezone (simple string) : - The timezone of reference of the time ranges
Returns: - The session time range object
method from_sess_string(this, sess)
from_sess_string - Initialize the session object from the session string in exchange timezone (syminfo.timezone)
Namespace types: Session
Parameters:
this (Session) : - The session object that will hold the day and the time range selection
sess (string) : - The session string that represents the session HHmm-HHmm,HHmm-HHmm:ddddddd
Returns: - The session time range object
method from_sess_string(this, sess, refTimezone)
from_sess_string - Initialize the session object from the session string
Namespace types: Session
Parameters:
this (Session) : - The session object that will hold the day and the time range selection
sess (string) : - The session string that represents the session HHmm-HHmm,HHmm-HHmm:ddddddd
refTimezone (simple string) : - The timezone of reference of the time ranges
Returns: - The session time range object
method nth_day_after(this, day, n)
nth_day_after - The nth day after the given day that is a session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
day (int) : - The day id of the reference day
n (int) : - The number of days after
Returns: - The day id of the nth session day of the week after the given day
method nth_day_before(this, day, n)
nth_day_before - The nth day before the given day that is a session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
day (int) : - The day id of the reference day
n (int) : - The number of days after
Returns: - The day id of the nth session day of the week before the given day
method next_day(this)
next_day - The next day that is a session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
Returns: - The day id of the next session day of the week
method previous_day(this)
previous_day - The previous day that is session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
Returns: - The day id of the previous session day of the week
method get_sec_in_day(this)
get_sec_in_day - Count the seconds since the start of the day this session time represents
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The number of seconds passed from the start of the day until that session time
method get_ms_in_day(this)
get_ms_in_day - Count the milliseconds since the start of the day this session time represents
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The number of milliseconds passed from the start of the day until that session time
method is_day_included(this, day)
is_day_included - Check if the given day is inside the session days
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
day (int) : - The day to check if it is a trading day
Returns: - Whether the current day is included in the session days
DateTimeWindow
DateTimeWindow - Object that represents a datetime window with a beginning and an end
Fields:
fromDateTime (series int) : - The beginning of the datetime window
toDateTime (series int) : - The end of the datetime window
SessionDays
SessionDays - Object that represent the trading days of the week
Fields:
days (map) : - The map that contains all days of the week and their session flag
SessionTime
SessionTime - Object that represents the time (hour and minutes)
Fields:
hourInDay (series int) : - The hour of the day that ranges from 0 to 24
minuteInHour (series int) : - The minute of the hour that ranges from 0 to 59
minuteInDay (series int) : - The minute of the day that ranges from 0 to 1440. They will be calculated based on hourInDay and minuteInHour when method is called
SessionTimeRange
SessionTimeRange - Object that represents a range that extends from the start to the end time
Fields:
startTime (SessionTime) : - The beginning of the time range
endTime (SessionTime) : - The end of the time range
isOvernight (series bool) : - Whether or not this is an overnight time range
Session
Session - Object that represents a session
Fields:
days (SessionDays) : - The map of the trading days
timeRanges (array) : - The array with all time ranges of the session during the trading days
SessionView
SessionView - Object that visualize a session
Fields:
sess (Session) : - The Session object to be visualized
names (array) : - The names of the session time ranges
colors (array) : - The colors of the session time ranges
chrono_utilsLibrary "chrono_utils"
Collection of objects and common functions that are related to datetime windows session days and time
ranges. The main purpose of this library is to handle time-related functionality and make it easy to reason about a
future bar and see if it is part of a predefined user session and/or inside a datetime window. All existing session
functions I found in the documentation e.g. "not na(time(timeframe, session, timezone))" are not suitable for
strategies, since the execution of the orders is delayed by one bar due to the execution happening at the bar close.
So a prediction for the next bar is necessary. Moreover, a history operator with a negative value is not allowed e.g.
`not na(time(timeframe, session, timezone) )` expression is not valid. Thus, I created this library to overcome
this small but very important limitation. In the meantime, I added useful functionality to handle session-based
behavior. An interesting utility that emerged from this development is data anomaly detection where a comparison
between the prediction and the actual value is happening. If those two values are different then a data inconsistency
happens between the prediction bar and the actual bar (probably due to a holiday or half session day etc..)
exTimezone(timezone)
exTimezone - Convert extended timezone to timezone string
Parameters:
timezone (simple string) : - The timezone or a special string
Returns: string representing the timezone
nameOfDay(day)
nameOfDay - Convert the day id into a short nameOfDay
Parameters:
day (int) : - The day id to convert
Returns: - The short name of the day
today()
today - Get the day id of this day
Returns: - The day id
nthDayAfter(day, n)
nthDayAfter - Get the day id of n days after the given day
Parameters:
day (int) : - The day id of the reference day
n (int) : - The number of days to go forward
Returns: - The day id of the day that is n days after the reference day
nextDayAfter(day)
nextDayAfter - Get the day id of next day after the given day
Parameters:
day (int) : - The day id of the reference day
Returns: - The day id of the next day after the reference day
nthDayBefore(day, n)
nthDayBefore - Get the day id of n days before the given day
Parameters:
day (int) : - The day id of the reference day
n (int) : - The number of days to go forward
Returns: - The day id of the day that is n days before the reference day
prevDayBefore(day)
prevDayBefore - Get the day id of previous day before the given day
Parameters:
day (int) : - The day id of the reference day
Returns: - The day id of the previous day before the reference day
tomorrow()
tomorrow - Get the day id of the next day
Returns: - The next day day id
normalize(num, min, max)
normalizeHour - Check if number is inthe range of
Parameters:
num (int)
min (int)
max (int)
Returns: - The normalized number
normalizeHour(hourInDay)
normalizeHour - Check if hour is valid and return a noralized hour range from
Parameters:
hourInDay (int)
Returns: - The normalized hour
normalizeMinute(minuteInHour)
normalizeMinute - Check if minute is valid and return a noralized minute from
Parameters:
minuteInHour (int)
Returns: - The normalized minute
monthInMilliseconds(mon)
monthInMilliseconds - Calculate the miliseconds in one bar of the timeframe
Parameters:
mon (int) : - The month of reference to get the miliseconds
Returns: - The number of milliseconds of the month
barInMilliseconds()
barInMilliseconds - Calculate the miliseconds in one bar of the timeframe
Returns: - The number of milliseconds in one bar
method init(this, fromDateTime, toDateTime)
init - Initialize the time window object from boolean values of each session day
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object that will hold the from and to datetimes
fromDateTime (int) : - The starting datetime of the time window
toDateTime (int) : - The ending datetime of the time window
Returns: - The time window object
method init(this, refTimezone, chTimezone, fromDateTime, toDateTime)
init - Initialize the time window object from boolean values of each session day
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object that will hold the from and to datetimes
refTimezone (simple string) : - The timezone of reference of the 'from' and 'to' dates
chTimezone (simple string) : - The target timezone to convert the 'from' and 'to' dates
fromDateTime (int) : - The starting datetime of the time window
toDateTime (int) : - The ending datetime of the time window
Returns: - The time window object
method init(this, sun, mon, tue, wed, thu, fri, sat)
init - Initialize the session days object from boolean values of each session day
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object that will hold the day selection
sun (bool) : - Is Sunday a trading day?
mon (bool) : - Is Monday a trading day?
tue (bool) : - Is Tuesday a trading day?
wed (bool) : - Is Wednesday a trading day?
thu (bool) : - Is Thursday a trading day?
fri (bool) : - Is Friday a trading day?
sat (bool) : - Is Saturday a trading day?
Returns: - The session days objectfrom_chart
method init(this, unixTime)
init - Initialize the object from the hour and minute of the session time in exchange timezone (syminfo.timezone)
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
unixTime (int) : - The unix time
Returns: - The session time object
method init(this, hourInDay, minuteInHour)
init - Initialize the object from the hour and minute of the session time in exchange timezone (syminfo.timezone)
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
hourInDay (int) : - The hour of the time
minuteInHour (int) : - The minute of the time
Returns: - The session time object
method init(this, hourInDay, minuteInHour, refTimezone)
init - Initialize the object from the hour and minute of the session time
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
hourInDay (int) : - The hour of the time
minuteInHour (int) : - The minute of the time
refTimezone (string) : - The timezone of reference of the 'hour' and 'minute'
Returns: - The session time object
method init(this, startTime, endTime)
init - Initialize the object from the start and end session time in exchange timezone (syminfo.timezone)
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
startTime (SessionTime) : - The time the session begins
endTime (SessionTime) : - The time the session ends
Returns: - The session time range object
method init(this, startTimeHour, startTimeMinute, endTimeHour, endTimeMinute, refTimezone)
init - Initialize the object from the start and end session time
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
startTimeHour (int) : - The time hour the session begins
startTimeMinute (int) : - The time minute the session begins
endTimeHour (int) : - The time hour the session ends
endTimeMinute (int) : - The time minute the session ends
refTimezone (string)
Returns: - The session time range object
method init(this, days, timeRanges)
init - Initialize the user session object from session days and time range
Namespace types: UserSession
Parameters:
this (UserSession) : - The user-defined session object that will hold the day and the time range selection
days (SessionDays) : - The session days object that defines the days the session is happening
timeRanges (SessionTimeRange ) : - The array of all the session time ranges during a session day
Returns: - The user session object
method to_string(this)
to_string - Formats the time window into a human-readable string
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object with the from and to datetimes
Returns: - The string of the time window
method to_string(this)
to_string - Formats the session days into a human-readable string with short day names
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
Returns: - The string of the session day short names
method to_string(this)
to_string - Formats the session time into a human-readable string
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The string of the session time
method to_string(this)
to_string - Formats the session time into a human-readable string
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The string of the session time
method to_string(this)
to_string - Formats the user session into a human-readable string
Namespace types: UserSession
Parameters:
this (UserSession) : - The user-defined session object with the day and the time range selection
Returns: - The string of the user session
method to_string(this)
to_string - Formats the bar into a human-readable string
Namespace types: Bar
Parameters:
this (Bar) : - The bar object with the open and close times
Returns: - The string of the bar times
method to_string(this)
to_string - Formats the chart session into a human-readable string
Namespace types: ChartSession
Parameters:
this (ChartSession) : - The chart session object that contains the days and the time range shown in the chart
Returns: - The string of the chart session
method get_size_in_secs(this)
get_size_in_secs - Count the seconds from start to end in the given timeframe
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object with the from and to datetimes
Returns: - The number of seconds inside the time widow for the given timeframe
method get_size_in_secs(this)
get_size_in_secs - Calculate the seconds inside the session
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The number of seconds inside the session
method get_size_in_bars(this)
get_size_in_bars - Count the bars from start to end in the given timeframe
Namespace types: DateTimeWindow
Parameters:
this (DateTimeWindow) : - The time window object with the from and to datetimes
Returns: - The number of bars inside the time widow for the given timeframe
method get_size_in_bars(this)
get_size_in_bars - Calculate the bars inside the session
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The number of bars inside the session for the given timeframe
method from_chart(this)
from_chart - Initialize the session days object from the chart
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object that will hold the day selection
Returns: - The user session object
method from_chart(this)
from_chart - Initialize the session time range object from the chart
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
Returns: - The session time range object
method from_chart(this)
from_chart - Initialize the session object from the chart
Namespace types: ChartSession
Parameters:
this (ChartSession) : - The chart session object that will hold the days and the time range shown in the chart
Returns: - The chart session object
method to_sess_string(this)
to_sess_string - Formats the session days into a session string with day ids
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object
Returns: - The string of the session day ids
method to_sess_string(this)
to_sess_string - Formats the session time into a session string
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The string of the session time
method to_sess_string(this)
to_sess_string - Formats the session time into a session string
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - The string of the session time
method to_sess_string(this)
to_sess_string - Formats the user session into a session string
Namespace types: UserSession
Parameters:
this (UserSession) : - The user-defined session object with the day and the time range selection
Returns: - The string of the user session
method to_sess_string(this)
to_sess_string - Formats the chart session into a session string
Namespace types: ChartSession
Parameters:
this (ChartSession) : - The chart session object that contains the days and the time range shown in the chart
Returns: - The string of the chart session
method from_sess_string(this, sess)
from_sess_string - Initialize the session days object from the session string
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object that will hold the day selection
sess (string) : - The session string part that represents the days
Returns: - The session days object
method from_sess_string(this, sess)
from_sess_string - Initialize the session time object from the session string in exchange timezone (syminfo.timezone)
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object that will hold the hour and minute of the time
sess (string) : - The session string part that represents the time HHmm
Returns: - The session time object
method from_sess_string(this, sess, refTimezone)
from_sess_string - Initialize the session time object from the session string
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object that will hold the hour and minute of the time
sess (string) : - The session string part that represents the time HHmm
refTimezone (simple string) : - The timezone of reference of the 'hour' and 'minute'
Returns: - The session time object
method from_sess_string(this, sess)
from_sess_string - Initialize the session time range object from the session string in exchange timezone (syminfo.timezone)
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
sess (string) : - The session string part that represents the time range HHmm-HHmm
Returns: - The session time range object
method from_sess_string(this, sess, refTimezone)
from_sess_string - Initialize the session time range object from the session string
Namespace types: SessionTimeRange
Parameters:
this (SessionTimeRange) : - The session time range object that will hold the start and end time of the daily session
sess (string) : - The session string part that represents the time range HHmm-HHmm
refTimezone (simple string) : - The timezone of reference of the time ranges
Returns: - The session time range object
method from_sess_string(this, sess)
from_sess_string - Initialize the user session object from the session string in exchange timezone (syminfo.timezone)
Namespace types: UserSession
Parameters:
this (UserSession) : - The user-defined session object that will hold the day and the time range selection
sess (string) : - The session string that represents the user session HHmm-HHmm,HHmm-HHmm:ddddddd
Returns: - The session time range object
method from_sess_string(this, sess, refTimezone)
from_sess_string - Initialize the user session object from the session string
Namespace types: UserSession
Parameters:
this (UserSession) : - The user-defined session object that will hold the day and the time range selection
sess (string) : - The session string that represents the user session HHmm-HHmm,HHmm-HHmm:ddddddd
refTimezone (simple string) : - The timezone of reference of the time ranges
Returns: - The session time range object
method nth_day_after(this, day, n)
nth_day_after - The nth day after the given day that is a session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
day (int) : - The day id of the reference day
n (int) : - The number of days after
Returns: - The day id of the nth session day of the week after the given day
method nth_day_before(this, day, n)
nth_day_before - The nth day before the given day that is a session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
day (int) : - The day id of the reference day
n (int) : - The number of days after
Returns: - The day id of the nth session day of the week before the given day
method next_day(this)
next_day - The next day that is a session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
Returns: - The day id of the next session day of the week
method previous_day(this)
previous_day - The previous day that is session day (true) in the object
Namespace types: SessionDays
Parameters:
this (SessionDays) : - The session days object with the day selection
Returns: - The day id of the previous session day of the week
method get_sec_in_day(this)
get_sec_in_day - Count the seconds since the start of the day this session time represents
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The number of seconds passed from the start of the day until that session time
method get_ms_in_day(this)
get_ms_in_day - Count the milliseconds since the start of the day this session time represents
Namespace types: SessionTime
Parameters:
this (SessionTime) : - The session time object with the hour and minute of the time of the day
Returns: - The number of milliseconds passed from the start of the day until that session time
method eq(this, other)
eq - Compare two bars
Namespace types: Bar
Parameters:
this (Bar) : - The bar object with the open and close times
other (Bar) : - The bar object to compare with
Returns: - Whether this bar is equal to the other one
method get_open_time(this)
get_open_time - The open time object
Namespace types: Bar
Parameters:
this (Bar) : - The bar object with the open and close times
Returns: - The open time object
method get_close_time(this)
get_close_time - The close time object
Namespace types: Bar
Parameters:
this (Bar) : - The bar object with the open and close times
Returns: - The close time object
method get_time_range(this)
get_time_range - Get the time range of the bar
Namespace types: Bar
Parameters:
this (Bar) : - The bar object with the open and close times
Returns: - The time range that the bar is in
getBarNow()
getBarNow - Get the current bar object with time and time_close timestamps
Returns: - The current bar
getFixedBarNow()
getFixedBarNow - Get the current bar with fixed width defined by the timeframe. Note: There are case like SPX 15min timeframe where the last session bar is only 10min. This will return a bar of 15 minutes
Returns: - The current bar
method is_in_window(this, win)
is_in_window - Check if the given bar is between the start and end dates of the window
Namespace types: Bar
Parameters:
this (Bar) : - The bar to check if it is between the from and to datetimes of the window
win (DateTimeWindow) : - The time window object with the from and to datetimes
Returns: - Whether the current bar is inside the datetime window
method is_in_timerange(this, rng)
is_in_timerange - Check if the given bar is inside the session time range
Namespace types: Bar
Parameters:
this (Bar) : - The bar to check if it is between the from and to datetimes
rng (SessionTimeRange) : - The session time range object with the start and end time of the daily session
Returns: - Whether the bar is inside the session time range and if this part of the next trading day
method is_in_days(this, days)
is_in_days - Check if the given bar is inside the session days
Namespace types: Bar
Parameters:
this (Bar) : - The bar to check if its day is a trading day
days (SessionDays) : - The session days object with the day selection
Returns: - Whether the current bar day is inside the session
method is_in_session(this, sess)
is_in_session - Check if the given bar is inside the session as defined by the input params (what "not na(time(timeframe.period, this.to_sess_string()) )" should return if you could write it
Namespace types: Bar
Parameters:
this (Bar) : - The bar to check if it is between the from and to datetimes
sess (UserSession) : - The user-defined session object with the day and the time range selection
Returns: - Whether the current time is inside the session
method next_bar(this, offsetBars)
next_bar - Predicts the next bars open and close time based on the charts session
Namespace types: ChartSession
Parameters:
this (ChartSession) : - The chart session object that contains the days and the time range shown in the chart
offsetBars (simple int) : - The number of bars forward
Returns: - Whether the current time is inside the session
DateTimeWindow
DateTimeWindow - Object that represents a datetime window with a beginning and an end
Fields:
fromDateTime (series int) : - The beginning of the datetime window
toDateTime (series int) : - The end of the datetime window
SessionDays
SessionDays - Object that represent the trading days of the week
Fields:
days (map) : - The map that contains all days of the week and their session flag
SessionTime
SessionTime - Object that represents the time (hour and minutes)
Fields:
hourInDay (series int) : - The hour of the day that ranges from 0 to 24
minuteInHour (series int) : - The minute of the hour that ranges from 0 to 59
minuteInDay (series int) : - The minute of the day that ranges from 0 to 1440. They will be calculated based on hourInDay and minuteInHour when method is called
SessionTimeRange
SessionTimeRange - Object that represents a range that extends from the start to the end time
Fields:
startTime (SessionTime) : - The beginning of the time range
endTime (SessionTime) : - The end of the time range
isOvernight (series bool) : - Whether or not this is an overnight time range
UserSession
UserSession - Object that represents a user-defined session
Fields:
days (SessionDays) : - The map of the user-defined trading days
timeRanges (SessionTimeRange ) : - The array with all time ranges of the user-defined session during the trading days
Bar
Bar - Object that represents the bars' open and close times
Fields:
openUnixTime (series int) : - The open time of the bar
closeUnixTime (series int) : - The close time of the bar
chartDayOfWeek (series int)
ChartSession
ChartSession - Object that represents the default session that is shown in the chart
Fields:
days (SessionDays) : - A map with the trading days shown in the chart
timeRange (SessionTimeRange) : - The time range of the session during a trading day
isFinalized (series bool)
Relative Volume (rVol), Better Volume, Average Volume ComparisonThis is the best version of relative volume you can find a claim which is based on the logical soundness of its calculation.
I have amalgamated various volume analysis into one synergistic script. I wasn't going to opensource it. But, as one of the lucky few winners of TradingClue 2. I felt obligated to give something back to the community.
Relative volume traditionally compares current volume to prior bar volume or SMA of volume. This has drawbacks. The question of relative volume is "Volume relative to what?" In the traditional scripts you'll find it displays current volume relative to the last number of bars. But, is that the best way to compare volume. On a daily chart, possibly. On a daily chart this can work because your units of time are uniform. Each day represents a full cycle of volume. However, on an intraday chart? Not so much.
Example: If you have a lookback of 9 on an hourly chart in a 24 hour market, you are then comparing the average volume from Midnight - 9 AM to the 9 AM volume. What do you think you'll find? Well at 9:30 when NY exchanges open the volume should be consistently and predictably higher. But though rVol is high relative to the lookback period, its actually just average or maybe even below average compared to prior NY session opens. But prior NY session opens are not included in the lookback and thus ignored.
This problem is the most visibly noticed when looking at the volume on a CME futures chart or some equivalent. In a 24 hour market, such as crypto, there are website's like skew can show you the volume disparity from time of day. This led me to believe that the traditional rVol calculation was insufficient. A better way to calculate it would be to compare the 9:30 am 30m bar today to the last week's worth of 9:30 am 30m bars. Then I could know whether today's volume at 9:30 am today is high or low based on prior 9:30 am bars. This seems to be a superior method on an intraday basis and is clearly superior in markets with irregular volume
This led me to other problems, such as markets that are open for less than 24 hours and holiday hours on traditional market exchanges. How can I know that the script is accurately looking at the correct prior relevant bars. I've created and/or adapted solutions to all those problems and these calculations and code snippets thus have value that extend beyond this rVol script for other pinecoders.
The Script
This rVol script looks back at the bars of the same time period on the viewing timeframe. So, as we said, the last 9:30 bars. Averages those, then divides the: . The result is a percentage expressed as x.xxx. Thus 1.0 mean current volume is equal to average volume. Below 1.0 is below the average and above 1.0 is above the average.
This information can be viewed on its own. But there are more levels of analysis added to it.
Above the bars are signals that correlate to the "Better Volume Indicator" developed by, I believe, the folks at emini-watch and originally adapted to pinescript by LazyBear. The interpretation of these symbols are in a table on the right of the indicator.
The volume bars can also be colored. The color is defined by the relationship between the average of the rVol outputs and the current volume. The "Average rVol" so to speak. The color coding is also defined by a legend in the table on the right.
These can be researched by you to determine how to best interpret these signals. I originally got these ideas and solid details on how to use the analysis from a fellow out there, PlanTheTrade.
I hope you find some value in the code and in the information that the indicator presents. And I'd like to thank the TradingView team for producing the most innovative and user friendly charting package on the market.
(p.s. Better Volume is provides better information with a longer lookback value than the default imo)
Credit for certain code sections and ideas is due to:
LazyBear - Better Volume
Grimmolf (From GitHub) - Logic for Loop rVol
R4Rocket - The idea for my rVol 1 calculation
And I can't find the guy who had the idea for the multiples of volume to the average. Tag him if you know him
Final Note: I'd like to leave a couple of clues of my own for fellow seekers of trading infamy.
Indicators: indicators are like anemometers (The things that measure windspeed). People talk bad about them all the time because they're "lagging." Well, you can't tell what the windspeed is unless the wind is blowing. anemometers are lagging indicators of wind. But forecasters still rely on them. You would use an indicator, which I would define as a instrument of measure, to tell you the windspeed of the markets. Conversely, when people talk positively about indicators they say "This one is great and this one is terrible." This is like a farmer saying "Shovels are great, but rakes are horrible." There are certain tools that have certain functions and every good tool has a purpose for a specific job. So the next time someone shares their opinion with you about indicators. Just smile and nod, realizing one day they'll learn... hopefully before they go broke.
How to forecast: Prediction is accomplished by analyzing the behavior of instruments of measure to aggregate data (using your anemometer). The data is then assembled into a predictive model based on the measurements observed (a trading system). That predictive model is tested against reality for it's veracity (backtesting). If the model is predictive, you can optimize your decision making by creating parameter sets around the prediction that are synergistic with the implications of the prediction (risk, stop loss, target, scaling, pyramiding etc).
<3
Stop Hunt Magnet Heatmap [mqsxn]The Stop Hunt Magnet Heatmap visualizes where clusters of equal highs and lows have formed, creating “magnet zones” of liquidity that price is often drawn toward. These zones represent the stop-loss pools of retail traders which is where smart money loves to hunt.
The script automatically detects these liquidity pockets and paints them as dimmed green (above highs) and dimmed red (below lows) zones on your chart. With its Bookmap-style evolving mode, you can watch the liquidity map accumulate historically as if the heatmap were run at every candle, giving you a unique visual edge on potential stop hunts.
✨ Features
Automatic liquidity detection based on swing highs/lows.
Granularity control to merge nearby levels into stronger zones.
Dynamic thickness to control zone visualization.
Price range limiter to keep the chart clean and focused.
Evolving Heatmap mode (Bookmap-style accumulation across history).
Full-Chart mode to stretch current magnets across the whole chart window.
Dimmed visuals so it blends seamlessly into your chart background.
⚙️ Inputs & Settings
Core Settings
- Swing Lookback (bars left/right): Defines how many candles to the left/right must confirm a -pivot high/low.
-Min Touches to Qualify: Minimum times a level must be tested before it is considered a magnet.
- Extend Heatmap Bars: How far forward to extend the drawn boxes/lines when not in full-chart or evolving mode.
-Level Granularity (ticks): Rounds detected levels to a grid of N ticks; merges nearby equal highs/lows.
- Zone Thickness (half-height, ticks): Vertical half-height of each magnet zone.
Scope Limits
- Limit price range to last N bars: Only generate magnets within the high/low window of the last N bars (avoids far-away levels).
Full-Chart Paint
- Paint CURRENT magnets across whole window: When enabled, extends current detected magnets all the way across the chart window.
- Full-Chart: draw back N bars: Defines how far back the full-chart magnets stretch.
Evolving Heatmap (per-bar)
- Accumulate heatmap per bar (Bookmap-style): When enabled, freezes liquidity zones from the moment they are detected and accumulates them over time, creating a historical heatmap.
- Evolving: keep at most last N bars of history: Limit how many bars back the evolving map is retained to avoid clutter and improve performance.
Visuals
- Liquidity Above Highs (Dimmed): Color for bullish stop-hunt zones (default lime, faint).
- Liquidity Below Lows (Dimmed): Color for bearish stop-hunt zones (default red, faint).
- Line Style: Choose how the outline of each zone is drawn (solid, dotted, dashed).
Follow @mqsxn for more!
Find more of my indicators and strategies in my Discord (7 day free trial): whop.com
Queso Heat IndexQueso Heat Index (QHI) — ATR-Adaptive Edge-Pressure Gauge
QHI measures how strongly price is pressing the edges of a rolling consolidation window. It heats up when price repeatedly pushes the window up , cools down when it pushes down , and drifts back toward neutral when price wanders in the middle. Everything is ATR-normalized so it adapts across symbols and timeframes.
Output: a signed score from −100 … +100
> 0 = bullish pressure (hot)
< 0 = bearish pressure (cold)
≈ 0 = neutral (no side dominating)
What you’ll see on the chart
Rolling “box” (Donchian window): top, bottom, and midline.
Optional compact-box shading when the window height is small relative to ATR.
Background “thermals”: tinted red when Heat > Hot threshold, blue when Heat < Cold threshold (intensity scales with the score).
Optional Heat line (−100..+100), optional 0/±80 thresholds, and optional push markers (PU/PD).
Optional table showing the current Heat score, placeable in any corner.
How it works (under the hood)
Consolidation window — Over lookback bars we track highest high (top), lowest low (bottom), and midpoint. The window is called “compact” when box height ≤ ATR × maxRangeATR .
ATR-based push detection — A bar is a push-up if high > prior window high + (epsATR × ATR + tick buffer) . A push-down if low < prior window low − (epsATR × ATR + tick buffer) . We also measure how many ATRs beyond the edge the bar traveled.
Heat gains (symmetric) — Each push adds/subtracts Heat:
base gain + streak bonus × consecutive pushes + magnitude bonus × ATRs beyond edge .
Decay toward neutral — Each bar, Heat decays by a percentage. Decay is:
– higher in the middle band of the box, and
– adaptive : the farther (in ATRs) from the relevant band (top when hot, bottom when cold), the faster it decays; hugging the band slows decay.
Midpoint bias (optional) — Gentle drift toward hot when trading above mid, toward cold when below mid, with a dead-zone near mid so tiny wobbles don’t matter.
Reset on regime flip (optional) — First valid push from the opposite side can snap Heat back to 0 before applying new gains.
How to read it
Rising hot with slow decay → strong upside pressure; pullbacks that hold near the top band often continue.
Flip to cold after being hot → regime change risk; tighten risk or consider the other side.
Compact window + rising hot (or cold) → squeeze-and-go conditions.
Neutral (≈ 0) → edges aren’t being pressured; expect mean-reversion inside the box.
Key inputs (what they do)
Window & ATR
lookback : size of the Donchian window (longer = smoother, slower).
atrLen : ATR period for all volatility-scaled thresholds.
maxRangeATR : defines “compact” windows for optional shading.
topBottomFrac : how thick the top/bottom bands are (used for decay/pressure logic).
Push detection (ATR-based)
epsATR : how many ATRs beyond the prior edge to count as a real push.
tickBuff : fixed extra ticks beyond the ATR epsilon (filters micro-breaches).
Heat gains
gainBase : main fuel per push.
gainPerStreak : rewards consecutive pushes.
gainPer1ATRBrk : adds more for stronger breakouts past the edge.
resetOppSide : snap back to 0 on the first opposite-side push.
Decay
decayPct : baseline % removed each bar.
decayAccelMid : multiplies decay when price is in the middle band.
adaptiveDecay , decayMinMult , decayPerATR , decayMaxMult : scale decay with ATR distance from the nearest “target” band (top if hot, bottom if cold).
Midpoint bias
useMidBias : enable/disable drift above/below midpoint.
midDeadFrac : width of neutral (no-drift) zone around mid.
midBiasPerBar : max drift per bar at the box edge.
Visuals (all default to OFF for a clean chart)
Plot Heat line + Show 0/±80 lines (only shows thresholds if Heat line is on).
Hot/Cold thresholds & transparency floors for background shading.
Push markers (PU/PD).
Heat score table : toggle on; choose any corner.
Tuning quick-starts
Daily trending equities : lookback 40–60; epsATR 0.10–0.25; gainBase 12–18; gainPerStreak 0.5–1.5; gainPer1ATRBrk 1–2; decayPct 3–6; adaptiveDecay ON (decayPerATR 0.5–0.8).
Intraday / noisy : raise epsATR and tickBuff to filter noise; keep decayPct modest so Heat can build.
Weekly swing : longer lookback/atrLen; slightly lower decayPct so regimes persist.
Alerts (included)
New window HIGH (push-up)
New window LOW (push-down)
Heat turned HOT (crosses above your Hot threshold)
Heat turned COLD (crosses below your Cold threshold)
Best practices & notes
Use QHI as a pressure gauge , not a standalone system—combine with your entry/exit plan and risk rules.
On thin symbols, increase epsATR and/or tickBuff to avoid spurious pushes.
Gap days can register large pushes; ATR scaling helps but consider context.
Want the Heat in a separate pane? Use the companion panel version; keep this overlay for background/box visuals.
Pine v6. Warm-up: values appear as soon as one bar of window history exists.
TL;DR
QHI quantifies how hard price is leaning on a consolidation edge.
It’s ATR-adaptive, streak- and magnitude-aware, and cools off intelligently when momentum fades.
Watch for thermals (background), the score (−100..+100), and fresh push alerts to time entries in the direction of pressure.
(MA-EWMA) with ChannelsHamming Windowed Volume-Weighted Bidirectional Momentum-Adaptive Exponential Weighted Moving Average
This script is an advanced financial indicator that calculates a Hamming Windowed Volume-Weighted Bidirectional Momentum-Adaptive Exponential Weighted Moving Average (MA-EWMA). It adapts dynamically to market conditions, adjusting key parameters like lookback period, momentum length, and volatility sensitivity based on price volatility.
Key Components:
Dynamic Adjustments: The indicator adjusts its lookback and momentum length using the ATR (Average True Range), making it more responsive to volatile markets.
Volume Weighting: It incorporates volume data, weighting the moving average based on the volume activity, adding further sensitivity to price movement.
Bidirectional Momentum: It calculates upward and downward momentum separately, using these values to determine the directional weighting of the moving average.
Hamming Window: This technique smooths the price data by applying a Hamming window, which helps to reduce noise in the data and enhances the accuracy of the moving average.
Channels: Instead of plotting a single line, the script creates dynamic channels, providing more context for support and resistance levels based on the market's behavior.
The result is a highly adaptive and sophisticated moving average indicator that responds dynamically to both price momentum and volume trends.
Prometheus Topological Persistent EntropyPersistence Entropy falls under the branch of math topology. Topology is a study of shapes as they twist and contort. It can be useful in the context of markets to determine how volatile they may be and different from the past.
The key idea is to create a persistence diagram from these log return segments. The persistence diagram tracks the "birth" and "death" of price features:
A birth occurs when a new price pattern or feature emerges in the data.
A death occurs when that pattern disappears.
By comparing prices within each segment, the script tracks how long specific price features persist before they die out. The lifetime of each feature (difference between death and birth) represents how robust or fleeting the pattern is. Persistent price features tend to reflect stable trends, while shorter-lived features indicate volatility.
Entropy Calculation: The lifetimes of these patterns are then used to compute the entropy of the system. Entropy, in this case, measures the amount of disorder or randomness in the price movements. The more varied the lifetimes, the higher the entropy, indicating a more volatile market. If the price patterns exhibit longer, more consistent lifetimes, the entropy is lower, signaling a more stable market.
Calculation:
We start by getting log returns for a user defined look back value. In the compute_persistent_entropy function we separate the overall log returns into windows. We then compute persistence diagrams of the windows. It tracks the birth and death of price patterns to see how persistent they are. Then we calculate the entropy of the windows.
After we go through that process we get an array of entropies, we then smooth it by taking the sum of all of them and dividing it by how many we have so the indicator can function better.
// Calculate log returns
log_returns = array.new()
for i = 1 to lgr_lkb
array.push(log_returns, math.log(close / close ))
// Function to compute a simplified persistence diagram
compute_persistence_diagram(segment) =>
n = array.size(segment)
lifetimes = array.new()
for i = 0 to n - 1
for j = i + 1 to n - 1
birth = array.get(segment, i)
death = array.get(segment, j-1)
if birth != death
array.push(lifetimes, math.abs(death - birth))
lifetimes
// Function to compute entropy of a list of values
compute_entropy(values) =>
n = array.size(values)
if n == 0
0.0
else
freq_map = map.new()
total_sum = 0.0
for i = 0 to n - 1
value = array.get(values, i)
//freq_map := freq_map.get(value, 0.0) + 1
map.put(freq_map, value, value + 1)
total_sum += 1
entropy = 0.0
for in freq_map
p = count / total_sum
entropy -= p * math.log(p)
entropy
compute_persistent_entropy(log_returns, window_size) =>
n = (lgr_lkb) - (2 * window_size) + 1
entropies = array.new()
for i = 0 to n - 1
segment1 = array.new()
segment2 = array.new()
for j = 0 to window_size - 1
array.push(segment1, array.get(log_returns, i + j))
array.push(segment2, array.get(log_returns, i + window_size + j))
dgm1 = compute_persistence_diagram(segment1)
dgm2 = compute_persistence_diagram(segment2)
combined_diagram = array.concat(dgm1, dgm2)
entropy = compute_entropy(combined_diagram)
array.push(entropies, entropy)
entropies
//---------------------------------------------
//---------------PE----------------------------
//---------------------------------------------
// Calculate Persistent Entropy
entropies = compute_persistent_entropy(log_returns, window_size)
smooth_pe = array.sum(entropies) / array.size(entropies)
This image illustrates how the indicator works for traders. The purple line is the actual indicator value. The line that changes from green to red is a SMA of the indicator value, we use this to determine bullish or bearish. When the smoothed persistence entropy is above it’s SMA that signals bearishness.
The indicator tends to look prettier on higher time frames, we see NASDAQ:TSLA on a 4 hour here and below we see it on the 5 minute.
On a lower time frame it looks a little weird but still functions the same way.
Prometheus encourages users to use indicators as tools along with their own discretion. No indicator is 100% accurate. We encourage comments about requested features and criticism.
Harmonic Rolling VWAP (Zeiierman)█ Overview
The Harmonic Rolling VWAP (Zeiierman) indicator combines the concept of the Rolling Volume Weighted Average Price (VWAP) with advanced harmonic analysis using Discrete Fourier Transform (DFT). This innovative indicator aims to provide traders with a dynamic view of price action, capturing both the volume-weighted price and underlying harmonic patterns. By leveraging this combination, traders can gain deeper insights into market trends and potential reversal points.
█ How It Works
The Harmonic Rolling VWAP calculates the rolling VWAP over a specified window of bars, giving more weight to periods with higher trading volume. This VWAP is then subjected to harmonic analysis using the Discrete Fourier Transform (DFT), which decomposes the VWAP into its frequency components.
Key Components:
Rolling VWAP (RVWAP): A moving average that gives more weight to higher volume periods, calculated over a user-defined window.
True Range (TR): Measures volatility by comparing the current high and low prices, considering the previous close price.
Discrete Fourier Transform (DFT): Analyzes the harmonic patterns within the RVWAP by decomposing it into its frequency components.
Standard Deviation Bands: These bands provide a visual representation of price volatility around the RVWAP, helping traders identify potential overbought or oversold conditions.
█ How to Use
Identify Trends: The RVWAP line helps in identifying the underlying trend by smoothing out short-term price fluctuations and focusing on volume-weighted prices.
Assess Volatility: The standard deviation bands around the RVWAP give a clear view of price volatility, helping traders identify potential breakout or breakdown points.
Find Entry and Exit Points: Traders can look for entries when the price is near the lower bands in an uptrend or near the upper bands in a downtrend. Exits can be considered when the price approaches the opposite bands or shows harmonic divergence.
█ Settings
VWAP Source: Defines the price data used for VWAP calculations. The source input defines the price data used for calculations. This setting affects the VWAP calculations and the resulting bands.
Window: Sets the number of bars used for the rolling calculations. The window input sets the number of bars used for the rolling calculations. A larger window smooths the VWAP and standard deviation bands, making the indicator less sensitive to short-term price fluctuations. A smaller window makes the indicator more responsive to recent price changes.
-----------------
Disclaimer
The information contained in my Scripts/Indicators/Ideas/Algos/Systems does not constitute financial advice or a solicitation to buy or sell any securities of any type. I will not accept liability for any loss or damage, including without limitation any loss of profit, which may arise directly or indirectly from the use of or reliance on such information.
All investments involve risk, and the past performance of a security, industry, sector, market, financial product, trading strategy, backtest, or individual's trading does not guarantee future results or returns. Investors are fully responsible for any investment decisions they make. Such decisions should be based solely on an evaluation of their financial circumstances, investment objectives, risk tolerance, and liquidity needs.
My Scripts/Indicators/Ideas/Algos/Systems are only for educational purposes!
Nick_OS RangesUNDERSTANDING THE SCRIPT:
TIMEFRAME RESOLUTION:
* You have the option to choose Daily , Weekly , or Monthly
LOOKBACK WINDOW:
* This number represents how far back you want the data to pull from
- Example: "250" would represent the past 250 Days, Weeks, or Months depending on what is selected in the Timeframe Resolution
RANGE 1 nth (Gray lines):
* This number represents the range of the nth biggest day, week, or month in the Lookback Window
- Example: "30" would represent the range of the 30th biggest day in the past 250 days. (If the Lookback Window is "250")
RANGE 2 nth (Blue lines):
* This number represents the range of the nth biggest day, week, or month in the Lookback Window
- Example: "10" would represent the range of the 10th biggest day in the past 250 days. (If the Lookback Window is "250")
RANGE 3 nth (Pink lines):
* This number represents the range of the nth biggest day, week, or month in the Lookback Window
- Example: "3" would represent the range of the 3rd biggest day in the past 250 days. (If the Lookback Window is "250")
YELLOW LINES:
* The yellow lines are the average percentage move of the inputted number in the Lookback Window
SUGGESTED INPUTS:
FOR DAILY:
Lookback Window: 250
Range 1 nth: 30
Range 2 nth: 10
Range 3 nth: 3
FOR WEEKLY:
Lookback Window: 50
Range 1 nth: 10
Range 2 nth: 5
Range 3 nth: 2
FOR MONTHLY:
Lookback Window: 12
Range 1 nth: 3
Range 2 nth: 2
Range 3 nth: 1
TIMEFRAMES TO USE (If You Have TradingView Premium):
Daily: 5 minute timeframe and higher (15 minute timeframe and higher for Futures)
Weekly: 15 minute timeframe and higher
Monthly: Daily timeframe and higher (Monthly still has issues)
TIMEFRAMES TO USE (If You DO NOT Have TradingView Premium):
Daily: 15 minute timeframe and higher
Weekly: 30 minute timeframe and higher
Monthly: Daily timeframe and higher (Monthly still has issues)
IMPORTANT RELATED NOTE:
If you decide to use a higher Lookback Window, the ranges might be off and the timeframes listed above might not apply
ISSUES THAT MIGHT BE RESOLVED IN THE FUTURE
1. If it is a shortened week (No Monday or Friday), then the Weekly Ranges will show the same ranges as last week
2. Monthly ranges will change based on any timeframe used
REVELATIONS (VoVix - PoC) REVELATIONS (VoVix - POC): True Regime Detection Before the Move
Let’s not sugarcoat it: Most strategies on TradingView are recycled—RSI, MACD, OBV, CCI, Stochastics. They all lag. No matter how many overlays you stack, every one of these “standard” indicators fires after the move is underway. The retail crowd almost always gets in late. That’s never been enough for my team, for DAFE, or for anyone who’s traded enough to know the real edge vanishes by the time the masses react.
How is this different?
REVELATIONS (VoVix - POC) was engineered from raw principle, structured to detect pre-move regime change—before standard technicals even light up. We built, tested, and refined VoVix to answer one hard question:
What if you could see the spike before the trend?
Here’s what sets this system apart, line-by-line:
o True volatility-of-volatility mathematics: It’s not just "ATR of ATR" or noise smoothing. VoVix uses normalized, multi-timeframe v-vol spikes, instantly detecting orderbook stress and "outlier" market events—before the chart shows them as trends.
o Purist regime clustering: Every trade is enabled only during coordinated, multi-filter regime stress. No more signals in meaningless chop.
o Nonlinear entry logic: No trade is ever sent just for a “good enough” condition. Every entry fires only if every requirement is aligned—local extremes, super-spike threshold, regime index, higher timeframe, all must trigger in sync.
o Adaptive position size: Your contracts scale up with event strength. Tiny size during nominal moves, max leverage during true regime breaks—never guesswork, never static exposure.
o All exits governed by regime decay logic: Trades are closed not just on price targets but at the precise moment the market regime exhausts—the hardest part of systemic trading, now solved.
How this destroys the lag:
Standard indicators (RSI, MACD, OBV, CCI, and even most “momentum” overlays) simply tell you what already happened. VoVix triggers as price structure transitions—anyone running these generic scripts will trade behind the move while VoVix gets in as stress emerges. Real alpha comes from anticipation, not confirmation.
The visuals only show what matters:
Top right, you get a live, live quant dashboard—regime index, current position size, real-time performance (Sharpe, Sortino, win rate, and wins). Bottom right: a VoVix "engine bar" that adapts live with regime stress. Everything you see is a direct function of logic driving this edge—no cosmetics, no fake momentum.
Inputs/Signals—explained carefully for clarity:
o ATR Fast Length & ATR Slow Length:
These are the heart of VoVix’s regime sensing. Fast ATR reacts to sharp volatility; Slow ATR is stability baseline. Lower Fast = reacts to every twitch; higher Slow = requires more persistent, “real” regime shifts.
Tip: If you want more signals or faster markets, lower ATR Fast. To eliminate noise, raise ATR Slow.
o ATR StdDev Window: Smoothing for volatility-of-volatility normalization. Lower = more jumpy, higher = only the cleanest spikes trigger.
Tip: Shorten for “jumpy” assets, raise for indices/futures.
o Base Spike Threshold: Think of this as your “minimum event strength.” If the current move isn’t volatile enough (normalized), no signal.
Tip: Higher = only biggest moves matter. Lower for more signals but more potential noise.
o Super Spike Multiplier: The “are you sure?” test—entry only when the current spike is this multiple above local average.
Tip: Raise for ultra-selective/swing-trading; lower for more active style.
Regime & MultiTF:
o Regime Window (Bars):
How many bars to scan for regime cluster “events.” Short for turbo markets, long for big swings/trends only.
o Regime Event Count: Only trade when this many spikes occur within the Regime Window—filters for real stress, not isolated ticks.
Tip: Raise to only ever trade during true breakouts/crashes.
o Local Window for Extremes:
How many bars to check that a spike is a local max.
Tip: Raise to demand only true, “clearest” local regime events; lower for early triggers.
o HTF Confirm:
Higher timeframe regime confirmation (like 45m on an intraday chart). Ensures any event you act on is visible in the broader context.
Tip: Use higher timeframes for only major moves; lower for scalping or fast regimes.
Adaptive Sizing:
o Max Contracts (Adaptive): The largest size your system will ever scale to, even on extreme event.
Tip: Lower for small accounts/conservative risk; raise on big accounts or when you're willing to go big only on outlier events.
o Min Contracts (Adaptive): The “toe-in-the-water.” Smallest possible trade.
Tip: Set as low as your broker/exchange allows for safety, or higher if you want to always have meaningful skin in the game.
Trade Management:
o Stop %: Tightness of your stop-loss relative to entry. Lower for tighter/safer, higher for more breathing room at cost of greater drawdown.
o Take Profit %: How much you'll hold out for on a win. Lower = more scalps. Higher = only run with the best.
o Decay Exit Sensitivity Buffer: Regime index must dip this far below the trading threshold before you exit for “regime decay.”
Tip: 0 = exit as soon as stress fails, higher = exits only on stronger confirmation regime is over.
o Bars Decay Must Persist to Exit: How long must decay be present before system closes—set higher to avoid quick fades and whipsaws.
Backtest Settings
Initial capital: $10,000
Commission: Conservative, realistic roundtrip cost:
15–20 per contract (including slippage per side) I set this to $25
Slippage: 3 ticks per trade
Symbol: CME_MINI:NQ1!
Timeframe: 1 min (but works on all timeframes)
Order size: Adaptive, 1–3 contracts
No pyramiding, no hidden DCA
Why these settings?
These settings are intentionally strict and realistic, reflecting the true costs and risks of live trading. The 10,000 account size is accessible for most retail traders. 25/contract including 3 ticks of slippage are on the high side for NQ, ensuring the strategy is not curve-fit to perfect fills. If it works here, it will work in real conditions.
Tip: Set to 1 for instant regime exit; raise for extra confirmation (less whipsaw risk, exits held longer).
________________________________________
Bottom line: Tune the sensitivity, selectivity, and risk of REVELATIONS by these inputs. Raise thresholds and windows for only the best, most powerful signals (institutional style); lower for activity (scalpers, fast cryptos, signals in constant motion). Sizing is always adaptive—never static or martingale. Exits are always based on both price and regime health. Every input is there for your control, not to sell “complexity.” Use with discipline, and make it your own.
This strategy is not just a technical achievement: It’s a statement about trading smarter, not just more.
* I went back through the code to make sure no the strategy would not suffer from repainting, forward looking, or any frowned upon loopholes.
Disclaimer:
Trading is risky and carries the risk of substantial loss. Do not use funds you aren’t prepared to lose. This is for research and informational purposes only, not financial advice. Backtest, paper trade, and know your risk before going live. Past performance is not a guarantee of future results.
Expect more: We’ll keep pushing the standard, keep evolving the bar until “quant” actually means something in the public code space.
Use with clarity, use with discipline, and always trade your edge.
— Dskyz , for DAFE Trading Systems
Stochastic Z-Score Oscillator Strategy [TradeDots]The "Stochastic Z-Score Oscillator Strategy" represents an enhanced approach to the original "Buy Sell Strategy With Z-Score" trading strategy. Our upgraded Stochastic model incorporates an additional Stochastic Oscillator layer on top of the Z-Score statistical metrics, which bolsters the affirmation of potential price reversals.
We also revised our exit strategy to when the Z-Score revert to a level of zero. This amendment gives a much smaller drawdown, resulting in a better win-rate compared to the original version.
HOW DOES IT WORK
The strategy operates by calculating the Z-Score of the closing price for each candlestick. This allows us to evaluate how significantly the current price deviates from its typical volatility level.
The strategy first takes the scope of a rolling window, adjusted to the user's preference. This window is used to compute both the standard deviation and mean value. With these values, the strategic model finalizes the Z-Score. This determination is accomplished by subtracting the mean from the closing price and dividing the resulting value by the standard deviation.
Following this, the Stochastic Oscillator is utilized to affirm the Z-Score overbought and oversold indicators. This indicator operates within a 0 to 100 range, so a base adjustment to match the Z-Score scale is required. Post Stochastic Oscillator calculation, we recalibrate the figure to lie within the -4 to 4 range.
Finally, we compute the average of both the Stochastic Oscillator and Z-Score, signaling overpriced or underpriced conditions when the set threshold of positive or negative is breached.
APPLICATION
Firstly, it is better to identify a stable trading pair for this technique, such as two stocks with considerable correlation. This is to ensure conformance with the statistical model's assumption of a normal Gaussian distribution model. The ideal performance is theoretically situated within a sideways market devoid of skewness.
Following pair selection, the user should refine the span of the rolling window. A broader window smoothens the mean, more accurately capturing long-term market trends, while potentially enhancing volatility. This refinement results in fewer, yet precise trading signals.
Finally, the user must settle on an optimal Z-Score threshold, which essentially dictates the timing for buy/sell actions when the Z-Score exceeds with thresholds. A positive threshold signifies the price veering away from its mean, triggering a sell signal. Conversely, a negative threshold denotes the price falling below its mean, illustrating an underpriced condition that prompts a buy signal.
Within a normal distribution, a Z-Score of 1 records about 68% of occurrences centered at the mean, while a Z-Score of 2 captures approximately 95% of occurrences.
The 'cool down period' is essentially the number of bars that await before the next signal generation. This feature is employed to dodge the occurrence of multiple signals in a short period.
DEFAULT SETUP
The following is the default setup on EURAUD 1h timeframe
Rolling Window: 80
Z-Score Threshold: 2.8
Signal Cool Down Period: 5
Stochastic Length: 14
Stochastic Smooth Period: 7
Commission: 0.01%
Initial Capital: $10,000
Equity per Trade: 40%
FURTHER IMPLICATION
The Stochastic Oscillator imparts minimal impact on the current strategy. As such, it may be beneficial to adjust the weightings between the Z-Score and Stochastic Oscillator values or the scale of Stochastic Oscillator to test different performance outcomes.
Alternative momentum indicators such as Keltner Channels or RSI could also serve as robust confirmations of overbought and oversold signals when used for verification.
RISK DISCLAIMER
Trading entails substantial risk, and most day traders incur losses. All content, tools, scripts, articles, and education provided by TradeDots serve purely informational and educational purposes. Past performances are not definitive predictors of future results.
Buy Sell Strategy With Z-Score [TradeDots]The "Buy Sell Strategy With Z-Score" is a trading strategy that harnesses Z-Score statistical metrics to identify potential pricing reversals, for opportunistic buying and selling opportunities.
HOW DOES IT WORK
The strategy operates by calculating the Z-Score of the closing price for each candlestick. This allows us to evaluate how significantly the current price deviates from its typical volatility level.
The strategy first takes the scope of a rolling window, adjusted to the user's preference. This window is used to compute both the standard deviation and mean value. With these values, the strategic model finalizes the Z-Score. This determination is accomplished by subtracting the mean from the closing price and dividing the resulting value by the standard deviation.
This approach provides an estimation of the price's departure from its traditional trajectory, thereby identifying market conditions conducive to an asset being overpriced or underpriced.
APPLICATION
Firstly, it is better to identify a stable trading pair for this technique, such as two stocks with considerable correlation. This is to ensure conformance with the statistical model's assumption of a normal Gaussian distribution model. The ideal performance is theoretically situated within a sideways market devoid of skewness.
Following pair selection, the user should refine the span of the rolling window. A broader window smoothens the mean, more accurately capturing long-term market trends, while potentially enhancing volatility. This refinement results in fewer, yet precise trading signals.
Finally, the user must settle on an optimal Z-Score threshold, which essentially dictates the timing for buy/sell actions when the Z-Score exceeds with thresholds. A positive threshold signifies the price veering away from its mean, triggering a sell signal. Conversely, a negative threshold denotes the price falling below its mean, illustrating an underpriced condition that prompts a buy signal.
Within a normal distribution, a Z-Score of 1 records about 68% of occurrences centered at the mean, while a Z-Score of 2 captures approximately 95% of occurrences.
The 'cool down period' is essentially the number of bars that await before the next signal generation. This feature is employed to dodge the occurrence of multiple signals in a short period.
DEFAULT SETUP
The following is the default setup on EURUSD 1h timeframe
Rolling Window: 80
Z-Score Threshold: 2.8
Signal Cool Down Period: 5
Commission: 0.03%
Initial Capital: $10,000
Equity per Trade: 30%
RISK DISCLAIMER
Trading entails substantial risk, and most day traders incur losses. All content, tools, scripts, articles, and education provided by TradeDots serve purely informational and educational purposes. Past performances are not definitive predictors of future results.
FUMO 200 MagnetWhat it does
FUMO Magnet measures how far price has stretched away from its long-term “magnet” — a blended EMA/SMA moving average (200 by default).
It plots a logarithmic deviation (optionally normalized) as an oscillator around zero.
Above 0** → price is above the magnet (stretched up)
Below 0** → price is below the magnet (stretched down)
Guide levels** highlight potential overbought/oversold zones
---
Why log deviation?
Log returns make extremes comparable across cycles and compress exponential trends — especially useful for BTC and other crypto assets.
Normalization modes further adjust the scale, keeping the oscillator readable on any chart.
---
Inputs
**Base**
* Source (default: Close)
* Base Length (default: 200 EMA/SMA)
* EMA vs SMA weight (%) — 0% = pure SMA, 100% = pure EMA, 50% = blended
* EMA smoothing of deviation — acts as a noise filter
**Normalization**
* None (Log Deviation) — raw log stretch in % terms
* Z-score — deviation in standard deviations (σ)
* Robust Z (MAD) — deviation vs median absolute deviation, resistant to outliers
* Tanh squash — smooth nonlinear squash of extremes for compact scale
* Normalization window (for Z / MAD)
* Tanh scale (lower = stronger squash)
* Clamp after normalization — hard cap at ±X
**Levels**
* Guide levels (Upper / Lower) — visual thresholds (default ±12)
* Zero line toggle
---
### How to read it
* **Trend bias**: sustained time above 0 = uptrend, below 0 = downtrend
* **Stretch / mean reversion**: the farther from 0, the higher the reversion risk
* **Cross-checks**: combine with structure (HH/HL, LH/LL), volume, or momentum (RSI, MACD)
---
### Recommended settings by timeframe
**Long-term (1D / 1W)**
* Normalization: None (Log Deviation)
* Base Length: 200
* EMA vs SMA weight: 50% (adjust 35–65% for faster/slower magnet)
* Deviation smoothing: 20 (10–30 range)
* Guide levels: ±12 to ±20
* Use case: cycle extremes, portfolio rebalancing, trim/add logic
**Swing (4H – 1D)**
* Normalization: Z-score
* Window: 200 (100–250)
* Smoothing: 14–20
* Guide levels: ±2σ to ±3σ
* Use case: stretched conditions across regimes; ±3σ is rare, often mean-reverts
**Intraday / Active swing (1H – 4H)**
* Normalization: Robust Z (MAD)
* Window: 200 (150 for faster response)
* Smoothing: 10–16
* Guide levels: ±3 to ±4 (robust units)
* Use case: handles spikes better than σ, fewer false overbought/oversold signals
**Scalping / Universal readability (15m – 1H)**
* Normalization: Tanh squash
* Tanh scale: 6–10 (start with 8)
* Smoothing: 8–12
* Guide levels: ±8 to ±12
* Use case: compact panel across assets and timeframes; not % or σ, but visually consistent
---
### Optional
* Clamp: enable ±20 (or ±25) for strict bounded range (useful for public charts)
---
### Quick setups
**BTC Daily (“cycle view”)**
* Normalization: None
* Blend: 50%
* Smooth: 20
* Levels: ±12–15
**BTC 4H (“swing”)**
* Normalization: Z-score
* Window: 200
* Smooth: 16
* Levels: ±2.5σ to ±3σ
**Alts 1H (“volatile”)**
* Normalization: Robust Z (MAD)
* Window: 200
* Smooth: 12
* Levels: ±3.5 to ±4.5
**Mixed assets 15m (“compact panel”)**
* Normalization: Tanh squash
* Scale: 8
* Smooth: 10
* Levels: ±8–12
* Clamp: ±20
ArraysAssorted🟩 OVERVIEW
This library provides utility methods for working with arrays in Pine Script. The first method finds extreme values (highest/lowest) within a rolling lookback window and returns both the value and its position. I might extend the library for other ad-hoc methods I use to work with arrays.
🟩 HOW TO USE
Pine Script libraries contain reusable code for importing into indicators. You do not need to copy any code out of here. Just import the library and call the method you want.
For example, for version 1 of this library, import it like this:
import SimpleCryptoLife/ArraysAssorted/1
See the EXAMPLE USAGE sections within the library for examples of calling the methods.
You do not need permission to use Pine libraries in your open-source scripts.
However, you do need explicit permission to reuse code from a Pine Script library’s functions in a public protected or invite-only publication .
In any case, credit the author in your description. It is also good form to credit in open-source comments.
For more information on libraries and incorporating them into your scripts, see the Libraries section of the Pine Script User Manual.
🟩 METHOD 1: m_getHighestLowestFloat()
Finds the highest or lowest float value from an array. Simple enough. It also returns the index of the value as an offset from the end of the array.
• It works with rolling lookback windows, so you can find extremes within the last N elements
• It includes an offset parameter to skip recent elements if needed
• It handles edge cases like empty arrays and invalid ranges gracefully
• It can find either the first or last occurrence of the extreme value
We also export two enums whose sole purpose is to look pretty as method arguments.
method m_getHighestLowestFloat(_self, _highestLowest, _lookbackBars, _offset, _firstLastType)
Namespace types: array
This method finds the highest or lowest value in a float array within a rolling lookback window, and returns the value along with the offset (number of elements back from the end of the array) of its first or last occurrence.
Parameters:
_self (array) : The array of float values to search for extremes.
_highestLowest (HighestLowest) : Whether to search for the highest or lowest value. Use the enum value HighestLowest.highest or HighestLowest.lowest.
_lookbackBars (int) : The number of array elements to include in the rolling lookback window. Must be positive. Note: Array elements only correspond to bars if the consuming script always adds exactly one element on consecutive bars.
_offset (int) : The number of array elements back from the end of the array to start the lookback window. A value of zero means no offset. The _offset parameter offsets both the beginning and end of the range.
_firstLastType (FirstLast) : Whether to return the offset of the first (lowest index) or last (highest index) occurrence of the extreme value. Use FirstLast.first or FirstLast.last.
Returns: (tuple) A tuple containing the highest or lowest value and its offset -- the number of elements back from the end of the array. If not found, returns . NOTE: The _offsetFromEndOfArray value is not affected by the _offset parameter. In other words, it is not the offset from the end of the range but from the end of the array. This number may or may not have any relation to the number of *bars* back, depending on how the array is populated. The calling code needs to figure that out.
EXPORTED ENUMS
HighestLowest
Whether to return the highest value or lowest value in the range.
• highest : Find the highest value in the specified range
• lowest : Find the lowest value in the specified range
FirstLast
Whether to return the first (lowest index) or last (highest index) occurrence of the extreme value.
• first : Return the offset of the first occurrence of the extreme value
• last : Return the offset of the last occurrence of the extreme value
C&B Auto MK5C&B Auto MK5.2ema BullBear
Overview
The C&B Auto MK5.2ema BullBear is a versatile Pine Script indicator designed to help traders identify bullish and bearish market conditions across various timeframes. It combines Exponential Moving Averages (EMAs), Relative Strength Index (RSI), Average True Range (ATR), and customizable time filters to generate actionable signals. The indicator overlays on the price chart, displaying EMAs, a dynamic cloud, scaled RSI levels, bull/bear signals, and market condition labels, making it suitable for swing trading, day trading, or scalping in trending or volatile markets.
What It Does
This indicator generates bull and bear signals based on the interaction of two EMAs, filtered by RSI thresholds, ATR-based volatility, a 50/200 EMA trend filter, and user-defined time windows. It adapts to market volatility by adjusting EMA lengths and RSI thresholds. A dynamic cloud highlights trend direction or neutral zones, with candlestick coloring in neutral conditions. Market condition labels (current and historical) provide real-time trend and volatility context, displayed above the chart.
How It Works
The indicator uses the following components:
EMAs: Two EMAs (short and long) are calculated on a user-selected timeframe (1, 5, 15, 30, or 60 minutes). Their crossover or crossunder triggers potential bull/bear signals. EMA lengths adjust based on volatility (e.g., 10/20 for volatile markets, 5/10 for non-volatile).
Dynamic Cloud: The area between the EMAs forms a cloud, colored green for bullish trends, red for bearish trends, or a user-defined color (default yellow) for neutral zones (when EMAs are close, determined by an ATR-based threshold). Users can widen the cloud for visibility.
RSI Filter: RSI is scaled to price levels and plotted on the chart (optional). Signals are filtered to ensure RSI is within volatility-adjusted bull/bear thresholds and not in overbought/oversold zones.
ATR Volatility Filter: An optional filter ensures signals occur during sufficient volatility (ATR(14) > SMA(ATR, 20)).
50/200 EMA Trend Filter: An optional filter restricts bull signals to bullish trends (50 EMA > 200 EMA) and bear signals to bearish trends (50 EMA < 200 EMA).
Time Filter: Signals are restricted to a user-defined UTC time window (default 9:00–15:00), aligning with active trading sessions.
Market Condition Labels: Labels above the chart display the current trend (Bullish, Bearish, Neutral) and optionally volatility (e.g., “Bullish Volatile”). Up to two historical labels persist for a user-defined number of bars (default 5) to show recent trend changes.
Visual Aids: Bull signals appear as green triangles/labels below the bar, bear signals as red triangles/labels above. Candlesticks in neutral zones are colored (default yellow).
The indicator ensures compatibility with standard chart types (e.g., candlestick or bar charts) to produce realistic signals, avoiding non-standard types like Heikin Ashi or Renko.
How to Use It
Add to Chart: Apply the indicator to a candlestick or bar chart on TradingView.
Configure Settings:
Timeframe: Choose a timeframe (1, 5, 15, 30, or 60 minutes) to match your trading style.
Filters:
Enable/disable the ATR volatility filter to focus on high-volatility periods.
Enable/disable the 50/200 EMA trend filter to align signals with the broader trend.
Enable the time filter and set custom UTC hours/minutes (default 9:00–15:00).
Cloud Settings: Adjust the cloud width, neutral zone threshold, color, and transparency.
EMA Colors: Use default trend-based colors or set custom colors for short/long EMAs.
RSI Display: Toggle the scaled RSI and its thresholds, with customizable colors.
Signal Settings: Toggle bull/bear labels and set signal colors.
Market Condition Labels: Toggle current/historical labels, include/exclude volatility, and adjust decay period.
Interpret Signals:
Bull Signal: A green triangle or “Bull” label below the bar indicates potential bullish momentum (EMA crossover, RSI above bull threshold, within time window, passing filters).
Bear Signal: A red triangle or “Bear” label above the bar indicates potential bearish momentum (EMA crossunder, RSI below bear threshold, within time window, passing filters).
Neutral Zone: Yellow candlesticks and cloud (if enabled) suggest a lack of clear trend; consider range-bound strategies or avoid trading.
Market Condition Labels: Check labels above the chart for real-time trend (Bullish, Bearish, Neutral) and volatility status to confirm market context.
Monitor Context: Use the cloud, RSI, and labels to assess trend strength and volatility before acting on signals.
Unique Features
Volatility-Adaptive EMAs: Automatically adjusts EMA lengths based on ATR to suit volatile or non-volatile markets, reducing manual configuration.
Neutral Zone Detection: Uses an ATR-based threshold to identify low-trend periods, helping traders avoid choppy markets.
Scaled RSI Visualization: Plots RSI and thresholds directly on the price chart, simplifying momentum analysis relative to price.
Flexible Time Filtering: Supports precise UTC-based trading windows, ideal for day traders targeting specific sessions.
Historical Market Labels: Displays recent trend changes (up to two) with a decay period, providing context for market shifts.
50/200 EMA Trend Filter: Aligns signals with the broader market trend, enhancing signal reliability.
Notes
Use on standard candlestick or bar charts to ensure accurate signals.
Test the indicator on a demo account to optimize settings for your market and timeframe.
Combine with other analysis (e.g., support/resistance, volume) for better decision-making.
The indicator is not a standalone system; use it as part of a broader trading strategy.
Limitations
Signals may lag in fast-moving markets due to EMA-based calculations.
Neutral zone detection may vary in extremely volatile or illiquid markets.
Time filters are UTC-based; ensure your platform’s timezone settings align.
This indicator is designed for traders seeking a customizable, trend-following tool that adapts to volatility and provides clear visual cues with robust filtering for bullish and bearish market conditions.
Adaptive Freedom Machine w/labelsAdaptive Freedom Machine w/ Labels
Overview
The Adaptive Freedom Machine w/ Labels is a versatile Pine Script indicator designed to assist traders in identifying buy and sell opportunities across various market conditions (trending, ranging, or volatile). It combines Exponential Moving Averages (EMAs), Relative Strength Index (RSI), Average True Range (ATR), and customizable time filters to generate actionable signals. The indicator overlays on the price chart, displaying EMAs, a dynamic cloud, scaled RSI levels, buy/sell signals, and market condition labels, making it suitable for swing trading, day trading, or scalping.
What It Does
This indicator generates buy and sell signals based on the interaction of two EMAs, filtered by RSI thresholds, ATR-based volatility, and user-defined time windows. It adapts to the selected market condition by adjusting EMA lengths, RSI thresholds, and trading hours. A dynamic cloud highlights trend direction or neutral zones, and candlestick bodies are colored in neutral conditions for clarity. A table displays real-time trend and volatility status.
How It Works
The indicator uses the following components:
EMAs: Two EMAs (short and long) are calculated on a user-selected timeframe (1, 5, 15, 30, or 60 minutes). Their crossover or crossunder generates potential buy/sell signals, with lengths adjusted based on the market condition (e.g., longer EMAs for trending markets, shorter for ranging).
Dynamic Cloud: The area between the EMAs forms a cloud, colored green for uptrends, red for downtrends, or a user-defined color (default yellow) for neutral zones (when EMAs are close, determined by an ATR-based threshold). Users can widen the cloud for visibility.
RSI Filter: RSI is scaled to price levels and plotted on the chart (optional). Signals are filtered to ensure RSI is within user-defined buy/sell thresholds and not in overbought/oversold zones, with thresholds tailored to the market condition.
ATR Volatility Filter: An optional filter ensures signals occur during sufficient volatility (ATR(14) > SMA(ATR, 20)).
Time Filter: Signals are restricted to a user-defined or market-specific time window (e.g., 10:00–15:00 UTC for volatile markets), with an option for custom hours.
Visual Aids: Buy/sell signals appear as green triangles (buy) or red triangles (sell). Candlesticks in neutral zones are colored (default yellow). A table in the top-right corner shows the current trend (Uptrend, Downtrend, Neutral) and volatility (High or Low).
The indicator ensures compatibility with standard chart types (e.g., candlestick charts) to produce realistic signals, avoiding non-standard types like Heikin Ashi or Renko.
How to Use It
Add to Chart: Apply the indicator to a candlestick or bar chart on TradingView.
Configure Settings:
Timeframe: Choose a timeframe (1, 5, 15, 30, or 60 minutes) to align with your trading style.
Market Condition: Select one market condition (Trending, Ranging, or Volatile). Volatile is the default if none is selected. Only one condition can be active.
Filters:
Enable/disable the ATR volatility filter to trade only in high-volatility periods.
Enable the time filter and choose default hours (specific to the market condition) or set custom UTC hours.
Cloud Settings: Adjust the cloud width, neutral zone threshold, and color. Enable/disable the neutral cloud.
RSI Display: Toggle the scaled RSI and its thresholds on the chart.
Interpret Signals:
Buy Signal: A green triangle below the bar indicates a potential long entry (EMA crossover, RSI above buy threshold, within time window, and passing volatility filter).
Sell Signal: A red triangle above the bar indicates a potential short entry (EMA crossunder, RSI below sell threshold, within time window, and passing volatility filter).
Neutral Zone: Yellow candlesticks and cloud (if enabled) suggest a lack of clear trend; avoid trading or use for range-bound strategies.
Monitor the Table: Check the top-right table for real-time trend (Uptrend, Downtrend, Neutral) and volatility (High or Low) to confirm market context.
Unique Features
Adaptive Parameters: Automatically adjusts EMA lengths, RSI thresholds, and trading hours based on the selected market condition, reducing manual tweaking.
Neutral Zone Detection: Uses an ATR-based threshold to identify low-trend periods, helping traders avoid choppy markets.
Scaled RSI Visualization: Plots RSI and thresholds directly on the price chart, making it easier to assess momentum relative to price action.
Flexible Time Filtering: Supports both default and custom UTC-based trading windows, ideal for day traders targeting specific sessions.
Dynamic Cloud: Enhances trend visualization with customizable width and neutral zone coloring, improving readability.
Notes
Use on standard candlestick or bar charts to ensure realistic signals.
Test the indicator on a demo account to understand its behavior in your chosen market and timeframe.
Adjust settings to match your trading strategy, but avoid over-optimizing for past data.
The indicator is not a standalone system; combine it with other analysis (e.g., support/resistance, news events) for better results.
Limitations
Signals may lag in fast-moving markets due to EMA-based calculations.
Neutral zone detection may vary in extremely volatile or illiquid markets.
Time filters are UTC-based; ensure your platform’s timezone settings align.
This indicator is designed for traders seeking a customizable, trend-following tool that adapts to different market environments while providing clear visual cues and robust filtering.
Silver Bullet ICT Strategy [TradingFinder] 10-11 AM NY Time +FVG🔵 Introduction
The ICT Silver Bullet trading strategy is a precise, time-based algorithmic approach that relies on Fair Value Gaps and Liquidity to identify high-probability trade setups. The strategy primarily focuses on the New York AM Session from 10:00 AM to 11:00 AM, leveraging heightened market activity within this critical window to capture short-term trading opportunities.
As an intraday strategy, it is most effective on lower timeframes, with ICT recommending a 15-minute chart or lower. While experienced traders often utilize 1-minute to 5-minute charts, beginners may find the 1-minute timeframe more manageable for applying this strategy.
This approach specifically targets quick trades, designed to take advantage of market movements within tight one-hour windows. By narrowing its focus, the Silver Bullet offers a streamlined and efficient method for traders to capitalize on liquidity shifts and price imbalances with precision.
In the fast-paced world of forex trading, the ability to identify market manipulation and false price movements is crucial for traders aiming to stay ahead of the curve. The Silver Bullet Indicator simplifies this process by integrating ICT principles such as liquidity traps, Order Blocks, and Fair Value Gaps (FVG).
These concepts form the foundation of a tool designed to mimic the strategies of institutional players, empowering traders to align their trades with the "smart money." By transforming complex market dynamics into actionable insights, the Silver Bullet Indicator provides a powerful framework for short-term trading success
Silver Bullet Bullish Setup :
Silver Bullet Bearish Setup :
🔵 How to Use
The Silver Bullet Indicator is a specialized tool that operates within the critical time windows of 9:00-10:00 and 10:00-11:00 in the forex market. Its design incorporates key principles from ICT (Inner Circle Trader) methodology, focusing on concepts such as liquidity traps, CISD Levels, Order Blocks, and Fair Value Gaps (FVG) to provide precise and actionable trade setups.
🟣 Bullish Setup
In a bullish setup, the indicator starts by marking the high and low of the session, serving as critical reference points for liquidity. A typical sequence involves a liquidity grab below the low, where the price manipulates retail traders into selling positions by breaching a key support level.
This movement is often orchestrated by smart money to accumulate buy orders. Following this liquidity grab, a market structure shift (MSS) occurs, signaled by the price breaking the CISD Level—a confirmation of bullish intent. The indicator then highlights an Order Block near the CISD Level, representing the zone where institutional buying is concentrated.
Additionally, it identifies a Fair Value Gap, which acts as a high-probability area for price retracement and trade entry. Traders can confidently take long positions when the price revisits these zones, targeting the next significant liquidity pool or resistance level.
Bullish Setup in CAPITALCOM:US100 :
🟣 Bearish Setup
Conversely, in a bearish setup, the price manipulates liquidity by creating a false breakout above the high of the session. This move entices retail traders into long positions, allowing institutional players to enter sell orders.
Once the price reverses direction and breaches the CISD Level to the downside, a change of character (CHOCH) becomes evident, confirming a bearish market structure. The indicator highlights an Order Block near this level, indicating the origin of the institutional sell orders, along with an associated FVG, which represents an imbalance zone likely to be revisited before the price continues downward.
By entering short positions when the price retraces to these levels, traders align their strategies with the anticipated continuation of bearish momentum, targeting nearby liquidity voids or support zones.
Bearish Setup in OANDA:XAUUSD :
🔵 Settings
Refine Order Block : Enables finer adjustments to Order Block levels for more accurate price responses.
Mitigation Level OB : Allows users to set specific reaction points within an Order Block, including: Proximal: Closest level to the current price. 50% OB: Midpoint of the Order Block. Distal: Farthest level from the current price.
FVG Filter : The Judas Swing indicator includes a filter for Fair Value Gap (FVG), allowing different filtering based on FVG width: FVG Filter Type: Can be set to "Very Aggressive," "Aggressive," "Defensive," or "Very Defensive." Higher defensiveness narrows the FVG width, focusing on narrower gaps.
Mitigation Level FVG : Like the Order Block, you can set price reaction levels for FVG with options such as Proximal, 50% OB, and Distal.
CISD : The Bar Back Check option enables traders to specify the number of past candles checked for identifying the CISD Level, enhancing CISD Level accuracy on the chart.
🔵 Conclusion
The Silver Bullet Indicator is a cutting-edge tool designed specifically for forex traders who aim to leverage market dynamics during critical liquidity windows. By focusing on the highly active 9:00-10:00 and 10:00-11:00 timeframes, the indicator simplifies complex market concepts such as liquidity traps, Order Blocks, Fair Value Gaps (FVG), and CISD Levels, transforming them into actionable insights.
What sets the Silver Bullet Indicator apart is its precision in detecting false breakouts and market structure shifts (MSS), enabling traders to align their strategies with institutional activity. The visual clarity of its signals, including color-coded zones and directional arrows, ensures that both novice and experienced traders can easily interpret and apply its findings in real-time.
By integrating ICT principles, the indicator empowers traders to identify high-probability entry and exit points, minimize risk, and optimize trade execution. Whether you are capturing short-term price movements or navigating complex market conditions, the Silver Bullet Indicator offers a robust framework to enhance your trading performance.
Ultimately, this tool is more than just an indicator; it is a strategic ally for traders who seek to decode the movements of smart money and capitalize on institutional strategies. With the Silver Bullet Indicator, traders can approach the market with greater confidence, precision, and profitability.
Machine Learning: Gaussian Process Regression [LuxAlgo]We provide an implementation of the Gaussian Process Regression (GPR), a popular machine-learning method capable of estimating underlying trends in prices as well as forecasting them.
While this implementation is adapted to real-time usage, do remember that forecasting trends in the market is challenging, do not use this tool as a standalone for your trading decisions.
🔶 USAGE
The main goal of our implementation of GPR is to forecast trends. The method is applied to a subset of the most recent prices, with the Training Window determining the size of this subset.
Two user settings controlling the trend estimate are available, Smooth and Sigma . Smooth determines the smoothness of our estimate, with higher values returning smoother results suitable for longer-term trend estimates.
Sigma controls the amplitude of the forecast, with values closer to 0 returning results with a higher amplitude. Do note that due to the calculation of the method, lower values of sigma can return errors with higher values of the training window.
🔹 Updating Mechanisms
The script includes three methods to update a forecast. By default a forecast will not update for new bars (Lock Forecast).
The forecast can be re-estimated once the price reaches the end of the forecasting window when using the "Update Once Reached" method.
Finally "Continuously Update" will update the whole forecast on any new bar.
🔹 Estimating Trends
Gaussian Process Regression can be used to estimate past underlying local trends in the price, allowing for a noise-free interpretation of trends.
This can be useful for performing descriptive analysis, such as highlighting patterns more easily.
🔶 SETTINGS
Training Window: Number of most recent price observations used to fit the model
Forecasting Length: Forecasting horizon, determines how many bars in the future are forecasted.
Smooth: Controls the degree of smoothness of the model fit.
Sigma: Noise variance. Controls the amplitude of the forecast, lower values will make it more sensitive to outliers.
Update: Determines when the forecast is updated, by default the forecast is not updated for new bars.
Variety, Low-Pass, FIR Filter Impulse Response Explorer [Loxx]Variety Low-Pass FIR Filter, Impulse Response Explorer is a simple impulse response explorer of 16 of the most popular FIR digital filtering windowing techniques. Y-values are the values of the coefficients produced by the selected algorithms; X-values are the index of sample. This indicator also allows you to turn on Sinc Windowing for all window types except for Rectangular, Triangular, and Linear. This is an educational indicator to demonstrate the differences between popular FIR filters in terms of their coefficient outputs. This is also used to compliment other indicators I've published or will publish that implement advanced FIR digital filters (see below to find applicable indicators).
Inputs:
Number of Coefficients to Calculate = Sample size; for example, this would be the period used in SMA or WMA
FIR Digital Filter Type = FIR windowing method you would like to explore
Multiplier (Sinc only) = applies a multiplier effect to the Sinc Windowing
Frequency Cutoff = this is necessary to smooth the output and get rid of noise. the lower the number, the smoother the output.
Turn on Sinc? = turn this on if you want to convert the windowing function from regular function to a Windowed-Sinc filter
Order = This is used for power of cosine filter only. This is the N-order, or depth, of the filter you wish to create.
What are FIR Filters?
In discrete-time signal processing, windowing is a preliminary signal shaping technique, usually applied to improve the appearance and usefulness of a subsequent Discrete Fourier Transform. Several window functions can be defined, based on a constant (rectangular window), B-splines, other polynomials, sinusoids, cosine-sums, adjustable, hybrid, and other types. The windowing operation consists of multipying the given sampled signal by the window function. For trading purposes, these FIR filters act as advanced weighted moving averages.
A finite impulse response (FIR) filter is a filter whose impulse response (or response to any finite length input) is of finite duration, because it settles to zero in finite time. This is in contrast to infinite impulse response (IIR) filters, which may have internal feedback and may continue to respond indefinitely (usually decaying).
The impulse response (that is, the output in response to a Kronecker delta input) of an Nth-order discrete-time FIR filter lasts exactly {\displaystyle N+1}N+1 samples (from first nonzero element through last nonzero element) before it then settles to zero.
FIR filters can be discrete-time or continuous-time, and digital or analog.
A FIR filter is (similar to, or) just a weighted moving average filter, where (unlike a typical equally weighted moving average filter) the weights of each delay tap are not constrained to be identical or even of the same sign. By changing various values in the array of weights (the impulse response, or time shifted and sampled version of the same), the frequency response of a FIR filter can be completely changed.
An FIR filter simply CONVOLVES the input time series (price data) with its IMPULSE RESPONSE. The impulse response is just a set of weights (or "coefficients") that multiply each data point. Then you just add up all the products and divide by the sum of the weights and that is it; e.g., for a 10-bar SMA you just add up 10 bars of price data (each multiplied by 1) and divide by 10. For a weighted-MA you add up the product of the price data with triangular-number weights and divide by the total weight.
What's a Low-Pass Filter?
A low-pass filter is the type of frequency domain filter that is used for smoothing sound, image, or data. This is different from a high-pass filter that is used for sharpening data, images, or sound.
Whats a Windowed-Sinc Filter?
Windowed-sinc filters are used to separate one band of frequencies from another. They are very stable, produce few surprises, and can be pushed to incredible performance levels. These exceptional frequency domain characteristics are obtained at the expense of poor performance in the time domain, including excessive ripple and overshoot in the step response. When carried out by standard convolution, windowed-sinc filters are easy to program, but slow to execute.
The sinc function sinc (x), also called the "sampling function," is a function that arises frequently in signal processing and the theory of Fourier transforms.
In mathematics, the historical unnormalized sinc function is defined for x ≠ 0 by
sinc x = sinx / x
In digital signal processing and information theory, the normalized sinc function is commonly defined for x ≠ 0 by
sinc x = sin(pi * x) / (pi * x)
For our purposes here, we are used a normalized Sinc function
Included Windowing Functions
N-Order Power-of-Cosine (this one is really N-different types of FIR filters)
Hamming
Hanning
Blackman
Blackman Harris
Blackman Nutall
Nutall
Bartlet Zero End Points
Bartlet-Hann
Hann
Sine
Lanczos
Flat Top
Rectangular
Linear
Triangular
If you wish to dive deeper to get a full explanation of these windowing functions, see here: en.wikipedia.org
Related indicators
STD-Filtered, Variety FIR Digital Filters w/ ATR Bands
STD/C-Filtered, N-Order Power-of-Cosine FIR Filter
STD/C-Filtered, Truncated Taylor Family FIR Filter
STD/Clutter-Filtered, Kaiser Window FIR Digital Filter
STD/Clutter Filtered, One-Sided, N-Sinc-Kernel, EFIR Filt
STD/C-Filtered, Truncated Taylor Family FIR Filter [Loxx]STD/C-Filtered, Truncated Taylor Family FIR Filter is a FIR Digital Filter that uses Truncated Taylor Family of Windows. Taylor functions are obtained by adding a weighted-cosine series to a constant (called a pedestal). A simpler form of these functions can be obtained by dropping some of the higher-order terms in the Taylor series expansion. If all other terms, except for the first two significant ones, are dropped, a truncated Taylor function is obtained. This is a generalized window that is expressed as:
(1 + K) / 2 + (1 - K) / 2 * math.cos(2.0 * math.pi *n / N) where 0 ≤ |n| ≤ N/2
Here k can take the values in the range 0≤k≤1. We note that the Hann 0 ≤ |n| ≤ window is a special case of the truncated Taylor family with k = 0 and Rectangular 0 ≤ |n| ≤ window (SMA) is a special case of the truncated Taylor family with k = 1.
Truncated Taylor Family of Windows amplitudes for this indicator with K = 0.5
This indicator also includes Standard Deviation and Clutter filtering.
What is a Standard Devaition Filter?
If price or output or both don't move more than the (standard deviation) * multiplier then the trend stays the previous bar trend. This will appear on the chart as "stepping" of the moving average line. This works similar to Super Trend or Parabolic SAR but is a more naive technique of filtering.
What is a Clutter Filter?
For our purposes here, this is a filter that compares the slope of the trading filter output to a threshold to determine whether to shift trends. If the slope is up but the slope doesn't exceed the threshold, then the color is gray and this indicates a chop zone. If the slope is down but the slope doesn't exceed the threshold, then the color is gray and this indicates a chop zone. Alternatively if either up or down slope exceeds the threshold then the trend turns green for up and red for down. Fro demonstration purposes, an EMA is used as the moving average. This acts to reduce the noise in the signal.
Included
Bar coloring
Loxx's Expanded Source Types
Signals
Alerts
energies_correlation_zscoreA table to help track correlations between the four major energies contracts of the CME. The table shows the z-score of the current correlation value between HO, RB, CL, and NG. The inputs are:
- timeframe: the timeframe of the calcluation. the default is 5 minutes.
- window: the rolling window over which to calculate the correlations. the default is 48, or four hours given the default timeframe.
A score of zer means that the correlation over the latest window is in line with the average for all windows sampled from the chart history. More positive scores imply higher positive correlation than normal, and vice versa for negative scores.