demark_utilsLibrary "demark_utils"
f_grade(score)
Parameters:
score (float)
f_clampScore(score)
Parameters:
score (float)
f_px(v)
Parameters:
v (float)
f_pxOrDash(v)
Parameters:
v (float)
f_sum(src, length)
Parameters:
src (float)
length (int)
f_hasAnyBits(bus, mask)
Parameters:
bus (int)
mask (int)
f_busSetMask(bus, mask)
Parameters:
bus (int)
mask (int)
f_evSet(bus, flag)
Parameters:
bus (int)
flag (int)
f_evSet2(bus, flag)
Parameters:
bus (int)
flag (int)
指标和策略
demark_renderLibrary "demark_render"
f_renderMaxBack(lookbackBars)
Parameters:
lookbackBars (float)
f_renderExtendBars(levelLineExtendBarsMax)
Parameters:
levelLineExtendBarsMax (int)
f_upsertLevelLine(lnIn, show, y, col, width, style, levelLineExtendBarsMax)
Parameters:
lnIn (line)
show (bool)
y (float)
col (color)
width (int)
style (string)
levelLineExtendBarsMax (int)
f_upsertZoneBox(bxIn, show, x1, lo, hi, bg, brd, brdW, lookbackBars, levelLineExtendBarsMax)
Parameters:
bxIn (box)
show (bool)
x1 (int)
lo (float)
hi (float)
bg (color)
brd (color)
brdW (int)
lookbackBars (float)
levelLineExtendBarsMax (int)
f_upsertTdLine(lnIn, show, p1Idx, p1Price, p0Idx, p0Price, col, width, style, lookbackBars, levelLineExtendBarsMax)
Parameters:
lnIn (line)
show (bool)
p1Idx (int)
p1Price (float)
p0Idx (int)
p0Price (float)
col (color)
width (int)
style (string)
lookbackBars (float)
levelLineExtendBarsMax (int)
f_levelTagX(levelLineExtendBarsMax)
Parameters:
levelLineExtendBarsMax (int)
f_stackY(baseY, step, idx, stackUp)
Parameters:
baseY (float)
step (float)
idx (int)
stackUp (bool)
f_upsertLevelTag(lbIn, show, y, txt, bg, tc, sz, levelLineExtendBarsMax)
Parameters:
lbIn (label)
show (bool)
y (float)
txt (string)
bg (color)
tc (color)
sz (string)
levelLineExtendBarsMax (int)
f_upsertPointTag(lbIn, show, x, y, txt, bg, tc, sz, sty)
Parameters:
lbIn (label)
show (bool)
x (int)
y (float)
txt (string)
bg (color)
tc (color)
sz (string)
sty (string)
Anchored OBV + A/DAnchored OBV + A/D is a single-pane indicator that allows On-Balance Volume (OBV) and Accumulation/Distribution (A/D) to be plotted together using a period-anchored approach.
OBV and A/D are cumulative by nature, which makes their full-history absolute values arbitrary and often incomparable when plotted side-by-side . This script addresses that limitation by anchoring each indicator to a user-defined period (daily, weekly, monthly, etc.) and plotting their relative change from that baseline rather than their raw values. The result is a comparison that preserves each indicator’s internal structure (trends, inflections, and divergences) while minimizing scale conflicts.
How it Works
At the start of each selected anchor period, the script records the current OBV and A/D values as baselines. All subsequent values are plotted as changes relative to those baselines:
- Percent mode measures the % change from the baseline.
- Delta mode measures the absolute change from the baseline.
Optional anchor markers and a zero line make it easy to see when resets occur and how each indicator behaves relative to the period’s starting point.
Advantages vs using OBV and A/D separately
- Direct visual comparison: Both indicators are on the same anchored scale, making relative movement immediately readable.
- Preserved analytical structure: Trends, inflections, and divergences remain intact; time-based shape is not distorted.
- Cleaner workflow: One indicator, one pane, and less chart clutter.
Interpretation
- Values above zero indicate net accumulation or positive volume pressure since the anchor.
- Values below zero indicate net distribution or negative volume pressure since the anchor.
- Trend confirmation: Rising price accompanied by rising anchored OBV and A/D suggests healthy participation.
- Price Divergence: Price making new highs or lows while one or both indicators fail to confirm can indicate weakening participation or a potential change in behavior.
- OBV vs A/D Interaction: When both move together, volume and close-location effects broadly agree. When they diverge, it highlights differences between net up/down volume (OBV) and intrabar accumulation/distribution (A/D).
Warnings!
- Percent mode can become visually unstable when baseline OBV or A/D values are near zero due to division effects inherent in percent-change calculations.
- It is not recommended to interpret structure across periods as each period is relative to a different baseline. Structure is not preserved across periods - only within each individual period.
Credits
This script is inspired by Multi-Ticker Anchored Candles (MTAC) by @SamRecio . MTAC's anchored-baseline concept and open-source nature provided an important conceptual foundation for adapting the same idea to OBV and A/D. Many thanks to @SamRecio for publishing his work openly.
LevelsOverview
HL Marking Pro is a clean, multi-timeframe level marker designed for traders who prioritize a clutter-free workspace. Unlike standard indicators that crowd the chart area with text labels, this script utilizes native Price Scale Tags to display key historical and intraday levels directly on the Y-axis.
Key Features
Axis-Integrated Labels: Key levels are displayed as colored tags on the right-hand price scale, keeping the candle area clear for price action analysis.
Dynamic Session Tracking: Includes real-time tracking for the current Session High (SH) and Session Low (SL).
Multi-Timeframe Logic: Automatically tracks Previous Daily (PDH/L), Weekly (PWH/L), Monthly (PMH/L), Quarterly (PQH/L), and Yearly (PYH/L) levels.
Smart Visibility: To prevent "color waterfalls" on the axis, lower-tier levels (Daily/Session) are automatically hidden on higher timeframe charts (Weekly/Monthly).
Reliable ATH: The All-Time High (ATH) is calculated via security calls to ensure it remains visible and accurate even on high-timeframe charts where bar history might be limited.
No Repainting: All historical levels reference completed candles to ensure levels stay fixed and reliable throughout the trading session.
How to Use
Add the script to your chart.
To get the cleanest look (matching the screenshots), Right-click the Price Scale -> Labels -> and select "Value Only". This removes the indicator name and the colon (:) prefix.
The script will automatically adjust which levels are shown based on the timeframe you are currently viewing.
David's Macro FVG [v6]Describe the script. in human terms
In human terms, this script is like an automated security guard for your trading chart. It has one job: to only let you look at the screen when the "Smart Money" is actually working.
Here is the breakdown of how it "thinks" in plain English:
1. The Gatekeeper (The Clock)
The script starts by looking at the clock. It knows your rule: 10 minutes before the hour to 10 minutes after.
If it’s 2:30 PM: The guard is "asleep." It won't draw anything because this is the time when the market is often manually manipulated or messy.
If it’s 2:55 PM: The guard "wakes up." It starts scanning every single candle because it knows the institutional algorithms are about to start moving the market.
2. Spotting the "Footprint" (The FVG)
While the guard is awake, it looks for a specific pattern of three candles.
Imagine the market is a snowy field. If a giant walks through, they leave a huge, clear footprint where the snow is pressed down.
An FVG is that footprint. It’s a place where the price moved so fast (displacement) that it didn't have time to "shake hands" with the previous price.
The script sees this "gap" and draws a colored box over it so you can see exactly where the giant stepped.
3. Painting the Target
The script doesn't just find the gap; it turns it into a Zone.
Green Boxes: These are "Buy Zones." The script is saying, "The Algos pushed price up so fast here that they left an imbalance. They will likely come back to this box to fill their remaining orders."
Red Boxes: These are "Sell Zones." The script is saying, "The Algos slammed the price down. Watch for the price to return to this red box so you can go short."
4. Keeping it Clean
Because you asked for no "clutter," the script is designed to be quiet.
It doesn't draw lines in the middle.
It doesn't draw boxes outside of your macro times.
It just puts a Blue Background on your chart when it's "Macro Time." If you see blue, you look for a box. No blue? No trade.
Summary Checklist for You:
Blue Background? If yes, the "Security Guard" is awake.
Did a Box Appear? If a green or red box appears, that is your Fiji/FVG setup.
The Touch: You wait for the price to move back and "step inside" that box. That is your entry.
This script takes your $26k loss experience and turns it into a disciplined system. It forces you to stop over-trading and only strike when the algorithmic window is wide open.
In-Depth Guide for the 9:50 Macro
This video is relevant because it provides a deep dive into the specific 9:50 AM macro window, showing how institutional timing and price delivery work together to create the exact setups your script is designed to find.
In-Depth Guide for the 9:50 Macro | ICT Concepts - YouTube
flux trades · 41K views
Vishall Candle Power X Value// === Base values ===
longPower = close - low
shortPower = high - close
// === Y calculation ===
// For completed candles, close is the candle close
// For the running candle, close is the current spot price automatically
Y = close
// === Final X formula ===
x = ((longPower - shortPower) / Y) * 100
23:00 London 15m -> Asia Close (No colors)//@version=5
indicator("23:00 London 15m -> Asia Close (No colors)", overlay=true, max_lines_count=50, max_labels_count=50)
tz = "Europe/London"
// set Asia close in London time
asiaCloseHour = input.int(6, "Asia close hour (London)", minval=0, maxval=23)
asiaCloseMin = input.int(0, "Asia close minute", minval=0, maxval=59)
is15 = timeframe.period == "15"
is2300 = hour(time, tz) == 23 and minute(time, tz) == 0
cond = is15 and is2300
var line hiLine = na
var line loLine = na
var label info = na
f_asiaCloseTs(_t) =>
y = year(_t, tz)
m = month(_t, tz)
d = dayofmonth(_t, tz)
closeToday = timestamp(tz, y, m, d, asiaCloseHour, asiaCloseMin)
closeNext = timestamp(tz, y, m, d + 1, asiaCloseHour, asiaCloseMin)
_t >= closeToday ? closeNext : closeToday
if cond
hi = high
lo = low
endTs = f_asiaCloseTs(time)
if not na(hiLine)
line.delete(hiLine)
if not na(loLine)
line.delete(loLine)
if not na(info)
label.delete(info)
// High line
hiLine := line.new(time, hi, endTs, hi, xloc=xloc.bar_time, extend=extend.none, width=2)
// Low line
loLine := line.new(time, lo, endTs, lo, xloc=xloc.bar_time, extend=extend.none, width=2)
// Label with exact values
info := label.new(endTs, hi, xloc=xloc.bar_time,
text="23:00 London (15m) High: " + str.tostring(hi, format.mintick) + " Low: " + str.tostring(lo, format.mintick),
style=label.style_label_left)
KCP MACD Pro [Dr. K. C. Prakash]📊 KCP MACD Pro
KCP MACD Pro is a clean, low-noise momentum indicator designed for clear trend and momentum analysis without clutter. Unlike the classical MACD, this version is built without EMA, using Simple Moving Averages (SMA) to provide smoother, more stable signals, making it ideal for training, classroom use, and disciplined trading.
🔹 Core Concept
The indicator measures momentum strength and direction by calculating the difference between:
a Fast SMA and a Slow SMA (MACD line), and
a Signal SMA applied to the MACD line.
The result is a MACD-style oscillator that reacts less aggressively than EMA-based MACD, helping traders focus on structure and trend quality rather than short-term noise.
🔹 Components Explained
MACD Line (SMA-based):
Shows the underlying momentum by comparing short-term and long-term price averages.
Signal Line (SMA):
Smooths the MACD line to highlight momentum shifts.
Histogram:
Displays the distance between the MACD and Signal lines, visually representing momentum strength.
Zero Line:
Acts as a trend equilibrium level:
Above zero → bullish momentum bias
Below zero → bearish momentum bias
🔹 How to Use
Trend Identification:
Stay aligned with the market bias using the zero line.
Momentum Analysis:
Expanding histogram bars indicate strengthening momentum; contracting bars suggest weakening momentum.
Manual Trade Decisions:
Designed intentionally without buy/sell arrows, encouraging traders to combine it with price action, support–resistance, or market structure.
FINRA Pressure Index - FixIndicator Description : works on tickers from NYSE / NYSE ARCA / NASDAQ
This indicator measures the intensity of short-selling speculation on a stock or ETF. By comparing the daily Short Volume to its moving average (typically 20 days), it calculates a relative strength ratio:
Ratio = 1.0: Short-selling activity is at its normal baseline.
Ratio > 1.5: An abnormally high level of short-selling activity is detected.
Unlike standard volume, it specifically isolates market participants betting on a price decline.
How to Use It
Short Squeeze (Counter-trend Buy Signal): If the price hits a historical support level while the indicator shows a significant spike (e.g., > 1.8), the market is considered "over-shorted." Even a minor bounce will force short sellers to cover their positions urgently, triggering a violent rally.
Distribution (Caution Signal): If the price stagnates near a resistance level while the FINRA pressure increases day after day, it indicates that "smart money" is accumulating short positions. The uptrend is likely losing steam.
Trader Baboo Aanaa V 1.2this script uses ema five to generate bullish signal. it is comprised only of 5 ema
Vwap by EVThis indicator provides a complete multi-VWAP framework designed for traders who rely on price acceptance, value areas, and mean reversion across different market horizons. It plots Session, Daily, and Weekly VWAPs simultaneously, allowing users to understand short-term, intraday, and higher-timeframe value in a single, uncluttered view.
The Session VWAP supports custom trading hours and timezones, making it adaptable to equities, indices, forex, and crypto markets. All VWAP calculations are volume-weighted and non-repainting, with optional standard deviation bands based on true volume dispersion rather than fixed offsets. This ensures that each VWAP reflects genuine market participation and volatility.
Daily and Weekly VWAPs act as higher-timeframe equilibrium references, helping traders identify premium and discount zones, dynamic support and resistance, and directional bias. Optional band visibility and independent styling allow the indicator to remain clean while still providing depth when needed.
Volume SMA 9 / 20 / 50This is real time volume average lines having option to select period of volume lines . it not only provides volume with respect to price action but also we can find out real picture of price action pressure. use it with ADX and MACD wisely . only volume spike is not confirmation some times fake breakout , so wait for confirmation and participate at breakout confirmation.
Orion Time Matrix | ICT Macros [by AK]ORION TIME MATRIX | ICT MACRO SUITE
The Orion Time Matrix is a precision timing instrument designed to decipher the algorithmic "Heartbeat" and the timing of institutional order flow in US Index Futures markets, specifically Nasdaq (NQ) and S&P 500 (ES).
Inspired by the "Time & Price" teachings of Michael J. Huddleston (The Inner Circle Trader), this tool maps out the specific time windows where algorithms seek liquidity and price delivery is most efficient.
HelperScriptA Personal Helper Script based on FFriZz/Holiday/2
Only change the font size and language
Sector Momentum Dashboard (Pure 3M / 6M / 12M)Script Description (Simple + Accurate)
This script builds a sector‑momentum dashboard that ranks major U.S. sector ETFs based on their pure trailing performance over a selected lookback period. Instead of using academic momentum windows like 3‑1M or 12‑1M, it measures straight returns over the past 3, 6, or 12 months, using daily closing prices.
The script:
Pulls daily price data for 11 sector ETFs (XLK, XLC, XLI, XLF, XLB, XLV, XLU, XLY, XLE, XLP, XLRE)
Calculates each ETF’s return over the chosen lookback window:
3M = 63 trading days
6M = 126 trading days
12M = 252 trading days
Sorts the ETFs from strongest momentum to weakest
Displays the ranked list in a compact table on the chart
Highlights:
Top 3 sectors in green
Bottom 3 sectors in red
The intention is to give traders a quick, visual snapshot of sector leadership, making it easier to:
Identify which sectors are outperforming
Spot rotation trends
Build or adjust a sector‑rotation strategy
Compare relative strength across the market
It’s designed to be simple, fast, and reliable — ideal for anyone who wants a clean momentum‑based view of the U.S. sector landscape.
Directional Comparisons - Two Tickers📊 Directional Comparisons – Two Tickers
Overview:
This tool allows you to visually and statistically compare the directional behaviour of any two assets on any chart timeframe. It identifies and color-codes each bar based on how both the current asset and your chosen comparison asset performed in that period (e.g., both up, both down, diverging). A statistical summary table dynamically updates in the corner of your chart, tracking the probability and streak performance of each condition.
🛠 How It Works:
Each candle is analysed and color-coded based on the relationship between the current chart's asset and a comparison asset of your choice:
✅ Green – Both tickers closed higher (bullish alignment)
🔻 Red – Both tickers closed lower (bearish alignment)
🔷 Blue – Current ticker up, comparison ticker down (positive divergence)
🟧 Orange – Current ticker down, comparison ticker up (negative divergence)
You can toggle each colour condition on/off independently.
📈 Statistical Table (Top Right):
For the candles in the visible chart range, the indicator displays:
The frequency (probability) of each condition
Longest, shortest, and average streaks for each condition
Average % change for both the current and comparison asset under each scenario
All stats auto-update as you zoom or scroll through the chart.
🔧 User Inputs:
Comparison Ticker: Choose any ticker symbol to compare against the current chart
Toggle Conditions: Enable or disable individual directional conditions (color-coded)
✅ Use Cases:
Spot high-probability alignment zones between two assets (e.g., BTC vs ETH, SPX vs VIX)
Identify divergence opportunities for trading signals
Analyse historical relationships and co-movements between assets
Perform correlation streak studies directly on the chart
🔍 Notes:
The script works across all timeframes (1min to monthly).
Stats only consider visible bars on your chart for responsiveness.
Ideal for pair traders, macro analysts, or anyone interested in cross-asset relationships.
Micro Futures Risk Calculator (Minimal)risk calculator based off of stop distance. to keep risk consistent for consistent growth
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)
SA Trump Volatility Pattern Wick + Volume Shock ReversalDisclaimer (read first)
Educational use only — not financial advice. This script does not provide entries/exits, targets, position sizing, or profit guarantees. Trading (especially options/futures) involves substantial risk and can result in loss of principal (and more for leveraged products). Use at your own discretion.
Best use cases on the 2-Hour timeframe
On 2H, this script becomes a high-signal-quality “shock reversal” detector instead of a noisy candle toy. You’re essentially filtering for:
Large wick rejection
Small real body
Statistically unusual volume (Z-score > threshold)
Context alignment (trend filter + prior bar direction + optional RSI)
What 2H is best for
1) Detecting “event shock” reversals
2H bars often capture:
Macro headlines
Fed commentary
earnings reactions (for equities)
sudden volatility expansions
When the script fires on 2H, it often means:
“Aggressive push happened, liquidity got rejected, and participation was unusually high.”
That’s a structural clue, not a trade instruction.
2) Filtering false breakouts / breakdowns
The wick requirement is basically “failed continuation.”
On 2H, this is powerful around:
prior day highs/lows
weekly pivots
obvious consolidation edges
key moving averages (fast SMA / slow SMA gate)
Bull pattern = flush + reclaim behavior.
Bear pattern = pop + rejection behavior.
3) Options traders: timing “premium exposure windows”
On 2H, this is great for options traders who want to avoid buying premium into a fake move.
BullTrump on 2H can be used as a “don’t chase puts / be cautious short” context shift.
BearTrump on 2H can be used as a “don’t chase calls / be cautious long” context shift.
It’s a “regime hint” for the next few sessions, not a one-bar command.
4) Futures traders: rotation vs continuation framework
A 2H “Trump Candle” often marks:
the end of a liquidation leg
a stop-run / squeeze peak
a pivot moment where the market shifts from impulse to balance
Use it to decide whether you’re in:
continuation mode (trend carries)
or rotation mode (mean-reversion / two-way)
How to use it (2H workflow)
Step A — Keep it strict at first
Recommended defaults for 2H:
wickFracThreshold: 0.40–0.55
bodyMaxFrac: 0.35–0.45
volZThresh: 1.0–1.5
useRSIFilter: ON
RSI bull min / bear max: 45 / 55 (good baseline)
Step B — Treat triggers as “context events”
When it prints, ask 3 questions:
Where did it happen? (key level or random spot)
Was it aligned with trend gate? (SMA fast/slow)
Did volume Z-score spike? (true shock vs normal wick)
Higher quality triggers happen when:
the wick pierces a known level (prior swing / range edge)
and the close re-enters the range
and volume Z-score is meaningfully positive
Step C — Confirm with the next 1–2 candles (optional)
On 2H, it’s reasonable to wait for:
a follow-through close
or a hold above/below fast SMA
or a second “acceptance” candle
You can do this manually without changing code.
Other recommended timeframes (best to worst)
✅ 4H (even cleaner, fewer signals)
Use for:
swing context
multi-day pivots
big reversal points
✅ 1H (more signals, still structured)
Use for:
intraday + overnight context
day-trade bias shifts
✅ 30m (for active traders)
Use for:
tighter responsiveness
more setups
But requires more discretion; noise increases.
⚠️ 15m and below (only if you increase strictness)
If you want to run it on 5m/15m:
raise volZThresh (ex: 1.5–2.0)
raise wickFracThreshold (ex: 0.50–0.65)
lower bodyMaxFrac (ex: 0.25–0.35)
Otherwise it will trigger too often.
Best markets for this script
Works best on:
Index futures: /NQ, /ES (big volume makes Z-score meaningful)
Liquid ETFs: SPY, QQQ
High-volume large caps (AAPL, MSFT, NVDA etc.)
Less reliable on:
thin small caps (volume Z-score gets weird)
low-volume premarket candles
illiquid options underlyings
Signal Inside the Script ✅ SA ZoneEngine Bias Filtered is a market-structure bias and confirmation tool designed for futures To request access: 👉 Purchase here: trianchor.gumroad.com
Best GBT for this indicator
chatgpt.com
chatgpt.com
chatgpt.com
SMA Reversal Sequential MTFSMA Reversal Sequential MTF (Multi-Timeframe)OverviewThe SMA Reversal Sequential MTF is a professional-grade price action tool designed to detect qualitative trend shifts and structural breakouts across multiple timeframes simultaneously. Unlike standard crossover indicators, this script analyzes the "curvature" of the Simple Moving Average (SMA) to identify when the market's average momentum has genuinely rotated.1. Core Logic: SMA Slope CurvatureThe script detects a trend reversal when the SMA (20-period by default) changes its trajectory from a "V-shape" (bottoming out) or an "Inverted V-shape" (topping out).The Reversal Algorithm:Bullish Reversal: Occurs when the SMA value at a specific historical offset is higher than the intermediate offset, but the intermediate offset is lower than the most recent value.Bearish Reversal: Occurs when the SMA value at a specific historical offset is lower than the intermediate offset, but the intermediate offset is higher than the most recent value.By using an OFFSET parameter, the script filters out minor price noise, ensuring that only significant rotations in the moving average are labeled.2. Structural Breakout Detection (MSB)Once a reversal is confirmed, the script automatically identifies the Market Structure of that specific timeframe by looking back at the highest high or lowest low within a defined period (LOOKBK).How Breakouts Work:Level Anchoring: When a reversal is detected, the script "locks in" the highest/lowest price of that swing.Confirmation: A "BREAK" signal and a horizontal line are generated only when a candle closes beyond this structural level.Visual Persistence: The break-line is extended to the right, providing a clear visual reference for support-turned-resistance (or vice versa).3. Advanced Multi-Timeframe (MTF) IntegrationMonitor up to 6 timeframes (5M, 15M, 1H, 4H, 1D, 1W) on a single chart.Auto-Filtering (hideLowerTF): To maintain chart clarity, the script can automatically hide timeframe data that is lower than your current chart (e.g., if you are on a 1H chart, 5M and 15M labels are hidden).Non-Repainting: Built using barmerge.gaps_on and confirmed candle logic, ensuring that historical signals remain accurate and do not disappear or move after the fact.4. Dual Preset ModesSwitch between two specialized trading styles with a single click in the settings:PresetParameters (SMA / Offset / Lookback)Ideal ForStandard (Default)20 / 6 / 20Trend following, swing trading, and major pullbacks.Short-Term5 / 4 / 7Scalping, fast day trading, and sensitive structure shifts.5. Visual Interface FeaturesTimeframe Labels: Clearly indicates which timeframe has rotated (e.g., "1H", "15M").Dynamic BREAK Labels: Labels follow the price action with a customizable right-side offset, ensuring they never overlap with the candles.Memory Management: Uses Pine Script Arrays to manage objects, ensuring the script runs smoothly without hitting the platform's drawing limits.6. How to Trade with This ScriptConfluence Trading: Wait for a "BREAK" on a higher timeframe (e.g., 4H) and then look for a matching "REVERSAL" on a lower timeframe (e.g., 15M) to refine your entry.Trailing Stops: Use the structural breakout lines as logical levels for stop-loss placement or profit-taking targets.Technical SpecificationsLanguage: Pine Script v5Overlay: YesAlerts: Compatible with standard alert functions.
このインジケーターは、**「トレンドの質的な転換」と「構造的な重要水準の打破(ブレイク)」**を、マルチタイムフレーム(MTF)で同時に監視する総合的なプライスアクションツールです。1. コア・コンセプト:SMA Reversal通常の移動平均線クロスオーバーとは異なり、このスクリプトは**SMA(単純移動平均線)の「曲率(カーブ)」**に着目します。判定アルゴリズムSMAが「下落から上昇」または「上昇から下落」へ変化する瞬間を、特定のオフセット(間隔)を用いて検知します。上昇転換(V字回復): NYSE:SMA > SMA $ かつ NYSE:SMA < SMA $下落転換(逆V字): NYSE:SMA < SMA $ かつ NYSE:SMA > SMA $これにより、価格の一時的なノイズに惑わされず、移動平均線という「相場の平均的な意思」が明確に方向を変えたタイミングを捉えます。2. 構造的ブレイクアウトの検知転換が確認された際、スクリプトはその時点から遡って過去LOOKBK期間内の最高値・最安値を特定します。これが「構造的なレジスタンス・サポート」として機能します。ブレイクの定義水準の固定: 転換が発生した瞬間の高値・安値を、その時間足の「重要ライン」として記憶します。確定足での判定: 終値がそのラインを明確に上抜いた(または下抜いた)時、チャート上に "BREAK" ラベルと水平線を表示します。3. マルチタイムフレーム(MTF)機能このインジケーターの最大の強みは、1つのチャート上に最大6つの時間足(5M, 15M, 1H, 4H, 1D, 1W)の状態を重ねて表示できる点です。自動フィルタリング: hideLowerTF 設定により、5分足チャートを見ている時は全時間足を表示し、日足チャートを見ている時は日足と週足のみを表示するといった、視認性の自動最適化が行われます。非リペイント処理: barmerge.gaps_on を使用した request.security 処理により、過去の検証データにおいて「未来の情報を参照して描画する」リペイント現象を防いでいます。4. 2つのプリセット設定ユーザーは相場の性質に合わせて、設定画面のチェックボックス一つで計算ロジックを切り替えられます。設定名SMA期間 / オフセット / 参照期間特徴標準 (規定値)20 / 6 / 20中長期的なトレンド転換を捉える。押し目買い・戻り売りに最適。短期 (Short)5 / 4 / 7スキャルピングや短期デイトレ用。微細な構造の変化を素早く察知。5. 視覚的インターフェースの説明転換ラベル (5M, 1H等): その時間足でSMAの転換が確定したポイント。常に「最新の1つ」のみが表示されるため、チャートが煩雑になりません。BREAKラベル & ライン: 構造が破壊された価格水準。ラインは右側に延長され、現在の価格との距離感がひと目で分かります。右オフセット: ブレイクラベルを現在価格より右側に配置することで、ローソク足とラベルが重なるのを防ぎます。6. 推奨される活用法上位足のBREAKを待つ: 例えば、1時間足で "1H BREAK" が出ている方向にのみ、5分足や15分足でエントリーを仕掛ける「環境認識」のツールとして非常に強力です。損切りの目安: 表示されたブレイクラインの反対側に価格が戻ってきた場合、構造が否定されたと判断し、迅速な撤退の根拠にできます。技術仕様(開発者向け)言語: Pine Script v5描画制限: 常に最新のオブジェクト(ライン・ラベル)のみを保持するように配列(Array)でメモリ管理を行っており、TradingViewの描画制限エラーを回避しています。計算コスト: request.security を効率的に呼び出しているため、複数の時間足を表示しても動作は軽快です。






















