Multi EMA Touch Alert (Realtime / Alertcondition)🇺🇸 English Description (for TradingView Publication)
Title: Multi EMA Touch Alert (Realtime / Alertcondition)
This script detects real-time price touches on multiple EMAs and provides clean, reliable alerts through TradingView’s alertcondition system.
It is designed for traders who want fast reactions, minimal chart clutter, and precise touch-based notifications.
Features
• Real-time EMA touch detection (no need to wait for candle close)
• Supports multiple EMAs (default: 10 / 20 / 40 / 80)
• Touch logic works from both above and below
• Clean visual markers that appear only in real-time
• Fully compatible with TradingView’s alert creation panel
• “Any EMA Touch” option for combined alerts
How it works
The script checks whether the current candle’s high–low range intersects each EMA.
When a touch occurs, a small colored marker appears, and the corresponding alertcondition becomes true.
You can set alerts for individual EMAs or for all EMAs at once.
Ideal for scalpers, breakout traders, and anyone who relies on EMA reactions for timing entries.
🇯🇵 日本語説明文(TradingView公開用)
タイトル: Multi EMA Touch Alert(リアルタイム/アラート設定対応)
このスクリプトは、複数のEMAに価格がタッチした瞬間をリアルタイムで検出し、TradingViewのアラート設定画面から自由に通知を作成できるインジケーターです。
チャートをシンプルに保ちながら、必要なタイミングだけ確実にアラートを受け取りたいトレーダー向けに最適化されています。
特徴
• 足確定を待たないリアルタイムタッチ検出
• 複数EMAに対応(初期設定:10 / 20 / 40 / 80)
• 上下どちらからのタッチにも対応
• リアルタイムのみ印を表示し、過去チャートが散らからない
• TradingViewのアラート作成画面で個別・まとめて設定可能
• 「Any EMA Touch」で全EMAを一括監視も可能
動作概要
ローソク足の高値〜安値がEMAに触れた瞬間にタッチ判定が発生し、
リアルタイムで小さなマーカーが表示され、alertconditionがtrueになります。
アラートはEMAごと、または全EMAまとめて設定できます。
スキャルピングや短期トレードで、EMA反応を重視する方に最適です。
อินดิเคเตอร์และกลยุทธ์
Market Regime Guard PRO Institutional No-Trade ZonesThis dashboard automatically blocks trading on structurally dangerous market days caused by volatility compression, inside-day accumulation, rising VIX liquidation risk, EMA breakdowns, and thin liquidity traps.
Most traders lose not because their entries are bad — but because they trade on structurally dangerous market days.
This dashboard automatically blocks trading on contraction, liquidation-risk, inside-day, and volatility-trap days.
Then list what it detects:
• Inside Days (institutional absorption)
• NR7 contraction traps
• ATR volatility compression
• EMA structure breakdown
• Rising VIX liquidation risk
• News & holiday liquidity traps
Promise:
Only trade when the market structure is favorable.
Use this as your universal go/no-go trading permission system.
If it’s GREEN → Trade.
If it’s RED → Stand Aside or Be careful
Works on:
SPY, QQQ, TQQQ, NVDA, PLTR, TSLA, BTC, ES, NQ, Forex & Crypto.
🧭 How to Use the Market Regime Table
This table is your go / no-go permission system.
Start by checking it on SPY and QQQ — these represent the overall U.S. market and the Nasdaq growth complex.
• If SPY and QQQ are GREEN → market structure is favorable
• If either is RED → stand aside or reduce risk
Once the market is GREEN, you can then apply the same table to individual stocks (NVDA, PLTR, TSLA, AMD, etc.) to confirm that the stock’s structure is also favorable before taking any trades.
Rule of thumb:
Market first. Stock second.
Only trade when both are GREEN.
This one rule alone dramatically improves win rate, drawdown, and consistency.
FULL DESCRIPTION
Most traders don’t lose because their entries are bad —
They lose because they trade on structurally dangerous market days.
On these days:
• Institutions absorb liquidity
• Volatility contracts
• Fake breakouts dominate
• Stop hunts explode
• Real expansion does not occur
This indicator automatically identifies and blocks:
• Inside-day accumulation traps
• NR7 contraction traps
• Falling ATR volatility compression
• EMA structure breakdowns
• Rising VIX liquidation risk
• Thin liquidity / holiday risk
• News-day volatility traps
It gives you a clear desk-style verdict:
Status Meaning
🟢 GREEN Market structure favorable – trade normally
🔴 RED Structural danger – stand aside
This is not an entry system.
This is your permission system.
🛠 HOW TO USE
Add indicator to your chart
Check table in top-right
Trade only on GREEN days
Avoid RED days completely
📈 Personal Note
This regime filter has been instrumental in my own trading journey. After struggling during my first few years in the market, I realized that the biggest losses didn’t come from bad strategies — they came from trading on the wrong days.
Learning to stand aside on structurally dangerous market days and only trade when conditions are favorable dramatically improved my consistency and overall returns.
🧠 Why Market Regime Matters Even More for Day Traders
Most day-trader losses do not come from bad entries.
They come from:
• Choppy inside-day conditions
• Liquidity absorption
• Falling volatility (no follow-through)
• Stop-hunt behavior
• News / thin liquidity traps
Your filter directly blocks every one of these traps.
So for day traders, this tool:
• Prevents revenge trading
• Stops death-by-a-thousand-cuts days
• Filters out random chop days
• Protects capital on slow days
• Preserves psychological capital
📈 Why It Also Improves Swing Trading
For swing traders, this tool:
• Avoids entering during contraction
• Avoids entering before expansions
• Avoids bear-regime traps
• Improves follow-through probability
• Reduces drawdown
• Improves R-multiple expectancy
Which means:
Fewer trades
Higher quality trades
More profit per trade
The Universal Truth
The market does not pay you for activity.
It pays you for selectivity.
This filter improves timing, not tactics.
Your entries can be identical — your results improve simply because you’re trading on the right days.
⚠️ Disclaimer
This indicator is provided for educational and informational purposes only and does not constitute financial, investment, or trading advice.
Trading stocks, options, futures, forex, and cryptocurrencies involves substantial risk and may result in the loss of some or all of your invested capital. Past performance is not indicative of future results.
This tool does not guarantee profits and should be used as a market structure filter and risk-management aid only. Always perform your own analysis, use proper position sizing, and consult a licensed financial professional before making any trading decisions.
You are solely responsible for all trades taken using this indicator.
Timeframe-Independent Anchored VWAPAn anchored VWAP (Volume Weighted Average Price) that produces identical values (down to the tick!) across different timeframes (unlike, for example, TradingView's built-in Anchored VWAP).
Advantages
This indicator calculates identical values whether you view it on 1m, 5m, 15m, or any other timeframe within reasonable ranges. Even challenging non-integer timeframe ratios like calculating on 2m while viewing on 3m are handled perfectly. In High or Low mode, VWAP will anchor precisely at the selected candle's high/low. As usual for AVWAP, up to 3 standard deviation bands are supported.
How to Use
Setting the Anchor: When the indicator is added, select your anchor time. This is typically placed at a significant swing high/low or session open.
Source Selection: Choose whether to anchor from High, Low, or Close price.
Calculation Timeframe: Select the timeframe used for VWAP calculation.
For intraday trading (1m-1H charts): Just keep the default setting (1m)
For swing trading (4H-D charts): Use 5m or 15m calculation timeframe
For position trading (D-W charts): Use 1H calculation timeframe
Important: Lower calculation timeframes provide more precise data but may hit Pine Script's bar limit on very long timeframes
Standard Deviation Bands: Enable additional band sets as needed for your trading style.
Technical Implementation
The indicator achieves timeframe independence through the following algorithm:
Lower Timeframe Sampling: Uses Pine Script's request.security_lower_tf() to retrieve bar data at the specified calculation timeframe, regardless of the viewing timeframe. This provides consistent data resolution across all chart timeframes.
Anchor Detection: Scans the lower timeframe data to identify the exact bar containing the selected anchor price. The algorithm handles both simple cases (where anchor falls on a complete bar) and complex cases (where anchor falls within a split bar in non-integer timeframe ratios like calculating on 2m while viewing on 3m).
FIFO Buffer Management: Maintains a First-In-First-Out buffer of lower timeframe bars. On each chart bar:
Adds new lower timeframe bars to the buffer
Processes exactly one period worth of bars (matching the viewing timeframe)
Removes processed bars from the buffer
This approach ensures consistent calculation regardless of viewing timeframe.
First Bar Initialization: On the anchor bar, processes only the single anchor bar to ensure the VWAP starts exactly at the anchor price. Subsequent bars process the full period, maintaining mathematical accuracy.
VWAP Calculation: Applies the standard volume-weighted average price formula:
VWAP = Σ(Price × Volume) / Σ(Volume)
StdDev = √(Σ(Price² × Volume) / Σ(Volume) - VWAP²)
All calculations accumulate from the anchor point forward.
Visual Continuity: For edge cases where the anchor falls in an incomplete bar (e.g., calculating on 2m while viewing on 3m), displays the anchor price as a visual placeholder until the actual calculation begins on the next bar. This ensures the line always starts visually at the anchor point.
Market Structure Buy and Sells This indicator is based on these two indicators:
- Next Candle Predictor with Auto Hedging by HackWarrior
- Market Structure by odnac
How It Works
The Entry (Breakout): The script tracks the most recent Swing Highs and Lows. When price closes above a Swing High, it triggers a Buy Signal. When it closes below a Swing Low, it triggers a Sell Signal.
The Stop Loss (Signal #1): Unlike standard indicators that use a fixed pip amount, this uses "Signal #1"—a volatility-based calculation that finds the recent wave bottom (for buys) or wave top (for sells) to set a logical, market-based stop loss.
The Take Profit: Once the risk is defined by Signal #1, the indicator automatically projects a target based on your desired Risk:Reward Ratio (default is 1:1).
Key Features
Visual Trade Boxes: Instantly see your Profit (Green) and Loss (Red) zones on the chart the moment a signal triggers.
RSI "C" Exit (Optional): A toggleable safety switch that allows you to exit trades early if the RSI becomes overbought or oversold, protecting your gains before a reversal.
Live Backtest Table: A real-time dashboard in the corner of your chart that tracks Total Trades, Wins, Losses, and Win Rate so you can see how the strategy performs on any timeframe.
Integrated Alerts: Full support for alerts on both Buy and Sell signals.
MA Zone Candle Color 8.0This indicator plots a selected moving average (any type: EMA, VWAP, HMA, ALMA, custom composites, RVWAP, etc.) and creates a symmetrical grid of horizontal levels/bands spaced at precise, predefined increments around it. The spacing between levels can be set in two modes:
Percent (%) of the current MA value
Points (fixed price units)
The available increment sizes follow a specific geometric-like sequence (very similar to Gann square-of-9 derived steps), giving you clean, repeatable distance choices such as 0.61, 1.22, 2.44, 4.88, 9.77 points (or their percentage equivalents).
Core purpose
It visually marks exactly how far price has moved away from your chosen moving average — in multiples of the increment you selected.
Main practical use cases -
1. Measuring distance from key reference level
VWAP or EMA(20–89), Points mode, 1.22–4.88 incr.
"Price is currently 3.5 increments above VWAP" → quick context for context
2. Identifying structured price levels
Points mode + 2.44 or 4.88 increment
Treat every band as potential support/resistance or target zone
3. Comparing extension size across instruments
Percent mode, same increment value across symbols
Makes extensions visually comparable (BTC vs ETH vs SPX vs NQ)
4. Session / intraday structure mapping
RVWAP or session VWAP + Points mode
See how many "steps" price has made since session open / reset
5. Setting objective take-profit / scale-out levels
Any MA + medium increment (4.88–19.53 points)
"I'll take partials at +2×, +4×, +6× increment" — very mechanical
6. Volatility-adjusted grid (crypto/forex)
Points mode with larger increments
Prevents bands from becoming too wide/narrow during huge volatility swings
Most common combo
MA: VWAP or RVWAP (session/day reset)
Mode: Points
Increment: 1.220704 or 2.441408 or 4.8828125
Bands per side: 30–60
→ Creates a clean, evenly-spaced ladder of levels around the daily/intraday average that traders can use purely for distance measurement and objective level marking.
In short:
It's a very precise, repeatable distance ruler built around any moving average you choose — nothing more, nothing less.
EMA 8 48 System v1Short Description:
A trend-following indicator using EMA crossovers, ATR-based volatility filter, and a cooldown period to reduce false signals. Designed for clear buy/sell signals in trending markets.
Full Description:
What is this indicator?
This script implements a dual EMA crossover system (8-period and 48-period EMAs) with a trend filter (EMA200), ATR-based volatility filter, and a cooldown period to avoid overtrading.
It visually plots EMAs, buy/sell signals, and ATR-based stop loss/target levels.
Why is it useful?
Helps traders identify high-probability trend entries and avoid choppy, low-volatility conditions.
Reduces false signals by requiring trend confirmation, sufficient volatility, and spacing out trades.
Suitable for intraday and swing trading on most liquid assets.
When to use:
Best used in markets showing clear trends (not sideways).
Works on most timeframes, but higher timeframes (15m, 1h, 4h, daily) tend to give more reliable signals.
How to spot buy and sell:
Buy: Green “BUY” label appears when EMA8 crosses above EMA48, price is above EMA200, and ATR is above the minimum threshold.
Sell: Red “SELL” label appears when EMA8 crosses below EMA48, price is below EMA200, and ATR is above the minimum threshold.
ATR-based stop loss and target levels are plotted for each signal.
Additional tips:
Adjust the minimum ATR and cooldown settings to match your asset’s volatility and your trading style.
Use in conjunction with price action or higher timeframe analysis for best results.
Avoid trading during low volatility or sideways markets, as signals may be less reliable.
Always backtest and forward-test before using live.
How to add signals and update settings:
Use the script’s input panel to adjust EMA lengths, ATR settings, minimum ATR, and cooldown period.
To add alerts, use TradingView’s “Add Alert” feature and select the buy or sell conditions from the script’s alert options.
For further customization, you can edit the script to add additional filters or notification logic.
This indicator is for educational purposes only. Always use proper risk management and do your own research before trading.
Disclaimer:
This script is for informational and educational purposes only and does not constitute financial advice or a recommendation to buy or sell any financial instrument.
Trading involves risk. Past performance is not indicative of future results. Always do your own research and use proper risk management.
The author is not responsible for any losses incurred from the use of this script. By using this script, you agree to take full responsibility for your trading decisions.
Percentage Price LevelsPercentage Price Levels displays dynamic price levels based on percentage gains and losses from the current price. Instantly visualize where price would be at ±2%, ±4%, ±6%, ±8%, ±10%(and beyond) — perfect for setting profit targets, stop-losses, and understanding potential price movement.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 WHAT IT DOES
• Draws horizontal lines at percentage-based price levels above and below current price
• Green lines = potential profit targets (positive %)
• Red lines = potential stop-loss zones (negative %)
• Yellow line = current price reference
• Summary table shows all levels in a clean, easy-to-read format
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚙️ FEATURES
• Up to 8 positive and 8 negative percentage levels
• Fully customizable percentages (set your own values)
• Toggle each level on/off individually
• Adjustable font size (Tiny to Huge)
• Multiple line styles (Solid, Dashed, Dotted)
• Movable summary table (any corner)
• Base price options: Close, Open, High, Low, HL2, OHLC4
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📈 HOW TO USE
1. Add the indicator to your chart
2. Default shows ±2%, ±4%, ±6%, ±8%, ±10% levels
3. Open Settings to customize:
• Enable/disable specific levels
• Change percentage values
• Adjust colors and font size
• Move table position
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
💡 USE CASES
• Day Trading — Quick intraday profit targets
• Swing Trading — Visualize multi-day price zones
• Risk Management — Set stop-losses based on % risk tolerance
• Options Trading — Find strike prices relative to spot
• Position Sizing — See exact dollar values at each level
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔧 DEFAULT SETTINGS
Positive: +2%, +4%, +6%, +8%, +10% (3 extra slots available)
Negative: -2%, -4%, -6%, -8%, -10% (3 extra slots available)
Font Size: Normal
Line Style: Dashed
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
If you find this useful, please leave a like! Feedback and suggestions welcome in the comments.
Micro Futures Risk Calculator (Minimal)risk calculator based off of stop distance. to keep risk consistent for consistent growth
Filtered Percentile OscillatorThe Filtered Percentile Oscillator is a new trend following tool that uses trend strength for filtering. Noisy at times - but do not underrate it, this tool has great potential. :)
Benefits:
- Very high speed
- Adaptive behaviour filtering excess noise
- High performance on CRYPTO:SUIUSD
- Plotting for better visualization
The Idea
Get a simple indicator that is combined with trend strength for filtering. The best for this was the Percentile. I used it on the classic source to keep it simple, but if anybody wants feel free to change it with/without ChatGPT.
How it works:
Calculate the Percentile of the source.
Calculate the ADX & the Percentile of ADX.
Then we have two filter conditions:
If ADX Percentile+ Absolute Percentile of source > Sum Filter Treshhold is not true, both the Long & Short conditions are automaticly false.
If ADX Percentile > Filter Treshhold it will make the treshholds for the Percentile lower, while if it is below the filter treshhold, it will put the treshholds higher to filter excess noise further.
Enjoy Gs!
Rolling DrawdownRolling Drawdown, trying to make an auto updating drawdown screener and scanner, work in progress, edit in future.
Adaptive For LoopThe Adaptive For Loop is a new advanced trend following tool that can avoid false signals while keeping a high speed.
Benefits
- Good speed
- Low noise
- High Performance on INDEX:BTCUSD
- Plotting for clear visualization of trend and values.
The Idea
Before I tried using a For Loop on a singular piece of source - but every source was noisy in different parts and was not really that good.
So I got an idea: How about I make a for loop on all of them (open, high, low, close) and filter them to get the best out of all worlds?
How it works
Calculate the For Loop for open, high, low, close -> a For Loop compares the current value to past values and scores it accordingly.
After calculating them, it picks the one with the highest absolute value. This means only the for loop with the highest strength gets applied. This filters noise and provides users with high speed even in the environments that do not support it.
Enjoy Gs!
Rolling DrawdownRolling Drawdown, trying to get an auto updating drawdown. work in progress. will edit in future
Momentum RSIThe Momentum RSI is a smoother and faster version of the famous RSI made by J. Welles Wilder.
Benefits
- Higher speed relative to the classic RSI
- Lower noise
- Momentum which can be watched for additional data and more educated investments
- Low/High Value catching
- Plotting for better visualization
- High CRYPTO:SOLUSD performance
The Idea
The idea is to make the RSI faster by adding momentum to it. This can prevent false signals and speed up entries.
What is the momentum in here? The momentum is the difference between a short-term & a longer term Moving Average, which can also signal uptrends/downtrends.
How it works
First it calculates the basic RSI using the standard calculation. Then it applies 2 averages on it, one with higher lookback and one with lower lookback.
The difference between the lower lookback and higher lookback averages is what gives us the momentum.
Another momentum is a lower length RSI - higher length RSI.
These two momentum calculations are then added on top of the previous RSI value .
This is the entire calculation - simple & efficient.
Enjoy Gs!
Rolling Period Drawdownwork in progress, will edit in future, trying to get an auto updating draw down indicator.
Extreme HMA ATR BandsThe Extreme HMA ATR Bands are an advanced trend following tool focused on high speed & high smoothness over multiple assets.
Benefits:
- High Speed
- Smooth trend catching with low amount of false signals
- Great performance on CRYPTO:SOLUSD , BINANCE:SUIUSD , CRYPTO:CROUSD
- Plotting allowing easier visualization of the performance
The Idea
The idea is to create bands that "weight" data into the extreme points. These extreme points are to be taken from HMA to provide a smoother result. Averaging the extreme points we get the "middle" to which we can simply apply the ATR to get high accuracy signals.
How it works:
It calculates HMA over a short period to get a smooth source.
Then calculates the Highest & Lowest point of the HMA and their Lowest & Highest points.
By finding the Lowest Lowest Highest HMA and Highest Highest Lowest HMA and averaging them, you get a middle ground between high responsivness & smoothness.
Enjoy Gs!
SA_ORB_ONR_CLOUD_vwapBandsSIGNAL ARCHITECT™ — ORB / ONR Cloud with VWAP Bands
Optimized for the 15-Minute Timeframe
Overview
The Signal Architect™ ORB / ONR Cloud is a session-structure and probability framework designed to help traders understand where price is statistically compressed, transitioning, or escaping value during the regular trading session.
On the 15-minute chart, this study excels at identifying:
High-probability consolidation zones
Early session directional intent
Fade vs continuation environments
Context for VWAP-based mean reversion or trend extension
Rather than predicting price, the indicator classifies market behavior using time-anchored ranges and volume-weighted statistics.
Core Components (15-Minute Context)
1️⃣ Overnight Range (ONR)
The Overnight Range captures price extremes formed before the regular session opens.
On the 15-minute timeframe, ONR acts as:
A higher-timeframe reference level
A source of institutional liquidity memory
A boundary where early session reactions often occur
2️⃣ Opening Range (ORB)
The Opening Range is defined as the first X minutes after the session open (default: 15 minutes).
On a 15-minute chart:
The ORB often forms entirely within a single candle
It represents initial institutional positioning
It helps differentiate initiative vs responsive behavior
3️⃣ ORB–ONR Cloud (Key Feature)
The Cloud is the overlapping area between the Overnight Range and the Opening Range.
This zone is critical on the 15-minute timeframe because it often represents:
Compressed auction
Balance / indecision
Liquidity absorption
Interpretation:
Price inside the cloud → Higher probability of consolidation, fade, or contraction
Price exiting the cloud → Transition toward expansion or trend resolution
The cloud is not a signal — it is a probability environment.
4️⃣ VWAP with Session-Weighted σ Bands
The study plots VWAP starting from the regular session open, along with true volume-weighted standard deviation bands (±1σ, ±2σ).
On the 15-minute timeframe:
VWAP defines fair value
σ bands help distinguish normal rotation vs statistical extension
Interaction with VWAP while inside the cloud often suggests mean-reverting conditions
Interaction with VWAP after leaving the cloud often confirms trend continuation
5️⃣ Breakout Classification (BRK)
A BRK event occurs when price closes outside BOTH:
The Overnight Range
The Opening Range
On the 15-minute chart:
BRK events often mark session regime changes
They are contextual markers, not entries
Arrows are color-matched to the candle (green candle → green arrow, red candle → red arrow)
To avoid clutter, breakouts can be limited to first-occurrence only.
Probability Layer (15-Minute Edge)
The indicator includes rolling probability calculations to quantify market behavior:
📊 Inside-Cloud Probability
Shows how often price remains inside the ORB–ONR cloud over the selected lookback.
Higher values → balance / compression dominant
Lower values → trend / expansion dominant
📉 Fade / Contraction Probability (Inside Cloud)
When price is inside the cloud, the study measures volatility contraction using ATR behavior.
Higher contraction % → Greater likelihood of rotation or fade
Lower contraction % → Cloud acting as launchpad rather than balance
📈 State Occupancy (5-State Model)
Tracks how price distributes its time across:
Above both ranges
Below both ranges
Inside ORB only
Inside ONR only
Inside the Cloud
This helps traders understand where the market statistically prefers to trade on the 15-minute structure.
Best Use Cases (15-Minute Chart)
✔ Contextual bias for intraday swing trades
✔ Identifying fade vs trend conditions
✔ VWAP-based execution alignment
✔ Avoiding low-probability entries inside compression
✔ Session structure awareness without lower-timeframe noise
What This Indicator Is NOT
❌ Not a buy/sell system
❌ Not predictive
❌ Not a guarantee of outcomes
It is a market structure and probability framework — designed to improve decision quality, not replace risk management.
Recommended Settings (15-Minute)
ORB Length: 15 minutes
VWAP Bands: ±1σ / ±2σ
Probability Lookback: 100–200 bars
Breakout Mode: First-occurrence only
Cloud Enabled: Yes
Risk & Compliance Notice
This tool is provided for educational and informational purposes only.
It does not constitute financial advice, investment recommendations, or trade instructions.
All trading involves risk, including the possible loss of capital.
Standalone Signal - trianchor.gumroad.com
chatgpt.com
chatgpt.com
chatgpt.com
Disaster SL & TP by refhowto set disaster stoploss according to asr, also eases position sizing to your depo level
Crypto Session Range 📄 INDICATOR DESCRIPTION (ENGLISH)
Crypto Session Range (Custom Timezone) is a lightweight and accurate session-based indicator designed specifically for cryptocurrency markets (24/7).
This indicator allows traders to define custom trading time windows using any global timezone, solving common issues found in traditional session indicators that are built for stock markets.
🔹 Key Features
Custom timezone support (e.g. America/Puerto_Rico, America/New_York, UTC)
Up to 3 configurable trading sessions
Visual background highlighting during active sessions
Automatic High & Low range tracking for each session
Optional range extension after the session ends
Works on all crypto pairs and timeframes
🔹 Who Is This For?
Crypto traders who want precise session control
Day traders, scalpers, and session-based strategies
Traders who operate during specific market windows (London / NY / custom)
🔹 Notes
This indicator is not restricted to exchange trading hours and is fully compatible with 24/7 markets like crypto, unlike many default session tools.
Trap longs - Hamza Naveed// This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
//@version=5
indicator("Trap Longs - Hamza Naveed", max_labels_count = 500, overlay = false, format = format.volume)
g1 = '📊 Net Positions '
g2 = '📈 Moving Averages (VWMA/EMA) '
g3 = '⚙️ Additional Settings '
g4 = '🎚️ Profile '
g5 = '🖥️ Statistics '
g6 = '⚖️ Divergences'
// User inputs - General settings
dtype = input.string('Net Positions', 'Type', options = )
disp = input.string('Candles', 'Display as', options = )
cumu = input.string('Full Data', 'Cumulation', options = )
denom = input.string('Quote Currency', 'Quoted in', options = )
// User inputs - Data Source Settings
binance = input.bool(true, 'Binance USDT.P', inline = 'src')
binance2 = input.bool(true, 'Binance USD.P', inline = 'src')
binance3 = input.bool(true, 'Binance BUSD.P', inline = 'src2')
bitmex = input.bool(true, 'BitMEX USD.P', inline = 'src2')
bitmex2 = input.bool(true, 'BitMEX USDT.P ', inline = 'src3')
kraken = input.bool(true, 'Kraken USD.P', inline = 'src3')
// User inputs - Net Positions
showL = input.bool(true, 'NET LONGS ►', group = g1, inline='l')
showS = input.bool(false, 'NET SHORTS ►', group = g1, inline='s')
showD = input.bool(false, 'NET DELTA ►', group = g1, inline='d')
showR = input.bool(false, 'NET RATIO ►', group = g1, inline='r')
pcolL = input.color(#a5d6a7, '', group = g1, inline = 'l')
ncolL = input.color(#f77c80, '', group = g1, inline = 'l')
lcolL = input.color(#a5d6a7, '━', group = g1, inline = 'l')
pcolS = input.color(#a5d6a7, '', group = g1, inline = 's')
ncolS = input.color(#f77c80, '', group = g1, inline = 's')
lcolS = input.color(#faa1a4, '━', group = g1, inline = 's')
pcolD = input.color(#a5d6a7, '', group = g1, inline = 'd')
ncolD = input.color(#f77c80, '', group = g1, inline = 'd')
lcolD = input.color(#90bff9, '━', group = g1, inline = 'd')
pcolR = input.color(#a5d6a7, '', group = g1, inline = 'r')
ncolR = input.color(#f77c80, '', group = g1, inline = 'r')
lcolR = input.color(#f9d690, '━', group = g1, inline = 'r')
// User inputs - Net Positions EMAs
mat = input.string('VWMA', 'Type', options= , group=g2)
emaL = input.bool(false, 'LONGS ', group=g2, inline='emal')
emaS = input.bool(false, 'SHORTS ', group=g2, inline='emas')
emaD = input.bool(false, 'DELTA ',group=g2, inline='emad')
emaR = input.bool(false, 'RATIO ',group=g2, inline='emar')
emaLl = input.int(100, '', group=g2, inline='emal')
emaSl = input.int(100, '', group=g2, inline='emas')
emaDl = input.int(100, '', group=g2, inline='emad')
emaRl = input.int(100, '', group=g2, inline='emar')
emaLc = input.color(color.rgb(165, 214, 167, 60), '', group=g2, inline='emal')
emaSc = input.color(color.rgb(250, 161, 164, 60), '', group=g2, inline='emas')
emaDc = input.color(color.rgb(144, 191, 249, 60), '', group=g2, inline='emad')
emaRc = input.color(color.rgb(249, 214, 144, 60), '', group=g2, inline='emar')
// User inputs - Additional settings
volhm = input.bool(false, 'Volume HM', group=g3, inline='vol')
volc2 = input.color(color.rgb(49, 121, 245),'', group=g3, inline = 'vol')
offs = input.int (10, 'Label Offset', group=g3)
length = input.int (14, 'Position RSI Length', group=g3)
vlbl = input.bool(true, 'Value Labels', group=g3, inline='lv')
nlbl = input.bool(true, 'Data Labels', group=g3, inline='lv')
wick = input.bool(false, 'Show Candle Wicks', group=g3)
// User inputs - Profile settings
prof = input.bool (false, 'Generate a profile', group=g4)
profsrc = input.string('Net Longs', 'Profile Data', options = , group=g4)
vapct = input.float (70, 'Value Area %', minval = 5, maxval = 95, group = g4)
ori = input.string("Left", 'Position', options = , group = g4)
profSize = input.int (2, 'Node Size', minval = 1, group = g4)
rows = input.int (40, 'Rows', minval = 6, maxval = 500, step = 25, group = g4) - 1
vancol = input.color (color.new(color.blue, 75), 'Node Colors ', group = g4, inline = 'nc')
nvancol = input.color (color.new(color.gray, 75), '━', group = g4, inline = 'nc')
poc = input.bool (false, 'POC', group = g4, inline = 'POC'),
poccol = input.color (color.new(color.red, 50), ' ', group = g4, inline = "POC")
val = input.bool (false, 'VA', group = g4, inline = "VA")
vafill = input.color (color.new(color.blue, 95), ' ', group = g4, inline = 'VA')
// User inputs - Statistics
stats = input.bool(false, 'Show Stats', group = g5)
chg_b = input.int(50, 'Bars Back', group = g5)
tablevpos = input.string('Horizontal', 'Orientation', options= , group = g5)
tablepos = input.string('Bottom Center', 'Position', options= , group = g5)
stat_oi = input.bool(true, 'OI ━', group = g5, inline = 'oi')
stat_nl = input.bool(true, 'NL ━', group = g5, inline = 'nl')
stat_ns = input.bool(true, 'NS ━', group = g5, inline = 'ns')
stat_nd = input.bool(true, 'ND ━', group = g5, inline = 'nd')
stat_oi_c = input.bool(true, 'OI Change ━', group = g5, inline = 'oi')
stat_nl_c = input.bool(true, 'NL Change ━', group = g5, inline = 'nl')
stat_ns_c = input.bool(true, 'NS Change ━', group = g5, inline = 'ns')
stat_nd_c = input.bool(true, 'ND Change ━', group = g5, inline = 'nd')
stat_oi_r = input.bool(true, 'OI RSI', group = g5, inline = 'oi')
stat_nl_r = input.bool(true, 'NL RSI', group = g5, inline = 'nl')
stat_ns_r = input.bool(true, 'NS RSI', group = g5, inline = 'ns')
stat_nd_r = input.bool(true, 'ND RSI', group = g5, inline = 'nd')
// User inputs - Divergence Finder
showdiv = input.bool(false, 'Divergence finder', group = g6)
divsrc = input.string('Net Longs', 'Source', options = , group=g6)
pivotDistance = input.int(5, 'Maximum Distance', minval=0, group=g6)
leftPivot = input.int(8, 'Lookback Bars Left', minval=1, group=g6)
rightPivot = input.int(8, 'Lookback Bars Right', minval=1, group=g6)
pHH_npLH = input.bool(true, 'Price HH + Data LH', group = g6, inline='div1')
pLH_npHH = input.bool(true, 'Price LH + Data HH', group = g6, inline='div2')
pLL_npHL = input.bool(true, 'Price LL + Data HL ', group = g6, inline='div3')
pHL_npLL = input.bool(true, 'Price HL + Data LL ', group = g6, inline='div4')
pHH_npLHcol = input.color(color.red, '', group = g6, inline='div1')
pLH_npHHcol = input.color(color.red, '', group = g6, inline='div2')
pLL_npHLcol = input.color(color.green, '', group = g6, inline='div3')
pHL_npLLcol = input.color(color.green, '', group = g6, inline='div4')
// Getting OI data
mex = syminfo.basecurrency=='BTC' ? 'XBT' : string(syminfo.basecurrency)
= request.security('BINANCE' + ":" + string(syminfo.basecurrency) + 'USDT.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BINANCE' + ":" + string(syminfo.basecurrency) + 'USD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BINANCE' + ":" + string(syminfo.basecurrency) + 'BUSD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BITMEX' + ":" + mex + 'USD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('BITMEX' + ":" + mex + 'USDT.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
= request.security('KRAKEN' + ":" + string(syminfo.basecurrency) + 'USD.P_OI', timeframe.period, [close-close , close], ignore_invalid_symbol = true)
deltaOI = (binance ? nz(oid1,0) : 0) + (binance2 ? nz(oid2,0)/close : 0) + (binance3 ? nz(oid3,0) : 0) + (bitmex ? nz(oid4,0)/close : 0) + (bitmex2 ? nz(oid5,0)/close : 0) + (kraken ? nz(oid6,0)/close : 0)
OI = (binance ? nz(oi1,0) : 0) + (binance2 ? nz(oi2,0)/close : 0) + (binance3 ? nz(oi3,0) : 0) + (bitmex ? nz(oi4,0)/close : 0) + (bitmex2 ? nz(oi5,0)/close : 0) + (kraken ? nz(oi6,0)/close : 0)
// Conditions for positions entering and exiting
priceUP = close>open
priceDOWN = close0
oiDOWN = deltaOI<0
newlongs = oiUP and priceUP
rektlongs = oiDOWN and priceDOWN
newshorts = oiUP and priceDOWN
rektshorts = oiDOWN and priceUP
// Visible range
vrc = cumu=='Visible Range' ? time > chart.left_visible_bar_time and time <= chart.right_visible_bar_time : true
// Cumulation of positions entering and exiting
longs_entering = ta.cum(newlongs and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
longs_exiting = ta.cum(rektlongs and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
shorts_entering = ta.cum(newshorts and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
shorts_exiting = ta.cum(rektshorts and vrc ? (denom=='Base Currency' ? deltaOI : deltaOI * close) : 0)
// Output data
net_longs = longs_entering - math.abs(longs_exiting)
net_shorts = shorts_entering - math.abs(shorts_exiting)
net_delta = net_longs - net_shorts
net_ratio = net_longs / net_shorts
// Calculating Relative Strength
longs_strength = ta.rsi(net_longs, length)
shorts_strength = ta.rsi(net_shorts, length)
delta_strength = ta.rsi(net_delta, length)
ratio_strength = ta.rsi(net_ratio, length)
oi_strength = ta.rsi(OI, length)
// Calculating candle OHLC
src = dtype=='Net Positions' ? net_longs : longs_strength
OpenL = wick ? ta.sma(src , 2) : src
HighL = ta.highest(src, 1)
LowL = ta.lowest(src, 1)
CloseL = wick ? ta.sma(src, 2) : src
src2 = dtype=='Net Positions' ? net_shorts : shorts_strength
OpenS = wick ? ta.sma(src2 , 2) : src2
HighS = ta.highest(src2, 1)
LowS = ta.lowest(src2, 1)
CloseS = wick ? ta.sma(src2, 2) : src2
src3 = dtype=='Net Positions' ? net_delta : delta_strength
OpenD = wick ? ta.sma(src3 , 2) : src3
HighD = ta.highest(src3, 1)
LowD = ta.lowest(src3, 1)
CloseD = wick ? ta.sma(src3, 2) : src3
src4 = dtype=='Net Positions' ? net_ratio : ratio_strength
OpenR = wick ? ta.sma(src4 , 2) : src4
HighR = ta.highest(src4, 1)
LowR = ta.lowest(src4, 1)
CloseR = wick ? ta.sma(src4, 2) : src4
// Calculating EMAs
Lema = mat=='EMA' ? ta.ema(src, emaLl) : ta.vwma(src, emaLl)
Sema = mat=='EMA' ? ta.ema(src2, emaSl) : ta.vwma(src2, emaSl)
Dema = mat=='EMA' ? ta.ema(src3, emaDl) : ta.vwma(src3, emaDl)
Rema = mat=='EMA' ? ta.ema(src4, emaRl) : ta.vwma(src4, emaRl)
// Conditions
lcondL = showL and (disp=='Line' or disp=='Columns'), ccondL = showL and disp=='Candles'
lcondS = showS and (disp=='Line' or disp=='Columns'), ccondS = showS and disp=='Candles'
lcondD = showD and (disp=='Line' or disp=='Columns'), ccondD = showD and disp=='Candles'
lcondR = showR and (disp=='Line' or disp=='Columns'), ccondR = showR and disp=='Candles'
// Plotting Lines
plot(lcondL ? src : na, title="Net Longs", color=disp=='Line' ? lcolL : (net_longs >0 ? pcolL : ncolL), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
plot(lcondS ? src2 : na, title="Net Shorts", color=disp=='Line' ? lcolS : (net_shorts >0 ? pcolS : ncolS), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
plot(lcondD ? src3 : na, title="Net Shorts", color=disp=='Line' ? lcolD : (net_delta >0 ? pcolD : ncolD), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
plot(lcondR ? src4 : na, title="Net Ratio", color=disp=='Line' ? lcolR : (net_ratio >0 ? pcolR : ncolR), linewidth=1, style = disp=='Line' ? plot.style_line : disp=='Columns' ? plot.style_columns : na, editable = false)
// Plotting Candles
plotcandle(ccondL ? OpenL : na, ccondL ? HighL : na, ccondL ? LowL : na, ccondL ? CloseL : na, "Longs", CloseL>OpenL ? pcolL : ncolL, CloseL>OpenL ? pcolL : ncolL, false, bordercolor = CloseL>OpenL ? pcolL : ncolL)
plotcandle(ccondS ? OpenS : na, ccondS ? HighS : na, ccondS ? LowS : na, ccondS ? CloseS : na, "Shorts", CloseS>OpenS ? pcolS : ncolS, CloseS>OpenS ? pcolS : ncolS, false, bordercolor = CloseS>OpenS ? pcolS : ncolS)
plotcandle(ccondD ? OpenD : na, ccondD ? HighD : na, ccondD ? LowD : na, ccondD ? CloseD : na, "Delta", CloseD>OpenD ? pcolD : ncolD, CloseD>OpenD ? pcolD : ncolD, false, bordercolor = CloseD>OpenD ? pcolD : ncolD)
plotcandle(ccondR ? OpenR : na, ccondR ? HighR : na, ccondR ? LowR : na, ccondR ? CloseR : na, "Ratio", CloseR>OpenR ? pcolR : ncolR, CloseR>OpenR ? pcolR : ncolR, false, bordercolor = CloseR>OpenR ? pcolR : ncolR)
// Plotting EMAs
plot(emaL ? Lema : na, color=emaLc, editable = false)
plot(emaS ? Sema : na, color=emaSc, editable = false)
plot(emaD ? Dema : na, color=emaDc, editable = false)
plot(emaR ? Rema : na, color=emaRc, editable = false)
// Plotting Relative Strength
plot(dtype=='Position RSI' ? 100 : na, color=color.rgb(120, 123, 134, 90), title = 'RSI 100')
plot(dtype=='Position RSI' ? 70 : na, color=color.rgb(120, 123, 134, 72), title = 'RSI 70')
plot(dtype=='Position RSI' ? 50 : na, color=color.rgb(120, 123, 134, 90), title = 'RSI 50')
plot(dtype=='Position RSI' ? 30 : na, color=color.rgb(120, 123, 134, 72), title = 'RSI 30')
plot(dtype=='Position RSI' ? 0 : na, color=color.rgb(120, 123, 134, 90), title = 'RSI 0')
// Volume Heatmap
vol = volume
volmax = ta.highest(volume, 50)
col = color.from_gradient(volume, 0, volmax, chart.bg_color, volc2)
plotshape(time>chart.left_visible_bar_time and volhm, style=shape.square, size=size.normal,location = location.bottom, color=col, editable = false)
// Labels
if vlbl and disp=='Candles'
vLlabel = showL ? label.new(bar_index, CloseL>OpenL ? HighL : LowL, newlongs or rektlongs ? str.tostring(deltaOI, format.volume) : na, size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseL>OpenL ? label.style_label_down : label.style_label_up) : na
vSlabel = showS ? label.new(bar_index, CloseS>OpenS ? HighS : LowS, newshorts or rektshorts ? str.tostring(deltaOI, format.volume) : na, size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseS>OpenS ? label.style_label_down : label.style_label_up) : na
vDlabel = showD ? label.new(bar_index, CloseD>OpenD ? HighD : LowD, str.tostring(deltaOI, format.volume), size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseD>OpenD ? label.style_label_down : label.style_label_up) : na
vRlabel = showR ? label.new(bar_index, CloseR>OpenR ? HighR : LowR, str.tostring(deltaOI, format.volume), size = size.auto, color=color.rgb(255, 255, 255, 100), textcolor = chart.fg_color, style = CloseR>OpenR ? label.style_label_down : label.style_label_up) : na
if nlbl and disp!='Columns'
Llabel = showL ? label.new(bar_index+offs, src, 'NET LONGS', size = size.tiny, color=lcolL, textcolor = color.black, style = label.style_label_left) : na
Slabel = showS ? label.new(bar_index+offs, src2, 'NET SHORTS', size = size.tiny, color=lcolS, textcolor = color.black, style = label.style_label_left) : na
Dlabel = showD ? label.new(bar_index+offs, src3, 'NET DELTA', size = size.tiny, color=lcolD, textcolor = color.black, style = label.style_label_left) : na
Rlabel = showR ? label.new(bar_index+offs, src4, 'NET RATIO', size = size.tiny, color=lcolR, textcolor = color.black, style = label.style_label_left) : na
label.delete(Llabel )
label.delete(Slabel )
label.delete(Dlabel )
label.delete(Rlabel )
// Generating a profile - Code from @KioseffTrading's "Profile Any Indicator" script (used with their permission)
srcp = profsrc=='Net Longs' ? src : profsrc=='Net Shorts' ? src2 : profsrc=='Net Delta' ? src3 : src4
var int timeArray = array.new_int()
var float dist = array.new_float()
var int x2 = array.new_int(rows + 1, 5)
var vh = matrix.new(1, 1)
array.unshift(timeArray, math.round(time))
if prof and time >= chart.left_visible_bar_time and time <= chart.right_visible_bar_time
matrix.add_col(vh)
matrix.set(vh, 0, matrix.columns(vh) - 1, srcp)
if prof and barstate.islast
= switch ori
"Left" =>
=>
calc = (matrix.max(vh) - matrix.min(vh)) / (rows + 1)
for i = 0 to rows
array.push(dist, matrix.min(vh) + (i * calc))
for i = 1 to matrix.columns(vh) - 1
for x = 0 to array.size(dist) - 1
if matrix.get(vh, 0, i) >= matrix.get(vh, 0, i - 1)
if array.get(dist, x) >= matrix.get(vh, 0, i - 1) and array.get(dist, x) <= matrix.get(vh, 0, i)
array.set(x2, x, array.get(x2, x) + profSize)
else
if array.get(dist, x) >= matrix.get(vh, 0, i) and array.get(dist, x) <= matrix.get(vh, 0, i - 1)
array.set(x2, x, array.get(x2, x) + profSize)
boc = array.new_box()
for i = 1 to rows
right = array.get(timeArray, n + array.get(x2, i))
if ori == "Left"
switch math.sign(n - array.get(x2, i))
-1 => right := chart.right_visible_bar_time
=> right := array.get(timeArray, n - array.get(x2, i))
array.push(boc, box.new(pos, array.get(dist, i - 1),
right, array.get(dist, i), xloc = xloc.bar_time, border_color =
nvancol, bgcolor = nvancol
))
if i == rows
array.push(boc, box.new(pos, array.get(dist, array.size(dist) - 1),
right, array.get(dist, array.size(dist) - 1) + calc, xloc = xloc.bar_time, border_color =
nvancol, bgcolor = nvancol
))
array.shift(x2), nx = array.indexof(x2, array.max(x2))
nz = nx - 1, nz2 = 0, nz3 = 0, nz4 = 0
for i = 0 to array.size(x2) - 1
if nz > -1 and nx <= array.size(x2) - 1
switch array.get(x2, nx) >= array.get(x2, nz)
true => nz2 += array.get(x2, nx), nx += 1
=> nz2 += array.get(x2, nz), nz -= 1
else if nz <= -1
nz2 += array.get(x2, nx), nx += 1
else if nx >= array.size(x2)
nz2 += array.get(x2, nz), nz -= 1
if nz2 >= array.sum(x2) * (vapct / 100)
nz3 := nx <= array.size(x2) - 1 ? nx : array.size(x2) - 1, nz4 := nz <= -1 ? 0 : nz
break
for i = nz3 to nz4
box.set_border_color(array.get(boc, i), vancol)
box.set_bgcolor(array.get(boc, i), vancol)
if poc
var pocL = line(na)
y = math.avg(box.get_top(array.get(boc, array.indexof(x2, array.max(x2)))), box.get_bottom(array.get(boc, array.indexof(x2, array.max(x2)))))
if na(pocL)
pocL := line.new(chart.left_visible_bar_time, y, chart.right_visible_bar_time, y, xloc = xloc.bar_time, color = poccol, width = 1)
else
line.set_xy1(pocL, chart.left_visible_bar_time, y)
line.set_xy2(pocL, chart.right_visible_bar_time, y)
if val
var vaup = line(na), var vadn = line(na)
ydn = box.get_bottom(array.get(boc, nz3)), yup = box.get_top(array.get(boc, nz4))
if na(vaup)
vadn := line.new(chart.left_visible_bar_time, ydn, chart.right_visible_bar_time, ydn, xloc = xloc.bar_time, color = vancol, width = 1)
vaup := line.new(chart.left_visible_bar_time, yup, chart.right_visible_bar_time, yup, xloc = xloc.bar_time, color = vancol, width = 1)
else
line.set_xy1(vadn, chart.left_visible_bar_time, ydn), line.set_xy2(vadn, chart.right_visible_bar_time, ydn)
line.set_xy1(vaup, chart.left_visible_bar_time, yup), line.set_xy2(vaup, chart.right_visible_bar_time, yup)
linefill.new(vadn, vaup, vafill)
//Generating tables for Stats
switchpos(tablepos) =>
switch tablepos
'Top Left' => position.top_left
'Top Center' => position.top_center
'Top Right' => position.top_right
'Bottom Left' => position.bottom_left
'Bottom Center' => position.bottom_center
'Bottom right' => position.bottom_right
dataTable = table.new(switchpos(tablepos), columns=15, rows=15, bgcolor=color.rgb(120, 123, 134, 56))
fill_rows(cond, txt, c, r) =>
if cond
table.cell(table_id=dataTable, column = tablevpos=='Horizontal' ? c : 0, row = tablevpos=='Horizontal' ? 0 : r, text = txt, height=0, text_color=color.white, text_halign=text.align_center, text_valign= text.align_center)
if barstate.islast and stats and dtype!='Position RSI'
txt = ' •𝗢𝗜: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(denom=='Base Currency' ? OI : OI*close, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt2 = ' •𝗡𝗟: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_longs, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt3 = ' •𝗡𝗦: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_shorts, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt4 = ' •𝗡𝗗: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_delta, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt5 = ' •𝗢𝗜𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(denom=='Base Currency' ? OI-OI : (OI-OI ) * close, format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt6 = ' •𝗡𝗟𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_longs - net_longs , format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt7 = ' •𝗡𝗦𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_shorts - net_shorts , format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt8 = ' •𝗡𝗗𝗖: ' + (denom=='Quote Currency' ? '$' : '') + str.tostring(net_delta - net_delta , format = format.volume) + ' ' + (denom=='Base Currency' ? str.tostring(string(syminfo.basecurrency)) : '')
txt9 = ' •𝗢𝗜 𝗥𝗦𝗜: ' + str.tostring(math.round(oi_strength,1))
txt10 = ' •𝗡𝗟 𝗥𝗦𝗜: ' + str.tostring(math.round(longs_strength,1))
txt11 = ' •𝗡𝗦 𝗥𝗦𝗜: ' + str.tostring(math.round(shorts_strength, 1))
txt12 = ' •𝗡𝗗 𝗥𝗦𝗜: ' + str.tostring(math.round(delta_strength, 1))
fill_rows(stat_oi, txt, 0, 0)
fill_rows(stat_nl, txt2, 1, 1)
fill_rows(stat_ns, txt3, 2, 2)
fill_rows(stat_nd, txt4, 3, 3)
fill_rows(stat_oi_c, txt5, 4, 4)
fill_rows(stat_nl_c, txt6, 5, 5)
fill_rows(stat_ns_c, txt7, 6, 6)
fill_rows(stat_nd_c, txt8, 7, 7)
fill_rows(stat_oi_r, txt9, 8, 8)
fill_rows(stat_nl_r, txt10, 9, 9)
fill_rows(stat_ns_r, txt11, 10, 10)
fill_rows(stat_nd_r, txt12, 11, 11)
// Divergence Finder
switchdivsrc(divsrc) =>
switch divsrc
'Net Longs' => src
'Net Shorts' => src2
'Net Delta' => src3
'Net Ratio' => src4
np = switchdivsrc(divsrc)
var priceHigh = array.new_float(0), var priceLow = array.new_float(0)
var priceHighIndex = array.new_int (0), var priceLowIndex = array.new_int (0)
var npHigh = array.new_float(0), var npLow = array.new_float(0)
var npHighIndex = array.new_int (0), var npLowIndex = array.new_int (0)
var priceHighTrend = 0, var priceLowTrend = 0
var npHighTrend = 0, var npLowTrend = 0
bool closeRecentHighs = false, bool closeOldHighs = false
bool closeHighs = false, bool closeRecentLows = false
bool closeOldLows = false, bool closeLows = false
curPriceHigh = ta.pivothigh(close, leftPivot, rightPivot)
curPriceLow = ta.pivotlow (close, leftPivot, rightPivot)
curnpHigh = ta.pivothigh(np, leftPivot, rightPivot)
curnpLow = ta.pivotlow (np, leftPivot, rightPivot)
if not na(curPriceHigh)
array.push(priceHigh, curPriceHigh)
array.push(priceHighIndex, bar_index-rightPivot)
if not na(curPriceLow)
array.push(priceLow, curPriceLow)
array.push(priceLowIndex, bar_index-rightPivot)
if not na(curnpHigh)
array.push(npHigh, curnpHigh)
array.push(npHighIndex, bar_index-rightPivot)
if not na(curnpLow)
array.push(npLow, curnpLow)
array.push(npLowIndex, bar_index-rightPivot)
if showdiv
if array.size(priceHigh) >= 2 and not na(curPriceHigh)
if array.get(priceHigh, array.size(priceHigh)-1) >= array.get(priceHigh, array.size(priceHigh)-2)
priceHighTrend := 1
else
priceHighTrend := -1
if array.size(priceLow) >= 2 and not na(curPriceLow)
if array.get(priceLow, array.size(priceLow)-1) >= array.get(priceLow, array.size(priceLow)-2)
priceLowTrend := 1
else
priceLowTrend := -1
if array.size(npHigh) >= 2 and not na(curnpHigh)
if array.get(npHigh, array.size(npHigh)-1) >= array.get(npHigh, array.size(npHigh)-2)
npHighTrend := 1
else
npHighTrend := -1
if array.size(npLow) >= 2 and not na(curnpLow)
if array.get(npLow, array.size(npLow)-1) >= array.get(npLow, array.size(npLow)-2)
npLowTrend := 1
else
npLowTrend := -1
if array.size(priceHighIndex) >= 2 and array.size(npHighIndex) >=2
closeRecentHighs := math.abs(array.get(priceHighIndex, array.size(priceHighIndex)-1) - array.get(npHighIndex, array.size(npHighIndex)-1)) <= pivotDistance
closeOldHighs := math.abs(array.get(priceHighIndex, array.size(priceHighIndex)-2) - array.get(npHighIndex, array.size(npHighIndex)-2)) <= pivotDistance
closeHighs := closeRecentHighs and closeOldHighs
if array.size(priceLowIndex) >= 2 and array.size(npLowIndex) >=2
closeRecentLows := math.abs(array.get(priceLowIndex, array.size(priceLowIndex)-1) - array.get(npLowIndex, array.size(npLowIndex)-1)) <= pivotDistance
closeOldLows := math.abs(array.get(priceLowIndex, array.size(priceLowIndex)-2) - array.get(npLowIndex, array.size(npLowIndex)-2)) <= pivotDistance
closeLows := closeRecentLows and closeOldLows
bool uptrendExhuastion = closeHighs and priceHighTrend > 0 and npHighTrend < 0 and (not na(curnpHigh) or not na(curPriceHigh))
bool uptrendAbsorption = closeHighs and priceHighTrend < 0 and npHighTrend > 0 and (not na(curnpHigh) or not na(curPriceHigh))
bool downtrendExhuastion = closeLows and priceLowTrend < 0 and npLowTrend > 0 and (not na(curnpLow) or not na(curPriceLow))
bool downtrendAbsorption = closeLows and priceLowTrend > 0 and npLowTrend < 0 and (not na(curnpLow) or not na(curPriceLow))
drawDiv(time1, price1, time2, price2, type) =>
dcol = type == 'Uptrend Exhuastion' ? pHH_npLHcol : type == 'Uptrend Absorption' ? pLH_npHHcol : type == 'Downtrend Exhaustion' ? pLL_npHLcol : type == 'Downtrend Absorption' ? pHL_npLLcol : na
line.new(x1=time1, y1=price1, x2=time2, y2=price2, color=dcol, width=1)
if uptrendAbsorption or uptrendExhuastion and showdiv
highTime1 = array.get(npHighIndex, array.size(npHighIndex)-1)
highPrice1 = array.get(npHigh, array.size(npHigh)-1)
highTime2 = array.get(npHighIndex, array.size(npHighIndex)-2)
highPrice2 = array.get(npHigh, array.size(npHigh)-2)
if uptrendExhuastion and pHH_npLH
drawDiv(highTime1, highPrice1, highTime2, highPrice2, 'Uptrend Exhuastion')
if uptrendAbsorption and pLH_npHH
drawDiv(highTime1, highPrice1, highTime2, highPrice2, 'Uptrend Absorption')
if downtrendAbsorption or downtrendExhuastion and showdiv
lowTime1 = array.get(npLowIndex, array.size(npLowIndex)-1)
lowPrice1 = array.get(npLow, array.size(npLow)-1)
lowTime2 = array.get(npLowIndex, array.size(npLowIndex)-2)
lowPrice2 = array.get(npLow, array.size(npLow)-2)
if downtrendExhuastion and pLL_npHL
drawDiv(lowTime1, lowPrice1, lowTime2, lowPrice2, 'Downtrend Exhuastion')
if downtrendAbsorption and pHL_npLL
drawDiv(lowTime1, lowPrice1, lowTime2, lowPrice2, 'Downtrend Absorption')
HVMTRIGGERS
This uses INTRADAY price action to find triggers where retail traders are trapped and milked for liquidity
Kalman Absorption/Distribution Tracker 3-State EKFQuant-Grade Institutional Flow: 3-State EKF Absorption Tracker
SUMMARY
An advanced, open-source implementation of a 3-State Extended Kalman Filter (EKF) designed to track institutional Order Flow. By analyzing 1-second intrabar microstructure data, this script estimates the true Position, Velocity, and Volatility of the Cumulative Volume Delta (CVD), revealing hidden Absorption and Distribution events in real-time.
INTRODUCTION: THE SIGNAL AMIDST THE NOISE
In the world of technical analysis, noise is the enemy. Traditional indicators rely on Moving Averages (SMA, EMA) to smooth out price and volume data. The problem is the "Lag vs. Noise" paradox: to get a smooth signal, you must accept lag; to get a fast signal, you must accept noise.
This indicator solves that paradox by introducing aerospace-grade mathematics to the TradingView community: The 3-State Extended Kalman Filter (EKF).
Unlike moving averages that blindly average past data, a Kalman Filter is a probabilistic state-space model. It constantly predicts where the order flow "should" be, compares it to the actual measurement, and updates its internal model based on the calculated uncertainty of the market.
This script is not just another volume oscillator. It is a full microstructure analysis engine that digests intrabar data (down to 1-second resolution) to track the true intent of "Smart Money" while filtering out the noise of retail chop.
THE INNOVATION: WHY 3 STATES?
Most Kalman Filters found in public libraries are "1-State" (tracking price only) or occasionally "2-State" (tracking price and velocity). This script introduces a highly advanced 3-State EKF.
The filter tracks three distinct variables simultaneously in a feedback loop:
State 1: Position (The True CVD)
This is the noise-filtered estimate of the Cumulative Volume Delta. It represents the actual inventory accumulation of aggressive buyers versus sellers, stripped of random noise.
State 2: Velocity (The Momentum)
This tracks the rate of change of the order flow. Is buying accelerating? Is selling pressure fading even as price drops? This provides a leading signal before the cumulative value even turns.
State 3: Volatility (The Adaptive Regime)
This is the game-changer. The filter estimates the current volatility of the order flow (Log-Volatility). In high-volatility environments (like news events), the filter automatically widens its uncertainty bands (Covariance) and reacts faster. In low-volatility environments (chop), it tightens up and ignores minor fluctuations.
THE LOGIC: DETECTING ABSORPTION AND DISTRIBUTION
The core philosophy of this indicator is based on Wyckoff Logic: Effort vs. Result.
-- Effort: Represented by the CVD (Buying/Selling pressure).
-- Result: Represented by Price Movement.
When these two diverge, we have an actionable signal. The script uses the EKF Velocity state to detect these moments:
Absorption (Bullish)
This occurs when the EKF detects high negative Velocity (aggressive selling), but Price refuses to drop. The "Smart Money" is absorbing the sell orders via limit buys. The indicator highlights this as a Blue Event in the dashboard.
Distribution (Bearish)
This occurs when the EKF detects high positive Velocity (aggressive buying), but Price refuses to rise. Limit sellers are capping the market. The indicator highlights this as an Orange Event.
TECHNICAL DEEP DIVE: UNDER THE HOOD
For the developers and quants, here is how the Pine Script is architected using the "type" and "method" features of Pine Script v5.
1. Data Ingestion (Microstructure)
The script uses "request.security_lower_tf" to pull intrabar data regardless of your chart timeframe. This allows the script to see "inside" the bar. A 5-minute candle might look green, but the microstructure might reveal that 80% of the volume was selling absorption at the wick. This script sees that.
2. Tick Classification
Standard CVD assumes that if Price Close is greater than Price Open, all volume is buying. This is often flawed. This script offers three modes of tick handling, including a "High-Low Distribution" method that statistically apportions volume based on where the tick closed relative to its high and low.
3. The EKF Mathematics
The script implements the standard Extended Kalman Filter equations manually. It calculates the Jacobian matrix to handle the non-linear relationship between volatility and price. The "Process Noise Matrix" (Q) is dynamically scaled by the Volatility State. This means the mathematics of the indicator literally "breathe" with the market conditions—expanding during expansion and contracting during consolidation.
THE DASHBOARD & VISUALS:
The indicator features a professional-grade HUD (Heads Up Display) located on the chart table.
-- EKF State Vector: Displays the real-time Position, Velocity, and Volatility values derived from the matrix.
-- Ease of Movement (Wyckoff): Calculates how much price moves per 1,000 contracts of CVD. For example, if Price moves +5 points per 1k Buy CVD, but only -2 points per 1k Sell CVD, the "Path of Least Resistance" is clearly UP.
-- Session State: Tracks cumulative confirmed Bullish vs. Bearish events for Today, Yesterday, and the Day Before (3-Day Profile).
-- Bias Summary: An algorithmic conclusion telling you if the day is "Confirmed Bullish," "Accumulating," or "Neutral."
HOW TO TRADE THIS INDICATOR
Strategy A: The Reversal (Absorption Play)
Look for price making a Lower Low.
Look for the EKF Velocity (Histogram) to be Deep Red (High Selling Pressure).
Watch the Dashboard "Absorption" count increase.
SIGNAL: When EKF Velocity crosses back toward zero and turns grey/green, the absorption is complete. This indicates sellers are exhausted and limit buyers have control.
Strategy B: The Trend Continuation (Ease of Movement)
Check the Dashboard "Ease of Movement" section.
If "Price per +1K CVD" is significantly higher than "Price per -1K CVD", buyers are efficient.
Wait for a pullback where EKF Velocity hits the "Neutral Zone" (Gray).
SIGNAL: Enter Long when Velocity ticks positive again, aligning with the dominant Ease of Movement stats.
CONFIGURATION GUIDE:
Because this is a quant-grade tool, the settings allow for fine-tuning the physics of the filter.
-- Velocity Decay: Controls how fast momentum resets to zero. Set high (0.98) for trending markets, or lower (0.85) for mean-reverting chop.
-- Volatility Persistence: Controls how "sticky" volatility regimes are.
-- Process Noise: Increase this if the filter feels too laggy; decrease it if the filter feels too jittery (noisy).
-- Measurement Noise: Increase this to trust the Mathematical Model more than the Price Data (smoother output).
WHY OPEN SOURCE?
Complex statistical filtering is often sold behind closed doors in expensive "Black Box" algorithms. By releasing this 3-State EKF open source, the goal is to raise the standard of development on TradingView.
I encourage the community to inspect the code, specifically the "ekf_update_3state" function, to understand how matrix operations can be simulated in Pine Script to create adaptive, self-correcting indicators. And also update me for improvements.
DISCLAIMER:
This tool analyzes microstructure volume data. It requires a subscription plan that supports Intrabar inspection (Premium/Pro recommended for best results). Past performance of the Kalman Filter logic does not guarantee future results. Volume analysis is subjective and should be used as part of a comprehensive strategy.
SUGGESTED SETTINGS
-- Timeframe: Works best on 1m, 3m, or 5m charts (Intrabar data is fetched from 1S).
-- Asset Class: Highly effective on Futures (ES, NQ, BTC) and high-volume Forex/Crypto pairs where volume data is reliable.
-- Background: Dark mode recommended for Dashboard visibility.
WHAT IS A KALMAN FILTER?
Imagine driving a car into a tunnel where your GPS signal is lost.
Prediction: Your car knows its last speed (Velocity) and position. It predicts where you are every second inside the tunnel.
Update: When you exit the tunnel, the GPS connects again. The system compares where it thought you were versus where the satellite says you are.
Correction: It corrects your position and updates its estimate of your speed.
Now apply this to trading:
-- The Tunnel: Market Noise, wicks, and Fake-outs.
-- The Car: The True Market Trend.
-- This Indicator: The navigation system that tells you where the market actually is, ignoring the noise of the tunnel.
Enjoy the indicator and trade safe!
Dr. Jay Desai
(Investment Management & Derivatives Area, Gujarat University)






















