Market State Momentum OscillatorMarket State Momentum Oscillator (MSMO)
Overview
The MSMO combines three elements in one panel:
Momentum oscillator (gray/blue area with aqua signal line)
Market State filter (green/red background area)
Money Flow Index (orange line)
Works on all markets and all timeframes. Non-repainting at bar close.
Colors and meaning
Gray area: Momentum above 0 (bullish bias)
Blue area: Momentum below 0 (bearish bias)
Aqua line: Signal line smoothing the oscillator
Green background: Market state bullish (price above moving average)
Red background: Market state bearish (price below moving average)
Orange line: Money Flow Index (volume-weighted momentum)
How to use
Always wait for confirmation of the green or red market state before acting.
Trend alignment: Watch the slope of the Weekly and Daily 200 MA and Weekly and Daily 50 MA to understand higher-timeframe trend direction. Trade only in alignment with the broader trend.
Entries:
Long: Green state + gray histogram rising + MFI trending up
Short: Red state + blue histogram falling + MFI trending down
Exits: Histogram crossing back through 0, or state background flips against the position.
Users can add chart alerts on plot crossings if needed.
Inputs
Lengths for oscillator pivot, signal smoothing, state moving average, trend weight, return %, and Money Flow Index. Defaults work for most charts.
Note
Educational use only. Not financial advice.
Tags
trend, oscillator, market state, momentum, money flow, crypto, forex, stocks, indices, futures
Indicadores e estratégias
B A N K $ - HTF Candle Boxes (Power of 3)This indicator allows you to visualise the HTF candles on the LTF's, this is useful for using the Power of 3 / Accumulation, Manipulation & Distribution concepts.
By default, the HTF interval is set to 1h, this means that an outline will be created around the LTF candles that are within that 1h window. (i.e from 13:00-14:00 etc).
Features
HTF Interval Selector - this allows the user to customise which HTF interval to use
Candle Boxes - this outlines the full outer perimeter of the relevant candles
Include Body - this highlights the distance between the candle Open & Close
Show MidLine
Additional Settings
Hide Side Lines - this will only draw the Top & Bottom lines
Extend Lines to Current Candle - most recent Top & Bottom lines will extend to current price
Draw Lines from Exact Candle - this makes the most recent candle lines cleaner
I personally use this indicator to outline the most recent 3 1h candles to make it easier to identify sweeps & reversals however there is additional functionality to allow the user to customise the indicator to their preference.
MTF CRT Setup Finder (Raids + BOS linked)//@version=6
indicator("MTF CRT Setup Finder (Raids + BOS linked)", overlay=true, max_lines_count=500)
// === INPUTS ===
lookback = input.int(5, "Swing Lookback Bars", minval=2)
// === Function: Detect swing highs/lows ===
swingHigh(src, lb) => ta.pivothigh(src, lb, lb)
swingLow(src, lb) => ta.pivotlow(src, lb, lb)
// === Function: Detect CRT with memory ===
f_crt(tf) =>
hi = request.security(syminfo.tickerid, tf, high)
lo = request.security(syminfo.tickerid, tf, low)
cl = request.security(syminfo.tickerid, tf, close)
sh = request.security(syminfo.tickerid, tf, swingHigh(high, lookback))
sl = request.security(syminfo.tickerid, tf, swingLow(low, lookback))
raidHigh = not na(sh) and hi > sh and cl < sh
raidLow = not na(sl) and lo < sl and cl > sl
// store last raid state
var bool hadRaidHigh = false
var bool hadRaidLow = false
if raidHigh
hadRaidHigh := true
if raidLow
hadRaidLow := true
bosDown = hadRaidHigh and cl < sl
bosUp = hadRaidLow and cl > sh
// reset after BOS
if bosDown
hadRaidHigh := false
if bosUp
hadRaidLow := false
// === Apply on H1 only first (test) ===
= f_crt("60")
// === Plot ===
plotshape(raidHigh, title="Raid High", style=shape.diamond, color=color.red, size=size.small, text="Raid High")
plotshape(raidLow, title="Raid Low", style=shape.diamond, color=color.green, size=size.small, text="Raid Low")
plotshape(bosDown, title="Bearish CRT", style=shape.triangledown, color=color.red, size=size.large, text="CRT↓")
plotshape(bosUp, title="Bullish CRT", style=shape.triangleup, color=color.green, size=size.large, text="CRT↑")
Frank-Setup EMA, RS & RSI ✅It is a clean and simple indicator designed to identify weakness in stocks using two proven methods: RSI and Relative Strength (RS) vs. a benchmark (e.g., NIFTY).
🔹 Features
RSI Weakness Signals
Plots when RSI crosses below 50 (weakness begins).
Plots when RSI moves back above 50 (weakness ends).
Relative Strength (RS) vs Benchmark
Compares stock performance to a chosen benchmark.
Signals when RS drops below 1 (stock underperforming).
Signals when RS recovers above 1 (strength resumes).
Clear Visual Markers
Circles for RSI signals.
Triangles for RS signals.
Optional RSI labels for clarity.
Built-in Alerts
Get notified instantly when RSI or RS weakness starts or ends.
No need to constantly watch charts.
🎯 Use Case
This tool is built for traders who want to:
Spot shorting opportunities when a stock shows weakness.
Track underperformance vs. the index.
Manage risk by exiting longs when weakness appears.
Ripster EMA Clouds with customisable colorsEMA Clouds indicator inspired by Ripster47's concepts. Published primarily to offer customizable color settings for the cloud displays. This is not an identical copy but an inspired implementation.
Adaptive Dynamic Moving Average + Pro Trend Detector (RSI, MACD)A powerful Adaptive Moving Average with smart reset filters (RSI, MACD, Volume, CCI, Stoch, Momentum, Bollinger, Slope). Detect trends early, avoid noise, and trade with confidence on Forex, Crypto, Stocks & Indices.
This advanced tool goes beyond a simple moving average. It adapts to market conditions in real time, filters out noise, and highlights trend shifts with precision.
✨ Key Features:
✅ Adaptive Moving Average powered by a smart counter system
✅ Multiple reset modes (RSI, Volume, MACD, CCI, Stoch, Momentum, Bollinger, Slope, None)
✅ Dynamic trend confirmation with smoothing & gradient coloring
✅ Bullish, Bearish & Neutral zones for clear visualization
✅ Works on any market: Forex, Crypto, Indices, Stocks
🔑 Why Traders Love It:
Adjusts instantly to volatility & momentum changes
Helps avoid fake signals by requiring confirmation bars
Combines momentum + trend strength for reliability
Clean, color-coded visualization for fast decisions
💡 Perfect for swing trading, intraday setups, and trend following strategies.
📈 Add it to your chart, test it in different markets, and watch how it adapts to reveal hidden opportunities!
Volume Heat ZoneVolume Zones Indicator
This Pine Script creates a volume-based zone analysis tool for TradingView.
Function:
Divides the price range (high to low) into 20 levels over a 100-candle lookback period
Measures volume activity at each price level
Draws boxes at levels with above-average volume (1.5x threshold)
Key Settings:
Lookback Period (100): Number of candles analyzed
Price Levels (20): Price range subdivisions
Volume Threshold (1.5): Minimum volume multiplier for zones
Candle Offset (1): Excludes current candle from analysis
Projection Bars (10): Extends boxes 10 bars into the future
How it works:
The indicator identifies price levels where significant trading volume occurred historically, highlighting potential support/resistance zones. Boxes are redrawn on each confirmed candle, showing dynamic volume concentration areas that traders can use for entry/exit decisions.
VultureThis indicator ("vulture") is the volume of a candle divided by the spread.
When higher than 2 standard deviations, it suggests demand aggressively opposing supply and vice versa.
When lower than 2 standard deviations, it suggests demand hardly being opposed by supply or vice versa.
E.g., if the vulture is very high and volume is also very high, this indicates high institutional activity (who is usually right) against the herd (who is usually wrong). If the vulture is very low and volume is very high, this suggests a mark up or mark down. If vulture is very high and volume is very low, whilst prices are climbing up to a resistance area, the low volume climb is less likely an ease of movement, and more likely to be a significant "no demand" candle, and so prices are likely on the verge of a reversal back to the downside.
Real Relative Sector Strength - NormalizedShows RS/RW, which is esp. helpful if it's not fully clear based on the stock's chart movement compared to SPY's movement.
"Glowing green" = safely strong
"Glowing red" = safely weak
More infos: www.reddit.com
BTC_Hull Suite StrategyOverview
BTC_Hull Suite Strategy is a trend-following system designed to keep drawdowns modest while staying exposed during genuine uptrends. It uses the Hull Moving Average (HMA) for fast, low-lag trend turns, a long-term SMA filter to avoid chop, and a percentage trailing stop to protect gains.
🔧 What the strategy includes
- Hull Moving Average (HMA) with configurable length (default 55)
- SMA filter (default 130) to trade only with higher-timeframe bias
- Trailing stop in percent (default 5%) based on the running peak of close
- Execution model: signals are evaluated on the previous bar and entries are placed at the next bar’s open (TradingView default)
📈 How it works:
✅ Entry (Long):
Detects a bullish Hull turn by comparing the current HMA to its value 3 bars ago:
h > h3 and h <= h3 → HMA just turned up on the prior bar
The SMA filter must confirm: close > sma
If both are true (and within the date window), a long is opened next bar at the open
❌ Exit:
Hull turn down: h < h3 and h >= h3 , or
Trailing stop: price closes below peak * (1 – trailingPct)
Either condition closes the position at the current bar’s close
Notes:
pyramiding = 1 → allows one add-on (maximum two concurrent long positions)
Position sizing defaults to 20% of equity per entry (adjustable in Properties)
Who is this for?
This strategy is tailored for Bitcoin traders (spot or perpetuals) who want a rules-based, low-lag trend system with built-in drawdown protection.
It works best on Daily or 4H charts, but parameters can be adapted for other timeframes.
⚠️ Disclaimer
This strategy is provided for educational and research purposes only.
It is not financial advice. Markets are risky — always test on your own data, include realistic fees/slippage, and forward-test before using real capital.
Quick Overview - 1DInspired by Option Stalker Pro, it shows RS/RW on 1W.
Meant to be used on the 1D chart.
Also shows ATH / ATL - depending on what is closer. Which is great to be aware that you should zoom out more to make sure you don't miss out algolines or support / resistance lines!
Also if the stock is currently at ATH / ATL, this means it might be a low-risk stock pick.
More infos: www.reddit.com
Smart MTF Fair Value Gap StrategyThe Multi-Timeframe Fair Value Gap (FVG) Strategy is designed to identify institutional imbalance zones (Fair Value Gaps) from a higher timeframe and trade them efficiently on the current chart timeframe.
🔹 Core Logic
Detects Bullish FVGs when there’s a gap between a prior higher-timeframe high and the following low.
Detects Bearish FVGs when there’s a gap between a prior higher-timeframe low and the following high.
Zones are plotted as colored boxes (green for bullish, red for bearish).
When price re-enters a zone, the strategy automatically places trades with defined stop-loss and take-profit levels.
🔹 Risk Management
Stop-loss is set at the opposite side of the zone.
Take-profit is calculated using a customizable Risk:Reward ratio (default 2:1).
Adjustable position sizing and execution rules (enter on touch or require strict close inside zone).
🔹 Inputs & Features
Higher Timeframe selection (e.g., H1, H4, Daily).
Customizable box width for better visualization.
Toggle to show/hide zones.
Strict entry filter to avoid premature signals.
Works in both long and short directions.
⚡ This strategy provides a simple yet powerful way to visualize institutional FVG levels and test structured entries around them with proper risk management.
Dynamic Chandelier Exit Trader [KedArc Quant])Dynamic Chandelier Exit Trader (DCET)
The Dynamic Chandelier Exit Trader (DCET) builds upon the classical Chandelier Exit indicator by combining volatility-based stop placement with risk-reward exit logic. It is designed to provide clear buy/sell flip signals, making it adaptable across multiple trading environments.
Market Suitability
The DCET is most effective under the following market conditions:
1. Trending Markets (Upward or Downward)
- Strong performance when price is in a clear directional trend.
- Buy signals align with uptrends, sell signals align with downtrends.
- Works well on stocks, forex pairs, and crypto during trending phases.
2. Breakout Environments:
- Captures moves when price breaks out of consolidations.
- ATR-based stop dynamically adjusts to volatility expansion.
- Effective for traders who like catching the first move after breakouts.
3. Sideways / Range-Bound Markets:
- DCET tends to generate more frequent flip signals in sideways conditions.
- May lead to whipsaws, but can still be used with reduced ATR length or by combining with a trend filter (e.g., moving average direction).
4. All Markets (with Adjustments):
- Works universally but requires tuning.
- In highly volatile markets (e.g., crypto), a higher ATR multiplier may reduce false signals.
- In stable, slower-moving markets (e.g., large-cap equities), smaller ATR multipliers improve responsiveness.
Smart Multi-Confirm Reversal DetectorHow the Smart Multi-Confirm Reversal Detector Works
The indicator works by analyzing candlestick patterns, trend, and technical confirmations and then scoring each bar to determine the strength of a potential reversal. Here’s the step-by-step logic:
Step 1: Analyze Candlestick Patterns
For each new candle, the indicator checks if any of the selected patterns occur:
Wick Reversal (Long Lower Wick):
Looks for candles with a small body and a long lower shadow.
Indicates buying pressure (potential bullish reversal).
Inverted Wick (Long Upper Wick):
Looks for candles with a small body and a long upper shadow.
Indicates selling pressure (potential bearish reversal).
Body Engulf:
The current candle completely “engulfs” the previous candle.
Signals a strong change in momentum.
Tweezer Patterns:
Two consecutive candles with almost identical highs or lows.
Suggests a potential reversal zone.
3-Bar Pattern:
Three consecutive bullish or bearish candles in a row.
Shows strong momentum continuation or exhaustion, used to confirm reversal.
Each pattern can be turned on/off by the user. If a pattern is detected, it contributes points to the overall signal score.
Step 2: Confirm Trend Direction
The indicator checks EMA trend alignment:
Fast EMA vs Slow EMA:
Fast EMA above Slow EMA → bullish trend.
Fast EMA below Slow EMA → bearish trend.
Optional Higher Timeframe EMA (HTF) Alignment:
Checks if the trend on a higher timeframe matches the current trend.
Adds extra weight to the signal if alignment is true.
This ensures the signal goes in the direction of the prevailing trend, reducing false signals.
Step 3: Check Technical Confirmations
Optional filters increase reliability:
ADX (Average Directional Index):
Measures the strength of the current trend.
Only strong trends contribute to the score.
RSI (Relative Strength Index):
Bullish confirmation: RSI is oversold.
Bearish confirmation: RSI is overbought.
Volume Spike:
Compares current volume to the average volume.
High volume validates the signal’s momentum.
Body Momentum:
Compares current candle’s body size to its average.
Larger than average body indicates stronger momentum.
Each of these confirmations can be enabled/disabled and has a weight in the scoring system.
Step 4: Calculate Score
Each pattern and confirmation has a user-defined weight (0–100).
The indicator sums the active weights that pass conditions and normalizes to 100.
Example:
Wick Reversal detected → 30 points
Trend EMA confirmed → 15 points
ADX confirmed → 10 points
Score = 55/100 → may or may not trigger a signal depending on threshold.
Score Threshold:
Only bars above the user-defined threshold are considered a confirmed signal.
Bars above a lower “label threshold” still show a label, even if not strong enough for alerts.
Step 5: Visualize Signals
Bullish Signals: Green triangle below the candle.
Bearish Signals: Red triangle above the candle.
Labels: Show the type of pattern and the score.
Purpose: Quickly identify potential reversals and assess their strength visually.
Step 6: Optional Alerts
Fixed alert messages can be enabled for confirmed bullish or bearish signals.
Alerts do not recommend trades; they just notify you of pattern confirmations.
Complies with TradingView’s policy for safe alert use.
Step 7: Weighted Decision
The final decision is not binary.
Instead, the indicator combines multiple signals into a score, so stronger signals are more reliable.
This reduces false positives and gives traders a professional, multi-confirmation approach to detect potential reversals.
OPTIMAL super trend tripple confirm for leverage. Ai implemented for higher r:r still a work in progresss
3 SMA + RSI + MACD + MTF Ultimate Dashboard🎯 Overview:
High-precision trading indicator combining trend, momentum, and multi-timeframe confirmation for reliable buy/sell signals in Forex, Crypto, and other markets.
🔹 Core Features:
📈 3 SMAs (7/25/99) – Short, Medium & Long-term trend detection
⚡ RSI Filter – Avoid weak signals (Buy >55 / Sell <45)
💎 MACD with Threshold – Reduce false crossovers
⏱️ Multi-Timeframe Trend (H4) – Confirm overall market direction
✅ Dashboard & Signals:
🟢 Clear Buy & Sell arrows on chart
📊 Live dashboard showing filter status & total signals
🔔 Audio & Push Alerts – Mobile/Desktop/Webhook
💎 Benefits:
⚡ Minimizes false signals
📈 Works on M15, H1, H4, Daily
🎯 Combines trend, momentum, and confirmation filters in one dashboard
⚠️ Note: Signals are generated only after candle close for maximum reliability.
5m Enter AlertsThese alerts work really well to help you find good entries on the 5m chart:
"1 Enter LONG":
This one I use more often than any other alert. It's really great if the stock looks good but is currently overextended on the 5m, or looks like it's starting to pull back. It's triggered right after the stock pulled back to the VWAP or 15m EMA 8 and is about to continue.
All these criteria need to be met for the alert to be triggered on a VWAP pullback:
Crossed up VWAP or VWAP + half ATR recently (so it's also triggered even if it doesn't cross below VWAP on a pullback)
Above 5m EMA 8 (since this indicates it will likely continue higher up)
Closed above highest High of last 3 candles (to prevent premature alerts while the price started pulling back into the range of VWAP + half ATR)
Candle is confirmed (5m ended)
For the 15m EMA 8 pullback it's the same, except for that the 15m EMA 8 also still needs to be above VWAP (otherwise you wouldn't want to enter yet anyways).
"2 Enter SHORT":
Similar, but for shorts...
"3 High Volume Candle":
Detects High Volume Candles on the 5m chart. Can be helpful to get informed that a resistance / support finally broke on high volume, or to be notified about a potential reversal. Can therefore also be useful if applied on SPY.
Criteria:
Candle's volume > 1.2 * avg volume (of last 30 candles)
"X Candle Close":
This one I use quite often as well: it's really helpful to wait for a 5m candle to be confirmed, to see f. e. whether a candle really broke a support / resistance or not - and to prevent making bad decisions.
Criteria:
5m candle closed
More infos: www.reddit.com
Algo + Trendlines :: Long PeriodThis indicator helps me to avoid overlooking Trendlines / Algolines. So far it doesn't search explicitly for Algolines (I don't consider volume at all), but it's definitely now already not horribly bad.
These are meant to be used on logarithmic charts btw! The lines would be displayed wrong on linear charts.
The biggest challenge is that there are some technical restrictions in TradingView, f. e. a script stops executing if a for-loop would take longer than 0.5 sec.
So in order to circumvent this and still be able to consider as many candles from the past as possible, I've created multiple versions for different purposes that I use like this:
Algo + Trendlines :: Medium Period : This script looks for "temporary highs / lows" (meaning the bar before and after has lower highs / lows) on the daily chart, connects them and shows the 5 ones that are the closest to the current price (=most relevant). This one is good to find trendlines more thoroughly, but only up to 4 years ago.
Algo + Trendlines :: Long Period : This version looks instead at the weekly charts for "temporary highs / lows" and finds out which days caused these highs / lows and connects them, Taking data from the weekly chart means fewer data points to check whether a trendline is broken, which allows to detect trendlines from up to 12 years ago! Therefore it misses some trendlines. Personally I prefer this one with "Only Confirmed" set to true to really show only the most relevant lines. This means at least 3 candle highs / lows touched the line. These are more likely stronger resistance / support lines compared to those that have been touched only twice.
Very important: sometimes you might see dotted lines that suddenly stop after a few months (after 100 bars to be precise). This indicates you need to zoom further out for TradingView to be able to load the full line. Unfortunately TradingView doesn't render lines if the starting point was too long ago, so this is my workaround. This is also the script's biggest advantage: showing you lines that you might have missed otherwise since the starting bars were outside of the screen, and required you to scroll f. e back to 2015..
One more thing to know:
Weak colored line = only 2 "collision" points with candle highs/lows (= not confirmed)
Usual colored line = 3+ "collision" points (= confirmed)
Make sure to move this indicator above the ticker in the Object Tree, so that it is drawn on top of the ticker's candles!
More infos: www.reddit.com
cd_SMT_Sweep_CISD_CxGeneral
This indicator is designed to show trading opportunities after sweeps of higher timeframe (HTF) highs/lows and, if available, Smart Money Technique (SMT) divergence with a correlated asset, followed by confirmation from a lower timeframe change in state delivery (CISD).
Users can track SMT, Sweep, and CISD levels across nine different timeframes.
________________________________________
Usage and Details
Commonly correlated timeframes are available in the menu by default. Users can also enter other compatible timeframes manually if necessary.
The indicator output is presented as:
• A summary table
• Display on HTF candles
• CISD levels shown as lines
Users can disable any of these from the menu.
Presentations of selected timeframes are displayed only if they are greater than or equal to the active chart timeframe.
From the Show/Hide section, you can control the display of:
• SMT table
• Sweep table
• HTF candles
• CISD levels
• HTF boxes aligned with the active timeframe
________________________________________
SMT Analysis
To receive analysis, users must enter correlated assets in the menu (or adjust them as needed).
If asset X is paired with correlated asset Y, then a separate entry for Y correlated with X is not required.
Four correlation pairs are included by default. Users should check them according to their broker/exchange or define new ones.
Checkboxes at the beginning of each row allow activation/deactivation of pairs.
SMT analysis is performed on the last three candles of each selected HTF.
If one asset makes a new high while the correlated one does not (or one makes a new low while the other does not), this is considered SMT and will be displayed both in the table and on the chart.
Charts without defined correlated assets will not display an SMT table.
________________________________________
Sweep Analysis
For the selected timeframes, the current candle is compared with the previous one.
If price violates the previous level and then pulls back behind it, this is considered a sweep. It is displayed in both the table and on the chart.
Within correlated pairs, the analysis is done separately and shown only in the table.
Example with correlated and non-correlated pairs:
• In the table, X = false, ✓ = true.
• The Sweep Table has two columns for Bullish and Bearish results.
• For correlated pairs, both values appear side by side.
• For undefined pairs, only the active asset is shown.
Example 1: EURUSD and GBPUSD pair
• If both sweep → ✓ ✓
• If one sweeps, the other does not → ✓ X
• If neither sweeps → X X
Example 2: AUDUSD with no correlated pair defined
• If sweep → ✓
• If no sweep → X
________________________________________
HTF Candles
For every HTF enabled by the user, the last three candles (including the current one) are shown on the chart.
SMT and sweep signals are marked where applicable.
________________________________________
CISD Levels
For the selected timeframes, bullish and bearish CISD levels are plotted on the chart.
________________________________________
HTF Boxes
HTF boxes aligned with the active timeframe are displayed on the chart.
Box border colors change according to whether the active HTF candle is bullish or bearish.
________________________________________
How to Read the Chart?
Let’s break down the example below:
• Active asset: Nasdaq
• Correlated asset: US500 (defined in the menu, confirmed in the table bottom row)
• Active timeframe: H1 → therefore, the HTF box is shown for Daily
• Since a correlated pair is defined, the indicator runs both SMT and Sweep analysis for the selected timeframes. Without correlation, only Sweep analysis would be shown.
Table is prepared for H1 and higher timeframes (as per user selection and active TF).
Observations:
• SMT side → H1 timeframe shows a bearish warning
• Sweep side → Bearish column shows X and ✓
o X → no sweep on Nasdaq
o ✓ → sweep on US500
Meaning: US500 made a new high (+ sweep) while Nasdaq did not → SMT formed.
The last column of the table shows the compatible LTF for confirmation.
For H1, it suggests checking the 5m timeframe.
On the chart:
• CISD levels for selected timeframes are drawn
• SMT line is marked on H1 candles
• Next step: move to 5m chart for CISD confirmation before trading (with other confluences).
Similarly, the Daily row in the table shows a Bullish Sweep on US500.
________________________________________
Alerts
Two alert options are available:
1. Activate Alert (SMT + Sweep):
Triggers if both SMT and Sweep occur in the selected timeframes. (Classic option)
2. Activate Alert (Sweep + Sweep):
Triggers if sweeps occur in both assets of a correlated pair at the same timeframe.
Interpretation:
If SMT + Sweep are already present on higher timeframes, and simultaneous sweeps appear on lower timeframes, this may indicate a strong directional move.
Of course, this must be validated with CISD and other confluences.
________________________________________
HTF CISD Levels
Although CISD levels act as confirmation levels in their own timeframe, observing how price reacts to HTF CISD levels can provide valuable insights for intraday analysis.
POIs overlapping with these levels may be higher priority.
________________________________________
What’s Next in Future Versions?
• Completed CISD confirmations
• Additional alert options
• Plus your feedback and suggestions
________________________________________
Final Note
I’ll be happy to hear your opinions and feedback.
Happy trading!
Pump/Dump Detector [Modular]//@version=5
indicator("Pump/Dump Detector ", overlay=true)
// ————— Inputs —————
risk_pct = input.float(1.0, "Risk %", minval=0.1)
capital = input.float(100000, "Capital")
stop_multiplier = input.float(1.5, "Stop Multiplier")
target_multiplier = input.float(2.0, "Target Multiplier")
volume_mult = input.float(2.0, "Volume Spike Multiplier")
rsi_low_thresh = input.int(15, "RSI Oversold Threshold")
rsi_high_thresh = input.int(85, "RSI Overbought Threshold")
rsi_len = input.int(2, "RSI Length")
bb_len = input.int(20, "BB Length")
bb_mult = input.float(2.0, "BB Multiplier")
atr_len = input.int(14, "ATR Length")
show_signals = input.bool(true, "Show Entry Signals")
use_orderflow = input.bool(true, "Use Order Flow Proxy")
use_ml_flag = input.bool(false, "Use ML Risk Flag")
use_session_filter = input.bool(true, "Use Volatility Sessions")
// ————— Symbol Filter (Optional) —————
symbol_nq = input.bool(true, "Enable NQ")
symbol_es = input.bool(true, "Enable ES")
symbol_gold = input.bool(true, "Enable Gold")
is_nq = str.contains(syminfo.ticker, "NQ")
is_es = str.contains(syminfo.ticker, "ES")
is_gold = str.contains(syminfo.ticker, "GC")
symbol_filter = (symbol_nq and is_nq) or (symbol_es and is_es) or (symbol_gold and is_gold)
// ————— Calculations —————
rsi = ta.rsi(close, rsi_len)
atr = ta.atr(atr_len)
basis = ta.sma(close, bb_len)
dev = bb_mult * ta.stdev(close, bb_len)
bb_upper = basis + dev
bb_lower = basis - dev
rolling_vol = ta.sma(volume, 20)
vol_spike = volume > volume_mult * rolling_vol
// ————— Session Filter (EST) —————
est_offset = -5
est_hour = (hour + est_offset + 24) % 24
session_filter = (est_hour >= 18 or est_hour < 6) or (est_hour >= 14 and est_hour < 17)
session_ok = not use_session_filter or session_filter
// ————— Order Flow Proxy —————
mfi = ta.mfi(close, 14)
buy_imbalance = ta.crossover(mfi, 50)
sell_imbalance = ta.crossunder(mfi, 50)
reversal_candle = close > open and close > ta.highest(close , 3)
// ————— ML Risk Flag (Placeholder) —————
ml_risk_flag = use_ml_flag and (ta.sma(close, 5) > ta.sma(close, 20))
// ————— Entry Conditions —————
long_cond = symbol_filter and session_ok and vol_spike and rsi < rsi_low_thresh and close < bb_lower and (not use_orderflow or (buy_imbalance and reversal_candle)) and (not use_ml_flag or ml_risk_flag)
short_cond = symbol_filter and session_ok and vol_spike and rsi > rsi_high_thresh and (not use_orderflow or sell_imbalance) and (not use_ml_flag or ml_risk_flag)
// ————— Position Sizing —————
risk_amt = capital * (risk_pct / 100)
position_size = risk_amt / atr
// ————— Plot Signals —————
plotshape(show_signals and long_cond, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(show_signals and short_cond, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
// ————— Alerts —————
alertcondition(long_cond, title="Long Entry Alert", message="Pump fade detected: Long setup triggered")
alertcondition(short_cond, title="Short Entry Alert", message="Dump detected: Short setup triggered")
Radial Basis Kernel RSI for LoopRadial Basis Kernel RSI for Loop
What it is
An RSI-style oscillator that uses a radial basis function (RBF) kernel to compute a similarity-weighted average of gains and losses across many lookback lengths and kernel widths (γ). By averaging dozens of RSI estimates—each built with different parameters—it aims to deliver a smoother, more robust momentum signal that adapts to changing market conditions.
How it works
The script measures up/down price changes from your chosen Source (default: close).
For each combination of RSI length and Gamma (γ) in your ranges, it builds an RSI where recent bars that look most similar (by price behavior) get more weight via an RBF kernel.
It averages all those RSIs into a single value, then smooths it with your selected Moving Average type (SMA, EMA, WMA, HMA, DEMA) and a light regression-based filter for stability.
Inputs you can tune
Min/Max RSI Kernel Length & Step: Range of RSI lookbacks to include in the ensemble (e.g., 20→40 by 1) or (e.g., 30→50 by 1).
Min/Max Gamma & Step: Controls the RBF “width.” Lower γ = broader similarity (smoother); higher γ = more selective (snappier).
Source: Price series to analyze.
Overbought / Oversold levels: Defaults 70 / 30, with a midline at 50. Shaded regions help visualize extremes.
MA Type & Period (Confluence): Final smoothing on the averaged RSI line (e.g., DEMA(44) by default).
Red “OB” labels when the line crosses down from extreme highs (~80) → potential overbought fade/exit areas.
Green “OS” labels when the line crosses up from extreme lows (~20) → potential oversold bounce/entry areas.
How to use it
Treat it like RSI, but expect fewer whipsaws thanks to the ensemble and kernel weighting.
Common approaches:
Look for crosses back inside the bands (e.g., down from >70 or up from <30).
Use the 50 midline for directional bias (above = bullish momentum tilt; below = bearish).
Combine with trend filters (e.g., your chart MA) for higher-probability signals.
Performance note: This is really heavy and depending on how much time your subscription allows you could experience this timing out. Increasing the step size is the easiest way to reduce the load time.
Works on any symbol or timeframe. Like any oscillator, best used alongside price action and risk management rather than in isolation.
HSM KILLZONE//@version=5
indicator('HSM KILLZONE', 'HSM KILLZONE', 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('New York AM', '', 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('0700-1100', '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('New York PM', '', 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('1300-1600', '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('Asian Sesh', '', 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('2000-0000', '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('London', '', 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('0200-0500', '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)
P/S Ratio vs Median + Bollinger Band- 📝 This indicator highlights potential buying opportunities by analyzing the Price-to-Sales (P/S) ratio in relation to Bollinger Bands and its historical median.
- 🎯 The goal is to provide a visually intuitive signal for value-oriented entries, especially when valuation compression aligns with historical context.
- 💡 Vertical green shading is applied when the P/S ratio drops below the lower Bollinger Band, which is calculated directly from the P/S ratio itself — not price. This condition often signals the ticker may be oversold.
- 🟢 Lighter green appears when the ratio is below the lower band but above the median, suggesting a possible shorter-term entry with slightly more risk.
- 🟢 Darker green appears when the ratio is both below the lower band and below the median, pointing to a potentially stronger, longer-term value entry.
- ⚠️ This logic was tested using 1 and 2-day time frames. It may not be as helpful in longer time frames, as the financial data TradingView pulls in begins in Q4 2017.
- ⚠️ Note: This script relies on financial data availability through TradingView. It may not function properly with certain tickers — especially ETFs, IPOs, or thinly tracked assets — where P/S ratio data is missing or incomplete.
- ⚠️ This indicator will not guarantee successful results. Use in conjunction with other indicators and do your due diligence.
- 🤖 This script was iteratively refined with the help of AI to ensure clean logic, minimalist design, and actionable signal clarity.
- 📢 Idea is based on the script "Historical PE ratio vs median" by @haribotagada
- 💬 Questions, feedback, or suggestions? Drop a comment — I’d love to hear how you’re using it or what you'd like to see changed.