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!
אינדיקטורים ואסטרטגיות
Risk/Reward vs Win Rate HeatmapThis indicator overlays two decision-support tables on your main chart:
1. Reward:Risk vs Win Rate Heatmap
A matrix that shows whether a given combination of Win Rate (%) and Reward:Risk (R:R) is expected to be:
Profitable (green)
Break-even (amber)
Not Profitable (red)
The color is based on the standard expectancy concept:
E = p * R - (1 -p)
where p is win probability and R is Reward:Risk.
The diagonal amber cells represent the break-even boundary.
2. Drawdown Table
A quick reference table showing how much % gain is required to recover after a capital drawdown (e.g., -20% requires +25% to return to break-even). This is meant to anchor capital preservation and risk management decisions.
________________________________________
How to Use
Set your expected Win Rate and R:R in the inputs.
Enable Show highlight to display a status icon on the matching cell:
Profitable: 💰
Break-even: ⚠
Not profitable: 🚫
(All icons are customizable.)
Use the heatmap to sanity-check whether your strategy parameters make sense, and use the drawdown table as a reminder of why protecting capital matters.
________________________________________
Inputs & Customization
Position: Place each table anywhere on the chart (default layout provided).
Colors: Header colors and heatmap colors are customizable (defaults included).
Fonts: Title, headers, labels, legend, and icon font sizes are configurable.
Icons: Set your own symbols for Profitable / Break-even / Not profitable (with optional auto-contrast).
________________________________________
Notes
This script is educational and provides a visual framework to reason about expectancy and drawdowns.
It does not generate trade signals and does not guarantee profitability.
Results depend on the accuracy of your inputs and real-world execution (slippage, fees, market regime, etc.).
________________________________________
Disclaimer
This indicator is for educational purposes only and is not financial advice. You are responsible for any trading decisions and risk management.
Pro Intraday Reaction Levels🔥 Pro Intraday Reaction Levels
Maps yesterday’s range into today’s highest-probability intraday reaction zones.
Pro Intraday Reaction Levels is a professional market structure tool built for intraday traders who want clear context, smarter trade location, and high-probability reaction areas — without clutter.
Instead of plotting simple previous day lines, this indicator visualizes the entire prior day range and builds adaptive reaction zones where price is statistically more likely to stall, reject, or reverse.
It helps you stop trading blindly into extremes — and start trading with structure.
🧭 What It Shows on Your Chart
📦 Previous Day Range Box
Clearly displays yesterday’s full high–low range so you instantly know whether price is:
• Trading inside value
• Testing extremes
• Breaking into expansion
🔥 Adaptive Reaction Zones
Dynamic zones around the previous day high and low where intraday reactions commonly occur.
These zones automatically adjust to volatility (ATR):
Higher volatility → tighter zones
Lower volatility → wider zones
This keeps levels relevant in both quiet and fast markets.
⚖ Range Midpoint (Optional)
Marks the equilibrium level of the prior day — a common decision area for intraday traders.
⏹ Previous Day Close (Optional)
Displays a key reference level often respected as support/resistance or bias confirmation.
🧠 Why Traders Love It
Markets frequently react at previous day extremes due to liquidity, trapped traders, and institutional positioning.
This tool helps you:
✔ Spot potential reversal zones
✔ Identify breakout acceptance vs rejection
✔ Frame intraday bias using higher timeframe structure
✔ Avoid entering trades directly into reaction areas
It’s not just levels — it’s location and context.
⚙ Smart Features
🔹 Automatic Volatility Adjustment
Reaction zones scale dynamically using ATR so they stay meaningful in all conditions.
🔹 Session Mode
Choose how levels are projected:
• RTH Only – Focus on regular trading hours
• All Sessions – Use full 24-hour structure
🔹 Theme-Adaptive Visuals
Clean, Contrast, and Minimal themes automatically adjust colors for both dark and light charts.
🔹 Customizable Opacity & Colors
Fine-tune visibility without cluttering your chart.
🎯 Who This Is For
Ideal for traders who use:
• Intraday price action
• Futures and index trading
• Forex day trading
• Crypto intraday trading
• Support & resistance strategies
• Liquidity and reaction-based setups
Works on any market where previous day structure influences intraday behavior.
💡 How Many Traders Use It
Common approaches include:
• Looking for reversal patterns inside reaction zones
• Managing trades near PDH/PDL instead of chasing breakouts
• Combining zones with volume, order flow, or candlestick signals
• Using the midpoint and PDC as bias confirmation levels
EMA RaaIf you trade index options / futures intraday:
5 EMA → Entry timing
20 EMA → Trend pullback
50 EMA → Regime filter
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.
Vishall ForceProVishall ForcePro
Vishall ForcePro
Vishall ForcePro
Vishall ForcePro
Vishall ForcePro
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.
EZ Trend Indicator**EZ Trend Indicator (ElectZA)**
EZ Trend Indicator is a clean, lightweight trend tool built around the classic **EMA 50 / EMA 200** relationship. It plots both moving averages directly on price and automatically shades the chart background to quickly show whether the market is in a **bullish** or **bearish** environment. It also includes alert conditions for trend state changes so you can monitor direction without staring at the screen.
### What it shows
* **EMA 50 (Blue):** faster trend line (shorter-term direction)
* **EMA 200 (Red):** slower trend line (longer-term direction)
* **Background shading:**
* **Green** when EMA50 is above EMA200 (bullish trend)
* **Red** when EMA50 is below EMA200 (bearish trend)
### How to use
* **Trend filter (simple & effective):**
* When the background is **green**, prioritize **buy/long setups** and avoid counter-trend sells.
* When the background is **red**, prioritize **sell/short setups** and avoid counter-trend buys.
* **Crossover confirmation:**
* A shift from red → green suggests a potential bullish trend transition.
* A shift from green → red suggests a potential bearish trend transition.
* **Alerts:**
* Use **Bull Trend** alerts to get notified when the script detects a bullish trend state.
* Use **Bear Trend** alerts to get notified when the script detects a bearish trend state.
* **Best practice tip:**
* Combine this with your entry model (price action, support/resistance, MACD/RSI, etc.)—use EZ Trend Indicator as the **direction filter**, not the only trigger.
---
### Disclaimer
This indicator/script is provided for **educational and informational purposes only** and does **not** constitute financial, investment, or trading advice. Trading involves **significant risk**, and you may lose some or all of your capital. Past performance is **not** indicative of future results. Always do your own research, backtest on your market/timeframe, and apply proper risk management. By using this script, you accept full responsibility for all trading decisions and outcomes.
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 |
// # ========================================================================= #
MJ amd tableAsia, Londong and New york table showing each session what goes to happen depending on the movement of AMD
ISM Manufacturing PMIDescription
The ISM Manufacturing PMI (Purchasing Managers' Index) is a key economic indicator derived from monthly surveys of private sector companies. It provides insight into the health of the US manufacturing sector.
Above 50.0: Indicates Expansion.
Below 50.0: Indicates Contraction.
This script visualizes the ISM Manufacturing PMI using TradingView's available economic data (ECONOMICS:USBCOI), providing traders and analysts with a clear view of macroeconomic trends directly on their charts.
Key Features
Intuitive Visualization:
Dynamic Color Coding: The line turns Green during expansion (>50) and Red during contraction (<50).
Baseline Fill: Optional shading between the data line and the 50.0 baseline emphasizes the current economic state.
Histogram Mode: Toggle a histogram view to easily spot momentum shifts.
Customizable Data Source: Defaults to ECONOMICS:USBCOI but can be configured to use other tickers (e.g., FRED:NAPM) if preferred.
Smoothing: Built-in SMA, EMA, RMA, or WMA smoothing to filter out noise and see the longer-term trend.
Alerts: Set alerts for significant crossovers (Expansion/Contraction start) or extreme levels.
How to Use
Add to Chart: Apply the indicator to any chart. It works best on higher timeframes but pulls monthly data automatically.
Interpret the Trend:
Look for the line crossing the 50.0 level. A cross above suggests the manufacturing sector is growing (Bullish for economy). A cross below suggests slowing down or contraction (Bearish for economy).
Watch for extreme readings (above 60 or below 40) which often mark economic peaks or troughs.
Adjust Settings:
Style: Toggle the Line, Histogram, or Fill visibility in the settings.
Smoothing: If the raw data is too jagged, increase the "Smoothing Length" to 3 or 6 months.
Settings
PMI Ticker: Default is ECONOMICS:USBCOI.
Timeframe: Default is 1M (Monthly).
Show Line / Histogram: Toggle visualization modes.
Smoothing: Type and Length of the moving average applied to the data.
Colors: Customize the colors for Expansion (Grow), Contraction (Fall), and Neutral.
Indicator by: iCD_creator
Version: 1.0
---
Updates & Support
For questions, suggestions, or bug reports, please comment below or message the author.
**Like this indicator? Leave a 👍 and share your feedback!**
MACD RSI EMA AGGRESSIVE + ATR SLTPThis indicator is designed for aggressive scalping and intraday trading, especially on crypto futures.
It combines:
- MACD crossover for momentum direction
- RSI filter to avoid weak signals
- EMA trend filter to follow market bias
- Volume confirmation to reduce false signals
- ATR-based SL/TP visualization for risk management
The script provides clear BUY and SELL alerts that can be used across multiple symbols and timeframes.
Best used on lower timeframes (1m–5m) with proper risk management.
YesterWAPThe VWAP describes intra-day price action in "value-space" (quantity * price). By weighting prices based on the volume transacted, the VWAP attempts to reflect the "fair-market" value of an asset.
The VWAP is reset periodically, often at daily open, creating a "gap."
The YesterWAP tracks the gap for you.
Every time the VWAP is about to reset to LastPrice, the YesterWAP resets to it, first.
When yesterday's players clock back in today, they'll try to sort their (losing) positions out, at yesterday's VWAP, the YesterWAP.
SolQuant WatermarkSOLQUANT WATERMARK
The SolQuant Watermark is a professional-grade utility script designed for traders, educators, and content creators who want to keep their charts organized and branded. By utilizing Pine Script’s table functions, this indicator ensures your custom text and symbol data stay pinned to the screen, regardless of where you scroll on the price action.
KEY FEATURES
Customizable Branding: Display your community name, website, or social handles anywhere on the chart.
Automated Symbol Data: Dynamic tracking of the current Asset, Timeframe, and Date—perfect for keeping screenshots contextually accurate.
Precision Placement: Choose from 9 different anchor points (Top-Left, Bottom-Right, etc.) to ensure the UI never interferes with your technical analysis.
Visual Scaling: 5 different size settings (Tiny to Huge) to accommodate high-resolution displays or mobile viewing.
Aesthetic Control: Fully adjustable color palettes, background transparency, and border toggles.
WHY USE A TABLE-BASED WATERMARK?
Unlike standard chart labels which are tied to specific price/time coordinates, this tool uses the Table API . This means:
The watermark stays in place while you scroll through history.
It doesn't disappear when you "hide" other drawing tools.
It scales consistently across different devices.
INSTRUCTIONS
1. Branding: Open settings and type your link or handle into the "Quote Text" area.
2. Symbol Info: Toggle the "Symbol Info" section to automatically display asset names and dates for your records.
3. Layout: Use the X and Y position dropdowns to move the modules if they overlap with your current price action or other indicators.
Note: This is a visual utility tool only. It does not provide trade signals or financial advice.
Iron Fly 0DTE StrategyOverview
This indicator identifies optimal entry and exit points for 0DTE (zero days to expiration) Iron Fly options strategies on SPX. It uses a combination of DMI (Directional Movement Index) regime classification and ATR (Average True Range) volatility measurement to determine when market conditions favor non-directional premium selling.
An Iron Fly is a neutral options strategy that profits when price stays near a central strike. This indicator automates the decision of WHEN to enter and at WHAT strikes, based on quantifiable market conditions rather than discretionary judgment.
How It Works
Market Regime Classification
The core logic uses DMI and ADX to classify market conditions into four regimes:
SAFE - ADX below 25 AND DI Spread below 20: Low directional momentum, ideal for Iron Flies
CAUTION - ADX below 35 AND DI Spread below 30: Moderate conditions, wider wings recommended
WARNING - ADX below 45 OR DI Spread below 45: Elevated risk, no new entries
NO ENTRY - ADX above 45 AND DI Spread above 45: Strong trend, avoid premium selling
The DI Spread is calculated as the absolute difference between DI+ and DI-. A low spread indicates balanced buying and selling pressure, which favors range-bound price action.
Dynamic Wing Width Calculation
Wing width (the distance between the short strikes and protective long strikes) is calculated dynamically using:
Wing Width = ATR(14) × Multiplier × Late Session Factor
The multiplier varies by Entry Aggressiveness setting (5x to 7x ATR). Wings are widened by 20% in CAUTION regime for additional protection. Late in the session (after 50% elapsed), wings narrow by up to 20% as less time remains for adverse moves.
Wing width is bounded between 15 and 50 points and rounded to the nearest 5-point strike.
Entry Logic
New positions open when:
Market regime is SAFE or CAUTION
Current open positions are below the maximum limit
Daily trade count is below the daily limit
Price has moved sufficiently from the last entry (trigger distance)
No existing position at the calculated strike
Exit Logic
Positions close when price exceeds a dynamic exit threshold:
Exit Threshold = Wing Width × (Base Exit Percent + Time Decay Bonus)
The Base Exit Percent varies by Exit Aggressiveness (50% to 80%). The Time Decay Bonus increases throughout the session (0% to 25%), allowing wider tolerance as theta decay works in your favor.
What Makes This Original
This indicator differs from simple moving average or RSI-based approaches by:
Using DMI spread (not just ADX) to measure directional balance, which better identifies consolidation
Dynamically sizing wings based on current ATR rather than fixed widths
Adjusting exit tolerance based on session progress to account for theta decay
Implementing regime-based position management that automatically steps aside during trending conditions
Providing complete strike calculations for the 4-leg Iron Fly structure
Settings Guide
Strategy Settings
Entry Aggressiveness - Controls how often new trades open. LOW: fewer trades, wider wings, more selective. MID: balanced. HIGH: more trades, tighter wings.
Exit Aggressiveness - Controls how long positions are held. LOW: exits early at 50% of wing. MID: exits at 65% plus time bonus. HIGH: holds longer, exits at 80%.
Max Concurrent Flies - Maximum simultaneous open positions (1-5). Start with 1-2.
Max Trades Per Day - Daily limit to prevent overtrading (3-30).
Session Settings
Session Start/End - Trading hours in Eastern Time. Default 10:00-16:00.
How to Use
Add indicator to SPX chart (1-5 minute timeframe recommended)
Create alert with condition "Any alert() function call"
When OPEN alert fires, execute the 4-leg Iron Fly in your broker at the specified strikes
When CLOSE alert fires, close the position
Always verify the premium collected justifies the risk before entering
Alert Messages
OPEN alerts provide: Strike price, wing width, and all four leg strikes (short call, short put, long call, long put).
CLOSE alerts provide: Strike price and exit reason (price exceeded threshold or session ended).
Status Panel
The on-chart panel displays:
Positions - Current open count vs maximum
Market - Current regime classification
Wings - Current calculated wing width
Exit @ - Current exit threshold distance
Trades - Daily trade count vs limit
Limitations
Designed specifically for SPX 0DTE options; may not suit other underlyings
Does not account for bid-ask spreads or execution slippage
Market regime classification may lag during rapid regime changes
Past performance of signals does not guarantee future results
Requires manual execution in your options broker
Best Conditions
This strategy performs best during:
Range-bound, choppy market conditions
Normal volatility days (avoid major news events)
Regular trading hours (10 AM - 4 PM ET)
Avoid using during:
Strong trending days
FOMC announcements, CPI releases, earnings
Pre-market or after-hours
Disclaimer
This indicator is for educational and informational purposes only. It does not constitute financial advice.
Options trading involves substantial risk of loss
Iron Flies can result in losses up to the wing width minus premium collected
Past indicator signals do not guarantee future performance
Always understand your maximum risk before entering any trade
Never risk more than you can afford to lose
Conduct your own research and consider consulting a financial advisor
NY 16:00 Close Overview
This indicator is designed for traders active in Pre-market, Post-market, and Blue Ocean (Overnight) sessions. It identifies the exact closing price of the financial instrument at 16:00 New York Time (the end of the Regular Trading Hours - RTH) and anchors a continuous horizontal line to this level.
The 16:00 Close is a critical psychological and institutional level. This script helps you visualize how the price deviates from the official daily close during extended hours and subsequent trading days.
Key Features
Smart NY Close Detection: Automatically identifies the 16:00 NY bar. For instruments with early closures (like certain Futures or Commodities ending at 13:45), the script automatically anchors the line to the final available closing price of the session.
Workday-Only Logic: The script respects the traditional trading week. For assets that trade 24/7 (like Crypto), the line remains fixed at Friday's 16:00 close throughout the weekend and only updates on Monday.
Real-Time Price Label: Displays the exact anchor price on the right axis for quick reference.
Dynamic Performance Tracker: A floating dashboard in the top-right corner shows the current percentage change relative to the 16:00 Close.
Green Background: Price is above the anchor.
Red Background: Price is below the anchor.
Formatted Accuracy: Displays with leading zeros (e.g., -0.60%) for professional-grade readability.
Infinite Extension: The anchor line extends indefinitely into the future, providing a clean "waterline" for your charts.
Built-in Alerts: Includes a "Cross" alert that triggers whenever the price touches or crosses the 16:00 Close level.
Settings
Line Color/Width: Customize the visual appearance of the anchor line.
Show Label: Toggle the price tag on the right side.
Label Offset: Adjust the distance of the label from the bars to prevent overlap.
How to Use
Gap Analysis: Use the percentage box to instantly see the "Overnight Gap" during Blue Ocean or Pre-market sessions.
Support/Resistance: Watch how price reacts to the previous 16:00 close; it often acts as a significant "magnet" or pivot point during low-liquidity hours.
Trend Confirmation: If the price stays consistently above the blue line during the pre-market, it may indicate bullish sentiment for the upcoming RTH open.
Alg0 Hal0 CCI SnapAlg0 ۞ Hal0 CCI Snap
1. The Core PhilosophyThe A۞H CCI Snap is a dual-confirmation momentum oscillator. Unlike standard oscillators that only look at one data stream, this tool separates Market Structure (Background Trend) from Momentum Velocity (CCI Snap). It is designed to identify "Mean Reversion" opportunities and "Trend Continuation" snaps.
2. The Interface (Visual Components)The CCI Line (Blue): Tracks the "typical price" relative to its average. It tells you how fast the market is moving.The Signal Line (Yellow): A customizable moving average (HMA, TEMA, etc.) of the CCI. It filters out the "jitters" of the blue line.Background Trend (Green/Red): This is independent of the CCI. It tracks whether the actual Price is above or below a long-term Moving Average (default is 50 SMA).The 5-Color Heatmap Dashboard: A real-time data table that calculates the "Heat" of the current momentum compared to the last 3 bars.
3. How to Trade with A۞H CCI Snap
۞ The "Snap" Entry (Trend Continuation)This is the highest probability trade. You are looking for a momentary dip in a strong trend.Check Background: Background must be solid Green.Observe CCI: The Blue CCI line dips below the Yellow Signal line (a "cooling off").The Trigger: Enter when the Blue line snaps back above the Yellow line.Confirmation: The Dashboard should show Dark Green (Accelerating Bullish Heat).
۞ The Zero-Line Rejection (Trend Strength)
The 0 line is the "Fair Value" of momentum.Bullish: In a Green background, if CCI drops toward 0 but bounces off it without crossing, it confirms the trend is extremely strong.
Bearish: In a Red background, if CCI rises toward 0 but "rejects" and heads back down, it confirms heavy selling pressure.
۞ Exhaustion Warning (Mean Reversion)If the CCI is above +200 or below -200, the market is overextended. Look at the Dashboard Heatmap: If the CCI is at +210 but the cell color turns from Dark Green to Light Green, the "Heat" is leaving the move. This is your signal to tighten stop-losses or take profits.
4. Input Customization Guide and Recommendations
* Setting GroupFunctionPro-TipCCI CoreSets the sensitivity of the blue line.
* Use 14 for scalping, 20 for day trading.
* CCI SignalSets the smoothing of the yellow line.
* HMA (Hull) is best for crypto due to low lag.Background
* TrendDrives the Green/Red chart color.
* Set to 50 SMA for a "Trend Filter" or 200 SMA for "Macro" view.
* Alert SettingsToggles specific notifications.
* Turn off "Zero Cross" if you only want major Trend Flips.
5. Interpreting the Heatmap Dashboard:
۞ Dark Green (+): Bullish Acceleration (Buy/Hold).
۞ Light Green (+): Bullish Deceleration (Caution/Take Profit).
۞ Gray (0): No Momentum (Range-bound/Sideways).
۞ Orange/Light Red (-): Bearish Deceleration (Short Cover/Bottom Fish).
۞ Dark Red (-): Bearish Acceleration (Sell/Short).
!! Important Technical Note!!
VWAP Option: If you select VWAP as your Trend MA Type, the background will only color on charts that provide Volume Data (Stocks, Crypto, most Futures). It will appear gray on most Forex pairs.
Smart money PSP with color themesPSP with Color Themes — Price Strength Parity Indicator
PSP with Color Themes is a visual correlation indicator designed to detect Price Strength Parity (PSP) between the current chart symbol and a reference symbol.
It highlights candles where price behavior between two correlated instruments diverges or aligns, which is often used in SMT (Smart Money Technique) and intermarket analysis.
The indicator works directly on the chart and colors candles when a PSP condition is detected, using flexible and customizable color themes.
📌 What Is PSP (Price Strength Parity)?
PSP identifies situations where two correlated assets:
Move in opposite directions → Direct PSP (classic SMT divergence)
Move in the same direction → Inverse PSP (confirmation mode)
Such behavior often precedes:
Reversals
Continuations
Liquidity grabs
Market structure shifts
⚙️ Indicator Inputs
Reference Symbol
Defines the second asset used for comparison (e.g., ETHUSDT vs BTCUSDT).
Purpose:
To detect relative strength or weakness between two correlated markets.
Inverse Correlation Mode
Inverse Correlation Mode (true / false)
Allows switching between divergence-based and confirmation-based analysis.
Color Theme
Available presets:
Green / Red
Blue / Orange
Purple / Yellow
Teal / Pink
Custom
Purpose:
Adapts the indicator visually to different chart styles and backgrounds.
📈 How to Use in Trading
Typical use cases:
SMT divergence detection
Intermarket confirmation
Reversal timing
Liquidity sweep context
SMC / ICT models
Recommended combinations:
Market Structure (BOS / CHoCH)
Fair Value Gaps
Liquidity levels
Session highs /lows
⚠️ Important Notes
PSP is context-based, not a standalone entry system
Best results on correlated markets:
BTC / ETH
Indices (ES / NQ / YM)
FX pairs (EURUSD / DXY)
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






















