ICT KEY LEVELS (L3J)📊 Overview
The ICT KEY LEVELS (L3J) indicator is a tool designed to automatically identify and display key levels based on Inner Circle Trader (ICT) concepts.
This indicator combines session-based levels with multi-timeframe highs/lows analysis to provide traders with critical price zones for decision-making.
Developed by L3J - This indicator can be used in conjunction with other indicators I have developed for enhanced market analysis.
🎯 Key Features
Session-Based Levels
- Previous Day High/Low (PDH/PDL): Automatically identifies and displays the previous trading day's high and low levels
- Asian Session Levels: Tracks high and low during Asian trading hours (20:00-03:00 GMT+4)
- European Session Levels: Captures London session high and low levels (03:00-08:30 GMT+4)
Multi-Timeframe Analysis
- H1 Pivot Levels: Identifies 2-candle reversal patterns on 1-hour timeframe
- H4 Pivot Levels: Detects 4-hour pivot points using advanced pattern recognition
- Smart Visibility: Levels are only shown on appropriate timeframes (H1 levels on H1, H4 levels on H4)
Advanced Features
- Priority System: Automatically hides overlapping levels based on importance (Previous Day > Sessions > H4 > H1)
- Dynamic Labels: Real-time labels that update with price action
- Intelligent Cleanup: Removes crossed or outdated levels to maintain chart clarity
- Customizable Anchoring: Choose between precise timestamp anchoring or candle middle anchoring
- Performance Optimized: Built with efficient code structure for smooth chart performance
⚙️ Configuration Options
Note: Currently, the user interface settings are displayed in French. This will be updated to English in a future version.
General Settings
- Timezone: Configurable timezone for session calculations (default: GMT+4)
- Trading Days: Number of trading days to analyze (1-20 days)
- Extension: Right extension length for level lines
- Anchoring Mode: Precise timestamp or candle middle anchoring
Visual Customization
Each level type (Asia, Europe, Previous Day, H1, H4) includes:
- Color Selection: Separate colors for highs and lows
- Line Styles: Solid, Dotted, or Dashed lines
- Line Width: Adjustable thickness (1-4 pixels)
- Show/Hide Toggle: Individual control for each level type
🕒 Session Times
- Trading Day: 18:00-16:00 (CME session)
- Asian Session: 20:00-03:00 GMT+4
- European Session: 03:00-08:30 GMT+4
All times are configurable and timezone-aware
📈 How It Works
Level Detection
1. Session Levels: Continuously tracks price action during specific trading sessions
2. Pivot Detection: Uses 2-candle reversal patterns (bullish then bearish for highs, bearish then bullish for lows)
3. Multi-Timeframe Data: Requests higher timeframe data for H1 and H4 analysis
Smart Management
- Automatic Cleanup: Removes levels that have been crossed or are too old
- Priority Filtering: Hides duplicate levels based on importance hierarchy
- Dynamic Updates: Real-time adjustment of level positions and labels
🎨 Visual Elements
- Horizontal Lines: Extend from level creation point to the right
- Dynamic Labels: Show level type and session information
- Color Coding: Different colors for each session and timeframe
- Transparency: Automatically hides overlapping or less important levels
🔧 Technical Specifications
- Pine Script Version: v6
- Chart Overlay: True
- Max Lines: 500
- Max Labels: 50
- Performance: Optimized with intelligent memory management
📋 Usage Tips
1. Best Timeframe: Works on all timeframes, but H1 and lower provide optimal detail
2. Combine with Price Action: Use levels as confluence zones for entry/exit decisions
3. Risk Management: Levels can serve as stop-loss and take-profit targets
4. Market Structure: Helps identify key support/resistance in market structure analysis
🔄 Compatibility
This indicator is designed to work alongside other L3J indicators for comprehensive market analysis.
📞 Support & Updates
For questions, suggestions, or updates, please contact L3J through TradingView messaging.
---
Disclaimer : This indicator is for educational and analysis purposes. Always practice proper risk management and never risk more than you can afford to lose.
Version: 1.0
Author: L3J
Last Updated: 30/08/2025
Wskaźniki i strategie
Open High Low Close & Pivot Points [Prakash Kannan]Best Indicator to have previous day OHLC and Pivot Points
Dynamic Support & Resistance Zones v2 | Adaptive Channel System1. Overview of the Indicator
The Dynamic Support & Resistance Zones v2 indicator identifies key support and resistance levels based on the price action and volatility of the market. The indicator adapts to market conditions in real-time, dynamically adjusting the support and resistance zones as the price moves.
Support refers to the price level where a downward movement tends to stop, as buyers step in and push the price up.
Resistance refers to the price level where an upward movement tends to halt, as sellers come in and push the price back down.
The indicator combines two key elements:
Adaptive Channels: The support and resistance levels adjust based on market volatility (using the Average True Range - ATR).
Dynamic Zones: The support and resistance zones have gradients that change based on the proximity of price movements to these levels.
2. The Core Calculations:
a. ATR for Volatility:
ATR (Average True Range) is calculated to determine market volatility. This tells us how much the price has been moving over a certain period.
The indicator uses ATR to determine the width of the support and resistance channels. A higher ATR means wider channels (greater volatility), while a lower ATR leads to narrower channels (less volatility).
b. Dynamic Support & Resistance Levels:
Support Levels: The indicator calculates the lowest low over a specified lookback period (e.g., 20 bars). The support zone is then adjusted using a factor based on the ATR to create a dynamic channel.
Support Upper & Lower Levels: These form the outer boundaries of the support channel.
Smooth Support: The indicator uses a smoothing period to make these support levels less volatile and more accurate.
Resistance Levels: Similarly, the highest high over the lookback period is used to calculate the resistance levels. The ATR is again used to adjust the channel width.
Resistance Upper & Lower Levels: These form the outer boundaries of the resistance channel.
Smooth Resistance: The resistance levels are smoothed to create more consistent boundaries.
c. Midlines:
The indicator calculates "midlines" within the support and resistance zones. These help visualize the gradual transition between the upper and lower levels of the zones.
Midlines are plotted between the outer bands of the channels, giving a more nuanced view of the market's strength.
3. How It Visualizes the Zones:
a. Gradient Zones:
The indicator colors the space between the upper and lower boundaries of the support and resistance channels with gradient fills. These fills change color based on the price's proximity to the support or resistance zone, offering an immediate visual cue for traders.
Resistance Gradient: The closer the price is to the resistance zone, the more intense the red color becomes.
Support Gradient: Similarly, the closer the price is to the support zone, the greener the color becomes.
Extreme Zones: The outermost regions of the support and resistance zones (based on the highest and lowest levels) are also shaded differently to indicate extreme areas where the price might reverse with a higher probability.
b. Signals for Breakouts and Bounces:
Resistance Break: If the price crosses above the resistance upper boundary, a downward triangle symbol appears, signaling a potential breakout.
Support Break: If the price crosses below the support lower boundary, an upward triangle symbol appears, signaling a potential breakdown.
Bounce from Resistance/Support: If the price moves within the channel and bounces off the lower or upper boundary, it signals a rejection or bounce from support or resistance.
4. The Key Indicators:
Resistance Breakout: A signal that the price has broken above the resistance level, potentially indicating an upward trend.
Support Breakdown: A signal that the price has broken below the support level, potentially indicating a downward trend.
Resistance Rejection (Bounce): A price rejection at the resistance zone, signaling a potential reversal or continuation within the channel.
Support Bounce: A price rejection at the support zone, signaling a potential reversal or continuation within the channel.
5. Alerts and Notifications:
The indicator includes alert conditions for various events like:
Breakouts above resistance or below support.
Price bounces off support or resistance.
When these events occur, users can set alerts to notify them in real-time.
6. Customization:
Users can customize:
Lookback Period: How many bars the indicator should consider when calculating support and resistance levels.
Multipliers: Adjustments to the width of the channels (both for support and resistance).
Smoothing Period: The level of smoothing applied to the support and resistance zones to make the channels less volatile.
7. Summary of the Indicator's Key Features:
Dynamic, Adaptive Channels: The support and resistance zones adjust in real-time based on market volatility (ATR).
Smooth Transitions: Smooth, visual gradients help users understand the strength of the price action and potential reversal zones.
Real-Time Alerts: Users are notified when important price action events, such as breakouts or bounces, occur.
Customizable: Adjust the sensitivity of the support/resistance levels, channel width, and smoothing period based on personal preferences.
8. Use Case Example:
Imagine the price is near the upper resistance zone. If the price breaks above this level, it’s a Resistance Break signal, which could indicate the start of an upward trend. Conversely, if the price breaks below the lower support level, it’s a Support Breakdown signal, suggesting a potential downward trend.
Disclaimer:
The "Dynamic Support & Resistance Zones v2 | Adaptive Channel System" indicator is a tool designed to assist with technical analysis by identifying key support and resistance levels, as well as potential price action signals. While it is a powerful tool for trend analysis and trading decision-making, it is not a guaranteed predictor of market outcomes.
Risk Warning: Trading involves significant risk of loss, and the use of this indicator does not guarantee any specific results. It is recommended to combine the indicator with other forms of technical analysis, fundamental analysis, and risk management strategies.
Past Performance: The indicator's past performance is not indicative of future results. Market conditions are dynamic and constantly evolving, and past price action may not necessarily reflect future price behavior.
No Investment Advice: The indicator does not constitute financial or investment advice. Always perform your own research and consult with a professional financial advisor before making trading decisions.
Use at Your Own Risk: By using this indicator, you acknowledge that you are fully responsible for your trading decisions, and that you understand the potential risks involved.
AlgoFlex Buy Sell Signal (1h only)
**Overview**
AlgoFlex Scalper plots buy/sell signal markers using:
* a range filter (EMA of absolute bar changes) to define short-term bias,
* an Adaptive Moving Average (AMA) slope to confirm direction, and
* an ATR threshold to filter weak momentum.
Signals are evaluated on bar close to reduce intrabar noise. This is an indicator, not a strategy.
**How it works (concepts)**
* Range filter: smooths price with an EMA-based range measure and forms upper/lower bands.
* Trend state: counts consecutive movements of the filtered series (up/down counters) to avoid whipsaws.
* AMA + ATR gate: rising AMA with change > ATR \* atrMult can produce a long signal; falling AMA with change < -ATR \* atrMult can produce a short signal.
* TP/SL markers: projected using ATR multiples (tpMult, slMult). Visual guides only.
* Buy Signal, Sell Signal, plus optional TP/SL notifications. Designed to fire on bar close.
RVWAP % Distance Oscillator (30D vs 365D)RVWAP % Distance Oscillator (30D vs 365D)
Does what it says.
Goldbach Time IndicatorGoldbach Time Indicator (Minute Algebra + Core Levels)
A time-based discovery tool that maps minute arithmetic to a curated set of “Goldbach levels” (0–77) and highlights core reliable levels (29, 35, 71, 77) on any symbol/timeframe. It’s designed for session timing, event clustering, and pattern research—not price prediction.
What it shows
Three per-bar minute transforms:
Min = current minute (00–59)
Min+Hr = minute + hour (mapped, 60 → 00; valid up to 77)
Min−Hr = |minute − hour| (auto-chooses positive variant; 60 → 00)
Hit detection: marks a bar if any transform lands on an allowed Goldbach level.
Core emphasis: special tint/labels for 29, 35, 71, 77.
Optional background highlight (green for hits, blue tint when a core level is present).
Large corner readouts (optional): current Min / Min+Hr / Min−Hr with ✓ or ⭐ for core.
Detailed table: current time (your chosen timezone) + the three values and their status.
Histogram (optional): total hits and core hits under the chart.
Hover tooltips: per-bar time + which transforms hit (and whether they’re core).
Inputs & controls
Timezone Preset: UTC, New York, Tokyo, London, Sydney, or Custom UTC Offset.
Display toggles: Large number panels, Detailed table, Histogram, Horizontal reference lines.
Levels:
Standard set: 0,3,7,11,14,17,23,29,35,41,44,47,50,53,56,59,65,71,77
Core Only: show just 29, 35, 71, 77
Custom: paste your own comma-separated list (0–77)
Test Mode: assists with visual verification (e.g., consistent tooltips across all bars).
Core highlighting: stronger visual emphasis when a core level is hit.
How it helps
Session research: check if your strategy events cluster around certain minute signatures.
Timing filters: avoid entries during “no-hit” windows or focus on core hits.
Backtest guidance: the histogram and info panels make it easy to log/compare timing regimes.
Multi-market: independent of price scale—works for FX, indices, crypto, metals, single stocks.
Reading the visuals
Dots:
Yellow = Min, Lime = Min+Hr, Orange = Min−Hr, Blue = Core
Background:
Green = at least one hit, Blue tint = core level present
Tables/Panels: show current time (with timezone), raw values, and ✓/⭐ status.
Quick start
Choose your Timezone Preset (or set Custom UTC offset).
Start with Standard Levels; enable Core highlighting.
Turn on Detailed Table to confirm values match your venue/session.
(Optional) Show Histogram to see hit density; add Horizontal Lines for fixed references.
If needed, switch to Core Only or define Custom Levels to fit your hypothesis.
Notes & disclaimers
This is a time analytics overlay, not a buy/sell signal engine.
“Goldbach levels” here are a research framework (minute algebra 0–77) used for market-timing studies.
Always forward-test any timing rules with your strategy and risk plan.
Tags: timing, minute math, session research, clustering, core levels, UTC offset, macro timing, exploration
KING4R_swingGeneral
This script is called "KING4R_swing", designed to identify high-probability swing trading entries based on technical setups. It overlays the chart and uses conditions based on volume, EMAs, SPY index trend, and price structure.
Main Features
User Options:
Enable/disable SPY EMA conditions.
Show/hide checklist and final message.
Adjust label positions (vertical/horizontal).
Local EMAs:
Calculates 13-EMA and 48-EMA on the current symbol.
Flags whether EMA13 is above EMA48 and whether price is above EMA48.
Volume Spike Detection:
Searches for unusual volume spikes in the last 30 candles.
Then checks 60 candles after the spike for either:
Lateral movement (no new lows).
Higher lows (suggesting a change in structure).
Visual Tags:
When a volume spike is detected, it adds:
“📦 Post-volume Lateral” label if price goes sideways.
“📈 Structure Change” if higher lows are confirmed.
SPY Conditions:
Pulls EMAs from SPY on the daily timeframe.
Two optional conditions: EMA13 > EMA48 and EMA8 > EMA21.
Stopping Volume:
Checks if there's stopping volume in the last 30 candles (volume 1.5x above average).
Checklist + Scoring:
Assigns up to 6 points based on:
EMA13 > EMA48
Lateral structure after high volume
Price above EMA48
Stopping volume
SPY EMA13 > EMA48
SPY EMA8 > EMA21
Each condition adds 1 point.
Dynamic Labels:
Shows a red checklist, a final message with score, and a warning (“NO SETUP, NO TRADE”).
If score is 6/6, shows a 🚀 rocket icon above the bar.
Alert:
Triggers an alert when score = 6/6, indicating a possible high-probability entry.
ICT Advanced Entry Models ICT Advanced Entry Models & Market Analysis
A complete ICT-style execution suite that blends multi-timeframe structure, session logic, and 12 refined entry models into one confluence engine. Built for traders who want rule-based signals, transparent reasoning, and on-chart risk management.
What It Does
Detects market structure (BOS/CHoCH), swing failures, ranges, and premium/discount zones.
Tracks FVGs and Order Blocks with mitigation status and visual boxes.
Scores 12 ICT entry models and issues tiered alerts when confluence ≥ your threshold.
Adapts to market regime (trending vs ranging) and volatility to filter noise.
Shows risk:reward, dynamic stops/targets, and position size guidance per trade.
Logs rolling performance metrics (win rate, average R, max drawdown).
Adds a probability heatmap of high-interaction price zones.
Entry models included (toggle any on/off)
1- Optimal Trade Entry (OTE)
2- Silver Bullet (London/NY windows)
3- Unicorn Model (stop hunt → FVG/OB)
4- FVG Entry (mitigation & confluence aware)
5- Order Block Entry (mitigation-aware)
6- Breaker Block Entry
7- Stop Hunt Entry (volume/ATR-validated)
8- Liquidity Grab Entry (equal highs/lows)
9- Market Maker Model (accumulation/manipulation/distribution)
10- Power of 3 (session behavior + Asian range context)
11- Judas Swing
12- Asian Range Breakout
Confluence & filters
Weighted scoring per model (customizable weights).
MTF alignment: pick Higher TF for bias, Lower TF for trigger.
Regime & volatility gates (ADX/ATR derived).
Zone logic: premium/discount & extreme zones influence signals.
Session context: kill zones, macro times, Silver Bullet windows.
Visuals & overlays
BOS/CHoCH/SF labels.
OB/FVG boxes (solid when active, dashed when mitigated).
Daily/Weekly/Monthly key levels + Equilibrium line.
Asian High/Low and OTE 62–79% bands.
Market-regime background tint and probability heatmap lines.
Top-right Info Table shows bias, zone, regime, MTF alignment, active models, and performance stats.
Risk management (on-chart)
Dynamic structural/ATR stops and 3 staged targets (TP1/TP2/TP3).
Shows R:R, estimated position size from account size and risk %.
Alerts (tiered & specific)
High / Medium / Low Probability ICT Signal (based on confluence).
Model-specific: Unicorn, Silver Bullet, OTE.
Structure: Break of Structure, CHoCH, Swing Failure.
Regime and Volatility state changes.
(Create alerts via “Add Alert” → choose this indicator’s conditions.)
Inputs you’ll use most
Entry Models (enable all or cherry-pick).
Model Weights & Confluence Threshold.
MTF: Higher TF for bias, Lower TF for entries.
Risk: Account size, risk %, min R:R.
Sessions: Kill zones, macro times, DST adjust.
Structure: Lookback, show BOS/CHoCH/SF.
FVG: Minimum size, mitigation tracking, confluence zones.
Regime: Trend/volatility periods.
Performance: Tracking window.
How to use (quick start)
Select market & timeframe (commonly M5–H1 for execution; set HTF to H4/D for bias).
Enable your preferred models and set weights.
Keep Confluence Threshold modest (e.g., 3.0–4.5) and raise it in choppy periods.
Only act when MTF alignment agrees with market regime, and R:R meets your minimum.
Manage trades using the suggested structural/ATR stop and staged TPs.
Notes
Designed for liquid FX, indices, metals, and crypto.
Not a promise of future performance—use with prudent risk and forward test first.
Session times are exchange-agnostic; adjust DST toggle if your venue differs.
Tags: ICT, Smart Money Concepts, FVG, Order Block, BOS, CHoCH, Silver Bullet, OTE, Liquidity, MTF, Confluence, Risk Management, Algorithmic, Session Killzones, Market Regime.
FMF15
The Traders Trend Dashboard (FMF15) is a comprehensive trend analysis tool designed to assist traders in making informed trading decisions across various markets and timeframes. Unlike conventional trend-following scripts,FMF15 goes beyond simple trend detection by incorporating
VT – Dashboard05🚀 Overview
VT – Dashboard05 is a multi-timeframe market state dashboard for Forex and other liquid markets. It summarizes Trend, RSI state, RSM, and ICT structure (BOS/MSS) across H1 / M30 / M15 / M5 / M1 in one compact table—plus clean rejection markers (“S” at the top, “B” at the bottom) controlled entirely from the Style tab. All higher-timeframe values are computed without lookahead and only confirm on their candle close.
✨ Key Features
5-TF Dashboard (H1, M30, M15, M5, M1) — Columns for TREND / RSI / RSM / ICT, color-coded for quick reads.
EMA-Stack Trend — Fast/Mid/Slow EMA alignment for Up / Sideways / Down bias.
RSI & RSM States — OB/OS plus RSI vs RSM momentum (RYB / RLLT).
ICT Structure (BOS / MSS) — Choose Close Break or Body Break; signals confirm only on TF close.
Rejection Markers (Style-only) — “S” at top, “B” at bottom; change colors/visibility in Style (no Inputs clutter).
Alerts — State-change alerts for TREND, RSI, RSM, ICT on each TF, plus rejection alerts on the chart TF.
No repaint tricks — HTF data pulled with gaps filled, lookahead off, confirmation on close.
🛠 How to Use
Add to chart → set Dashboard Position (Inputs).
Pick ICT Break Method (Close Break or Body Break).
Tune Structure Swing Length for H1/M30/M15/M5/M1.
(Optional) Toggle EMA1–EMA4 overlays for context.
Style the markers in Settings → Style:
Rejection (Top) → “S” at top (color/visibility here).
Rejection (Bottom) → “B” at bottom (color/visibility here).
Create alerts using built-in conditions (e.g., ICT change H1, TREND change M15, Rejection Bullish (chart TF)).
⚙️ Settings
Dashboard: Dashboard Position, Compact Mode.
Trend: EMA Fast / Mid / Slow Lengths.
RSI: RSI Length, OB/OS Levels.
RSM: RSM RSI Length, RSM EMA Length.
ICT Structure: ICT Break Method (Close vs Body), Structure Swing Length per TF (H1/M30/M15/M5/M1).
EMAs on Chart: EMA1–EMA4 lengths & show/hide.
Style Tab: Rejection (Top) and Rejection (Bottom) series for color/visibility.
📈 Trading Concepts
TREND: EMA stacking—aligned = UP, mixed = SW, bearish stack = DOWN.
RSI: OB > overbought, OS < oversold, else SW.
RSM: RYB when Uptrend, RLLT when Downtrend.
ICT (BOS/MSS):
BOS↑/BOS↓ = break of last swing high/low.
MSS↑/MSS↓ = break against the prior BOS direction (structure shift).
Signals are evaluated with Close Break or Body Break and confirm only on TF close.
Rejection: Bar-based reversal patterns—“S” marks bearish rejection (top), “B” marks bullish rejection (bottom).
Note: This is a technical analysis tool. Always practice proper risk management and combine with other analysis techniques for best results.
Category: Multi-Timeframe / Dashboard / Structure
Version: 1.0
Developer: VT
HSM MACROS//@version=5
indicator('HSM MACROS', 'HSM MACROS', overlay=true, max_bars_back=500, explicit_plot_zorder=true)
import boitoki/AwesomeColor/4 as ac
import boitoki/Utilities/3 as util
///////////////
// Groups
///////////////
g0 = 'GENERAL'
g1_01 = '♯1 SESSION'
g1_02 = '♯2 SESSION'
g1_03 = '♯3 SESSION'
g1_04 = '♯4 SESSION'
g4 = 'BOX'
g6 = 'LABELS'
g5 = 'OPENING RANGE'
g7 = 'FIBONACCI LEVELS'
g8 = 'OPTIONS'
g11 = 'CANDLE'
g10 = 'Alerts visualized'
///////////////
// Defined
///////////////
max_bars = 500
option_yes = 'Yes'
option_no = '× No'
option_extend1 = 'Yes'
option_hide = '× Hide'
option_border_style1 = '────'
option_border_style2 = '- - - - - -'
option_border_style3 = '•••••••••'
option_chart_x = '× No'
option_chart_1 = 'Bar color'
option_chart_2 = 'Candles'
fmt_price = '{0,number,#.#####}'
fmt_pips = '{0,number,#.#}'
icon_separator = ' • '
color_none = color.new(color.black, 100)
color_text = color.new(color.white, 0)
///////////////
// Functions
///////////////
f_get_time_by_bar(bar_count) => timeframe.multiplier * bar_count * 60 * 1000
f_border_style (_style) =>
switch _style
option_border_style1 => line.style_solid
option_border_style2 => line.style_dashed
option_border_style3 => line.style_dotted
=> _style
f_get_period (_session, _start, _lookback) =>
result = math.max(_start, 1)
for i = result to _lookback
if na(_session ) and _session
result := i+1
break
result
f_get_label_position (_y, _side) =>
switch _y
'top' => _side == 'outside' ? label.style_label_lower_left : label.style_label_upper_left
'bottom' => _side == 'outside' ? label.style_label_upper_left : label.style_label_lower_left
f_get_started (_session) => na(_session ) and _session
f_get_ended (_session) => na(_session) and _session
f_message_limit_bars (_v) => '⚠️ This box\'s right position exceeds 500 bars(' + str.tostring(_v) + '). This box is not displayed correctly.'
f_set_line_x1 (_line, _x) =>
if (line.get_x1(_line) != _x)
line.set_x1(_line, _x)
f_set_line_x2 (_line, _x) =>
if (line.get_x2(_line) != _x)
line.set_x2(_line, _x)
f_set_box_right (_box, _x) =>
if box.get_right(_box) != _x
box.set_right(_box, _x)
///////////////
// Inputs
///////////////
// Timezone
i_tz = input.string('GMT-4', title='Timezone', options= , tooltip='e.g. \'America/New_York\', \'Asia/Tokyo\', \'GMT-4\', \'GMT+9\'...', group=g0)
i_history_period = input.int(10, 'History', minval=0, group=g0)
i_show = i_history_period > 0
i_lookback = 12 * 60
// Sessions
i_show_sess1 = input.bool(true, 'Session 1 ', group=g1_01, inline='session1_1') and i_show
i_sess1_label = input.string('MC1', '', group=g1_01, inline='session1_1')
i_sess1_color = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1_barcolor1 = input.color(#0a0a0a, '•', group=g1_01, inline='session1_1')
i_sess1_barcolor2 = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1 = input.session('0820-0830', 'Time', group=g1_01)
i_sess1_extend = input.string(option_no, 'Extend', options= , group=g1_01)
i_sess1_fib = input.string(option_no, 'Fibonacci levels', group=g1_01, options= ) != option_no
i_sess1_op = input.string(option_no, 'Opening range', group=g1_01, options= ) != option_no and i_show
i_sess1_chart = input.string(option_chart_x, 'Bar', options= , group=g1_01)
i_sess1_barcolor = i_sess1_chart == option_chart_1
i_sess1_plotcandle = i_sess1_chart == option_chart_2
i_show_sess2 = input.bool(true, 'Session 2 ', group=g1_02, inline='session2_1') and i_show
i_sess2_label = input.string('MC2', '', group=g1_02, inline='session2_1')
i_sess2_color = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2_barcolor1 = input.color(#0a0a0a, '•', group=g1_02, inline='session2_1')
i_sess2_barcolor2 = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2 = input.session('0920-0930', 'Time', group=g1_02)
i_sess2_extend = input.string(option_no, 'Extend', options= , group=g1_02)
i_sess2_fib = input.string(option_no, 'Fibonacci levels', group=g1_02, options= ) != option_no
i_sess2_op = input.string(option_no, 'Opening range', group=g1_02, options= ) != option_no and i_show
i_sess2_chart = input.string(option_chart_x, 'Bar', options= , group=g1_02)
i_sess2_barcolor = i_sess2_chart == option_chart_1
i_sess2_plotcandle = i_sess2_chart == option_chart_2
i_show_sess3 = input.bool(true, 'Session 3 ', group=g1_03, inline='session3_1') and i_show
i_sess3_label = input.string('MC3', '', group=g1_03, inline='session3_1')
i_sess3_color = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3_barcolor1 = input.color(#0a0a0a, '•', group=g1_03, inline='session3_1')
i_sess3_barcolor2 = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3 = input.session('0950-1010', 'Time', group=g1_03)
i_sess3_extend = input.string(option_no, 'Extend', options= , group=g1_03)
i_sess3_fib = input.string(option_no, 'Fibonacci levels', group=g1_03, options= ) != option_no
i_sess3_op = input.string(option_no, 'Opening range', group=g1_03, options= ) != option_no and i_show
i_sess3_chart = input.string(option_chart_x, 'Bar', options= , group=g1_03)
i_sess3_barcolor = i_sess3_chart == option_chart_1
i_sess3_plotcandle = i_sess3_chart == option_chart_2
i_show_sess4 = input.bool(true, 'Session 4 ', group=g1_04, inline='session4_1') and i_show
i_sess4_label = input.string('MC4', '', group=g1_04, inline='session4_1')
i_sess4_color = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4_barcolor1 = input.color(#0a0a0a, '•', group=g1_04, inline='session4_1')
i_sess4_barcolor2 = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4 = input.session('1050-1110', 'Time', group=g1_04)
i_sess4_extend = input.string(option_no, 'Extend', options= , group=g1_04)
i_sess4_fib = input.string(option_no, 'Fibonacci levels', group=g1_04, options= ) != option_no
i_sess4_op = input.string(option_no, 'Opening range', group=g1_04, options= ) != option_no and i_show
i_sess4_chart = input.string(option_chart_x, 'Bar', options= , group=g1_04)
i_sess4_barcolor = i_sess4_chart == option_chart_1
i_sess4_plotcandle = i_sess4_chart == option_chart_2
// Show & Styles
i_sess_box_style = input.string('Box', 'Style', options= , group=g4)
i_sess_border_style = f_border_style(input.string(option_border_style2, 'Line style', options= , group=g4))
i_sess_border_width = input.int(1, 'Thickness', minval=0, group=g4)
i_sess_bgopacity = input.int(94, 'Transp', minval=0, maxval=100, step=1, group=g4, tooltip='Setting the 100 is no background color')
// Candle
option_candle_body = 'OC'
option_candle_wick = 'OHLC'
i_candle = input.string(option_hide, 'Display', options= , group=g11)
i_candle_border_width = input.int(2, 'Thickness', minval=0, group=g11)
i_show_candle = (i_candle != option_hide) and (i_candle_border_width > 0)
i_show_candle_wick = i_candle == option_candle_wick
option_candle_color1 = 'Session\'s'
option_candle_color2 = 'Red • Green'
i_candle_color = input.string(option_candle_color2, 'Color ', options= , group=g11, inline='candle_color')
i_candle_color_g = input.color(#A6E22E, '', group=g11, inline='candle_color')
i_candle_color_r = input.color(#F92672, '', group=g11, inline='candle_color')
// Labels
i_label_show = input.bool(true, 'Labels', inline='label_show', group=g6) and i_show
i_label_size = str.lower(input.string('Small', '', options= , inline='label_show', group=g6))
i_label_position_y = str.lower(input.string('Top', '', options= , inline='label_show', group=g6))
i_label_position_s = str.lower(input.string('Outside', '', options= , inline='label_show', group=g6))
i_label_position = f_get_label_position(i_label_position_y, i_label_position_s)
i_label_format_name = input.bool(true, 'Name', inline='label_format', group=g6)
i_label_format_day = input.bool(false, 'Day', inline='label_format', group=g6)
i_label_format_price = input.bool(false, 'Price', inline='label_format', group=g6)
i_label_format_pips = input.bool(false, 'Pips', inline='label_format', group=g6)
// Fibonacci levels
i_f_linestyle = f_border_style(input.string(option_border_style1, title="Style", options= , group=g7))
i_f_linewidth = input.int(1, title="Thickness", minval=1, group=g7)
// Opening range
i_o_minutes = input.int(15, title='Periods (minutes)', minval=1, step=1, group=g5)
i_o_minutes := math.max(i_o_minutes, timeframe.multiplier + 1)
i_o_transp = input.int(88, title='Transp', minval=0, maxval=100, step=1, group=g5)
// Alerts
i_alert1_show = input.bool(false, 'Alerts - Sessions stard/end', group=g10)
i_alert2_show = input.bool(false, 'Alerts - Opening range breakouts', group=g10)
i_alert3_show = input.bool(false, 'Alerts - Price crossed session\'s High/Low after session closed', group=g10)
// ------------------------
// Drawing labels
// ------------------------
f_render_label (_show, _session, _is_started, _color, _top, _bottom, _text, _labels) =>
var label my_label = na
var int start_time = na
v_position_y = (i_label_position_y == 'top') ? _top : _bottom
v_label = array.new_string()
v_chg = _top - _bottom
if _is_started
start_time := time
if i_label_format_name and not na(_text)
array.push(v_label, _text)
if i_label_format_day
array.push(v_label, util.get_day(dayofweek(start_time, i_tz)))
if i_label_format_price
array.push(v_label, str.format(fmt_price, v_chg))
if i_label_format_pips
array.push(v_label, str.format(fmt_pips, util.toPips(v_chg)) + ' pips')
if _show
if _is_started
my_label := label.new(bar_index, v_position_y, array.join(v_label, icon_separator), textcolor=_color, color=color_none, size=i_label_size, style=i_label_position)
array.push(_labels, my_label)
util.clear_labels(_labels, i_history_period)
else if _session
label.set_y(my_label, v_position_y)
label.set_text(my_label, array.join(v_label, icon_separator))
// ------------------------
// Drawing Fibonacci levels
// ------------------------
f_render_fibonacci (_show, _session, _is_started, _x1, _x2, _color, _top, _bottom, _level, _width, _style, _is_extend, _lines) =>
var line my_line = na
if _show
y = (_top - _bottom) * _level + _bottom
if _is_started
my_line := line.new(_x1, y, _x2, y, width=_width, color=color.new(_color, 30), style=_style)
array.push(_lines, my_line)
if _is_extend
line.set_extend(my_line, extend.right)
else if _session
line.set_y1(my_line, y)
line.set_y2(my_line, y)
f_set_line_x2(my_line, _x2)
// ------------------------
// Drawing Opening range
// ------------------------
f_render_oprange (_show, _session, _is_started, _x1, _x2, _color, _max, _is_extend, _boxes) =>
var int start_time = na
var box my_box = na
top = ta.highest(high, _max)
bottom = ta.lowest(low, _max)
is_crossover = ta.crossover(close, box.get_top(my_box))
is_crossunder = ta.crossunder(close, box.get_bottom(my_box))
if _show
if _is_started
util.clear_boxes(_boxes, math.max(0, i_history_period - 1))
start_time := time
my_box := na
else if _session
time_op = start_time + (i_o_minutes * 60 * 1000)
time_op_delay = time_op - f_get_time_by_bar(1)
if time <= time_op and time > time_op_delay
my_box := box.new(_x1, top, _x2, bottom, border_width=0, bgcolor=color.new(_color, i_o_transp))
array.push(_boxes, my_box)
if _is_extend
box.set_extend(my_box, extend.right)
my_box
else
f_set_box_right(my_box, _x2)
if is_crossover
alert('Price crossed over the opening range', alert.freq_once_per_bar)
if i_alert2_show
label.new(bar_index, box.get_top(my_box), "×", color=color.blue, textcolor=ac.tradingview('blue'), style=label.style_none, size=size.large)
if is_crossunder
alert('Price crossed under the opening range', alert.freq_once_per_bar)
if i_alert2_show
label.new(bar_index, box.get_bottom(my_box), "×", color=color.red, textcolor=ac.tradingview('red'), style=label.style_none, size=size.large)
my_box
// ------------------------
// Drawing candle
// ------------------------
f_render_candle (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _open, _x1, _x2, _boxes, _lines) =>
var box body = na
var line wick1 = na
var line wick2 = na
border_width = i_candle_border_width
cx = math.round(math.avg(_x2, _x1)) - math.round(border_width / 2)
body_color = i_candle_color == option_candle_color2 ? close > _open ? i_candle_color_g : i_candle_color_r : _color
if _show
if _is_started
body := box.new(_x1, _top, _x2, _bottom, body_color, border_width, line.style_solid, bgcolor=color.new(color.black, 100))
wick1 := i_show_candle_wick ? line.new(cx, _top, cx, _top, color=_color, width=border_width, style=line.style_solid) : na
wick2 := i_show_candle_wick ? line.new(cx, _bottom, cx, _bottom, color=_color, width=border_width, style=line.style_solid) : na
array.push(_boxes, body)
array.push(_lines, wick1)
array.push(_lines, wick2)
util.clear_boxes(_boxes, i_history_period)
util.clear_lines(_lines, i_history_period * 2)
else if _session
top = math.max(_open, close)
bottom = math.min(_open, close)
box.set_top(body, top)
box.set_bottom(body, bottom)
box.set_right(body, _x2)
box.set_border_color(body, body_color)
line.set_y1(wick1, _top)
line.set_y2(wick1, top)
f_set_line_x1(wick1, cx)
f_set_line_x2(wick1, cx)
line.set_color(wick1, body_color)
line.set_y1(wick2, _bottom)
line.set_y2(wick2, bottom)
f_set_line_x1(wick2, cx)
f_set_line_x2(wick2, cx)
line.set_color(wick2, body_color)
else if _is_ended
box.set_right(body, bar_index)
// ------------------------
// Rendering limit message
// ------------------------
f_render_limitmessage (_show, _session, _is_started, _is_ended, _x, _y, _rightbars) =>
var label my_note = na
if _show
if _is_started
if _rightbars > max_bars
my_note := label.new(_x, _y, f_message_limit_bars(_rightbars), style=label.style_label_upper_left, color=color.yellow, textalign=text.align_left, yloc=yloc.price)
else if _session
if _rightbars > max_bars
label.set_y(my_note, _y)
label.set_text(my_note, f_message_limit_bars(_rightbars))
else
label.delete(my_note)
else if _is_ended
label.delete(my_note)
true
// Rendering session
//
f_render_sessionrange (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _lines) =>
var line above_line = na
var line below_line = na
if _show
if _is_started
above_line := line.new(_x1, _top, _x2, _top, width=i_sess_border_width, style=i_sess_border_style, color=_color)
below_line := line.new(_x1, _bottom, _x2, _bottom, width=i_sess_border_width, style=i_sess_border_style, color=_color)
linefill.new(above_line, below_line, color.new(_color, i_sess_bgopacity))
array.push(_lines, above_line)
array.push(_lines, below_line)
util.clear_lines(_lines, i_history_period * 2)
if _is_extend
line.set_extend(above_line, extend.right)
line.set_extend(below_line, extend.right)
else if _session
line.set_y1(above_line, _top)
line.set_y2(above_line, _top)
line.set_x2(above_line, _x2)
line.set_y1(below_line, _bottom)
line.set_y2(below_line, _bottom)
line.set_x2(below_line, _x2)
true
else if _is_ended
true
true
// ------------------------
// Rendering session box
// ------------------------
f_render_session (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _boxes) =>
var box my_box = na
if _show
if _is_started
my_box := box.new(_x1, _top, _x2, _bottom, _color, i_sess_border_width, i_sess_border_style, bgcolor=color.new(_color, i_sess_bgopacity))
array.push(_boxes, my_box)
util.clear_boxes(_boxes, i_history_period)
if _is_extend
box.set_extend(my_box, extend.right)
else if _session
box.set_top(my_box, _top)
box.set_bottom(my_box, _bottom)
f_set_box_right(my_box, _x2)
else if _is_ended
box.set_right(my_box, bar_index)
my_box
// ------------------------
// Drawing market
// ------------------------
f_render_main (_show, _session, _is_started, _is_ended, _color, _top, _bottom) =>
var box my_box = na
var label my_note = na
var x1 = 0
var x2 = 0
var session_open = 0.0
var session_high = 0.0
var session_low = 0.0
x0_1 = ta.valuewhen(na(_session ) and _session, bar_index, 1)
x0_2 = ta.valuewhen(na(_session) and _session , bar_index, 0)
x0_d = math.abs(x0_2 - x0_1)
limit_bars = max_bars
rightbars = x0_d
if _show
if _is_started
x1 := bar_index
x2 := bar_index + (math.min(x0_d, limit_bars))
session_open := open
session_high := _top
session_low := _bottom
else if _session
true_x2 = x1 + x0_d
rightbars := true_x2 - bar_index
limit_bars := bar_index + max_bars
x2 := math.min(true_x2, limit_bars)
session_high := _top
session_low := _bottom
else if _is_ended
session_open := na
// ------------------------
// Drawing
// ------------------------
draw (_show, _session, _color, _label, _extend, _show_fib, _show_op, _lookback, _boxes_session, _lines_session, _boxes_candle_body, _lines_candle_wick, _boxes_op, _lines_fib, _labels) =>
max = f_get_period(_session, 1, _lookback)
top = ta.highest(high, max)
bottom = ta.lowest(low, max)
is_started = f_get_started(_session)
is_ended = f_get_ended(_session)
is_extend = _extend != option_no
= f_render_main(_show, _session, is_started, is_ended, _color, top, bottom)
if i_sess_box_style == 'Box'
f_render_session(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _boxes_session)
if i_sess_box_style == 'Sandwich'
f_render_sessionrange(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _lines_session)
if i_show_candle
f_render_candle(_show, _session, is_started, is_ended, _color, top, bottom, _open, x1, x2, _boxes_candle_body, _lines_candle_wick)
if i_label_show
f_render_label(_show, _session, is_started, _color, top, bottom, _label, _labels)
if _show_op
f_render_oprange(_show, _session, is_started, x1, x2, _color, max, is_extend, _boxes_op)
if _show_fib
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.500, 2, line.style_solid, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.628, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.382, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
util.clear_lines(_lines_fib, i_history_period * 3)
f_render_limitmessage(_show, _session, is_started, is_ended, x1, bottom, _rightbars)
///////////////////
// Calculating
///////////////////
string tz = (i_tz == option_no or i_tz == '') ? na : i_tz
int sess1 = time(timeframe.period, i_sess1, tz)
int sess2 = time(timeframe.period, i_sess2, tz)
int sess3 = time(timeframe.period, i_sess3, tz)
int sess4 = time(timeframe.period, i_sess4, tz)
///////////////////
// Plotting
///////////////////
var sess1_box = array.new()
var sess2_box = array.new()
var sess3_box = array.new()
var sess4_box = array.new()
var sess1_line = array.new()
var sess2_line = array.new()
var sess3_line = array.new()
var sess4_line = array.new()
var sess1_op = array.new()
var sess2_op = array.new()
var sess3_op = array.new()
var sess4_op = array.new()
var sess1_fib = array.new()
var sess2_fib = array.new()
var sess3_fib = array.new()
var sess4_fib = array.new()
var sess1_candle_body = array.new()
var sess2_candle_body = array.new()
var sess3_candle_body = array.new()
var sess4_candle_body = array.new()
var sess1_candle_wick = array.new()
var sess2_candle_wick = array.new()
var sess3_candle_wick = array.new()
var sess4_candle_wick = array.new()
var sess1_labels = array.new()
var sess2_labels = array.new()
var sess3_labels = array.new()
var sess4_labels = array.new()
= draw(i_show_sess1, sess1, i_sess1_color, i_sess1_label, i_sess1_extend, i_sess1_fib, i_sess1_op, i_lookback, sess1_box, sess1_line, sess1_candle_body, sess1_candle_wick, sess1_op, sess1_fib, sess1_labels)
= draw(i_show_sess2, sess2, i_sess2_color, i_sess2_label, i_sess2_extend, i_sess2_fib, i_sess2_op, i_lookback, sess2_box, sess2_line, sess2_candle_body, sess2_candle_wick, sess2_op, sess2_fib, sess2_labels)
= draw(i_show_sess3, sess3, i_sess3_color, i_sess3_label, i_sess3_extend, i_sess3_fib, i_sess3_op, i_lookback, sess3_box, sess3_line, sess3_candle_body, sess3_candle_wick, sess3_op, sess3_fib, sess3_labels)
= draw(i_show_sess4, sess4, i_sess4_color, i_sess4_label, i_sess4_extend, i_sess4_fib, i_sess4_op, i_lookback, sess4_box, sess4_line, sess4_candle_body, sess4_candle_wick, sess4_op, sess4_fib, sess4_labels)
is_positive_bar = close > open
color c_barcolor = na
color c_plotcandle = na
c_sess1_barcolor = (is_sess1) ? (is_positive_bar ? i_sess1_barcolor1 : i_sess1_barcolor2) : na
c_sess2_barcolor = (is_sess2) ? (is_positive_bar ? i_sess2_barcolor1 : i_sess2_barcolor2) : na
c_sess3_barcolor = (is_sess3) ? (is_positive_bar ? i_sess3_barcolor1 : i_sess3_barcolor2) : na
c_sess4_barcolor = (is_sess4) ? (is_positive_bar ? i_sess4_barcolor1 : i_sess4_barcolor2) : na
if (i_sess1_chart != option_chart_x) and is_sess1
c_barcolor := i_sess1_barcolor ? c_sess1_barcolor : na
c_plotcandle := i_sess1_plotcandle ? c_sess1_barcolor : na
if (i_sess2_chart != option_chart_x) and is_sess2
c_barcolor := i_sess2_barcolor ? c_sess2_barcolor : na
c_plotcandle := i_sess2_plotcandle ? c_sess2_barcolor : na
if (i_sess3_chart != option_chart_x) and is_sess3
c_barcolor := i_sess3_barcolor ? c_sess3_barcolor : na
c_plotcandle := i_sess3_plotcandle ? c_sess3_barcolor : na
if (i_sess4_chart != option_chart_x) and is_sess4
c_barcolor := i_sess4_barcolor ? c_sess4_barcolor : na
c_plotcandle := i_sess4_plotcandle ? c_sess4_barcolor : na
barcolor(c_barcolor)
plotcandle(open, high, low, close, color=is_positive_bar ? color_none : c_plotcandle, bordercolor=c_plotcandle, wickcolor=c_plotcandle)
////////////////////
// Alerts
////////////////////
// Session alerts
sess1_started = is_sess1 and not is_sess1 , sess1_ended = not is_sess1 and is_sess1
sess2_started = is_sess2 and not is_sess2 , sess2_ended = not is_sess2 and is_sess2
sess3_started = is_sess3 and not is_sess3 , sess3_ended = not is_sess3 and is_sess3
sess4_started = is_sess4 and not is_sess4 , sess4_ended = not is_sess4 and is_sess4
alertcondition(sess1_started, 'Session #1 started')
alertcondition(sess1_ended, 'Session #1 ended')
alertcondition(sess2_started, 'Session #2 started')
alertcondition(sess2_ended, 'Session #2 ended')
alertcondition(sess3_started, 'Session #3 started')
alertcondition(sess3_ended, 'Session #3 ended')
alertcondition(sess4_started, 'Session #4 started')
alertcondition(sess4_ended, 'Session #4 ended')
alertcondition((not is_sess1) and ta.crossover(close, sess1_high), 'Session #1 High crossed (after session closed)')
alertcondition((not is_sess1) and ta.crossunder(close, sess1_low), 'Session #1 Low crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossover(close, sess2_high), 'Session #2 High crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossunder(close, sess2_low), 'Session #2 Low crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossover(close, sess3_high), 'Session #3 High crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossunder(close, sess3_low), 'Session #3 Low crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossover(close, sess4_high), 'Session #4 High crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossunder(close, sess4_low), 'Session #4 Low crossed (after session closed)')
// Alerts visualized
if i_alert1_show
if i_show_sess1
if sess1_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess1_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess1_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess1_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess2
if sess2_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess2_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess2_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess2_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess3
if sess3_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess3_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess3_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess3_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess4
if sess4_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess4_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
plot(i_alert3_show ? sess1_high : na, 'sess1_high', style=plot.style_linebr, color=i_sess1_color)
plot(i_alert3_show ? sess1_low : na, 'sess1_low' , style=plot.style_linebr, color=i_sess1_color, linewidth=2)
plot(i_alert3_show ? sess2_high : na, 'sess2_high', style=plot.style_linebr, color=i_sess2_color)
plot(i_alert3_show ? sess2_low : na, 'sess2_low' , style=plot.style_linebr, color=i_sess2_color, linewidth=2)
plot(i_alert3_show ? sess3_high : na, 'sess3_high', style=plot.style_linebr, color=i_sess3_color)
plot(i_alert3_show ? sess3_low : na, 'sess3_low' , style=plot.style_linebr, color=i_sess3_color, linewidth=2)
plot(i_alert3_show ? sess4_high : na, 'sess4_high', style=plot.style_linebr, color=i_sess4_color)
plot(i_alert3_show ? sess4_low : na, 'sess4_low' , style=plot.style_linebr, color=i_sess4_color, linewidth=2)
plotshape(i_alert3_show and (not is_sess1) and ta.crossover(close, sess1_high) ? sess1_high : na, 'cross sess1_high', color=i_sess1_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess1) and ta.crossunder(close, sess1_low) ? sess1_low : na, 'cross sess1_low', color=i_sess1_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess2) and ta.crossover(close, sess2_high) ? sess2_high : na, 'cross sess2_high', color=i_sess2_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess2) and ta.crossunder(close, sess2_low) ? sess2_low : na, 'cross sess2_low', color=i_sess2_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess3) and ta.crossover(close, sess3_high) ? sess3_high : na, 'cross sess3_high', color=i_sess3_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess3) and ta.crossunder(close, sess3_low) ? sess3_low : na, 'cross sess3_low', color=i_sess3_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess4) and ta.crossover(close, sess4_high) ? sess4_high : na, 'cross sess4_high', color=i_sess4_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess4) and ta.crossunder(close, sess4_low) ? sess4_low : na, 'cross sess4_low', color=i_sess4_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
MACD_V5 with Divergence
MACD_V5 with Divergence is an EMA-based Bull/Bear Power oscillator. It computes
BBP = (high − EMA(close, Length)) + (low − EMA(close, Length)), plots BBP as columns with a zero line, and overlays a slope-colored BBP moving average. The script flags fresh Overbought/Oversold extremes within a rolling window and draws dashed levels, and it detects Regular and Hidden divergences using confirmed pivots (non-repainting after confirmation; appears with an lbR-bar delay).
Built-in alerts fire on OB/OS prints and on BBP ↔ BBP-MA crosses (use “Any alert() function call”).
How to use
• Treat crosses as triggers and divergence as confirmation.
• Always read signals in the context of the higher-timeframe or a price-based trend filter (e.g., EMA on price).
• Backtest and paper trade before going live.
Inputs: EMA Length, Highest/Lowest Period, Overbought/Oversold levels, BBP MA Length.
Works on any symbol and timeframe.
EMA-based Bull/Bear Power oscillator (BBP) with slope-colored MA. Marks fresh OB/OS extremes and detects Regular/Hidden divergences via confirmed pivots (no repaint after confirmation; lbR delay). Alerts on OB/OS and BBP ↔ MA cross. Use crosses to trigger, divergences to confirm, and trend context to filter. Inputs: Length, Period, OB/OS, MA Length.
EMA-based BBPower oscillator with OB/OS extremes, slope MA, and regular/hidden divergence. Alerts on OB/OS and BBP↔MA cross. Use crosses to trigger, divergences to confirm. Pivot signals show after lbR delay.
Initial public release
EMA-based BBP with slope-colored MA
OB/OS extreme labels + dashed levels
Regular & Hidden divergence (confirmed pivots; non-repainting after confirm)
Built-in alerts for OB/OS and BBP↔MA cross
Signifikante HochsThis indicator was created to highlight significant highs in the price chart. It is intentionally kept simple and lightweight, since its primary purpose is to serve as a test and learning tool for exploring the functions of the TradingView platform.
How it works:
A user-defined lookback period is applied to check whether a local high has been formed.
A minimum percentage change threshold is used as an additional filter, so that only highs with a certain level of significance are marked.
Once such a high is detected, a visual marker is plotted above the corresponding candle.
The main goal of this script is not to provide a complete trading strategy, but rather to help users understand the basic elements of Pine Script, chart visualization, and platform workflows. In particular, this script is a practical way to test and demonstrate:
The use of input parameters.
Core functions such as ta.pivothigh.
Conditional checks for price significance.
Simple plotting of signals directly on the chart.
At the same time, this test indicator can serve as a foundation for further development. The logic can easily be extended to:
Display significant lows as well as highs.
Draw connecting trendlines between pivots.
Generate alerts whenever a new significant high appears.
Incorporate multi-timeframe logic for deeper analysis.
Important note:
This script is not intended to be a full trading strategy in its current form. Instead, it acts as a test environment for learning how to publish, manage, and experiment with indicators on TradingView.
For the TradingView community, this simple tool can still be valuable, as it provides a quick visual reference for key highs that traders may use as additional context in their market analysis.
HSM BULLET//@version=5
indicator('HSM BULLET', 'HSM BULLET', overlay=true, max_bars_back=500, explicit_plot_zorder=true)
import boitoki/AwesomeColor/4 as ac
import boitoki/Utilities/3 as util
///////////////
// Groups
///////////////
g0 = 'GENERAL'
g1_01 = '♯1 SESSION'
g1_02 = '♯2 SESSION'
g1_03 = '♯3 SESSION'
g1_04 = '♯4 SESSION'
g4 = 'BOX'
g6 = 'LABELS'
g5 = 'OPENING RANGE'
g7 = 'FIBONACCI LEVELS'
g8 = 'OPTIONS'
g11 = 'CANDLE'
g10 = 'Alerts visualized'
///////////////
// Defined
///////////////
max_bars = 500
option_yes = 'Yes'
option_no = '× No'
option_extend1 = 'Yes'
option_hide = '× Hide'
option_border_style1 = '────'
option_border_style2 = '- - - - - -'
option_border_style3 = '•••••••••'
option_chart_x = '× No'
option_chart_1 = 'Bar color'
option_chart_2 = 'Candles'
fmt_price = '{0,number,#.#####}'
fmt_pips = '{0,number,#.#}'
icon_separator = ' • '
color_none = color.new(color.black, 100)
color_text = color.new(color.white, 0)
///////////////
// Functions
///////////////
f_get_time_by_bar(bar_count) => timeframe.multiplier * bar_count * 60 * 1000
f_border_style (_style) =>
switch _style
option_border_style1 => line.style_solid
option_border_style2 => line.style_dashed
option_border_style3 => line.style_dotted
=> _style
f_get_period (_session, _start, _lookback) =>
result = math.max(_start, 1)
for i = result to _lookback
if na(_session ) and _session
result := i+1
break
result
f_get_label_position (_y, _side) =>
switch _y
'top' => _side == 'outside' ? label.style_label_lower_left : label.style_label_upper_left
'bottom' => _side == 'outside' ? label.style_label_upper_left : label.style_label_lower_left
f_get_started (_session) => na(_session ) and _session
f_get_ended (_session) => na(_session) and _session
f_message_limit_bars (_v) => '⚠️ This box\'s right position exceeds 500 bars(' + str.tostring(_v) + '). This box is not displayed correctly.'
f_set_line_x1 (_line, _x) =>
if (line.get_x1(_line) != _x)
line.set_x1(_line, _x)
f_set_line_x2 (_line, _x) =>
if (line.get_x2(_line) != _x)
line.set_x2(_line, _x)
f_set_box_right (_box, _x) =>
if box.get_right(_box) != _x
box.set_right(_box, _x)
///////////////
// Inputs
///////////////
// Timezone
i_tz = input.string('GMT-4', title='Timezone', options= , tooltip='e.g. \'America/New_York\', \'Asia/Tokyo\', \'GMT-4\', \'GMT+9\'...', group=g0)
i_history_period = input.int(10, 'History', minval=0, group=g0)
i_show = i_history_period > 0
i_lookback = 12 * 60
// Sessions
i_show_sess1 = input.bool(true, 'Session 1 ', group=g1_01, inline='session1_1') and i_show
i_sess1_label = input.string('London Silver', '', group=g1_01, inline='session1_1')
i_sess1_color = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1_barcolor1 = input.color(#0a0a0a, '•', group=g1_01, inline='session1_1')
i_sess1_barcolor2 = input.color(#0a0a0a, '', group=g1_01, inline='session1_1')
i_sess1 = input.session('0300-0400', 'Time', group=g1_01)
i_sess1_extend = input.string(option_no, 'Extend', options= , group=g1_01)
i_sess1_fib = input.string(option_no, 'Fibonacci levels', group=g1_01, options= ) != option_no
i_sess1_op = input.string(option_no, 'Opening range', group=g1_01, options= ) != option_no and i_show
i_sess1_chart = input.string(option_chart_x, 'Bar', options= , group=g1_01)
i_sess1_barcolor = i_sess1_chart == option_chart_1
i_sess1_plotcandle = i_sess1_chart == option_chart_2
i_show_sess2 = input.bool(true, 'Session 2 ', group=g1_02, inline='session2_1') and i_show
i_sess2_label = input.string('NY AM Bullet', '', group=g1_02, inline='session2_1')
i_sess2_color = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2_barcolor1 = input.color(#0a0a0a, '•', group=g1_02, inline='session2_1')
i_sess2_barcolor2 = input.color(#0a0a0a, '', group=g1_02, inline='session2_1')
i_sess2 = input.session('1000-1100', 'Time', group=g1_02)
i_sess2_extend = input.string(option_no, 'Extend', options= , group=g1_02)
i_sess2_fib = input.string(option_no, 'Fibonacci levels', group=g1_02, options= ) != option_no
i_sess2_op = input.string(option_no, 'Opening range', group=g1_02, options= ) != option_no and i_show
i_sess2_chart = input.string(option_chart_x, 'Bar', options= , group=g1_02)
i_sess2_barcolor = i_sess2_chart == option_chart_1
i_sess2_plotcandle = i_sess2_chart == option_chart_2
i_show_sess3 = input.bool(true, 'Session 3 ', group=g1_03, inline='session3_1') and i_show
i_sess3_label = input.string('NY PM Bullet', '', group=g1_03, inline='session3_1')
i_sess3_color = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3_barcolor1 = input.color(#0a0a0a, '•', group=g1_03, inline='session3_1')
i_sess3_barcolor2 = input.color(#0a0a0a, '', group=g1_03, inline='session3_1')
i_sess3 = input.session('1400-1500', 'Time', group=g1_03)
i_sess3_extend = input.string(option_no, 'Extend', options= , group=g1_03)
i_sess3_fib = input.string(option_no, 'Fibonacci levels', group=g1_03, options= ) != option_no
i_sess3_op = input.string(option_no, 'Opening range', group=g1_03, options= ) != option_no and i_show
i_sess3_chart = input.string(option_chart_x, 'Bar', options= , group=g1_03)
i_sess3_barcolor = i_sess3_chart == option_chart_1
i_sess3_plotcandle = i_sess3_chart == option_chart_2
i_show_sess4 = input.bool(true, 'Session 4 ', group=g1_04, inline='session4_1') and i_show
i_sess4_label = input.string(' ', '', group=g1_04, inline='session4_1')
i_sess4_color = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4_barcolor1 = input.color(#0a0a0a, '•', group=g1_04, inline='session4_1')
i_sess4_barcolor2 = input.color(#0a0a0a, '', group=g1_04, inline='session4_1')
i_sess4 = input.session('1000-1000', 'Time', group=g1_04)
i_sess4_extend = input.string(option_no, 'Extend', options= , group=g1_04)
i_sess4_fib = input.string(option_no, 'Fibonacci levels', group=g1_04, options= ) != option_no
i_sess4_op = input.string(option_no, 'Opening range', group=g1_04, options= ) != option_no and i_show
i_sess4_chart = input.string(option_chart_x, 'Bar', options= , group=g1_04)
i_sess4_barcolor = i_sess4_chart == option_chart_1
i_sess4_plotcandle = i_sess4_chart == option_chart_2
// Show & Styles
i_sess_box_style = input.string('Box', 'Style', options= , group=g4)
i_sess_border_style = f_border_style(input.string(option_border_style2, 'Line style', options= , group=g4))
i_sess_border_width = input.int(1, 'Thickness', minval=0, group=g4)
i_sess_bgopacity = input.int(94, 'Transp', minval=0, maxval=100, step=1, group=g4, tooltip='Setting the 100 is no background color')
// Candle
option_candle_body = 'OC'
option_candle_wick = 'OHLC'
i_candle = input.string(option_hide, 'Display', options= , group=g11)
i_candle_border_width = input.int(2, 'Thickness', minval=0, group=g11)
i_show_candle = (i_candle != option_hide) and (i_candle_border_width > 0)
i_show_candle_wick = i_candle == option_candle_wick
option_candle_color1 = 'Session\'s'
option_candle_color2 = 'Red • Green'
i_candle_color = input.string(option_candle_color2, 'Color ', options= , group=g11, inline='candle_color')
i_candle_color_g = input.color(#A6E22E, '', group=g11, inline='candle_color')
i_candle_color_r = input.color(#F92672, '', group=g11, inline='candle_color')
// Labels
i_label_show = input.bool(true, 'Labels', inline='label_show', group=g6) and i_show
i_label_size = str.lower(input.string('Small', '', options= , inline='label_show', group=g6))
i_label_position_y = str.lower(input.string('Top', '', options= , inline='label_show', group=g6))
i_label_position_s = str.lower(input.string('Outside', '', options= , inline='label_show', group=g6))
i_label_position = f_get_label_position(i_label_position_y, i_label_position_s)
i_label_format_name = input.bool(true, 'Name', inline='label_format', group=g6)
i_label_format_day = input.bool(false, 'Day', inline='label_format', group=g6)
i_label_format_price = input.bool(false, 'Price', inline='label_format', group=g6)
i_label_format_pips = input.bool(false, 'Pips', inline='label_format', group=g6)
// Fibonacci levels
i_f_linestyle = f_border_style(input.string(option_border_style1, title="Style", options= , group=g7))
i_f_linewidth = input.int(1, title="Thickness", minval=1, group=g7)
// Opening range
i_o_minutes = input.int(15, title='Periods (minutes)', minval=1, step=1, group=g5)
i_o_minutes := math.max(i_o_minutes, timeframe.multiplier + 1)
i_o_transp = input.int(88, title='Transp', minval=0, maxval=100, step=1, group=g5)
// Alerts
i_alert1_show = input.bool(false, 'Alerts - Sessions stard/end', group=g10)
i_alert2_show = input.bool(false, 'Alerts - Opening range breakouts', group=g10)
i_alert3_show = input.bool(false, 'Alerts - Price crossed session\'s High/Low after session closed', group=g10)
// ------------------------
// Drawing labels
// ------------------------
f_render_label (_show, _session, _is_started, _color, _top, _bottom, _text, _labels) =>
var label my_label = na
var int start_time = na
v_position_y = (i_label_position_y == 'top') ? _top : _bottom
v_label = array.new_string()
v_chg = _top - _bottom
if _is_started
start_time := time
if i_label_format_name and not na(_text)
array.push(v_label, _text)
if i_label_format_day
array.push(v_label, util.get_day(dayofweek(start_time, i_tz)))
if i_label_format_price
array.push(v_label, str.format(fmt_price, v_chg))
if i_label_format_pips
array.push(v_label, str.format(fmt_pips, util.toPips(v_chg)) + ' pips')
if _show
if _is_started
my_label := label.new(bar_index, v_position_y, array.join(v_label, icon_separator), textcolor=_color, color=color_none, size=i_label_size, style=i_label_position)
array.push(_labels, my_label)
util.clear_labels(_labels, i_history_period)
else if _session
label.set_y(my_label, v_position_y)
label.set_text(my_label, array.join(v_label, icon_separator))
// ------------------------
// Drawing Fibonacci levels
// ------------------------
f_render_fibonacci (_show, _session, _is_started, _x1, _x2, _color, _top, _bottom, _level, _width, _style, _is_extend, _lines) =>
var line my_line = na
if _show
y = (_top - _bottom) * _level + _bottom
if _is_started
my_line := line.new(_x1, y, _x2, y, width=_width, color=color.new(_color, 30), style=_style)
array.push(_lines, my_line)
if _is_extend
line.set_extend(my_line, extend.right)
else if _session
line.set_y1(my_line, y)
line.set_y2(my_line, y)
f_set_line_x2(my_line, _x2)
// ------------------------
// Drawing Opening range
// ------------------------
f_render_oprange (_show, _session, _is_started, _x1, _x2, _color, _max, _is_extend, _boxes) =>
var int start_time = na
var box my_box = na
top = ta.highest(high, _max)
bottom = ta.lowest(low, _max)
is_crossover = ta.crossover(close, box.get_top(my_box))
is_crossunder = ta.crossunder(close, box.get_bottom(my_box))
if _show
if _is_started
util.clear_boxes(_boxes, math.max(0, i_history_period - 1))
start_time := time
my_box := na
else if _session
time_op = start_time + (i_o_minutes * 60 * 1000)
time_op_delay = time_op - f_get_time_by_bar(1)
if time <= time_op and time > time_op_delay
my_box := box.new(_x1, top, _x2, bottom, border_width=0, bgcolor=color.new(_color, i_o_transp))
array.push(_boxes, my_box)
if _is_extend
box.set_extend(my_box, extend.right)
my_box
else
f_set_box_right(my_box, _x2)
if is_crossover
alert('Price crossed over the opening range', alert.freq_once_per_bar)
if i_alert2_show
label.new(bar_index, box.get_top(my_box), "×", color=color.blue, textcolor=ac.tradingview('blue'), style=label.style_none, size=size.large)
if is_crossunder
alert('Price crossed under the opening range', alert.freq_once_per_bar)
if i_alert2_show
label.new(bar_index, box.get_bottom(my_box), "×", color=color.red, textcolor=ac.tradingview('red'), style=label.style_none, size=size.large)
my_box
// ------------------------
// Drawing candle
// ------------------------
f_render_candle (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _open, _x1, _x2, _boxes, _lines) =>
var box body = na
var line wick1 = na
var line wick2 = na
border_width = i_candle_border_width
cx = math.round(math.avg(_x2, _x1)) - math.round(border_width / 2)
body_color = i_candle_color == option_candle_color2 ? close > _open ? i_candle_color_g : i_candle_color_r : _color
if _show
if _is_started
body := box.new(_x1, _top, _x2, _bottom, body_color, border_width, line.style_solid, bgcolor=color.new(color.black, 100))
wick1 := i_show_candle_wick ? line.new(cx, _top, cx, _top, color=_color, width=border_width, style=line.style_solid) : na
wick2 := i_show_candle_wick ? line.new(cx, _bottom, cx, _bottom, color=_color, width=border_width, style=line.style_solid) : na
array.push(_boxes, body)
array.push(_lines, wick1)
array.push(_lines, wick2)
util.clear_boxes(_boxes, i_history_period)
util.clear_lines(_lines, i_history_period * 2)
else if _session
top = math.max(_open, close)
bottom = math.min(_open, close)
box.set_top(body, top)
box.set_bottom(body, bottom)
box.set_right(body, _x2)
box.set_border_color(body, body_color)
line.set_y1(wick1, _top)
line.set_y2(wick1, top)
f_set_line_x1(wick1, cx)
f_set_line_x2(wick1, cx)
line.set_color(wick1, body_color)
line.set_y1(wick2, _bottom)
line.set_y2(wick2, bottom)
f_set_line_x1(wick2, cx)
f_set_line_x2(wick2, cx)
line.set_color(wick2, body_color)
else if _is_ended
box.set_right(body, bar_index)
// ------------------------
// Rendering limit message
// ------------------------
f_render_limitmessage (_show, _session, _is_started, _is_ended, _x, _y, _rightbars) =>
var label my_note = na
if _show
if _is_started
if _rightbars > max_bars
my_note := label.new(_x, _y, f_message_limit_bars(_rightbars), style=label.style_label_upper_left, color=color.yellow, textalign=text.align_left, yloc=yloc.price)
else if _session
if _rightbars > max_bars
label.set_y(my_note, _y)
label.set_text(my_note, f_message_limit_bars(_rightbars))
else
label.delete(my_note)
else if _is_ended
label.delete(my_note)
true
// Rendering session
//
f_render_sessionrange (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _lines) =>
var line above_line = na
var line below_line = na
if _show
if _is_started
above_line := line.new(_x1, _top, _x2, _top, width=i_sess_border_width, style=i_sess_border_style, color=_color)
below_line := line.new(_x1, _bottom, _x2, _bottom, width=i_sess_border_width, style=i_sess_border_style, color=_color)
linefill.new(above_line, below_line, color.new(_color, i_sess_bgopacity))
array.push(_lines, above_line)
array.push(_lines, below_line)
util.clear_lines(_lines, i_history_period * 2)
if _is_extend
line.set_extend(above_line, extend.right)
line.set_extend(below_line, extend.right)
else if _session
line.set_y1(above_line, _top)
line.set_y2(above_line, _top)
line.set_x2(above_line, _x2)
line.set_y1(below_line, _bottom)
line.set_y2(below_line, _bottom)
line.set_x2(below_line, _x2)
true
else if _is_ended
true
true
// ------------------------
// Rendering session box
// ------------------------
f_render_session (_show, _session, _is_started, _is_ended, _color, _top, _bottom, _x1, _x2, _is_extend, _boxes) =>
var box my_box = na
if _show
if _is_started
my_box := box.new(_x1, _top, _x2, _bottom, _color, i_sess_border_width, i_sess_border_style, bgcolor=color.new(_color, i_sess_bgopacity))
array.push(_boxes, my_box)
util.clear_boxes(_boxes, i_history_period)
if _is_extend
box.set_extend(my_box, extend.right)
else if _session
box.set_top(my_box, _top)
box.set_bottom(my_box, _bottom)
f_set_box_right(my_box, _x2)
else if _is_ended
box.set_right(my_box, bar_index)
my_box
// ------------------------
// Drawing market
// ------------------------
f_render_main (_show, _session, _is_started, _is_ended, _color, _top, _bottom) =>
var box my_box = na
var label my_note = na
var x1 = 0
var x2 = 0
var session_open = 0.0
var session_high = 0.0
var session_low = 0.0
x0_1 = ta.valuewhen(na(_session ) and _session, bar_index, 1)
x0_2 = ta.valuewhen(na(_session) and _session , bar_index, 0)
x0_d = math.abs(x0_2 - x0_1)
limit_bars = max_bars
rightbars = x0_d
if _show
if _is_started
x1 := bar_index
x2 := bar_index + (math.min(x0_d, limit_bars))
session_open := open
session_high := _top
session_low := _bottom
else if _session
true_x2 = x1 + x0_d
rightbars := true_x2 - bar_index
limit_bars := bar_index + max_bars
x2 := math.min(true_x2, limit_bars)
session_high := _top
session_low := _bottom
else if _is_ended
session_open := na
// ------------------------
// Drawing
// ------------------------
draw (_show, _session, _color, _label, _extend, _show_fib, _show_op, _lookback, _boxes_session, _lines_session, _boxes_candle_body, _lines_candle_wick, _boxes_op, _lines_fib, _labels) =>
max = f_get_period(_session, 1, _lookback)
top = ta.highest(high, max)
bottom = ta.lowest(low, max)
is_started = f_get_started(_session)
is_ended = f_get_ended(_session)
is_extend = _extend != option_no
= f_render_main(_show, _session, is_started, is_ended, _color, top, bottom)
if i_sess_box_style == 'Box'
f_render_session(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _boxes_session)
if i_sess_box_style == 'Sandwich'
f_render_sessionrange(_show, _session, is_started, is_ended, _color, top, bottom, x1, x2, is_extend, _lines_session)
if i_show_candle
f_render_candle(_show, _session, is_started, is_ended, _color, top, bottom, _open, x1, x2, _boxes_candle_body, _lines_candle_wick)
if i_label_show
f_render_label(_show, _session, is_started, _color, top, bottom, _label, _labels)
if _show_op
f_render_oprange(_show, _session, is_started, x1, x2, _color, max, is_extend, _boxes_op)
if _show_fib
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.500, 2, line.style_solid, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.628, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
f_render_fibonacci(_show, _session, is_started, x1, x2, _color, top, bottom, 0.382, i_f_linewidth, i_f_linestyle, is_extend, _lines_fib)
util.clear_lines(_lines_fib, i_history_period * 3)
f_render_limitmessage(_show, _session, is_started, is_ended, x1, bottom, _rightbars)
///////////////////
// Calculating
///////////////////
string tz = (i_tz == option_no or i_tz == '') ? na : i_tz
int sess1 = time(timeframe.period, i_sess1, tz)
int sess2 = time(timeframe.period, i_sess2, tz)
int sess3 = time(timeframe.period, i_sess3, tz)
int sess4 = time(timeframe.period, i_sess4, tz)
///////////////////
// Plotting
///////////////////
var sess1_box = array.new()
var sess2_box = array.new()
var sess3_box = array.new()
var sess4_box = array.new()
var sess1_line = array.new()
var sess2_line = array.new()
var sess3_line = array.new()
var sess4_line = array.new()
var sess1_op = array.new()
var sess2_op = array.new()
var sess3_op = array.new()
var sess4_op = array.new()
var sess1_fib = array.new()
var sess2_fib = array.new()
var sess3_fib = array.new()
var sess4_fib = array.new()
var sess1_candle_body = array.new()
var sess2_candle_body = array.new()
var sess3_candle_body = array.new()
var sess4_candle_body = array.new()
var sess1_candle_wick = array.new()
var sess2_candle_wick = array.new()
var sess3_candle_wick = array.new()
var sess4_candle_wick = array.new()
var sess1_labels = array.new()
var sess2_labels = array.new()
var sess3_labels = array.new()
var sess4_labels = array.new()
= draw(i_show_sess1, sess1, i_sess1_color, i_sess1_label, i_sess1_extend, i_sess1_fib, i_sess1_op, i_lookback, sess1_box, sess1_line, sess1_candle_body, sess1_candle_wick, sess1_op, sess1_fib, sess1_labels)
= draw(i_show_sess2, sess2, i_sess2_color, i_sess2_label, i_sess2_extend, i_sess2_fib, i_sess2_op, i_lookback, sess2_box, sess2_line, sess2_candle_body, sess2_candle_wick, sess2_op, sess2_fib, sess2_labels)
= draw(i_show_sess3, sess3, i_sess3_color, i_sess3_label, i_sess3_extend, i_sess3_fib, i_sess3_op, i_lookback, sess3_box, sess3_line, sess3_candle_body, sess3_candle_wick, sess3_op, sess3_fib, sess3_labels)
= draw(i_show_sess4, sess4, i_sess4_color, i_sess4_label, i_sess4_extend, i_sess4_fib, i_sess4_op, i_lookback, sess4_box, sess4_line, sess4_candle_body, sess4_candle_wick, sess4_op, sess4_fib, sess4_labels)
is_positive_bar = close > open
color c_barcolor = na
color c_plotcandle = na
c_sess1_barcolor = (is_sess1) ? (is_positive_bar ? i_sess1_barcolor1 : i_sess1_barcolor2) : na
c_sess2_barcolor = (is_sess2) ? (is_positive_bar ? i_sess2_barcolor1 : i_sess2_barcolor2) : na
c_sess3_barcolor = (is_sess3) ? (is_positive_bar ? i_sess3_barcolor1 : i_sess3_barcolor2) : na
c_sess4_barcolor = (is_sess4) ? (is_positive_bar ? i_sess4_barcolor1 : i_sess4_barcolor2) : na
if (i_sess1_chart != option_chart_x) and is_sess1
c_barcolor := i_sess1_barcolor ? c_sess1_barcolor : na
c_plotcandle := i_sess1_plotcandle ? c_sess1_barcolor : na
if (i_sess2_chart != option_chart_x) and is_sess2
c_barcolor := i_sess2_barcolor ? c_sess2_barcolor : na
c_plotcandle := i_sess2_plotcandle ? c_sess2_barcolor : na
if (i_sess3_chart != option_chart_x) and is_sess3
c_barcolor := i_sess3_barcolor ? c_sess3_barcolor : na
c_plotcandle := i_sess3_plotcandle ? c_sess3_barcolor : na
if (i_sess4_chart != option_chart_x) and is_sess4
c_barcolor := i_sess4_barcolor ? c_sess4_barcolor : na
c_plotcandle := i_sess4_plotcandle ? c_sess4_barcolor : na
barcolor(c_barcolor)
plotcandle(open, high, low, close, color=is_positive_bar ? color_none : c_plotcandle, bordercolor=c_plotcandle, wickcolor=c_plotcandle)
////////////////////
// Alerts
////////////////////
// Session alerts
sess1_started = is_sess1 and not is_sess1 , sess1_ended = not is_sess1 and is_sess1
sess2_started = is_sess2 and not is_sess2 , sess2_ended = not is_sess2 and is_sess2
sess3_started = is_sess3 and not is_sess3 , sess3_ended = not is_sess3 and is_sess3
sess4_started = is_sess4 and not is_sess4 , sess4_ended = not is_sess4 and is_sess4
alertcondition(sess1_started, 'Session #1 started')
alertcondition(sess1_ended, 'Session #1 ended')
alertcondition(sess2_started, 'Session #2 started')
alertcondition(sess2_ended, 'Session #2 ended')
alertcondition(sess3_started, 'Session #3 started')
alertcondition(sess3_ended, 'Session #3 ended')
alertcondition(sess4_started, 'Session #4 started')
alertcondition(sess4_ended, 'Session #4 ended')
alertcondition((not is_sess1) and ta.crossover(close, sess1_high), 'Session #1 High crossed (after session closed)')
alertcondition((not is_sess1) and ta.crossunder(close, sess1_low), 'Session #1 Low crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossover(close, sess2_high), 'Session #2 High crossed (after session closed)')
alertcondition((not is_sess2) and ta.crossunder(close, sess2_low), 'Session #2 Low crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossover(close, sess3_high), 'Session #3 High crossed (after session closed)')
alertcondition((not is_sess3) and ta.crossunder(close, sess3_low), 'Session #3 Low crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossover(close, sess4_high), 'Session #4 High crossed (after session closed)')
alertcondition((not is_sess4) and ta.crossunder(close, sess4_low), 'Session #4 Low crossed (after session closed)')
// Alerts visualized
if i_alert1_show
if i_show_sess1
if sess1_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess1_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess1_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess1_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess2
if sess2_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess2_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess2_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess2_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess3
if sess3_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess3_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess3_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess3_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if i_show_sess4
if sess4_started
label.new(bar_index, close, 'Start', yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
if sess4_ended
label.new(bar_index, close, 'End' , yloc=yloc.abovebar, color=i_sess4_color, textcolor=color_text, size=size.small, style=label.style_label_down)
plot(i_alert3_show ? sess1_high : na, 'sess1_high', style=plot.style_linebr, color=i_sess1_color)
plot(i_alert3_show ? sess1_low : na, 'sess1_low' , style=plot.style_linebr, color=i_sess1_color, linewidth=2)
plot(i_alert3_show ? sess2_high : na, 'sess2_high', style=plot.style_linebr, color=i_sess2_color)
plot(i_alert3_show ? sess2_low : na, 'sess2_low' , style=plot.style_linebr, color=i_sess2_color, linewidth=2)
plot(i_alert3_show ? sess3_high : na, 'sess3_high', style=plot.style_linebr, color=i_sess3_color)
plot(i_alert3_show ? sess3_low : na, 'sess3_low' , style=plot.style_linebr, color=i_sess3_color, linewidth=2)
plot(i_alert3_show ? sess4_high : na, 'sess4_high', style=plot.style_linebr, color=i_sess4_color)
plot(i_alert3_show ? sess4_low : na, 'sess4_low' , style=plot.style_linebr, color=i_sess4_color, linewidth=2)
plotshape(i_alert3_show and (not is_sess1) and ta.crossover(close, sess1_high) ? sess1_high : na, 'cross sess1_high', color=i_sess1_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess1) and ta.crossunder(close, sess1_low) ? sess1_low : na, 'cross sess1_low', color=i_sess1_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess2) and ta.crossover(close, sess2_high) ? sess2_high : na, 'cross sess2_high', color=i_sess2_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess2) and ta.crossunder(close, sess2_low) ? sess2_low : na, 'cross sess2_low', color=i_sess2_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess3) and ta.crossover(close, sess3_high) ? sess3_high : na, 'cross sess3_high', color=i_sess3_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess3) and ta.crossunder(close, sess3_low) ? sess3_low : na, 'cross sess3_low', color=i_sess3_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess4) and ta.crossover(close, sess4_high) ? sess4_high : na, 'cross sess4_high', color=i_sess4_color, style=shape.triangleup, location=location.absolute, size=size.tiny)
plotshape(i_alert3_show and (not is_sess4) and ta.crossunder(close, sess4_low) ? sess4_low : na, 'cross sess4_low', color=i_sess4_color, style=shape.triangledown, location=location.absolute, size=size.tiny)
THE LION OB V1.0O melhor script para binárias baseada nos padrões de martelo e estrela cadente (com backtest)
EMAs & SMAs [Pacote com várias médias] //@version=5
indicator("EMAs-SMAs", overlay=true)
// Fonte
src = input.source(close, "Fonte (source)")
// ==============================
// EMAs
// ==============================
ema3 = ta.ema(src, 3)
ema4 = ta.ema(src, 4)
ema5 = ta.ema(src, 5)
ema7 = ta.ema(src, 7)
ema9 = ta.ema(src, 9)
ema17 = ta.ema(src, 17)
ema18 = ta.ema(src, 18)
ema21 = ta.ema(src, 21)
ema34 = ta.ema(src, 34)
ema40 = ta.ema(src, 40)
ema50 = ta.ema(src, 50)
ema55 = ta.ema(src, 55)
ema72 = ta.ema(src, 72)
ema80 = ta.ema(src, 80)
ema96 = ta.ema(src, 96)
ema100 = ta.ema(src, 100)
ema200 = ta.ema(src, 200)
plot(ema3, "EMA 3", color=color.new(color.blue, 0), linewidth=2)
plot(ema4, "EMA 4", color=color.new(color.red, 0), linewidth=2)
plot(ema5, "EMA 5", color=color.new(color.green, 0), linewidth=2)
plot(ema7, "EMA 7", color=color.new(color.orange, 0), linewidth=2)
plot(ema9, "EMA 9", color=color.new(color.orange, 0), linewidth=2)
plot(ema17, "EMA 17", color=color.new(color.blue, 0), linewidth=2)
plot(ema18, "EMA 18", color=color.new(color.red, 0), linewidth=2)
plot(ema21, "EMA 21", color=color.new(color.green, 0), linewidth=2)
plot(ema34, "EMA 34", color=color.new(color.orange, 0), linewidth=2)
plot(ema40, "EMA 40", color=color.new(color.orange, 0), linewidth=2)
plot(ema50, "EMA 50", color=color.new(color.blue, 0), linewidth=2)
plot(ema55, "EMA 55", color=color.new(color.red, 0), linewidth=2)
plot(ema72, "EMA 72", color=color.new(color.green, 0), linewidth=2)
plot(ema80, "EMA 80", color=color.new(color.orange, 0), linewidth=2)
plot(ema96, "EMA 96", color=color.new(color.orange, 0), linewidth=2)
plot(ema100, "EMA 100", color=color.new(color.blue, 0), linewidth=2)
plot(ema200, "EMA 200", color=color.new(color.red, 0), linewidth=2)
// ==============================
// SMAs
// ==============================
sma3 = ta.sma(src, 3)
sma4 = ta.sma(src, 4)
sma5 = ta.sma(src, 5)
sma7 = ta.sma(src, 7)
sma9 = ta.sma(src, 9)
sma17 = ta.sma(src, 17)
sma18 = ta.sma(src, 18)
sma21 = ta.sma(src, 21)
sma34 = ta.sma(src, 34)
sma40 = ta.sma(src, 40)
sma50 = ta.sma(src, 50)
sma55 = ta.sma(src, 55)
sma72 = ta.sma(src, 72)
sma80 = ta.sma(src, 80)
sma96 = ta.sma(src, 96)
sma100 = ta.sma(src, 100)
sma200 = ta.sma(src, 200)
plot(sma3, "SMA 3", color=color.new(color.blue, 60), linewidth=1, style=plot.style_line)
plot(sma4, "SMA 4", color=color.new(color.red, 60), linewidth=1, style=plot.style_line)
plot(sma5, "SMA 5", color=color.new(color.green, 60), linewidth=1, style=plot.style_line)
plot(sma7, "SMA 7", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma9, "SMA 9", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma17, "SMA 17", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma18, "SMA 18", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma21, "SMA 21", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma34, "SMA 34", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma40, "SMA 40", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma50, "SMA 50", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma55, "SMA 55", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma72, "SMA 72", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma80, "SMA 80", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma96, "SMA 96", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma100, "SMA 100", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
plot(sma200, "SMA 200", color=color.new(color.orange, 60), linewidth=1, style=plot.style_line)
D|W|M - AkashDaily Weekly Monthly Divider Indicator
- Day Name
- Daily Weekly Monthly Divider
- Hide Unhide Divider
- Can Change The Color and Style
Smartmoney logic heiken ashiSmartMoney Logic Heiken Ashi (SML.HA)
Elevator pitch
SML.HA is a noise-filtered Heiken Ashi renderer designed to keep you on the right side of trend. It applies a two-stage EMA smoothing—first on raw OHLC, then on the Heiken Ashi stream—to deliver steadier candles, clearer trend blocks, and fewer whipsaws across any market or timeframe.
How it works
Smooths price (open/high/low/close) with EMA (len).
Builds Heiken Ashi from the smoothed series.
Smooths the HA candles again with EMA (len2) for cleaner structure.
Colors candles lime when HA open < HA close (bullish) and red when HA open > HA close (bearish).
What you see
Ultra-smooth HA candles that reduce intrabar noise.
Consistent color blocks that make trend and momentum shifts obvious.
Wick and body rendering aligned to the smoothed HA values for clearer pullbacks.
Inputs
EMA Length (price) (len): Controls the first smoothing pass on raw OHLC.
EMA Length (HA) (len2): Controls the second smoothing pass on the HA stream.
Tip: Larger values = smoother, slower; smaller values = quicker, more responsive.
Best practices
Use higher timeframes (H1–D1) for bias and lower timeframes (M5–M30) for execution.
Favor entries on pullbacks that respect the candle color in the dominant direction.
Combine with session filters (e.g., New York 15:00–22:00 Europe/Paris) and key levels (PDH/PDL, S/R) for higher confluence.
Pair with risk management (fixed SL/TP or ATR-based) rather than color flips alone.
Notes
SML.HA is a visualization/confirmation tool; it does not repaint after bar close.
No alerts are included by default (it focuses on clean structure).
Works on all symbols and timeframes supported by TradingView.
(FR) Description professionnelle
Présentation
SML.HA est un affichage Heiken Ashi “lissé” en deux étapes (EMA sur prix puis sur Heiken Ashi) pour réduire le bruit, clarifier les tendances et limiter les faux signaux, sur tous marchés et unités de temps.
Fonctionnement
Lissage EMA des prix (len).
Construction Heiken Ashi à partir des prix lissés.
Second lissage EMA de la série Heiken Ashi (len2).
Bougies vertes (haussières) si open HA < close HA, rouges (baissières) si open HA > close HA.
Réglages
EMA Length (price) : lissage initial des prix.
EMA Length (HA) : lissage de la série Heiken Ashi.
(Plus la valeur est grande, plus l’affichage est stable mais moins réactif.)
Bonnes pratiques
Définir le biais en H1–D1, exécuter en M5–M30.
Entrer sur repli dans le sens de la couleur dominante.
Ajouter un filtre de session (ex. New York 15:00–22:00, heure de Paris) et des niveaux clés (PDH/PDL, S/R).
Toujours encadrer par un money management strict.
Remarques
Aucun repaint après clôture de bougie.
Pas d’alertes natives (focus sur la lecture de structure).
Compatible tous actifs / toutes UT sur TradingView.
ICT ob by AyushThis indicator marks **order blocks** by detecting the first opposite candle of any pullback run and drawing a line from its **open** to the confirming candle’s close.
It works on **any timeframe (or HTF projection)**, stays clean, and only shows **solid, body-confirmed OBs**.
Date Range Performance
Calculates total change and percentage change between two dates.
Computes average change per bar and per day.
Offers arithmetic and geometric daily %.
Supports auto mode (last N trading days) and manual date range.
Displays results as a watermark on the chart.