SENTINEL CORE by Pipsomnian🛡️ Sentinel Core — Learning Mode (Structure & Probability Engine)
by Pipsomnian
Sentinel Core is the core structure and probability framework within the Sentinel ecosystem.
It is designed to help traders move beyond binary signals and learn how to grade market environments based on structure, momentum, and session quality.
This tool does not predict price.
It evaluates context.
🎯 What Sentinel Core Is
Sentinel Core is an EMA-structured learning and decision-grading indicator built to train:
• Trend alignment
• Pullback behavior
• Market structure continuation
• Session discipline (London & New York)
• Probability stacking
Instead of asking “Is there a signal?”,
Sentinel Core trains you to ask:
“How strong is this setup?”
🧠 The Scoring Concept
Each potential setup is evaluated using multiple structural components:
• EMA trend alignment
• Pullback to value
• Strong candle confirmation
• Market structure continuation
• Active trading session
The result is a setup quality grade:
• A+ → Full structural alignment
• B → Strong but incomplete alignment
Lower-quality environments are intentionally ignored.
This encourages patience, selectivity, and discipline.
🟢 Who Sentinel Core Is For
Sentinel Core is designed for traders who:
• Already understand basic EMA structure
• Want fewer, higher-quality setups
• Trade session-based markets (especially Gold)
• Value discipline over frequency
• Want to develop judgment, not dependency
🚫 What Sentinel Core Is NOT
Sentinel Core is not:
• A signal service
• An automated strategy
• A promise of profitability
• A replacement for risk management
• A shortcut to consistency
Execution, risk control, and psychology remain your responsibility.
⏱️ Recommended Use
• Timeframe: 5-Minute
• Markets: XAUUSD (Gold), major FX, liquid indices
• Sessions: London & New York
EMAs are used for structure and context, not prediction.
🧭 Position in the Sentinel Framework
• Sentinel Lite — Learn structure & discipline
• Sentinel Core — Grade probability & judgment
• Sentinel A+ — Refine timing & precision
• Sentinel Gold Standard — Execute with control
⚠️ Educational use only. No financial advice.
— Pipsomnian
지표 및 전략
Kotegawa Dip ReversalTakashi Kotegawa trading indicator
it is meant to buy cheap japanese stocks when they are below vwap
Simple EFI + EMASimple Elder Force Index (EFI) with EMA Signal is a minimal momentum indicator that measures buying and selling pressure by combining price change and volume. The raw Force Index is smoothed with an Exponential Moving Average to reduce noise, and an additional EMA signal line helps visualize momentum shifts and trend strength. A zero line is included to quickly distinguish bullish (> 0) from bearish (< 0) conditions. This stripped-down version is designed for clarity and fast decision-making without extra filters or alerts.
ATR DEEPATR Bottom Indicator:
ATR Bottom is a dynamic support level based on market volatility (ATR) and a long-term moving average. It helps identify a price zone where downside risk significantly increases.
Unlike static levels, this indicator adapts to current market volatility and adjusts as market conditions change.
How it works:
Calculated using a moving average and ATR
The level represents the difference between average price and volatility
Always plotted below price and updates dynamically
Not a standalone entry signal
Interpretation:
Price above the line — market remains stable
Price touching the line — potential reaction or slowdown zone
Close below the line — sign of scenario shift and increased bearish pressure
Important:
Does not predict exact market bottoms
Designed for scenario-based analysis
Best used in combination with other analytical tools
PowerLevels - Key Daily LevelsThe Institutional Levels standalone indicator plots the following key price and volume levels directly on your chart:
PDH & PDL (Previous Day High/Low): Displays the high and low of the prior session using time-anchored logic to ensure accuracy across the weekend gap.
POC (Point of Control): The price level where the most volume was traded during the previous New York RTH session.
VAH & VAL (Value Area High/Low): Marks the boundaries of the price range where 70% of the previous day's volume took place.
Settlement: The official previous-day closing price as determined by the CME exchange.
Midnight Open: A horizontal line marking the opening price at 12:00 AM New York time for the current session.
NDOG (New Day Opening Gap): Automated boxes highlighting the gap between the previous day's close and the current day's open, including a dashed midline.
NWOG (New Week Opening Gap): Automated boxes highlighting the gap between Friday’s close and Sunday’s open, including a dashed midline.
Midnight V-Line: A vertical separator marking each new daily session to maintain a clear visual narrative.
Cyberpunk Hyper-Linear ChannelCyberpunk Hyper-Linear Channel is a next-generation linear regression channel designed to visualize trend direction, volatility, and price positioning with high clarity and minimal noise.
Unlike traditional regression channels, this indicator applies EMA smoothing to both slope and intercept, significantly reducing sudden angle shifts and visual jitter.
The result is a stable, latency-controlled trend channel that adapts smoothly to market structure.
🔹 Core Concept
・Linear regression defines the trend axis
・Standard deviation determines dynamic channel width
・Slope & intercept smoothing improves structural stability
・Neon zones highlight bullish / bearish pressure in real time
🔹 Key Features
・Smoothed Linear Regression Channel (trend-focused, low noise)
・Volatility-based adaptive upper & lower boundaries
・Dynamic neon fill that reacts to price position
・Clear trend bias visualization without repainting clutter
・Cyberpunk-inspired, clean and modern aesthetic
🔹 How to Use
・Price near center line → Mean reversion / equilibrium zone
・Price approaching channel edges → Volatility expansion
・Upper zone dominance → Bullish trend pressure
・Lower zone dominance → Bearish trend pressure
・Breakouts beyond the channel may signal trend acceleration or exhaustion
🔹 Best Use Cases
・Trend-following confirmation
・Dynamic support & resistance mapping
・Market structure visualization across all assets
Cyberpunk Hyper-Linear Channel は、
トレンド方向・ボラティリティ・価格の位置関係を
ノイズを極力排除して可視化する次世代線形回帰チャネルです。
従来の線形回帰チャネルと異なり、
傾き(Slope)と切片(Intercept)の両方にEMAスムージングを適用。
これにより、角度の急変や視覚的ブレを抑えた
安定性の高いトレンド構造を描画します。
🔹 コンセプト
・線形回帰によるトレンド軸の定義
・標準偏差による動的チャネル幅
・スムージングで構造ノイズを低減
・価格位置に応じたネオンゾーンの動的強調表示
🔹 特徴
・低ノイズ・高安定な線形回帰チャネル
・ボラティリティ連動型の上下バンド
・価格位置に反応するダイナミックな発色
・リペイント感のないクリーンな描画
・サイバーパンク調の洗練されたデザイン
🔹 使い方
・中央線付近 → 平衡・持ち合いゾーン
・チャネル上限 / 下限付近 → ボラ拡大・圧力増加
・上部ゾーン優勢 → 上昇トレンド圧力
・下部ゾーン優勢 → 下降トレンド圧力
・チャネル外へのブレイクは加速 or 行き過ぎの兆候として注視
🔹 想定用途
・トレンドフォローの補助
・動的サポート / レジスタンスの把握
・相場構造の視覚的理解
BTC - NMI: Network Metabolism IndexBTC - Network Metabolism Index (NMI) | RM
Concept & Background
The Network Metabolism Index (NMI) is a fundamental valuation model that treats Bitcoin as a biological organism. While price is the "face" of the asset, the NMI measures its "internal organs"—specifically its physical security and its social circulation.
Computational Logic: The Assembly Line
To arrive at the final NMI score, the indicator follows a rigorous four-step deterministic process:
• Step 1: Metric Selection: We ingest three high-fidelity data streams from Glassnode. Difficulty (Security), Active Addresses (Utility), and Market Cap (Price).
• Step 2: Fair Value Proxy (FVP) Computation: We calculate the network's intrinsic strength using a modified Metcalfe Law. We square the Active Addresses to account for network effect growth and multiply it by the Square Root of Difficulty to weight the value by physical security.
• Step 3: Log-Ratio Normalization: Because the FVP represents astronomical values of physical and social work, we calculate the Natural Logarithm of the Market Cap divided by the FVP . This places the data into a usable, though deep-negative, "dimensionless" territory.
• Step 4: Denoising & Banding: We apply a 14-day Least Squares Moving Average (LSMA) to the result to strip away daily volatility. Finally, we wrap the curve in 1.5 Standard Deviation bands to identify statistical "Fever" (Overvalued) and "Starvation" (Undervalued) zones.
The Y-Axis is measured in Nats (Natural Logarithmic Units). Important: Users should treat these units as dimensionless . Because the fundamental proxies for security and utility are so mathematically dominant, the resulting values reside in a negative logarithmic territory . The absolute numerical value is secondary to the morphology of the curve and its position relative to the dynamic Sigma bands.
Core Features / User Inputs
• LSMA Denoising: A linear regression filter to reveal structural trends.
• Dynamic Sigma Bands: 365-day rolling bands that adapt to Bitcoin's maturing market cycle.
• Regime Audit Dashboard: Real-time classification of the network state.
How to Read The Chart
• Metabolic Starvation (Blue Zone): Security and utility are significantly higher than price reflects. A generational value opportunity.
• Metabolic Fever (Red Zone): Price is over-extended relative to the network's biological reality.
• Neutral (Grey): Price and health are in a sustainable balance.
Data Feed Disclaimer
This indicator requires access to the Glassnode professional data feeds (Difficulty, Active Addresses, and Market Cap). Users without a valid subscription to these alternative data sets will not see the oscillator render. This script is intended for macro analysis; it is not financial advice.
General Disclaimer
This indicator is a mathematical model based on historical on-chain data. It is intended for educational purposes and macro analysis. On-chain metrics are lagging by nature and should be used in conjunction with a robust risk management strategy. This is not financial advice.
Tags
Rob Maths, Rob_Maths, robmaths, Bitcoin, OnChain, Glassnode, FundamentalAnalysis, MetcalfeLaw, Quant, Macro, Difficulty, ActiveAddresses, ValuationModel, NetworkMetabolism
SessionsBuilt to display useful time sessions, mostly Frankfort and NY.
It also display the Asian range and fractal bars.
All three sub indicators are toggable separatly.
Works best for french trades as it's how it's been coded for.
If you want adapt it to your timezone, edit the "Fuseau horaire" option to match yours.
I intend to add another big indicator to make a cool package in the future.
I will soon try to make everything editable so you can chose what you can display (dont ask for when)
This is a full vibe coded script, feel free to fork it and edit it to your convenience as long as you credit me and share me yours so we can see what can be improved.
Enjoy :)
SWEEP HTF CANDLE - BY LIONLEE - 0792281999// This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// © CandelaCharts
//@version=6
indicator("CandelaCharts - HTF Sweeps", shorttitle = "CandelaCharts - HTF Sweeps", overlay = true, max_lines_count = 500, max_labels_count = 500, max_boxes_count = 500, max_bars_back = 500, max_polylines_count = 100)
// # ========================================================================= #
// # | Colors |
// # ========================================================================= #
//#region
// # Core -------------------------------------------------------------------- #
colors_white = color.white
colors_black = color.black
colors_purple = color.purple
colors_red = color.red
colors_gray = color.gray
colors_blue = color.blue
colors_orange = color.orange
colors_green = color.green
color_transparent = #ffffff00
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | Inputs |
// # ========================================================================= #
//#region
// # General ----------------------------------------------------------------- #
general_font = input.string("Monospace", "Text ", options = , inline = "1.0", group = "General")
general_text = input.string("Tiny", "", options = , inline = "1.0", group = "General")
general_brand_show = input.bool(false, "Hide Brand", group = "General")
htf_sweeps_tf_1_show = input.bool(true, "HTF I ", inline = "1.0", group = "Timeframes")
htf_sweeps_tf_1_tf = input.timeframe("15", "", inline = "1.0", group = "Timeframes")
htf_sweeps_tf_1_number = input.int(10, "", inline = "1.0", group = "Timeframes", minval = 1, maxval = 60)
htf_sweeps_tf_1_map = input.bool(false, "M", inline = "1.0", group = "Timeframes", tooltip = "Map this HTF to LTF")
htf_sweeps_tf_2_show = input.bool(true, "HTF II ", inline = "2.0", group = "Timeframes")
htf_sweeps_tf_2_tf = input.timeframe("60", "", inline = "2.0", group = "Timeframes")
htf_sweeps_tf_2_number = input.int(8, "", inline = "2.0", group = "Timeframes", minval = 1, maxval = 60)
htf_sweeps_tf_2_map = input.bool(true, "M", inline = "2.0", group = "Timeframes")
htf_sweeps_tf_3_show = input.bool(true, "HTF III ", inline = "3.0", group = "Timeframes")
htf_sweeps_tf_3_tf = input.timeframe("240", "", inline = "3.0", group = "Timeframes")
htf_sweeps_tf_3_number = input.int(6, "", inline = "3.0", group = "Timeframes", minval = 1, maxval = 60)
htf_sweeps_tf_3_map = input.bool(false, "M", inline = "3.0", group = "Timeframes")
htf_sweeps_tf_4_show = input.bool(true, "HTF IV ", inline = "4.0", group = "Timeframes")
htf_sweeps_tf_4_tf = input.timeframe("1D", "", inline = "4.0", group = "Timeframes")
htf_sweeps_tf_4_number = input.int(4, "", inline = "4.0", group = "Timeframes", minval = 1, maxval = 60)
htf_sweeps_tf_4_map = input.bool(false, "M", inline = "4.0", group = "Timeframes")
htf_sweeps_tf_5_show = input.bool(true, "HTF V ", inline = "5.0", group = "Timeframes")
htf_sweeps_tf_5_tf = input.timeframe("1W", "", inline = "5.0", group = "Timeframes")
htf_sweeps_tf_5_number = input.int(2, "", inline = "5.0", group = "Timeframes", minval = 1, maxval = 60)
htf_sweeps_tf_5_map = input.bool(false, "M", inline = "5.0", group = "Timeframes")
htf_sweeps_tf_6_show = input.bool(false, "HTF VI ", inline = "6.0", group = "Timeframes")
htf_sweeps_tf_6_tf = input.timeframe("1M", "", inline = "6.0", group = "Timeframes")
htf_sweeps_tf_6_number = input.int(1, "", inline = "6.0", group = "Timeframes", minval = 1, maxval = 60)
htf_sweeps_tf_6_map = input.bool(false, "M", inline = "6.0", group = "Timeframes")
htf_sweeps_bull_color = input.color(colors_green, "Coloring ", inline = "1.0", group = "HTF")
htf_sweeps_bear_color = input.color(colors_black, "", inline = "1.0", group = "HTF")
htf_sweeps_wick_border_color = input.color(colors_black, "", inline = "1.0", group = "HTF")
htf_sweeps_offset = input.int(10, "Offset ", minval = 1, inline = "2.0", group = "HTF", tooltip = "The distance from the current chart candles.")
htf_sweeps_space = input.int(1, "Space ", minval = 1, inline = "3.0", maxval = 4, group = "HTF", tooltip = "Space between candles")
htf_sweeps_margin = input.int(10, "Margin ", minval = 1, inline = "4.0", group = "HTF", tooltip = "The distance between HTF group candles.")
htf_sweeps_candle_width = input.string("Small", "Size ", inline = "5.0", group = "HTF", options = , tooltip = "Candle size")
htf_sweeps_label_show = input.bool(true, "Labels ", inline = "6.0", group = "HTF")
htf_sweeps_label_size = input.string("Large", "", inline = "6.0", group = "HTF", options = )
htf_sweeps_label_position = input.string("Top", "", inline = "6.0", group = "HTF", options = , tooltip = " - Size of the label - Position of the label - Text color of the label")
htf_sweeps_label_color = input.color(colors_black, "", inline = "6.0", group = "HTF")
// htf_sweeps_bias_show = input.bool(true, "Bias ", inline = "6.0", group = "HTF")
// htf_sweeps_bias_bull_color = input.color(colors_green, "", inline = "6.0", group = "HTF")
// htf_sweeps_bias_bear_color = input.color(colors_red, "", inline = "6.0", group = "HTF")
// htf_sweeps_time_show = input.bool(true, "Time ", inline = "7.0", group = "HTF")
// htf_sweeps_time_color = input.color(colors_gray, "", inline = "7.0", group = "HTF")
htf_sweeps_ltf_trace_h_l_show = input.bool(true, "H/L Line ", inline = "1.0", group="LTF")
htf_sweeps_ltf_trace_h_l_style = input.string('····', '', options = , inline = "1.0", group="LTF")
htf_sweeps_ltf_trace_h_l_width = input.int(1, '', inline = "1.0", minval = 0, maxval = 4, group="LTF")
htf_sweeps_ltf_trace_h_l_color = input.color(color.new(colors_gray, 50), "", inline = "1.0", group="LTF")
htf_sweeps_ltf_trace_o_c_line_show = input.bool(true, "O/C Line ", inline = "2.0", group = "LTF")
htf_sweeps_ltf_trace_o_c_line_style = input.string('⎯⎯⎯', "", options = , inline = "2.0", group = "LTF")
htf_sweeps_ltf_trace_o_c_line_width = input.int(1, '', inline = "2.0", minval = 0, maxval = 4, group = "LTF")
htf_sweeps_ltf_trace_o_c_line_color = input.color(color.new(colors_gray, 50), "", inline = "2.0", group = "LTF")
htf_sweeps_sweep_show = input.bool(true, "Sweep ", inline = "1.0", group = "Sweep")
htf_sweeps_sweep_ltf_show = input.bool(true, "LTF ", inline = "1.0", group = "Sweep")
htf_sweeps_sweep_htf_show = input.bool(true, "HTF", inline = "1.0", group = "Sweep", tooltip = "Show sweeps. - Show sweeps on LTF. - Show sweeps on HTF.")
htf_sweeps_sweep_line_style = input.string('⎯⎯⎯', " ", options = , inline = "1.1", group = "Sweep")
htf_sweeps_sweep_line_width = input.int(1, '', inline = "1.1", group = "Sweep")
htf_sweeps_sweep_line_color = input.color(colors_black, "", inline = "1.1", group = "Sweep")
htf_sweeps_i_sweep_show = input.bool(false, "I-sweep ", inline = "2.0", group = "Sweep")
htf_sweeps_i_sweep_ltf_show = input.bool(true, "LTF ", inline = "2.0", group = "Sweep")
htf_sweeps_i_sweep_htf_show = input.bool(true, "HTF", inline = "2.0", group = "Sweep", tooltip = "Show invalidated sweeps. - Show invalidated sweeps on LTF. - Show invalidated sweeps on HTF.")
htf_sweeps_i_sweep_line_style = input.string('----', " ", options = , inline = "2.1", group = "Sweep")
htf_sweeps_i_sweep_line_width = input.int(1, '', inline = "2.1", group = "Sweep")
htf_sweeps_i_sweep_line_color = input.color(colors_gray, "", inline = "2.1", group = "Sweep")
htf_sweeps_real_time_sweep_show = input.bool(false, "Real-time", inline = "3.0", group = "Sweep", tooltip = "Control visibility of Real-time Sweeps on LTF and HTF")
// htf_sweeps_dashboard_info_show = input.bool(true, "Panel ", inline = "1.0", group = "Dashboard")
// htf_sweeps_dashboard_info_position = input.string("Bottom Center", "", options = , inline = "1.0", group = "Dashboard", tooltip = "The dashboard will display only the HTF that is mapped to LTF")
htf_sweeps_alerts_sweep_formation = input.bool(false, "Sweep Formation", inline = "1.0", group = "Alerts")
htf_sweeps_alerts_sweep_invalidation = input.bool(false, "Sweep Invalidation", inline = "2.0", group = "Alerts")
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | UDTs |
// # ========================================================================= #
//#region
type UDT_Store
line bin_ln
box bin_box
label bin_lbl
polyline bin_polyline
type UDT_Sweep
string tf
int x1
float y
int x2
bool bull
// sweep is invalidated
bool invalidated = false
// id of htf candle, that invalidated sweep
int invalidated_on
// if sweep is invalidated on candle that forms a sweep, then sweep will be removed
bool removed = false
// mark sweep as formed after last candle that forms a sweep is closed and sweep was not invalidated
bool formed = false
type UDT_HTF_Candle
int num
int index
string tf
// real coordinates of HTF candle
float o
float c
float h
float l
int o_idx
int c_idx
int h_idx
int l_idx
int ot
int ct
// position of HTF candle on chart
int candle_left
int candle_rigth
float candle_top
float candle_bottom
int wick_x
int shift
bool is_closed
array htf_sweeps
array ltf_sweeps
bool bull
bool bull_sweep
bool bear_sweep
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | Bin |
// # ========================================================================= #
//#region
var UDT_Store bin = UDT_Store.new(
bin_ln = array.new()
, bin_box = array.new()
, bin_lbl = array.new()
, bin_polyline = array.new()
)
method clean_bin(UDT_Store store) =>
for obj in store.bin_ln
obj.delete()
for obj in store.bin_box
obj.delete()
for obj in store.bin_lbl
obj.delete()
for obj in store.bin_polyline
obj.delete()
store.bin_ln.clear()
store.bin_box.clear()
store.bin_lbl.clear()
store.bin_polyline.clear()
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | Functions |
// # ========================================================================= #
//#region
method text_size(string size) =>
out = switch size
"Tiny" => size.tiny
"Small" => size.small
"Normal" => size.normal
"Large" => size.large
"Huge" => size.huge
"Auto" => size.auto
out
method line_style(string style) =>
out = switch style
'⎯⎯⎯' => line.style_solid
'----' => line.style_dashed
'····' => line.style_dotted
method font_style(string font) =>
out = switch font
'Default' => font.family_default
'Monospace' => font.family_monospace
method candle_size(string size) =>
out = switch size
'Tiny' => 2
'Small' => 4
'Medium' => 6
'Large' => 8
'Huge' => 10
out
method tf_label(string tf) =>
tfl = tf
if tfl == ''
tfl := timeframe.period
out = switch tfl
'1' => '1m'
'2' => '2m'
'3' => '3m'
'5' => '5m'
'10' => '10m'
'15' => '15m'
'20' => '20m'
'30' => '30m'
'45' => '45m'
'60' => '1H'
'90' => '90m'
'120' => '2H'
'180' => '3H'
'240' => '4H'
'480' => '8H'
'540' => '9H'
'720' => '12H'
=> tfl
out
const string default_tz = "America/New_York"
var string htf_sweeps_tz = default_tz
get_short_dayofweek(int d) =>
switch d
dayofweek.monday => 'MON'
dayofweek.tuesday => 'TUE'
dayofweek.wednesday => 'WED'
dayofweek.thursday => 'THU'
dayofweek.friday => 'FRI'
dayofweek.saturday => 'SAT'
dayofweek.sunday => 'SUN'
=> ''
get_week_of_month(int t) =>
y = year(t)
m = month(t)
d = dayofmonth(t)
// Timestamp of first day of the same month
firstDay = timestamp(y, m, 1, 0, 0)
// Day of month index starting from 0 → (0–30)
dayIndex = d - 1
// Week index starting from 0 → (0–4)
weekIndex = int(dayIndex / 7)
// Week number starting from 1 → (1–5)
str.tostring(weekIndex + 1)
get_short_month(int t) =>
var string months = array.from(
"JAN", "FEB", "MAR", "APR", "MAY", "JUN",
"JUL", "AUG", "SEP", "OCT", "NOV", "DEC")
m = month(t)
m >= 1 and m <= array.size(months) ? array.get(months, m - 1) : ""
method candle_time_label(UDT_HTF_Candle candle) =>
string lbl = ""
if timeframe.in_seconds(candle.tf) >= timeframe.in_seconds("12M")
lbl := str.format_time(candle.ot, "yyyy", htf_sweeps_tz)
else if timeframe.in_seconds(candle.tf) >= timeframe.in_seconds("1M")
lbl := get_short_month(candle.ot)
else if timeframe.in_seconds(candle.tf) >= timeframe.in_seconds("1W")
lbl := get_week_of_month(candle.ot)
else if timeframe.in_seconds(candle.tf) >= timeframe.in_seconds("1D")
// Get date components in the selected timezone
y = year(candle.ot, htf_sweeps_tz)
m = month(candle.ot, htf_sweeps_tz)
d = dayofmonth(candle.ot, htf_sweeps_tz)
// Create timestamp at noon for that date in the selected timezone (using noon to avoid timezone edge cases)
date_ts = timestamp(htf_sweeps_tz, y, m, d, 12, 0, 0)
// Add 1 day to account for timezone offset
date_ts := date_ts + 86400000
// Get day of week for that date
lbl := get_short_dayofweek(dayofweek(date_ts, htf_sweeps_tz))
else
lbl := str.format_time(candle.ot, "HH:mm", htf_sweeps_tz)
lbl
// Returns formatted remaining time until current HTF candle close.
// Format: " HH:MM:SS"
get_htf_remaining_time(int from, string tf, string ses, string tz) =>
ct = time_close(tf, ses, na(tz) ? "" : tz)
if na(ct) or na(from)
""
else
// Remaining time in ms (clamped to 0 so it never goes negative)
remaining_ms = math.max(ct - from, 0)
// Total whole seconds remaining
remaining_sec = int(remaining_ms / 1000)
// Unit constants (seconds)
sec_per_min = 60
sec_per_hour = 60 * sec_per_min
sec_per_day = 24 * sec_per_hour
sec_per_month = 30 * sec_per_day
sec_per_year = 365 * sec_per_day
// Break down into Y / M / D / H / M / S (all ints)
years = int(remaining_sec / sec_per_year)
rem_after_years = remaining_sec % sec_per_year
months = int(rem_after_years / sec_per_month)
rem_after_months = rem_after_years % sec_per_month
days = int(rem_after_months / sec_per_day)
rem_after_days = rem_after_months % sec_per_day
hours = int(rem_after_days / sec_per_hour)
rem_after_hours = rem_after_days % sec_per_hour
minutes = int(rem_after_hours / sec_per_min)
seconds = rem_after_hours % sec_per_min
// Only show non-zero units
year_str = years > 0 ? str.format("{0}Y ", str.tostring(years, "#")) : ""
month_str = months > 0 ? str.format("{0}M ", str.tostring(months, "#")) : ""
day_str = days > 0 ? str.format("{0}D ", str.tostring(days, "#")) : ""
time_str = str.format("{0}:{1}:{2}",
str.tostring(hours, "00"),
str.tostring(minutes, "00"),
str.tostring(seconds, "00"))
year_str + month_str + day_str + time_str
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | Variables |
// # ========================================================================= #
//#region
var ltf = timeframe.period
var htf_1_candles = array.new()
var htf_2_candles = array.new()
var htf_3_candles = array.new()
var htf_4_candles = array.new()
var htf_5_candles = array.new()
var htf_6_candles = array.new()
var htf_candle_width = candle_size(htf_sweeps_candle_width)
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | Alert Methods |
// # ========================================================================= #
//#region
method enable_sweep_formed_alert(UDT_Sweep sweep) =>
if not na(sweep) and htf_sweeps_alerts_sweep_formation
if not sweep.invalidated
if sweep.bull
alert(str.format("Bullish HTF Sweep ({0}) formed on {1}. Price level {2, number, currency}", tf_label(sweep.tf), syminfo.ticker, sweep.y))
else
alert(str.format("Bearish HTF Sweep ({0}) formed on {1}. Price level {2, number, currency}", tf_label(sweep.tf), syminfo.ticker, sweep.y))
sweep
method enable_sweep_invalidated_alert(UDT_Sweep sweep) =>
if not na(sweep) and htf_sweeps_alerts_sweep_invalidation
if not sweep.invalidated
if sweep.bull
alert(str.format("Bullish HTF Sweep ({0}) invalidated on {1}. Price level {2, number, currency}", tf_label(sweep.tf), syminfo.ticker, sweep.y))
else
alert(str.format("Bearish HTF Sweep ({0}) invalidated on {1}. Price level {2, number, currency}", tf_label(sweep.tf), syminfo.ticker, sweep.y))
sweep
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | HTF Sweeps |
// # ========================================================================= #
//#region
method session_begins(string tf, string ses, string tz) =>
ta.change(time(tf, ses, na(tz) ? "" : tz))!= 0
method in_session(string tf, string ses, string tz) =>
t = time(tf, ses, na(tz) ? "" : tz)
ct = time_close(tf, ses, na(tz) ? "" : tz)
not na(t) and not na(ct)
method position_ltf_sweeps(array htf_candles) =>
count = htf_candles.size()
if count == 1
candle = htf_candles.get(0)
for in candle.ltf_sweeps
sweep.x2 := candle.c_idx
if count >= 2
candle = htf_candles.get(1)
next_candle = htf_candles.get(0)
for in candle.ltf_sweeps
sweep.x2 := next_candle.c_idx
htf_candles
method position_htf_sweeps(array htf_candles, int buffer) =>
count = htf_candles.size()
if count > 1
c_last = htf_candles.get(0)
for in htf_candles
for in candle.htf_sweeps
sweep.x2 := c_last.candle_rigth + buffer
sweep.x1 := candle.wick_x
htf_candles
method invalidate_sweep(UDT_Sweep sweep, UDT_HTF_Candle c2) =>
c2_bull = c2.bull
// if body of next candle cross sweep
invalidated = not na(sweep.y) and (sweep.bull ? (c2_bull ? sweep.y < c2.c : sweep.y < c2.o) : (c2_bull ? sweep.y > c2.o : sweep.y > c2.c))
invalidated
method invalidate_sweeps(array htf_candles) =>
count = htf_candles.size()
if count > 1
for i = count - 1 to 1
c1 = htf_candles.get(i)
for in c1.ltf_sweeps
if not sweep.removed and na(sweep.invalidated_on)
for k = i - 1 to 0
c2 = htf_candles.get(k)
htf_sweep = c1.htf_sweeps.get(j)
invalidated = sweep.invalidate_sweep(c2)
// invalidation by candle of sweep
if sweep.x2 <= c2.c_idx and sweep.x2 > c2.o_idx
if not c2.is_closed
if not sweep.invalidated and htf_sweeps_real_time_sweep_show
sweep.enable_sweep_invalidated_alert()
sweep.invalidated := invalidated
htf_sweep.invalidated := sweep.invalidated
else
if invalidated and na(sweep.invalidated_on)
sweep.invalidated_on := invalidated ? c2.o_idx : na
htf_sweep.invalidated_on := sweep.invalidated_on
break
else if na(sweep.invalidated_on)
// invalidation by the next candle
if not c2.is_closed
if not sweep.invalidated and htf_sweeps_real_time_sweep_show
sweep.enable_sweep_invalidated_alert()
sweep.invalidated := invalidated
htf_sweep.invalidated := sweep.invalidated
else
if invalidated
if not sweep.invalidated
sweep.enable_sweep_invalidated_alert()
sweep.invalidated := invalidated
sweep.invalidated_on := invalidated ? c2.o_idx : na
htf_sweep.invalidated := sweep.invalidated
htf_sweep.invalidated_on := sweep.invalidated_on
break
// filter removed sweeps
c2 = htf_candles.get(i - 1)
if not sweep.formed and not sweep.removed
if c2.is_closed
htf_sweep = c1.htf_sweeps.get(j)
if sweep.invalidated and not na(sweep.invalidated_on)
// if sweep is invalidated on candle that forms a sweep, then sweep will be removed
if not sweep.formed
sweep.removed := true
htf_sweep.removed := true
else
// mark sweep as formed after last candle that forms a sweep is closed and sweep was not invalidated
if not sweep.formed
sweep.formed := true
htf_sweep.formed := true
htf_candles
detect_sweep(UDT_HTF_Candle c1, UDT_HTF_Candle c2) =>
c1_bull = c1.bull
c2_bull = c2.bull
bull_sweep_in_range = c2_bull ? (c1_bull ? (c2.c < c1.h) : (c2.c < c1.h)) : (c1_bull ? (c2.o < c1.h) : (c2.o < c1.h))
is_bull_sweep = c2.h > c1.h and bull_sweep_in_range
bear_sweep_in_range = c2_bull ? (c1_bull ? (c2.o > c1.l) : (c2.o > c1.l)) : (c1_bull ? (c2.c > c1.l) : (c2.c > c1.l))
is_bear_sweep = c2.l < c1.l and bear_sweep_in_range
if is_bull_sweep
if not c1.bull_sweep
htf_sweep = UDT_Sweep.new(x1=c1.h_idx, x2=c2.c_idx, y=c1.h, bull=true, tf=c1.tf)
ltf_sweep = UDT_Sweep.new(x1=c1.h_idx, x2=c2.c_idx, y=c1.h, bull=true, tf=c1.tf)
c1.htf_sweeps.push(htf_sweep)
c1.ltf_sweeps.push(ltf_sweep)
c1.bull_sweep := true
ltf_sweep.enable_sweep_formed_alert()
else if is_bear_sweep
if not c1.bear_sweep
htf_sweep = UDT_Sweep.new(x1=c1.l_idx, x2=c2.c_idx, y=c1.l, bull=false, tf=c1.tf)
ltf_sweep = UDT_Sweep.new(x1=c1.l_idx, x2=c2.c_idx, y=c1.l, bull=false, tf=c1.tf)
c1.htf_sweeps.push(htf_sweep)
c1.ltf_sweeps.push(ltf_sweep)
c1.bear_sweep := true
ltf_sweep.enable_sweep_formed_alert()
method detect_sweeps(array htf_candles) =>
count = htf_candles.size()
if count > 1
size = math.min(4, count - 1)
for i = size to 1
c1 = htf_candles.get(i)
c2 = htf_candles.get(i - 1)
if not c2.is_closed and c1.htf_sweeps.size() <= 2
detect_sweep(c1, c2)
htf_candles.position_ltf_sweeps()
htf_candles.invalidate_sweeps()
htf_candles
method draw_sweep(UDT_Sweep sweep, bool ltf) =>
if sweep.invalidated
if htf_sweeps_i_sweep_show
if ltf and htf_sweeps_i_sweep_ltf_show or not ltf and htf_sweeps_i_sweep_htf_show
if htf_sweeps_real_time_sweep_show ? true : not sweep.removed and not na(sweep.invalidated_on)
bin.bin_ln.push(line.new(x1=sweep.x1, y1=sweep.y, x2=sweep.x2, y2=sweep.y, xloc = xloc.bar_index, color = htf_sweeps_i_sweep_line_color, style = line_style(htf_sweeps_i_sweep_line_style), width = htf_sweeps_i_sweep_line_width))
else
if htf_sweeps_sweep_show
if ltf and htf_sweeps_sweep_ltf_show or not ltf and htf_sweeps_sweep_htf_show
bin.bin_ln.push(line.new(x1=sweep.x1, y1=sweep.y, x2=sweep.x2, y2=sweep.y, xloc = xloc.bar_index, color = htf_sweeps_sweep_line_color, style = line_style(htf_sweeps_sweep_line_style), width = htf_sweeps_sweep_line_width))
sweep
is_bullish_candle(float c, float o, float h, float l) =>
if c == o
math.abs(o - h) < math.abs(o - l)
else
c > o
method add_htf_candle(array htf_candles, UDT_HTF_Candle candle, int total_candles_number)=>
if not na(candle)
if htf_candles.size() >= total_candles_number
htf_candles.pop()
htf_candles.unshift(candle)
htf_candles
method detect_htf_candle(array htf_candles, string tf, string ltf) =>
UDT_HTF_Candle htf_candle = na
if session_begins(tf, "", na) or htf_candles.size()==0
UDT_HTF_Candle candle = UDT_HTF_Candle.new(tf = tf, htf_sweeps = array.new(), ltf_sweeps = array.new())
candle.o := open
candle.c := close
candle.h := high
candle.l := low
candle.o_idx := bar_index
candle.c_idx := bar_index
candle.h_idx := bar_index
candle.l_idx := bar_index
candle.ot := time
candle.bull := is_bullish_candle(candle.c, candle.o, candle.h, candle.l)
if htf_candles.size() > 0
last_candle = htf_candles.get(0)
last_candle.is_closed := true
last_candle.ct := time
htf_candle := candle
else if in_session(tf, "", na) and htf_candles.size()>0
candle = htf_candles.first()
candle.c := close
candle.c_idx := bar_index + 1
candle.ct := time
if high > candle.h
candle.h := high
candle.h_idx := bar_index
if low < candle.l
candle.l := low
candle.l_idx := bar_index
candle.bull := is_bullish_candle(candle.c, candle.o, candle.h, candle.l)
htf_candle
get_htf_candle_shift(int candle_index, int offset, int buffer, int width, int candles_amount)=>
offset + (width + buffer) * (candles_amount - candle_index - 1)
method position_htf_candle(UDT_HTF_Candle candle, int candle_index, int offset, int buffer, int width, int candles_amount) =>
candle.shift := get_htf_candle_shift(candle_index, offset, buffer, width, candles_amount)
candle.candle_left := last_bar_index + candle.shift
candle.candle_rigth := candle.candle_left + width
candle.candle_top := math.max(candle.o, candle.c)
candle.candle_bottom := math.min(candle.o, candle.c)
candle.wick_x := candle.candle_left + width/2
candle
method position_htf_candles(array htf_candles, int shift) =>
candles_amount = htf_candles.size()
for in htf_candles
candle.position_htf_candle(index, shift, htf_sweeps_space, htf_candle_width, candles_amount)
method draw_htf_candle(UDT_HTF_Candle candle) =>
candle_color = candle.bull ? htf_sweeps_bull_color : htf_sweeps_bear_color
bin.bin_box.push(box.new(left=candle.candle_left, top=candle.candle_top, right=candle.candle_rigth, bottom=candle.candle_bottom, border_color = htf_sweeps_wick_border_color, border_width = 1, bgcolor = candle_color))
bin.bin_ln.push(line.new(x1=candle.wick_x, y1=candle.h, x2=candle.wick_x, y2=candle.candle_top, color = htf_sweeps_wick_border_color))
bin.bin_ln.push(line.new(x1=candle.wick_x, y1=candle.candle_bottom, x2=candle.wick_x, y2=candle.l, color = htf_sweeps_wick_border_color))
candle
method draw_htf_label(array htf_candles, string tf) =>
float y_top = na
float y_bottom = na
int x_min = na
int x_max = na
for in htf_candles
switch htf_sweeps_label_position
"Both" =>
y_top := na(y_top) ? candle.h : math.max(y_top, candle.h)
y_bottom := na(y_bottom) ? candle.l : math.min(y_bottom, candle.l)
"Top" =>
y_top := na(y_top) ? candle.h : math.max(y_top, candle.h)
"Bottom" =>
y_bottom := na(y_bottom) ? candle.l : math.min(y_bottom, candle.l)
x_min := na(x_min) ? candle.wick_x : math.min(x_min, candle.wick_x)
x_max := na(x_max) ? candle.wick_x : math.max(x_max, candle.wick_x)
// time label for HTF candle
txt = candle.candle_time_label()
bin.bin_lbl.push(label.new(x = candle.wick_x, y = candle.l, text = txt, tooltip = str.format("HTF candle open {0}", str.format_time(candle.ot, "yyyy-MM-dd HH:mm Z", htf_sweeps_tz)), xloc=xloc.bar_index, color=color_transparent, style = label.style_label_up, textcolor = htf_sweeps_label_color, size=text_size("Tiny"), text_font_family=font_style(general_font)))
x = math.round(math.avg(x_min, x_max))
txt = tf_label(tf)
remaining_ms = get_htf_remaining_time(timenow, tf, "", na)
if not na(y_top)
bin.bin_lbl.push(label.new(x = x, y = y_top, text = txt, tooltip = str.format("HTF {0}", txt), xloc=xloc.bar_index, color=color_transparent, style=label.style_label_down, textcolor=htf_sweeps_label_color, size=text_size(htf_sweeps_label_size), text_font_family=font_style(general_font)))
bin.bin_lbl.push(label.new(x = x, y = y_top, text = remaining_ms, tooltip = str.format("Time remaining until active HTF candle close {0}", remaining_ms), xloc=xloc.bar_index, color=color_transparent, style=label.style_label_down, textcolor=htf_sweeps_label_color, size=text_size("Tiny"), text_font_family=font_style(general_font)))
if not na(y_bottom)
bin.bin_lbl.push(label.new(x = x, y = y_bottom, text = txt, tooltip = str.format("HTF {0}", txt), xloc=xloc.bar_index, color=color_transparent, style=label.style_label_up, textcolor=htf_sweeps_label_color, size=text_size(htf_sweeps_label_size), text_font_family=font_style(general_font)))
// if htf_sweeps_bias_show and htf_candles.size() > 1
// c1 = htf_candles.get(0)
// c2 = htf_candles.get(1)
// bullish = c1.h > c2.h and c1.l > c2.l
// bearish = c1.h < c2.h and c1.l < c2.l
// bin.bin_lbl.push(label.new(x = x, y = na(y_top) ? y_bottom : y_top, text = " ", xloc=xloc.bar_index, color = bullish ? htf_sweeps_bias_bull_color : htf_sweeps_bias_bear_color, style = bullish ? label.style_arrowup : label.style_arrowdown, size = size.normal))
htf_candles
method draw_ltf_open_close_line(UDT_HTF_Candle candle) =>
y1 = math.min(candle.o, candle.c)
y2 = math.max(candle.c, candle.o)
bin.bin_ln.push(line.new(x1=candle.ot, y1=y1, x2=candle.ot, y2=y2, xloc = xloc.bar_time, extend = extend.both, color = htf_sweeps_ltf_trace_o_c_line_color, style = line_style(htf_sweeps_ltf_trace_o_c_line_style), width = htf_sweeps_ltf_trace_o_c_line_width))
candle
method draw_ltf_high_line(UDT_HTF_Candle candle) =>
bin.bin_ln.push(line.new(x1=candle.ot, y1=candle.h, x2=candle.ct, y2=candle.h, xloc = xloc.bar_time, extend = extend.none, color = htf_sweeps_ltf_trace_h_l_color, style = line_style(htf_sweeps_ltf_trace_h_l_style), width = htf_sweeps_ltf_trace_h_l_width))
candle
method draw_ltf_low_line(UDT_HTF_Candle candle) =>
bin.bin_ln.push(line.new(x1=candle.ot, y1=candle.l, x2=candle.ct, y2=candle.l, xloc = xloc.bar_time, extend = extend.none, color = htf_sweeps_ltf_trace_h_l_color, style = line_style(htf_sweeps_ltf_trace_h_l_style), width = htf_sweeps_ltf_trace_h_l_width))
candle
method plot_ltf(array htf_candles) =>
for in htf_candles
if htf_sweeps_ltf_trace_o_c_line_show
candle.draw_ltf_open_close_line()
if htf_sweeps_ltf_trace_h_l_show
candle.draw_ltf_high_line()
candle.draw_ltf_low_line()
for in candle.ltf_sweeps
ltf_sweep.draw_sweep(true)
htf_candles
method plot_htf(array htf_candles, string tf, bool ltf_map) =>
htf_candles.position_htf_sweeps(htf_sweeps_space)
for in htf_candles
candle.draw_htf_candle()
for in candle.htf_sweeps
htf_sweep.draw_sweep(false)
if htf_sweeps_label_show
htf_candles.draw_htf_label(tf)
if ltf_map
htf_candles.plot_ltf()
htf_candles
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | Plotting |
// # ========================================================================= #
//#region
bin.clean_bin()
var tf_1_show = htf_sweeps_tf_1_show and timeframe.in_seconds(timeframe.period) < timeframe.in_seconds(htf_sweeps_tf_1_tf)
var tf_2_show = htf_sweeps_tf_2_show and timeframe.in_seconds(timeframe.period) < timeframe.in_seconds(htf_sweeps_tf_2_tf)
var tf_3_show = htf_sweeps_tf_3_show and timeframe.in_seconds(timeframe.period) < timeframe.in_seconds(htf_sweeps_tf_3_tf)
var tf_4_show = htf_sweeps_tf_4_show and timeframe.in_seconds(timeframe.period) < timeframe.in_seconds(htf_sweeps_tf_4_tf)
var tf_5_show = htf_sweeps_tf_5_show and timeframe.in_seconds(timeframe.period) < timeframe.in_seconds(htf_sweeps_tf_5_tf)
var tf_6_show = htf_sweeps_tf_6_show and timeframe.in_seconds(timeframe.period) < timeframe.in_seconds(htf_sweeps_tf_6_tf)
if tf_1_show
htf_1_candle = htf_1_candles.detect_htf_candle(htf_sweeps_tf_1_tf, ltf)
htf_1_candles.add_htf_candle(htf_1_candle, htf_sweeps_tf_1_number)
htf_1_candles.detect_sweeps()
if tf_2_show
htf_2_candle = htf_2_candles.detect_htf_candle(htf_sweeps_tf_2_tf, ltf)
htf_2_candles.add_htf_candle(htf_2_candle, htf_sweeps_tf_2_number)
htf_2_candles.detect_sweeps()
if tf_3_show
htf_3_candle = htf_3_candles.detect_htf_candle(htf_sweeps_tf_3_tf, ltf)
htf_3_candles.add_htf_candle(htf_3_candle, htf_sweeps_tf_3_number)
htf_3_candles.detect_sweeps()
if tf_4_show
htf_4_candle = htf_4_candles.detect_htf_candle(htf_sweeps_tf_4_tf, ltf)
htf_4_candles.add_htf_candle(htf_4_candle, htf_sweeps_tf_4_number)
htf_4_candles.detect_sweeps()
if tf_5_show
htf_5_candle = htf_5_candles.detect_htf_candle(htf_sweeps_tf_5_tf, ltf)
htf_5_candles.add_htf_candle(htf_5_candle, htf_sweeps_tf_5_number)
htf_5_candles.detect_sweeps()
if tf_6_show
htf_6_candle = htf_6_candles.detect_htf_candle(htf_sweeps_tf_6_tf, ltf)
htf_6_candles.add_htf_candle(htf_6_candle, htf_sweeps_tf_6_number)
htf_6_candles.detect_sweeps()
if barstate.islast
offset = htf_sweeps_offset
if tf_1_show
htf_1_candles.position_htf_candles(offset)
htf_1_candles.plot_htf(htf_sweeps_tf_1_tf, htf_sweeps_tf_1_map)
offset += get_htf_candle_shift(0, htf_sweeps_margin, htf_sweeps_space, htf_candle_width, htf_sweeps_tf_1_number)
if tf_2_show
htf_2_candles.position_htf_candles(offset)
htf_2_candles.plot_htf(htf_sweeps_tf_2_tf, htf_sweeps_tf_2_map)
offset += get_htf_candle_shift(0, htf_sweeps_margin, htf_sweeps_space, htf_candle_width, htf_sweeps_tf_2_number)
if tf_3_show
htf_3_candles.position_htf_candles(offset)
htf_3_candles.plot_htf(htf_sweeps_tf_3_tf, htf_sweeps_tf_3_map)
offset += get_htf_candle_shift(0, htf_sweeps_margin, htf_sweeps_space, htf_candle_width, htf_sweeps_tf_3_number)
if tf_4_show
htf_4_candles.position_htf_candles(offset)
htf_4_candles.plot_htf(htf_sweeps_tf_4_tf, htf_sweeps_tf_4_map)
offset += get_htf_candle_shift(0, htf_sweeps_margin, htf_sweeps_space, htf_candle_width, htf_sweeps_tf_4_number)
if tf_5_show
htf_5_candles.position_htf_candles(offset)
htf_5_candles.plot_htf(htf_sweeps_tf_5_tf, htf_sweeps_tf_5_map)
offset += get_htf_candle_shift(0, htf_sweeps_margin, htf_sweeps_space, htf_candle_width, htf_sweeps_tf_5_number)
if tf_6_show
htf_6_candles.position_htf_candles(offset)
htf_6_candles.plot_htf(htf_sweeps_tf_6_tf, htf_sweeps_tf_6_map)
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
// # ========================================================================= #
// # | Brand |
// # ========================================================================= #
//#region
if barstate.isfirst and general_brand_show == false
var table brand = table.new(position.bottom_right, 1, 1, bgcolor = chart.bg_color)
table.cell(brand, 0, 0, "© CandelaCharts", text_color = colors_gray, text_halign = text.align_center, text_size = text_size(general_text), text_font_family = font_style(general_font))
//#endregion
// # ========================================================================= #
// # | End |
// # ========================================================================= #
Range Volatility Oscillator [Session Adjusted]Description
This open-source indicator calculates a volatility oscillator based purely on price range expansion/contraction (High − Low), making it especially suitable for instruments with well-defined trading sessions (FTSEMIB, DAX, ES, NQ, forex majors during London/NY overlap, etc.).
Instead of using price returns or close-based volatility, it compares short-term and long-term simple moving averages of the daily range, then expresses the relative difference as a percentage oscillator — similar in spirit to a MACD-style momentum readout, but applied to volatility itself.
Core Concept
Fast SMA(range, fast × candles_per_session)
Slow SMA(range, slow × candles_per_session)
Oscillator = 100 × (Fast / Slow − 1)
Positive values → recent ranges are expanding compared to the longer-term average (rising volatility / potential trend acceleration or breakout environment).
Negative values → ranges are contracting (falling volatility / potential consolidation or mean-reversion setup).
Zero line acts as the neutral pivot between expanding vs contracting regimes.
Key Features
- Session-aware calculation — user inputs session duration (default 6.5 h) → automatically estimates how many candles = 1 trading day on the current timeframe
- Works on any timeframe (1 min → daily), including irregular ones
- Optional signal line (SMA of the oscillator) for smoother readings and crossover strategies
- Clean, minimalistic plot with customizable colors
- Zero line always visible (dotted)
Typical Usage Ideas
- Rising oscillator + above zero → increasing volatility → favor momentum / breakout / trend-following strategies
- Falling oscillator / below zero → decreasing volatility → consider mean-reversion, tightening stops, or waiting for compression → expansion setups
- Signal line crossovers — fast line crossing above signal = short-term volatility pickup, crossing below = volatility cooling
- Divergences between price and the oscillator can sometimes highlight weakening trends (classic volatility divergence)
Combine with trend filters (EMA, VWAP, SuperTrend), support/resistance or volume for higher-probability setups.
Recommended Starting Settings
Session Duration: 6.5–8.5 hours (adjust to your market — e.g. 8.5 for many European indices, 6.5 for US regular session).
Fast SMA Length: 5 days
Slow SMA Length: 15 days
Signal-line Length: 3 days (if enabled)
Best results usually appear on intraday timeframes (3 min – 30 min) and on instruments with clear session boundaries and meaningful daily ranges.
Notes / Limitations
- Pure range-based → ignores gaps, overnight moves and volume
- Not normalized to ATR or percentage of price → readings are relative within each instrument
- Very low-liquidity / very small-range instruments may produce noisy output
Released under open source — feel free to modify, combine with other logic or use in strategies.
Feedback and improvements are welcome!
Pinescript Custom Performance BoostThis small script is a custom function that works similarly to the built-in calc_bars_count and max_bars_back functions, but can be used far more flexibly and significantly reduces the required computation time of Pine Script scripts.
The advantages over calc_bars_count are substantial.
The standard function works with a fixed value, e.g. calc_bars_count = 20000. The custom function, on the other hand, works on a percentage basis, e.g. with 20% of the total available chart bars.
In addition, calc_bars_count always affects the entire code, while the custom function can be applied selectively to specific parts of the script.
These two differences enable a much more flexible and efficient usage.
Fixed number of bars vs. percentage-based limitation:
The number of available bars varies greatly, not only depending on the ticker and timeframe used, but also on the TradingView subscription (approx. 5,000–40,000 historical bars).
For example, when using calc_bars_count = 20000, only charts that have more than 20,000 candles benefit. If the available number of bars is lower, there is no performance benefit at all until the value is changed after the first slow calculation.
When using the custom function with, for example, 50%, only 50% of the available bars are always calculated, regardless of how many bars are available. This results in a performance gain with shorter calculation times regardless of the chart.
Entire code vs. partial code sections:
calc_bars_count = 20000 affects the entire code globally, meaning the script processes data from only those 20,000 bars.
The custom function, however, can be used selectively for specific sections of the code. This makes it possible to continue accessing certain values across all available bars, while limiting only the truly computation-intensive parts of the script to a percentage-based range.
In this way, computation time can be drastically reduced without restricting the overall size of the data sets.
It is also possible to imitate max_bars_back and selectively limit specific values instead of limiting all of them.
I hope this is useful to some of you. Have fun with it!
Gold Sniper Pro: Trend & Reversal SystemTitle: Gold Sniper Pro: Trend & Reversal System
Headline: Stop choosing between "Buying the Dip" and "Chasing the Trend." Now you can do both.
Introduction: Most indicators fail because they only work in one market condition. Reversal indicators fail during strong breakouts (selling too early), and Trend indicators fail during ranging markets (buying the top).
Gold Sniper Pro solves this by running two separate algorithms simultaneously to cover every phase of price action on Gold (XAUUSD).
How It Works (The Dual-Core Logic):
1. 🟢 SNIPER MODE (The "Buy Low" Logic)
Goal: Catch the exact bottom of a pullback.
Logic: Detects when price sweeps a liquidity low but is trading at a "discount" (below the EMA 20).
Signal: Displays a Green "SNIPER" label.
Best for: Ranging markets and deep corrections.
2. 🔵 TREND MODE (The "Breakout" Logic)
Goal: Catch the high-momentum runaway moves (like the 16:40 pump).
Logic: Detects when price is holding above the EMA 20 with strong momentum. It buys the strength, not the weakness.
Signal: Displays a Blue "TREND" label.
Best for: News events and strong directional rallies.
Key Features:
⚡ Dynamic EMA Filter: Replaces laggy RSI with real-time price action relative to the EMA 20.
🛡️ Multi-Timeframe Safety: Built-in 30m Trend Filter to prevent trading against the major trend (can be toggled OFF for aggressive scalping).
🎯 Auto TP/SL Lines: Automatically plots your Risk:Reward (2:1) targets on the chart.
🚀 "Force Trade" Switch: A new feature that allows you to bypass safety filters during high-volatility news events to catch fast breakouts.
How to Use:
Timeframe: Best on 1m or 5m (Designed for XAUUSD/Gold).
Aggressive: Check "Ignore 30m Filter" in settings to catch every scalping opportunity.
Conservative: Uncheck "Ignore Filter" to only trade when the 30m trend is aligned.
Exit: Close trade when price hits the Green TP line or Red SL line.
Settings:
EMA Length: 20 (Standard Institutional Trend).
Reward Ratio: 2.0 (Default).
Naked POCThis indicator is designed for precision traders who need to identify Institutional Footprints and Naked POCs (nPOC) without cluttering the chart. It solves the common problem of "too many signals" during trend continuations while preserving critical reversal signals (like high-volume Dojis).
🚀 Key Features
1. Fusion Technology (Global Liquidity View)
Unlike standard indicators that only look at your current chart's volume, Fusion aggregates real-time Spot volume from major exchanges (Binance, Coinbase, OKX, Bybit) simultaneously.
Why? Futures follow Spot. This reveals the true liquidity wall across the entire market, filtering out fake pump/dump moves on a single derivative exchange.
Supports BTC & ETH pairs automatically.
2. Peak Hunter Algorithm (Smart Noise Filtering)
This is the core upgrade. Instead of marking every high-volume candle (which creates a mess during waterfalls/rallies), the Peak Hunter logic only marks a level if:
The volume is a Local Peak (higher than the past $N$ candles).
Result: It ignores "follow-through" candles in a trend but perfectly captures the Start (Ignition) and the End (Stopping Volume / Doji) of a move.
3. Micro-Structure POC (The "Microscope")
When a 30m or 4H candle triggers a signal, where exactly is the support?
This script scans the internal 1-minute or 15-second data (Lower Timeframe) inside that candle to find the exact price level with the highest volume.
Note: 15s scanning requires a Premium plan; 1m works for all.
4. Smart Lifecycle Management
nPOC Lines: Support/Resistance lines extend automatically until price tests them.
Touch Limit: Once price touches a line $X$ times (configurable), the line "dies" and becomes dotted/expired, keeping your chart clean.
DG Channel + Reversal Alerts//@version=5
indicator("Channel + Reversal Alerts", overlay=true)
//==================================================
// 1. НАСТРОЙКИ КАНАЛА
//==================================================
length = input.int(100, "Длина канала", minval=10)
// Канал по High / Low (надёжно и наглядно)
upper = ta.highest(high, length)
lower = ta.lowest(low, length)
// Рисуем канал
plot(upper, "Верхняя граница", color=color.red, linewidth=2)
plot(lower, "Нижняя граница", color=color.green, linewidth=2)
//==================================================
// 2. ЛОГИКА КАСАНИЙ
//==================================================
touchUpper = high >= upper
touchLower = low <= lower
touchUpper_first = touchUpper and not touchUpper
touchLower_first = touchLower and not touchLower
//==================================================
// 3. ПРОБОИ И РАЗВОРОТЫ
//==================================================
// Закрытие свечи вне канала
closeAbove = close > upper
closeBelow = close < lower
// Тень вышла за канал, а закрытие внутри
wickAbove = high > upper and close <= upper
wickBelow = low < lower and close >= lower
// Разворот = закрытие ИЛИ тень вне канала
reversalUpper = closeAbove or wickAbove
reversalLower = closeBelow or wickBelow
// Только первое появление, чтобы не спамило
reversalUpper_first = reversalUpper and not reversalUpper
reversalLower_first = reversalLower and not reversalLower
//==================================================
// 4. АЛЕРТЫ
//==================================================
// КАСАНИЕ
alertcondition(touchUpper_first, title="Upper touch", message="⬆️ касание")
alertcondition(touchLower_first, title="Lower touch", message="⬇️ касание")
// РАЗВОРОТ
alertcondition(reversalUpper_first, title="Upper reversal", message="⬆️ разворот")
alertcondition(reversalLower_first, title="Lower reversal", message="⬇️ разворот")
Daily Returns Analysis: N vs M
This script displays the moving average of the percentage difference in price over n vs. m periods.
Note: This is a daily average.
RSI 40-60 with Candle Colouring gran longer time frames commodities , mag 7 stocks , US500 , BTC
Main things it does:Shows a standard RSI (default 14-period) in a separate panel below the chart The RSI line is colored light cyan/blue
Draws horizontal lines at these key levels:70 (overbought – red dashed)
60 (upper boundary – bright red solid)
50 (middle/neutral – gray dotted)
40 (lower boundary – green solid)
30 (oversold – lime dashed)
→ It puts extra visual emphasis on the 40–60 zone.
Colors the price candles on the main chart (even though the indicator itself is not overlaid):Green/teal when RSI is above 50
Red when RSI is 50 or below
What traders usually use it for:Quick visual trend/momentum filter
Green candles = bullish bias (RSI > 50)
Red candles = bearish bias (RSI ≤ 50)
The area between 40–60 is often seen as neutral / no strong direction
Very simple, clean momentum-based candle coloring tool focused around the 50 level with extra attention to the 40–60 range.
Friendly Stretch Band Regime + Filters (Close Confirm + Hold)What it is
A calm, regime-based stretch band that highlights only three states: BUY zone, SELL zone, and Neutral. Designed to reduce noise and visual overload by avoiding markers, labels, and background tint.
How it works
Bands are built from an EMA basis ± ATR.
BUY Zone: price below lower band (lower band turns green)
SELL Zone: price above upper band (upper band turns red)
Neutral: price inside bands (bands grey)
Stability Options
Confirm on Close: requires CLOSE beyond the band (reduces wick spikes)
Hold Bars: holds zone state for N bars after the trigger ends (reduces flicker)
Optional Filters (applied only if enabled)
Trend filter (basis slope or slow EMA)
ATR expansion gate
Minimum exceed beyond band (ATR units)
Suggested Use
Best used as a clean “location/context” tool on swing timeframes (e.g., 4H). It can be paired with a separate momentum/confirmation tool.
Repainting & Disclaimer
Uses only current and historical bar data (no security() calls). Values may update on the realtime bar before close. Educational use only; not financial advice.
Bank CRE Stress & Short Risk Overlay + Dashboard
🏦 Bank CRE Short-Selling Dashboard:
- Expands the static database to better match the dashboard's highCRE + shortCandidates.
- Uses CRE ratio thresholds from dashboard (e.g., critical ~>500%, high ~400-500%, etc.).
- Keeps price stress logic (you can tweak it).
- Includes more failed/failed-like flags.
Access the Live Risk Monitoring & Trade Opportunities 🏦 Bank CRE Short-Selling Dashboard
claude.ai
Weighted NIFTY 5D Directional BreadthOverview
This indicator measures market participation quality within the NIFTY index by tracking how many heavily-weighted stocks are contributing to index direction over a rolling 5-day period.
Instead of counting simple up/down closes, it evaluates directional momentum × index weight, making it far more reliable for identifying narrow leadership, distribution, and late-stage rallies.
Why this indicator matters
Indexes can continue making higher highs even when only a few large stocks are doing the lifting.
This tool reveals what price alone hides:
Whether participation is broad or narrowing
When index highs are being driven by fewer contributors
Early warnings of fragility before corrections
How it works
Each selected NIFTY stock is assigned a weight approximating index influence
The indicator checks whether each stock is up or down versus its 5-day close
Directional signals are weighted and aggregated
The result is a single breadth line reflecting true contribution strength
Positive values → weighted participation is supportive
Negative values → weighted drag beneath the index
How to interpret
Index Higher High + Indicator Lower High
→ Narrow leadership, distribution risk
Indicator turns down before price
→ Early loss of momentum
Sustained positive readings
→ Healthy, broad participation
Sustained negative readings
→ Market weakness beneath the surface
This is not a buy/sell signal, but a context and risk-assessment tool.
Best use cases
Identifying late-stage rallies
Confirming or rejecting breakouts
Risk management for index trades
Combining with price structure or momentum indicators
Notes
Designed for Daily and higher timeframes
Uses non-repainting logic
Best used alongside price action and structure
Disclaimer
This indicator is intended for educational and analytical purposes only.
It does not provide financial advice or trade recommendations.
12H Fib MidpointsPrints the .5 fib retrace for final trading levels on the 1 minute chart.
Background process is exactly how its done in the video EverEvolving365 shared
1of1 Trades Expected Ranges (Friday Close Calculator)Expected Ranges (Friday Close Calculator)
Expected Ranges is a simple, non-plotting calculator designed for weekly market preparation.
It uses the most recent Friday’s daily close as the base price and calculates an expected trading range for the upcoming week.
This indicator is intentionally built as a calculator only — it does not draw lines or zones on the chart. This ensures there is no bleed between symbols and allows traders to convert levels into permanent TradingView drawings (horizontal lines and shaded rectangles) that are stored per symbol in their account.
How It Works
Friday Close is automatically detected from the daily chart.
You input a single value for Expected Weekly Move.
The indicator calculates:
Upper Range = Friday Close + Expected Move
Lower Range = Friday Close − Expected Move
Values are displayed in a clean top-right panel for quick reference.
TX Stealth Pro: International EditionTX Stealth Pro is a high-performance, intra-day monitoring terminal specifically designed for index futures traders (optimized for Taiwan Index Futures - TX). This indicator merges a sleek, "Stealth" dashboard UI with critical session-based technical levels, allowing traders to monitor trend direction, volatility, and key liquidity zones without cluttering the price action.






















