RSI Divergence (Regular+Hidden) Detector(Mastersinnifty)Description
The RSI Divergence (Regular + Hidden) Detector identifies both regular and hidden divergences between price and the Relative Strength Index (RSI). It automatically marks divergence points on the chart using short-form labels for quick recognition:
RB – Regular Bullish Divergence
RS – Regular Bearish Divergence
HB – Hidden Bullish Divergence
HS – Hidden Bearish Divergence
This tool helps traders spot potential reversals or trend continuation setups with clear, on-chart visual signals.
How It Works
Calculates RSI based on user-selected source and length.
Scans a specified lookback range for matching high/low points in price and RSI.
Validates divergences based on minimum RSI difference and minimum price percentage difference.
Marks detected divergences with short-form labels directly on the price chart.
Allows toggling between regular and hidden divergence detection.
Inputs
RSI Length – Period for RSI calculation.
Lookback Bars – Number of bars to scan for divergence.
Minimum RSI Difference – Minimum required RSI value change between points.
Minimum Price Difference (%) – Minimum required price percentage change between points.
Overbought / Oversold Levels – RSI thresholds for signal validation.
Show Regular Divergences – Enable/disable regular divergence detection.
Show Hidden Divergences – Enable/disable hidden divergence detection.
Use Case
Identify potential reversal points using regular divergences.
Spot possible trend continuation opportunities with hidden divergences.
Enhance entry/exit timing by combining divergence signals with other technical tools.
Apply in any market and timeframe, from scalping to swing trading.
Disclaimer
This indicator is for educational and research purposes only. It does not guarantee future performance. Always combine signals with your own analysis and risk management strategy before making trading decisions.
Indicators and strategies
CoinSidual SR Top3What it does
Plots up to 3 Resistance (red) and 3 Support (green) zones using confirmed swing highs/lows. Nearby levels are clustered by tolerance (bps) to avoid duplicates. Lines extend left/right and auto-update.
Inputs
• Swing Length – pivot lookback/forward
• Lookback Bars – analysis window size
• Cluster Tolerance (bps) – merge distance
• Line Extend Bars – label/line span
• Show R/S Labels – toggle labels
Notes
Works on any symbol/timeframe. No alerts. For educational use only.
BTC Trading Sessions - IndiaA simple script that shows the various BTC sessions in IST.
if you are using a different timezone or in a different country, this may not work.
3-Phase ORB Logic: Break, Retest, ConfirmWhat it is
A state-driven Opening Range framework that sequences Break → Retest → Confirm . It does not just draw ORB lines or tag any breakout; it tracks explicit state transitions with timing and tolerance to filter noise.
How it works (method & originality)
Break: After your ORB window, a valid break requires the prior close to be inside the range and the new close to be outside the ORB high/low (prevents slow drift).
Retest (configurable): Price must revisit the ORB edge within a tolerance band you define by % of the ORB range or a fixed price . Controls include Retest Side (Inside / Outside / Either), Proximity (Touch / Near), Basis (Close / Wick), and optional Cap Outside (limit far-outside closes). Retest must occur within a Max Bars window; same-bar Break→Retest is optional.
Confirm: A later bar must break beyond the max/min of the break + retest reference within Max Bars (or the same bar if enabled). Confirmation can be based on Wick , Close (same-bar only) , or Close (always) for stricter behavior.
Engine details: Per-bar state resets, explicit bar indexing for Break/Retest/Confirm, dual tolerance modes (percent or price), inside/outside/either logic, selectable wick/close handling, optional same-bar paths, and projected ORB lines. This is a sequence-and-tolerance framework, not a simple ORB level plotter.
Inputs
Session: ORB Session window
Tolerance: Mode (Percent or Price) + value
Retest controls: Retest Side (Inside/Outside/Either), Proximity (Touch/Near), Basis (Close/Wick), Cap Outside (on/off)
Timing: Max Bars for Retest, Max Bars for Confirm, Allow same-bar Break→Retest, Allow same-bar Retest→Confirm
Confirmation: Confirm Basis (Wick / Close same-bar only / Close always)
Display: Plot shapes or hide markers; ORB line projection length (bars)
Presets: Classic ORB (Outside • Touch • Close • 20%), Inside Touch (Close • 10%), Either Near (Wick • 15%), or Custom
How to use
Set the ORB session (e.g., 09:30–09:45).
Choose a Preset or use Custom and configure: Tolerance Mode/value, Retest Side/Proximity/Basis, optional Cap Outside.
Set Max Bars for Retest/Confirm and pick Confirm Basis (Wick or Close).
After a Break, wait for a valid Retest within your tolerance window, then a Confirm within the allowed bars.
Act after Confirm (or enable same-bar options if you allow them).
(Optional) Enable alerts for Break / Retest / Confirm; extend ORB lines forward for context.
Marker legend
Triangle = Break , X = Retest , Circle = Confirm (Up = long side, Down = short side.)
When signals reset or expire
Retest timeout: If Retest doesn’t occur within Max Bars , the sequence resets to Break-wait.
Confirm timeout: If Confirm doesn’t occur within Max Bars after Retest, the sequence resets.
Invalidation: With Inside retest, a move too far back inside (beyond tolerance) resets. With Outside retest and Cap Outside ON, a move too far outside (beyond tolerance) resets.
Re-entry into the range during the sequence can reset depending on your side/tolerance settings.
Non-repainting behavior
Logic evaluates bar-by-bar with explicit state resets. For stricter confirmation, select Confirm Basis = Close (always) .
Practical notes
Works on any timeframe. Match Percent tolerance to instrument volatility or use Price for fixed-tick products. Alerts are provided for each phase. The screenshot shows a full Break → Retest → Confirm sequence with only this script applied.
SRT Indicatorthis indicator simply plots the value of SRT below the chart. it is current spot price of nifty divided by its 124 daily SMA. typically one invests when srt is 0.7 to 0.9 and exits when it crosses 1.25. this can be adjusted according to our risk appetite.
Multi-Layer Volume Profile [Mark804]Multi‑Layer Volume Profile — Indicator Overview
An advanced multi-resolution volume analysis tool that stacks historical volume profiles to clearly reveal market structure across different time frames. Designed for traders seeking precision, clarity, and context in volume dynamics.
Key Features
Multi-Layer Volume Profiles
Constructs up to four distinct volume profiles:
Full Period
Half-Length
Quarter-Length
One-Eighth-Length
This layered design enables the identification of confluence zones and traction across multiple horizons.
Custom Bin Resolution
Users can control the number of bins to tailor the profile’s granularity—from fine detail (high bins) to smooth broad strokes (low bins).
Precise POC Highlighting
The Price of Control (PoC)—the price level with the most traded volume—appears as a prominent thick blue line, serving as a key anchor for trading decisions.
Total & Delta Volume Labels
Total Volume: Displayed at the top of each profile, reflecting total traded volume within that period.
Delta Volume: Shown at the bottom, indicating the net difference between bullish and bearish volume—positive suggests buyer strength; negative suggests seller dominance.
Range Boundaries
Each profile features horizontal lines marking the high and low of the period—common zones for price reactions, support, and resistance.
How It Works
For each active profile, the script:
Captures the price range (highs/lows) over the chosen lookback period.
Divides the range into equal-size bins.
Assigns candle volume to bins based on the candle’s close price.
Aggregates total and delta volume for profiling.
It highlights the maximum-volume bin (PoC) and overlays auxiliary elements—like range lines and volume labels—to enhance visual clarity and context.
Suggested Uses
Identify Acceptance Zones
Thick areas within profiles represent price levels where the market finds consensus—ideal for building entries or consolidating positions.
Spot Rejection Zones
Thinner volume regions may signal price rejection—valuable for stop placement or break-in entries.
Delta Confirmation
Use positive or negative delta values at the bottom of the profiles to confirm directional bias when considering breakout setups.
Multi-Timeframe Confluence
Watch for overlapping PoCs across profile layers—these often mark strong support/resistance levels worthy of trading attention.
Summary
The Multi‑Layer Volume Profile equips traders with a nuanced, multi-horizon view of market volume and structure. Its layered profiles, precise PoC markers, volume metrics, and profile range lines make it an invaluable analytical companion—whether scalping intraday moves or mapping macro-level support zones.
ATR-Filtered Breakout/Pullback (3x ETFs)//@version=5
indicator("ATR-Filtered Breakout/Pullback (3x ETFs)", overlay=true)
lenHigh = input.int(20, "Breakout lookback")
lenMA = input.int(20, "Pullback MA")
lenATR = input.int(14, "ATR length")
stopMult= input.float(2.5, "Stop multiplier (TQQQ=2.5, SOXL=3.0)")
hh = ta.highest(high, lenHigh)
ma = ta.sma(close, lenMA)
atr = ta.atr(lenATR)
volOK = atr/close <= 0.06
breakout= ta.crossover(close, hh)
pullback= (low <= ma) and (close > close )
plotshape(breakout and volOK, title="20D Breakout", style=shape.triangleup, location=location.abovebar, size=size.tiny)
plotshape(pullback and volOK, title="20DMA Pullback", style=shape.triangleup, location=location.belowbar, size=size.tiny)
stopDist = atr * stopMult
plot(close - stopDist, title="Stop", linewidth=1, style=plot.style_linebr)
plot(close + 2*stopDist,title="+2R", linewidth=1, style=plot.style_linebr)
Candlestick Suite–(Phoenix) it colors the major Reversal candlesticks
BullEngulf or BearEngulf or Engulfing() -> DARK_ORANGE
PiercingLine or DarkCloudCover -> CYAN
BullishHarami or BearishHarami -> YELLOW
BullishInsideBar or BearishInsideBar -> WHITE
Supply & Demand & Backtest (M5-H4)// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// © RoseZero
//@version=6
indicator('Vung Cung va Cau (M5-H4)', overlay = true)
//===Input===
length1 = input.int(5, 'Swing Loockback', minval = 1)
lengthM5 = input.int(10, title = 'Lookback (M5-M30)')
LengthH1 = input.int(20, title = 'Lookback (H1-H4)')
volMultiplier = input.float(1.5, title = 'Volume Threshold')
zoneHeight = input.float(0.4, title = 'Zone Height (%)')
rsiPeriod = input.int(14, title = 'RSI Period')
rsiOB = input.int(70, title = 'RSI Overbought')
rsiOS = input.int(30, title = 'RSI Oversold')
zoneDuration = input.int(20, title = 'ZOne Duration (bars)')
showEngulfing = input.bool(true, 'Highlight Engulfing Candles')
//boxLookback = input.int(10, title = 'Khoang cach toi da giua 2 liquidity Grab')
//===Auto-adjust by timeframe===
isLowerTF = timeframe.isminutes and timeframe.multiplier <= 30
length = isLowerTF ? lengthM5 : LengthH1
//===Calculation==
avgVol = ta.sma(volume, length)
rsi = ta.rsi(close, rsiPeriod)
highVol = volume > avgVol * volMultiplier
//===Supply Zone Conditions===
isSwingHigh = high == ta.highest(high, length)
bearish = close < open
supplyCond = highVol and isSwingHigh and bearish and rsi > rsiOB
//===Demand Zone Condition===
isSwingLow = low == ta.lowest(low, length)
bullish = close > open
demandCond = highVol and isSwingLow and bullish and rsi < rsiOS
//===Strength Classification===
zoneStrength = volume / avgVol
supplyColor = zoneStrength > 2 ? color.red : color.new(color.red, 60)
demandColor = zoneStrength > 2 ? color.green : color.new(color.green, 60)
supplyLabel = zoneStrength > 2 ? 'Supply(Strong)' : 'Supply(Week)'
demandLabel = zoneStrength > 2 ? 'Demand(Strong)' : 'Demand(Week)'
//===Draw Zone===
if supplyCond
box.new(left = bar_index, right = bar_index + zoneDuration, top = high, bottom = high * (1 - zoneHeight / 100), bgcolor = color.new(supplyColor, 80), border_color = supplyColor, text = supplyLabel, text_color = color.white)
alert('Vung cung moi xuat hien', alert.freq_once_per_bar_close)
if demandCond
box.new(left = bar_index, right = bar_index + zoneDuration, top = low * (1 + zoneHeight / 100), bottom = low, bgcolor = color.new(demandColor, 80), border_color = demandColor, text = demandLabel, text_color = color.white)
alert('Vung cau moi xuat hien', alert.freq_once_per_bar_close)
//===Alert=== alertc
alertcondition(supplyCond, title = 'New Supply Zone', message = 'Vung Cung moi xuat hien!')
alertcondition(demandCond, title = 'New Demand Zone', message = 'Vung Cau moi xuat hien!')
//============================================================================================
//===Khung thoi gian su ly===
timeframe = input.timeframe('30', 'Khung phan tich(vd:\'30\', \'60\')')
//===So nen truoc de do vung OB===
lookback = input.int(10, 'so nen truoc de do oder block')
//===Lay du lieu tu khung thoi gian lon hon===
= request.security(syminfo.tickerid, timeframe, [high , low , open , close ])
src = input.source(close, 'Nguon gia')
//===Logic phat hien OB ===
isBearishOB = closeHTF < openHTF
isBullishOB = closeHTF > openHTF
//===Vung OB===
obHigh = isBearishOB ? highHTF : na
obLow = isBullishOB ? lowHTF : na
//===Canh bao===
touchOB = close >= obLow and close <= obHigh
alertcondition(touchOB, title = 'Cham vung OB', message = 'Gia dang cham vung Smart Money Order Block!')
plotshape(touchOB, location = location.belowbar, color = color.orange, style = shape.triangleup, size = size.small)
if touchOB
alert('Cham vung OB: Gia dang cham vung Smart Money Order Block!', alert.freq_once_per_bar_close)
//===Vung thanh khoan===(Liquidity Sweep Zones)
swingHigh = ta.highest(high, length1)
swingLow = ta.lowest(low, length1)
liquidityHigh = high > swingHigh
liquidityLow = low < swingLow
//==========================================================================================
//===Volume filter===
avgVol2 = ta.sma(volume, 20)
highVol2 = volume > avgVol2 * volMultiplier
//===Candle Pattern===
bullishEngulfing = close > open and close < open and close > open and open < close
bearishEngulfing = close < open and close > open and close < open and open > close
isPinBarBull = close > open and (open - low) > 2 * (close - open)
isPinBarBear = close < open and (high - open) > 2 * (open - close)
isHammer = (high - low) > 3 * (open - close) and (close - low) / (high - low) > 0.6
isHangingMan = (high - low) > 3 * (open - close) and (high - open) / (high - low) > 0.6
isBullMarubozu = close > open and (high - close) < 0.1 * (high -low) and (open -low) < 0.1 * (high - low)
isBearMarubozu = close < open and (high - open) < 0.1 * (high - low) and (close -low) < 0.1 * (high -low)
//===Bien luu vung Cung / Cau da bi pha===
var float lastSupplyTop = na
var float lastSupplyBottom = na
var bool supplyBroken = false
var float lastDemandTop = na
var float lastDemandBottom = na
var bool demandBroken = false
//===Cap nhat vung moi khi co Cung/Cau moi ===
if supplyCond
lastSupplyTop := high
lastSupplyBottom := high * (1 - zoneHeight / 100)
supplyBroken := false
if demandCond
lastDemandBottom := low
lastDemandTop := low * (1 + zoneHeight / 100)
//===Kiem tra pha vo vung Cung/Cau===
if not supplyBroken and close > lastSupplyTop
supplyBroken := true
if not demandBroken and close < lastDemandBottom
demandBroken := true
//===Kiem tra backtest vung da bi pha===
backtestSupply = supplyBroken and close <= lastSupplyTop and close >= lastSupplyBottom
backtestDemand = demandBroken and close >= lastDemandBottom and close <= lastDemandTop
//===Kiem tra thung vung backtest (gia vuot qua vung luon)===
failBacktestSupply = supplyBroken and close < lastSupplyBottom
failBacktestDemand = demandBroken and close > lastDemandTop
//Hien thi canh bao tren bieu do===
plotshape(backtestSupply, title = 'Backtest Supply', location = location.abovebar, color = color.new(color.red, 50), style = shape.circle, size = size.small)
plotshape(backtestDemand, title = 'Backtest Demand', location = location.belowbar, color = color.new(color.green, 60), style = shape.circle, size = size.small)
volStrong = volume > ta.sma(volume, 20) * volMultiplier
validBull = bullishEngulfing and isPinBarBull and isHammer and isBullMarubozu and volStrong and demandCond
validBear = bearishEngulfing and isPinBarBear and isHangingMan and isBearMarubozu and volStrong and supplyCond
if validBull
alert("Tin hieu Buy: Mo hinh nen dao chieu tang + RSI + Volume lon", alert.freq_once_per_bar_close)
if validBear
alert("Tin hieu Sell: Mo hinh nen dao chieu giam + RSI + Volume lon", alert.freq_once_per_bar_close)
//plot(close)
//===============================================================================================
📱 Mobile EMA + V2L5 (edegrano)User Manual: Mobile EMA + V2 (edegrano)
Overview
This TradingView indicator combines EMA bias analysis and multi-timeframe linear regression trendlines with key crossover signals, displayed both on the chart and summarized in a colour-coded table for quick decision-making on mobile devices or desktops.
Inputs
Input Name Description Default
Custom EMA Timeframe Timeframe used to calculate EMA 50, 100, 200 "1" (1m)
Show EMAs on Chart Toggle to plot EMAs (50-blue, 100-black, 200-red) true
Linear Regression Length Period length for linear regression trendlines 20
Show EMA 50 > EMA 200 Bias Show EMA bias row in the table (Bullish/Bearish) true
Show Trendline Slope Bias Show trendline slope bias row in the table true
Price Distance % from Cross Percentage distance used to calculate above/below cross prices in table 2.0
What It Shows
On Chart:
EMA 50 (blue), EMA 100 (black), EMA 200 (red) lines
Vertical lines at EMA 50/200 crossover bars (blue for bullish, red for bearish)
Labels “Bull Cross” or “Bear Cross” on crossover bars
Signal dots (up to 3 consecutive strong buy or sell signals)
Table (bottom-left corner):
Row Description
EMA 50 > EMA 200 Bullish if EMA 50 is above EMA 200, Bearish otherwise (colored green/red text)
Trendline slope Bullish if all 1m, 3m, 5m regression slopes are up, Bearish if all down, Neutral otherwise (green/red/gray text)
Last EMA Cross Price Price where EMA 50 and EMA 200 last crossed (light blue text)
+% Above Cross Price percentage above last EMA cross price (dark orange text)
-% Below Cross Price percentage below last EMA cross price (red text)
Final Suggestion Overall signal: “Strong Buy 💎”, “Strong Sell 💎”, or “Mixed / Neutral” with green/red/gray background
How To Use
Set your preferred timeframe for EMA calculations using the Custom EMA Timeframe input. The default is 1 minute.
Enable or disable EMAs and table rows as you prefer with toggles.
Watch the table for quick bias and trend signals with color-coded text for easy interpretation.
Use the Last EMA Cross Price and the above/below percentage price points to identify key levels for entries, stops, or take profits.
Monitor the chart for EMA crossover vertical lines and labels to confirm signals visually.
Strong Buy or Sell dots indicate good entry opportunities — limited to 3 per consecutive trend.
Tips
Adjust the Price Distance % input to increase/decrease sensitivity of above/below price levels.
Combine this indicator with volume, price action, or other tools for best results.
Use on mobile or desktop with the compact table to stay informed without clutter.
ChainStrike Support and Resistance Power ChannelA TradingView Script Perfectly set up to be used on ANY crypto-currency on the 5 minute time frame.
It is to be used in tandem with Gingie's ChainStrike Program that automatically trades Bitunix Futures. If you would like to access this program, you can join discord.gg
Razor Precision — Buy/SellRazor Precision Stock Action Indicator
The Razor Precision indicator is an advanced, multi-layered market analysis tool designed for traders who demand accuracy and alignment across multiple timeframes. It combines price action, moving average crossovers, volume confirmation, swing structure mapping, and indicator confluence (RSI, MACD, ATR, OBV) to generate actionable buy/sell strength ratings.
Key Features:
Price Action Detection: Identifies higher highs/lows (uptrend) and lower highs/lows (downtrend).
MA Crossover Momentum: Monitors 50/200 moving average crossovers to detect trend shifts.
Volume Surge Analysis: Confirms breakouts or pullbacks with significant volume spikes.
Swing Structure Tracking: Maps internal/external breaks to align with Smart Money Concepts.
Indicator Confluence: Aggregates signals from RSI, MACD, ATR, and OBV for precision confirmation.
Multi-Timeframe Alignment: Compares trends across 15m, 1H, 4H, and Daily charts for stacked or conflicting signals.
Strength Levels: Signals range from SELL, STRONG SELL, ULTRA STRONG SELL to BUY, STRONG BUY, ULTRA STRONG BUY.
Dynamic Table Display: Updates every 5 minutes or when overall action changes, showing per-timeframe analysis and the aggregated decision.
Ideal for swing traders, scalpers, and intraday momentum players who want high-confidence trade direction filtered through multiple technical layers.
Mucip AL BUY indicator/Mucip AL BUY indikatörüThis indicator aims to identify potential market bottoms. It also provides visual support to investors by displaying the percentage profit after each buy signal, based on the highest peak price since that signal. Simple yet effective terms help users identify optimal entry points. Furthermore, not every signal yields accurate results.
Market Regime Matrix [Alpha Extract]A sophisticated market regime classification system that combines multiple technical analysis components into an intelligent scoring framework to identify and track dominant market conditions. Utilizing advanced ADX-based trend detection, EMA directional analysis, volatility assessment, and crash protection protocols, the Market Regime Matrix delivers institutional-grade regime classification with BULL, BEAR, and CHOP states. The system features intelligent scoring with smoothing algorithms, duration filters for stability, and structure-based conviction adjustments to provide traders with clear, actionable market context.
🔶 Multi-Component Regime Engine Integrates five core analytical components: ADX trend strength detection, EMA-200 directional bias, ROC momentum analysis, Bollinger Band volatility measurement, and zig-zag structure verification. Each component contributes to a sophisticated scoring system that evaluates market conditions across multiple dimensions, ensuring comprehensive regime assessment with institutional precision.
// Gate Keeper: ADX determines market type
is_trending = adx_value > adx_trend_threshold
is_ranging = adx_value <= adx_trend_threshold
is_maximum_chop = adx_value <= adx_chop_threshold
// BULL CONDITIONS with Structure Veto
if price_above_ema and di_bullish
if use_structure_filter and isBullStructure
raw_bullScore := 5.0 // MAXIMUM CONVICTION: Strong signals + Bull structure
else if use_structure_filter and not isBullStructure
raw_bullScore := 3.0 // REDUCED: Strong signals but broken structure
🔶 Intelligent Scoring System Employs a dynamic 0-5 scale scoring mechanism for each regime type (BULL/BEAR/CHOP) with adaptive conviction levels. The system automatically adjusts scores based on signal alignment, market structure confirmation, and volatility conditions. Features decision margin requirements to prevent false regime changes and includes maximum conviction thresholds for high-probability setups.
🔶 Advanced Structure Filter Implements zig-zag based market structure analysis using configurable deviation thresholds to identify significant pivot points. The system tracks Higher Highs/Higher Lows (HH/HL) for bullish structure and Lower Lows/Lower Highs (LL/LH) for bearish structure, applying structure veto logic that reduces conviction when price action contradicts the underlying trend framework.
// Define Market Structure (Bull = HH/HL, Bear = LL/LH)
isBullStructure = not na(last_significant_high) and not na(prev_significant_high) and
not na(last_significant_low) and not na(prev_significant_low) and
last_significant_high > prev_significant_high and last_significant_low > prev_significant_low
isBearStructure = not na(last_significant_high) and not na(prev_significant_high) and
not na(last_significant_low) and not na(prev_significant_low) and
last_significant_low < prev_significant_low and last_significant_high < prev_significant_high
🔶 Superior Engine Components Features dual-layer regime stabilization through score smoothing and duration filtering. The score smoothing component reduces noise by averaging raw scores over configurable periods, while the duration filter requires minimum regime persistence before confirming changes. This eliminates whipsaws and ensures regime transitions represent genuine market shifts rather than temporary fluctuations.
🔶 Crash Detection & Active Penalties Incorporates sophisticated crash detection using Rate of Change (ROC) analysis with severity classification. When crash conditions are detected, the system applies active penalties (-5.0) to BULL and CHOP scores while boosting BEAR conviction based on crash severity. This ensures immediate regime response to major market dislocations and drawdown events.
// === CRASH OVERRIDE (Active Penalties) ===
is_crash = roc_value < crash_threshold
if is_crash
// Calculate crash severity
crash_severity = math.abs(roc_value / crash_threshold)
crash_bonus = 4.0 + (crash_severity - 1.0) * 2.0
// ACTIVE PENALTIES: Force bear dominance
raw_bearScore := math.max(raw_bearScore, crash_bonus)
raw_bullScore := -5.0 // ACTIVE PENALTY
raw_chopScore := -5.0 // ACTIVE PENALTY
❓How It Works
🔶 ADX-Based Market Classification The Market Regime Matrix uses ADX (Average Directional Index) as the primary gatekeeper to distinguish between trending and ranging market conditions. When ADX exceeds the trend threshold, the system activates BULL/BEAR regime logic using DI+/DI- crossovers and EMA positioning. When ADX falls below the ranging threshold, CHOP regime logic takes precedence, with maximum conviction assigned during ultra-low ADX periods.
🔶 Dynamic Conviction Scaling Each regime receives conviction ratings from UNCERTAIN to MAXIMUM based on signal alignment and score magnitude. MAXIMUM conviction (5.0 score) requires perfect signal alignment plus favorable market structure. The system progressively reduces conviction when signals conflict or structure breaks, ensuring traders understand the reliability of each regime classification.
🔶 Regime Transition Management Implements decision margin requirements where new regimes must exceed existing regimes by configurable thresholds before transitions occur. Combined with duration filtering, this prevents premature regime changes and maintains stability during consolidation periods. The system tracks both raw regime signals and final regime output for complete transparency.
🔶 Visual Regime Mapping Provides comprehensive visual feedback through colored candle overlays, background regime highlighting, and real-time information tables. The system displays regime history, conviction levels, structure status, and key metrics in an organized dashboard format. Regime changes trigger immediate visual alerts with detailed transition information.
🔶 Performance Optimization Features efficient array management for zig-zag calculations, smart variable updating to prevent recomputation, and configurable debug modes for strategy development. The system maintains optimal performance across all timeframes while providing institutional-grade analytical depth.
Why Choose Market Regime Matrix ?
The Market Regime Matrix represents the evolution of market regime analysis, combining traditional technical indicators with modern algorithmic decision-making frameworks. By integrating multiple analytical dimensions with intelligent scoring, structure verification, and crash protection, it provides traders with institutional-quality market context that adapts to changing conditions. The sophisticated filtering system eliminates noise while preserving responsiveness, making it an essential tool for traders seeking to align their strategies with dominant market regimes and avoid adverse market environments.
✅ Elev8+Overview:
The Elev8+ indicator is a multi-layered trading indicator designed to help traders identify high-probability reversal points and trend-following opportunities. By combining the Classic Elev8+ Reversal Indicator, the DI StdDev Filter, and EMA/BB Trend Fills, this indicator offers a powerful toolset for navigating volatile markets with increased accuracy.
Key Features and Logic:
Classic Elev8+ Reversal Logic:
Liquidity Sweep Signals: The indicator detects liquidity sweeps by identifying price action that breaks previous high/low points with significant volume. This is crucial for identifying strong reversal signals when the market is grabbing liquidity.
ADX Trend Filter: The ADX filter ensures that the indicator only triggers signals during strong trending conditions, reducing false signals in range-bound markets. It requires the DI+ to be greater than ADX and ADX to be above 25, confirming a trend.
Bollinger Band Wick Filter: This filter helps identify price action where wicks penetrate the outer Bollinger Bands (3 to 3.5 standard deviations), indicating a potential reversal after price extremes. This adds an extra layer of confirmation for a reversal.
DI StdDev Filter:
Volatility-Adjusted DI Filtering: The DI StdDev Filter adds a volatility component to the classic ADX strategy. It tracks the DI+ and DI- lines' standard deviation, ensuring that trend strength is not only above the threshold but also confirms significant deviations, marking high-probability trend shifts.
Dynamic Thresholds: The upper and lower thresholds for DI are dynamically adjusted based on standard deviations, enhancing the responsiveness of the indicator in fast-moving markets.
EMA and Bollinger Band Trend Fills:
EMA Trend Fill: The Elev8+ Indicator visually highlights trend direction using fast and slow EMAs. A bullish trend is indicated when the fast EMA is above the slow EMA, and a bearish trend is indicated when the fast EMA is below the slow EMA. The background is filled with a semi-transparent color to easily distinguish trending conditions.
Bollinger Band Zones: The fill between the outer Bollinger Bands is used to highlight extreme price levels. These areas often signal overbought or oversold conditions, which traders can use to confirm reversal signals.
How It Works:
The Elev8+ Indicator intelligently combines trend-following and counter-trend signals. When multiple conditions are met, such as a liquidity sweep in the opposite direction of the trend, a reversal is signaled. Traders will benefit from the following:
Buy Signal: When the conditions for a strong reversal align (liquidity sweep, low volume, and confirmed by DI StdDev or BB wick filters), a buy signal is triggered.
Sell Signal: Similarly, when bearish reversal conditions (liquidity sweep and overbought conditions) align with the DI StdDev or BB wick filters, a sell signal is triggered.
Why It's Unique:
Comprehensive Market Filters: The combination of liquidity sweeps, ADX trend strength, DI StdDev volatility filtering, and Bollinger Bands ensures the indicator provides high-quality, high-probability trade setups.
Dual Reversal and Trend Confirmation: By incorporating both trend-following (EMA fills) and reversal logic (liquidity sweeps, BB filters), this script can adapt to different market conditions, providing both trend continuation and counter-trend signals.
Customizable Inputs: Traders can fine-tune the indicator's behavior by adjusting various parameters such as ADX period, Bollinger Band standard deviation, and DI StdDev thresholds to better fit their trading style and timeframes.
How to Use:
Set Up the Indicator: Apply the Elev8+ Indicator to your chart and enable the Classic Elev8 and/or DI StdDev Filter depending on your trading preferences. You can also adjust the EMA Trend Fill for clearer trend visualization.
Monitor Signals: Pay attention to the buy and sell signals generated by the combination of liquidity sweeps, ADX filters, and volatility adjustments. Confirm trades with the EMA trend fill and Bollinger Band zones.
Adapt to Market Conditions: Customize the sensitivity of the indicator by adjusting the ADX and DI StdDev parameters, as well as the Bollinger Band settings to fit different market environments and volatility.
Chart Explanation:
The indicator includes:
Reversal and trend-following signals: Easily identifiable buy and sell signals represented by small up and down triangles.
EMA Trend Fill: A background color fill that shows the prevailing trend.
Bollinger Band Zones: Shaded areas indicating overbought or oversold conditions.
Adjustable Parameters: Users can toggle features and modify parameters to suit their trading strategy.
50 SMA 5-Candle Crossovercatching the cycle using very simple method. at your descrtion.
must know what you are doing.
this will work if you do not follow bindly.
EZ FX Zones (OR Pro + Auto Alerts) v6.3Purpose:
This indicator automatically calculates and plots ORH (Opening Range High) and ORL (Opening Range Low) based on the first X minutes of trading (customizable), then uses those levels to:
Mark clear Buy and Sell Zones on the chart
Show targets based on ATR (Average True Range) or fixed pip/point settings
Automatically trigger alerts when price crosses important levels so you can enter trades in TopstepFX within your 5-minute execution window
What It Plots on the Chart:
Opening Range High (ORH) – top of the initial range (green line)
Opening Range Low (ORL) – bottom of the initial range (red line)
Midpoint – average of ORH and ORL (dotted white line)
Target Levels – projected profit targets above ORH and below ORL (gray dashed lines)
Labels – “BUY ABOVE” and “SELL BELOW” text for instant clarity
How to Use It (Third Grader Mode):
If price breaks above ORH → BUY.
If price breaks below ORL → SELL.
Your target is the nearest dashed line in the trade direction.
Alerts are sent to your phone when:
Price crosses ORH (BUY alert)
Price crosses ORL (SELL alert)
Price hits target levels
Alerts Included:
"BUY Signal – Price Crossed ORH"
"SELL Signal – Price Crossed ORL"
"Target Hit – Long"
"Target Hit – Short"
Why This Helps in TopstepFX:
No guesswork — you only react to breakouts of the first range.
You can trade with confidence in your 5-minute reaction window because the script does all calculations automatically.
You get push alerts on your phone so you don’t have to stare at charts all day.
Reversal Straategy(RSI & Volume & Support resistance)// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// © RoseZero
//@version=6
indicator('Chien luoc dao chieu manh(RSI + Volume + Ho tro auto)', overlay = true)
//===Tham so nguoi dung===
rsiOversold = input.int(30, 'Nguong RSI qua ban')
rsiOverbought = input.int(70, 'Nguong RSI qua mua')
rsiLow = input.int(35, 'Nguong qua ban')
rsiHigh = input.int(55, 'Nguong qua mua')
volMultiplier = input.float(1.5, 'nguong khoi luong tang (so voi TB)')
mult = input.float(1.5, 'Nguong nhan do lon nen', step = 0.1)
supportLength = input.int(20, 'Do dai vung ho tro')
resistLength = input.int(20, 'Do dai vung khang cu')
length = input.int(20, 'So nen trung binh')
volume_threshold = input.float(1.2, title = 'Nguong volume dao chieu')
fastEMA = input.int(21, title = 'EMA nhanh')
slowEMA = input.int(55, title = 'EMA cham')
depth = input.int(3, title = 'Pivot Depth')
rsiLen = input.int(14, title = 'RSI Length')
//==============================================================================
// === Dấu hiệu Cạn Cung ===
lowVolMultiplier = input.float(0.5, title = 'Ngưỡng khối lượng thấp (Cạn cung)')
lowRangeMultiplier = input.float(0.7, title = 'Ngưỡng biên độ giá thấp (Cạn cung)')
avgVolCC = ta.sma(volume, 20)
avgRangeCC = ta.sma(high - low, 20)
isLowVolume = volume < avgVolCC * lowVolMultiplier
isNarrowRange = (high - low) < avgRangeCC * lowRangeMultiplier
isSideways = math.abs(close - close ) < avgRangeCC * 0.3
supplyDryUp = isLowVolume and isNarrowRange and isSideways
// === Dấu hiệu Cạn Cầu ===
lowVolMultiplier2 = input.float(0.5, title = 'Ngưỡng khối lượng thấp (Cạn cầu)')
lowRangeMultiplier2 = input.float(0.7, title = 'Ngưỡng biên độ giá thấp (Cạn cầu)')
avgVolCD = ta.sma(volume, 20)
avgRangeCD = ta.sma(high - low, 20)
isLowVolumeCD = volume < avgVolCD * lowVolMultiplier2
isNarrowRangeCD = (high - low) < avgRangeCD * lowRangeMultiplier2
isWeakDemand = close <= close or close - close < avgRangeCD * 0.2
demandDryUp = isLowVolumeCD and isNarrowRangeCD and isWeakDemand
//=====================================================================================
ema34 = ta.ema(close, 34)
ema89 = ta.ema(close, 89)
volAvg = ta.sma(volume, 20)
plot(ema34, color = color.green, title = 'EMA 34')
plot(ema89, color = color.orange, title = 'EMA 89')
emaUp = ta.crossover(ema34, ema89)
emaDow = ta.crossunder(ema34, ema89)
alertcondition(emaUp, title = 'EMA34 cat len tren EMA89', message = 'EMA34 cat len tren EMA89 xu huong gia di len')
alertcondition(emaDow, title = 'EMA34 cat xuong duoi EMA89', message = 'EMA34 cat xuong duoi EMA*9 xu huong gia di xuong')
// dieu kien pha len ema va nguoc lai============================================================================================================
breakoutEma = close < ema34 and close < ema89 and close > ema34 and close > ema89
breakdownEma = close > ema34 and close > ema89 and close < ema34 and close < ema89
//dieu kien test lai EMA sau break
retestUpEma = breakoutEma and close < ema34 * 1.02 and close > ema89 * 0.98
retestDownEma = breakdownEma and close > ema34 * 0.98 and close < ema89 * 1.02
//canh bao gia test lai cum ema
alertcondition(retestUpEma, title = 'Canh bao test lai EMA gia tang', message = 'Gia dang test lai cum EMA khi gia tang')
alertcondition(retestDownEma, title = 'Canh bao test lai EMA gia giam', message = 'Gia dang test lai cum EMA khi gia giam')
//Tinh toan co bao Pivot
pivotHigh = ta.pivothigh(high, depth, depth)
pivotLow = ta.pivotlow(low, depth, depth)
ema = ta.ema(close, fastEMA)
ma = ta.sma(close, slowEMA)
rsii = ta.rsi(close, rsiLen)
//Volume Breakout check
volStrong = volume > ta.sma(volume, 20) * volume_threshold
//Mo hinh nen : Pinbar, Engulfing, Doji
isPinBar = math.abs(close - open) / math.abs(high - low) < 0.2
isBullEngulfing = close > open and open < close and close > open
isBearishEngulfing = close < open and open > close and close < open
isDoji = math.abs(close - open) / math.abs(high - low) < 0.1
//Dao chieu tang manh va giam manh
candlePattern = isPinBar or isBullEngulfing or isDoji
candlePattern2 = isPinBar or isBearishEngulfing or isDoji
priceCondition = close > ema and close > ma and rsii < 30 and volStrong
priceCondition2 = close < ema and close < ma and rsii > 70 and volStrong
bullishSignal = not na(pivotLow) and candlePattern and priceCondition and volStrong
if bullishSignal
alert('Dao chieu tang manh: Xuat hien nen dao chieu Tang(PInBar, BullishEngulf, Doji)', alert.freq_once_per_bar_close)
bearishSignal = not na(pivotHigh) and candlePattern2 and priceCondition2 and volStrong
if bearishSignal
alert('Dao chieu giam manh: Xuat hien nen dao chieu Giam(PinBar, BearishEngul, Doji)', alert.freq_once_per_bar_close)
//EMA & Trend
emaFast = ta.ema(close, fastEMA)
emaSlow = ta.ema(close, slowEMA)
plot(emaFast, title = 'EMA nhanh', color = color.blue)
plot(emaSlow, 'EMA cham', color = color.purple)
//===Ho tro tu dong===
supportZone = ta.lowest(low, supportLength)
resistZone = ta.highest(high, resistLength)
nearSupport = math.abs(low - supportZone) < syminfo.mintick * 100
nearResistance = math.abs(high - resistZone) < syminfo.mintick * 100
plot(supportZone, 'Ho tro', color = color.gray)
plot(resistZone, 'Khang cu', color = color.orange)
//===Mo hinh nen dao chieu tang & giam===
//Bullish: Hammer, Engulfing, piercing
body = math.abs(close - open)
avgbody = ta.sma(body, length)
upperWick = high - math.max(open, close)
lowerWick = math.min(open, close) - low
isHammerUp = lowerWick > 2 * body and upperWick < body and close > open
//engulfingUp = close < open and close > open and close > open and open < close
piercingUp = close > open and open < close and close > (open + close ) / 2
bullishCandle = isHammerUp or isBullEngulfing or piercingUp
//Bearish: Inverted Hammer, Bearish Engulfing, Dark cloud Cover
isHammerDow = upperWick > 2 * body and lowerWick < body and close < open
//engulfingDow = close > open and close < open and close < open and open > close
darkCloud = close < open and open > close and close < (open + close ) / 2
bearishCandle = isHammerDow or isBearishEngulfing or darkCloud
//========================================================================
//===Chi bao RSI & Volume===
rsi = ta.rsi(close, 14)
oversold = rsi < rsiOversold
overbought = rsi > rsiOverbought
avgVol = ta.sma(volume, 20)
volumeSpike = volume > avgVol * volMultiplier
rsiLL = rsi < rsiLow
rsiHH = rsi > rsiHigh
// nen rut chan 50%
fibo50=high/2+low/2
Pinbarbullish=close>fibo50 and open>fibo50 and volumeSpike and rsiLL // and close ta.ema(close,89)
plotshape(Pinbarbullish, style = shape.labelup, location = location.belowbar, color = color.green, text = 'L', textcolor = color.white, size = size.tiny)
plotshape(Pinbarbearish, style = shape.labeldown, location = location.abovebar, color = color.red, text = 'S', textcolor = color.white, size = size.tiny)
if Pinbarbullish
alert('Pin Bar dao chieu tang', alert.freq_once_per_bar_close)
if Pinbarbearish
alert('Pin Bar dao chieu giam', alert.freq_once_per_bar_close)
//===dieu kien tin hieu===
buySignal = bullishCandle and oversold and volumeSpike and nearSupport
sellSignal = bearishCandle and overbought and volumeSpike and nearResistance
//Canh bao nag cao
if buySignal
alert('Tin hieu MUA manh:Nen dao chieu tai vung ho tro kem RSI thap & Volume lon(LONG)', alert.freq_once_per_bar_close)
if sellSignal
alert('Tin hieu BAN manh:Nen dao chieu tai vung khang cu kem RSI cao & Volume lon(SHORT)', alert.freq_once_per_bar_close)
//===Hien canh bao===
alertcondition(buySignal, title = 'Tin hieu MUA', message = 'Nen dao chieu TANG tai vung ho tro(RSI thap + Volume lon)')
alertcondition(sellSignal, title = 'Tin hieu BAN', message = 'Nen dao chieu GIAM tai vung ho(RSI cao + Volume lon)')
plotshape(buySignal, style = shape.triangleup, location = location.belowbar, color = color.green, text = 'Long', textcolor = color.white)
plotshape(sellSignal, style = shape.triangledown, location = location.abovebar, color = color.red, text = 'Short', textcolor = color.white)
//Pin Bar ket hop volume lon & RSI qua mua / qua ban
isStrongBullPin = close > open and high - close > 2 * (close - open) and volume > volAvg * volMultiplier and rsi < rsiOversold
isStrongBearPin = open > close and close - low > 2 * (open - close) and volume > volAvg * volMultiplier and rsi > rsiOverbought
plotshape(isStrongBullPin, title = 'Canh bao Pinbar MUA manh', location = location.belowbar, color = color.green, style = shape.labelup, text = "Pb Mua", textcolor = color.white)
plotshape(isStrongBearPin, title = 'Canh bao Pinbar BAN manh', location = location.abovebar, color = color.red, style = shape.labeldown, text = 'Pb Ban', textcolor = color.white)
alertcondition(isStrongBullPin, title = 'Canh bao PinBar MUA manh', message = 'Phat hien PinBar MUA manh(vol cao + RSI qua ban)')
alertcondition(isStrongBearPin, title = 'Canh bao PInBar BAN manh', message = 'Phat hien PinBar BAN manh(vol cao+ RSI qua mua)')
if isStrongBullPin
alert('Pin Bar tin hieu mua:Phat hien PinBar MUA manh(vol cao + RSI qua ban)', alert.freq_once_per_bar_close)
if isStrongBearPin
alert('Pin Bar tin hieu ban:Phat hien PinBar BAN manh(vol cao+ RSI qua mua)', alert.freq_once_per_bar_close)
//================================================================
bool pv2_sv = input.bool (true, title='Plot 2nd order pivots')
bool msb_sv = input.bool (true, title='Plot MSB lines')
bool box_sv = input.bool (true, title='Plot Orderblocks')
bool m_sv = input.bool (true, title='Plot Breakerblocks')
bool range_sv = input.bool (true, title='Plot Range')
bool range_eq_sv = input.bool (true, title='Plot Range 0.5 Line')
bool range_q_sv = input.bool (true, title='Plot Range 0.25 and 0.75 Lines')
bool log_sv = input.bool (true, title='Use Log Scale')
bool msb_a_sv = input.bool (true, title='Alert MSB')
bool ob_a_sv = input.bool (true, title='Alert Orderblock test')
bool bb_a_sv = input.bool (true, title='Alert Breakerblock test')
bool r_a_sv = input.bool (true, title='Alert New Range')
bool rt_a_sv = input.bool (true, title='Alert Range test')
color u_s = input.color (color.new(color.red,90), title='Untested Supply Color')
color t_s = input.color (color.new(color.red,70), title='Tested Supply Color')
color u_d = input.color (color.new(color.green,90), title='Untested Demand Color')
color t_d = input.color (color.new(color.green,70), title='Tested Demand Color')
color u_b = input.color ( color.new(color.blue,90), title='Untested Breaker Color')
color t_b = input.color (color.new(color.blue, 70), title='Tested Breaker Color')
var float pvh1_price = array.new_float (30, na) // high
var int pvh1_time = array.new_int (30, na)
var float pvl1_price = array.new_float (30, na) // low
var int pvl1_time = array.new_int (30, na)
var float pvh2_price = array.new_float (10, na) // higher high
var int pvh2_time = array.new_int (10, na)
var float pvl2_price = array.new_float (10, na) // lower low
var int pvl2_time = array.new_int (10, na)
var float htcmrll_price = na // high that created most recent ll
var int htcmrll_time = na
var float ltcmrhh_price = na // low that created most recent hh
var int ltcmrhh_time = na
var box long_boxes = array.new_box() // orderblocks
var box short_boxes = array.new_box()
var box m_long_boxes = array.new_box() // breakerblocks
var box m_short_boxes = array.new_box()
var line bull_bos_lines = array.new_line() // MSB lines
var line bear_bos_lines = array.new_line()
var line range_h_lines = array.new_line() // Range lines
var line range_25_lines = array.new_line()
var line range_m_lines = array.new_line()
var line range_75_lines = array.new_line()
var line range_l_lines = array.new_line()
var label la_ph2 = array.new_label() // 2nd order pivots
var label la_pl2 = array.new_label()
var float temp_pv_0 = na
var float temp_pv_1 = na
var float temp_pv_2 = na
var int temp_time = na
var float last_range_h = na
var float last_range_l = na
var line range_m = na
var line range_25 = na
var line range_75 = na
var float box_top = na
var float box_bottom = na
var int h_a_time = 0
var int l_a_time = 0
var int mh_a_time = 0
var int ml_a_time = 0
var int rh_a_time = 0
var int rl_a_time = 0
bool pvh = high < high and high > high
bool pvl = low > low and low < low
int pv1_time = bar_index
float pv1_high = high
float pv1_low = low
bool new_ph_2nd = false
bool new_pl_2nd = false
string alert = na
if barstate.isconfirmed
if pvh
array.pop(pvh1_price)
array.pop(pvh1_time)
array.unshift(pvh1_price, pv1_high)
array.unshift(pvh1_time, pv1_time)
if array.size(pvh1_price) > 2
temp_pv_0 := array.get(pvh1_price, 0)
temp_pv_1 := array.get(pvh1_price, 1)
temp_pv_2 := array.get(pvh1_price, 2)
if temp_pv_0 < temp_pv_1 and temp_pv_1 > temp_pv_2
array.pop(pvh2_price)
array.pop(pvh2_time)
array.unshift(pvh2_price, temp_pv_1)
array.unshift(pvh2_time, array.get(pvh1_time, 1))
new_ph_2nd := true
if temp_pv_1 > array.get(pvh2_price, 1)
for i = 0 to array.size(pvl2_time) - 1 by 1
temp_ltcmrhh_time = array.get(pvl2_time, i)
if temp_ltcmrhh_time < array.get(pvh2_time, 0)
ltcmrhh_price := array.get(pvl2_price, i)
ltcmrhh_time := temp_ltcmrhh_time
break
if temp_pv_0 < ltcmrhh_price
if msb_sv
array.push(bear_bos_lines, line.new(x1=ltcmrhh_time, y1=ltcmrhh_price, x2=bar_index, y2=ltcmrhh_price, color=color.rgb(11, 238, 18), width=3))
box_top := array.get(pvh2_price, 0)
box_bottom := math.max(low , low )
array.push(short_boxes, box.new(left=array.get(pvh2_time, 0), top=box_top, right=bar_index, bottom=box_bottom, bgcolor= box_sv ? u_s : na ,border_color=na, extend=extend.right))
if msb_a_sv
alert := alert + 'Bearish MSB @ ' + str.tostring(ltcmrhh_price) + ' ' + 'New Supply Zone : '+ str.tostring(box_top) + ' - ' + str.tostring(box_bottom) + ' '
ltcmrhh_price := na
if pvl
array.pop(pvl1_price)
array.pop(pvl1_time)
array.unshift(pvl1_price, pv1_low)
array.unshift(pvl1_time, pv1_time)
if array.size(pvl1_price) > 2
temp_pv_0 := array.get(pvl1_price, 0)
temp_pv_1 := array.get(pvl1_price, 1)
temp_pv_2 := array.get(pvl1_price, 2)
if temp_pv_0 > temp_pv_1 and temp_pv_1 < temp_pv_2
array.pop(pvl2_price)
array.pop(pvl2_time)
array.unshift(pvl2_price, temp_pv_1)
array.unshift(pvl2_time, array.get(pvl1_time, 1))
new_pl_2nd := true
if temp_pv_1 < array.get(pvl2_price, 1)
for i = 0 to array.size(pvh2_time) - 1 by 1
temp_htcmrll_time = array.get(pvh2_time, i)
if temp_htcmrll_time < array.get(pvl2_time, 0)
htcmrll_price := array.get(pvh2_price, i)
htcmrll_time := temp_htcmrll_time
break
if temp_pv_0 > htcmrll_price
if msb_sv
array.push(bull_bos_lines, line.new(x1=htcmrll_time, y1=htcmrll_price, x2=bar_index, y2=htcmrll_price, color=color.rgb(236, 5, 5), width=3))
box_top := math.min(high , high )
box_bottom := array.get(pvl2_price, 0)
array.push(long_boxes, box.new(left=array.get(pvl2_time, 0), top=box_top, right=bar_index, bottom=box_bottom, bgcolor= box_sv ? u_d : na, border_color=na, extend=extend.right))
if msb_a_sv
alert := alert + 'Bullish MSB @ ' + str.tostring(htcmrll_price) + ' ' + 'New Demand Zone : '+ str.tostring(box_bottom) + ' - ' + str.tostring(box_top) + ' '
htcmrll_price := na
if array.size(short_boxes) > 0
for i = array.size(short_boxes) - 1 to 0 by 1
tbox = array.get(short_boxes, i)
top = box.get_top(tbox)
bottom = box.get_bottom(tbox)
ago = box.get_left(tbox)
if array.get(pvh1_price, 0) > bottom
if box_sv
box.set_bgcolor(tbox, t_s)
if ob_a_sv and close < bottom
if array.get(pvh1_time, 0) != h_a_time
h_a_time := array.get(pvh1_time, 0)
alert := alert + 'Supply Zone Test @ ' + str.tostring(array.get(pvh1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvl1_price, 0) > top
if m_sv
box.set_bgcolor(tbox, u_b)
array.push(m_long_boxes, tbox)
else
box.delete(tbox)
array.remove(short_boxes, i)
if msb_sv
line.delete(array.get(bear_bos_lines, i))
array.remove(bear_bos_lines, i)
if array.size(long_boxes) > 0
for i = array.size(long_boxes) - 1 to 0 by 1
lbox = array.get(long_boxes, i)
top = box.get_top(lbox)
bottom = box.get_bottom(lbox)
ago = box.get_left(lbox)
if array.get(pvl1_price, 0) < top
if box_sv
box.set_bgcolor(lbox, t_d)
if ob_a_sv and close > top
if array.get(pvl1_time, 0) != l_a_time
l_a_time := array.get(pvl1_time, 0)
alert := alert + 'Demand Zone Test @ ' + str.tostring(array.get(pvl1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvh1_price, 0) < bottom
if m_sv
box.set_bgcolor(lbox, u_b)
array.push(m_short_boxes, lbox)
else
box.delete(lbox)
array.remove(long_boxes, i)
if msb_sv
line.delete(array.get(bull_bos_lines, i))
array.remove(bull_bos_lines, i)
if array.size(m_short_boxes) > 0
for i = array.size(m_short_boxes) - 1 to 0 by 1
tbox = array.get(m_short_boxes, i)
top = box.get_top(tbox)
bottom = box.get_bottom(tbox)
ago = box.get_left(tbox)
if array.get(pvh1_price, 0) > bottom
box.set_bgcolor(tbox, t_b)
if bb_a_sv and close < bottom
if array.get(pvh1_time, 0) != mh_a_time
mh_a_time := array.get(pvh1_time, 0)
alert := alert + 'Breakerblock Test Up @ ' + str.tostring(array.get(pvh1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvl1_price, 0) > top
box.delete(tbox)
array.remove(m_short_boxes, i)
if array.size(m_long_boxes) > 0
for i = array.size(m_long_boxes) - 1 to 0 by 1
lbox = array.get(m_long_boxes, i)
top = box.get_top(lbox)
bottom = box.get_bottom(lbox)
ago = box.get_left(lbox)
if array.get(pvl1_price, 0) < top
box.set_bgcolor(lbox, t_b)
if bb_a_sv and close > top
if array.get(pvl1_time, 0) != ml_a_time
ml_a_time := array.get(pvl1_time, 0)
alert := alert + 'Breakerblock Test Down @ ' + str.tostring(array.get(pvl1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvh1_price, 0) < bottom
box.delete(lbox)
array.remove(m_long_boxes, i)
if range_sv and (new_ph_2nd or new_pl_2nd) and (array.get(pvh2_price, 0) < array.get(pvh2_price, 1) and array.get(pvl2_price, 0) > array.get(pvl2_price, 1) and array.get(pvh2_price, 0) > array.get(pvl2_price, 1) and array.get(pvl2_price, 0) < array.get(pvh2_price, 1)) and (array.get(pvl2_price, 1) > nz(last_range_h) or na(last_range_l)? true : (array.get(pvh2_price, 1) < last_range_l))
temp_time := math.min(array.get(pvh2_time, 1), array.get(pvl2_time, 1))
last_range_h := array.get(pvh2_price, 1)
last_range_l := array.get(pvl2_price, 1)
temp_pv_0 := log_sv ? math.exp((math.log(last_range_h) + math.log(last_range_l))/2) : (last_range_h + last_range_l)/2
temp_pv_1 := log_sv ? math.exp((math.log(last_range_h) + math.log(temp_pv_0))/2) : (last_range_h + temp_pv_0)/2
temp_pv_2 := log_sv ? math.exp((math.log(last_range_l) + math.log(temp_pv_0))/2) : (last_range_l + temp_pv_0)/2
array.push(range_h_lines, line.new(x1=temp_time, y1=last_range_h, x2=bar_index, y2=last_range_h, color= color.white, width=2, extend=extend.right))
array.push(range_l_lines, line.new(x1=temp_time, y1=last_range_l, x2=bar_index, y2=last_range_l, color= color.white, width=2, extend=extend.right))
if range_eq_sv
array.push(range_m_lines, line.new(x1=temp_time, y1=temp_pv_0, x2=bar_index, y2=temp_pv_0, color= color.rgb(246, 6, 6), width=2, extend=extend.right))
if range_q_sv
array.push(range_25_lines, line.new(x1=temp_time, y1=temp_pv_1, x2=bar_index, y2=temp_pv_1, style=line.style_dashed, color=color.rgb(1, 54, 249), width=2, extend=extend.right))
array.push(range_75_lines, line.new(x1=temp_time, y1=temp_pv_2, x2=bar_index, y2=temp_pv_2, style=line.style_dashed, color=color.rgb(1, 54, 249), width=2, extend=extend.right))
if r_a_sv
alert := alert + 'New Range : ' + str.tostring(last_range_h) + ' - ' + str.tostring(last_range_l) + '. Mean = ' + str.tostring(temp_pv_0) + ' '
if array.size(range_h_lines) > 0
for i = array.size(range_h_lines) - 1 to 0 by 1
range_h = array.get(range_h_lines, i)
top = line.get_y1(range_h)
range_l = array.get(range_l_lines, i)
bottom = line.get_y1(range_l)
temp_time := line.get_x1(range_h)
if array.get(pvh1_price, 0) > top
if rt_a_sv and close < top
if array.get(pvh1_time, 0) != rh_a_time
rh_a_time := array.get(pvh1_time, 0)
alert := alert + 'Range High Test @ ' + str.tostring(array.get(pvh1_price, 0)) + ' '
if array.get(pvl1_price, 0) < bottom
if rt_a_sv and close > bottom
if array.get(pvl1_time, 0) != rl_a_time
rl_a_time := array.get(pvl1_time, 0)
alert := alert + 'Range Low Test @ ' + str.tostring(array.get(pvl1_price, 0)) + ' '
if range_eq_sv
range_m := array.get(range_m_lines, i)
if range_q_sv
range_25 := array.get(range_25_lines, i)
range_75 := array.get(range_75_lines, i)
if array.get(pvh1_price, 0) < bottom or array.get(pvl1_price, 0) > top
line.delete(range_h)
array.remove(range_h_lines, i)
line.delete(range_l)
array.remove(range_l_lines, i)
if range_eq_sv
line.delete(range_m)
array.remove(range_m_lines, i)
if range_q_sv
line.delete(range_25)
array.remove(range_25_lines, i)
line.delete(range_75)
array.remove(range_75_lines, i)
last_range_h := na
last_range_l := na
if pv2_sv
if new_ph_2nd
array.push(la_ph2, label.new(x = array.get(pvh2_time, 0), y = array.get(pvh2_price, 0), xloc = xloc.bar_index, style = label.style_label_down, color = #770000FF, size = size.tiny))
if new_pl_2nd
array.push(la_pl2, label.new(x = array.get(pvl2_time, 0), y = array.get(pvl2_price, 0), xloc = xloc.bar_index, style = label.style_label_up, color = #007700FF, size = size.tiny))
alert := not na(alert) ? (alert + 'Current price = ' + str.tostring(close) + ' ') : na
exec = not na(alert) ? true : false
//if exec==true
//alert(alert, alert.freq_once_per_bar_close)
//xac dinh dieu kien khoi luong lon
// mau cay nen mua
buyCandle = close > open and volumeSpike ? color.rgb(4, 128, 8) : na
// mau cay nen ban
sellCandle = close < open and volumeSpike ? color.rgb(147, 23, 230) : na
// ve nen tuy chinh
plotcandle(open, high, low, close, color = buyCandle, title = "Buy Candle")
plotcandle(open, high, low, close, color = sellCandle, title = "Sell Candle")
//plot(close)
//=== Lọc pin bar intraday ===
isIntraday = timeframe.multiplier >= 15 and timeframe.multiplier <= 60 // M15 đến H1
//isPinBar = math.abs(close - open) / math.abs(high - low) < 0.2
volSpike = volume > ta.sma(volume, 20) * 1.5
//rsi = ta.rsi(close, 14)
rsiExtreme = rsi < 30 or rsi > 70
//nearSupport = math.abs(low - ta.lowest(low, 20)) < syminfo.mintick * 100
//nearResistance = math.abs(high - ta.highest(high, 20)) < syminfo.mintick * 100
validBullPin = isPinBar and close > open and high - close > 2 * (close - open) and volSpike and rsi < 30 and nearSupport and isIntraday
validBearPin = isPinBar and open > close and close - low > 2 * (open - close) and volSpike and rsi > 70 and nearResistance and isIntraday
plotshape(validBullPin, location = location.belowbar, style = shape.labelup, color = color.green, text = "PB M15-H1")
plotshape(validBearPin, location = location.abovebar, style = shape.labeldown, color = color.red, text = "PB M15-H1")
alertcondition(validBullPin, title = "Pin Bar MUA intraday", message = "Phát hiện Pin Bar MUA mạnh (M15-H1)")
if validBullPin
alert("Pin bar MUA intraday : Phát hiện Pin Bar MUA mạnh (M15-H1)", alert.freq_once_per_bar_close)
alertcondition(validBearPin, title = "Pin Bar BÁN intraday", message = "Phát hiện Pin Bar BÁN mạnh (M15-H1)")
if validBearPin
alert("Pin bar BAN Intrday : Phát hiện Pin Bar BÁN mạnh (M15-H1)", alert.freq_once_per_bar_close)
//=======- Dùng H1 để xác định xu hướng, M15 để vào lệnh.
//Nếu pin bar xuất hiện ở H1, bạn có thể chờ xác nhận phá đỉnh/đáy ở M15 để vào lệnh.
//Kết hợp thêm EMA hoặc vùng cung cầu để tăng độ tin cậy
//====================================
trendUp = ema34 > ema89
trendDow = ema34 < ema89
//tin hieu vao lenh
enterLong = validBullPin and close > high and trendUp
enterShort = validBearPin and close < low and trendDow
plotshape(enterLong, location = location.belowbar, style = shape.triangleup, color = color.lime, text = "Long", textcolor = color.white)
plotshape(enterShort, location = location.abovebar, style = shape.triangledown, color = color.fuchsia, text = "Short", textcolor = color.white)
if enterLong
alert("Vao lenh Long: Pin Bar + Pha dinh + EMA xac nhan", alert.freq_once_per_bar_close)
if enterShort
alert("Vao lenh Short: Pin Bar + Pha day + EMA xac nhan", alert.freq_once_per_bar_close)
//==================================================================================
// === Hiển thị tín hiệu Cạn cung ===
//plotshape(supplyDryUp, title = 'Cạn cung', location = location.belowbar, color = color.yellow, style = shape.circle, size = size.small)
alertcondition(supplyDryUp, title = 'Cảnh báo cạn cung', message = 'Phát hiện dấu hiệu cạn cung: khối lượng thấp + giá đi ngang + biên độ hẹp')
// === Kết hợp với tín hiệu mua/bán để tăng độ tin cậy ===
buySignalCC = buySignal and supplyDryUp
sellSignalCC = sellSignal and supplyDryUp
plotshape(buySignalCC, title = 'Mua + Cạn cung', location = location.belowbar, color = color.lime, style = shape.triangleup, text = 'Long CC', textcolor = color.white)
plotshape(sellSignalCC, title = 'Bán + Cạn cung', location = location.abovebar, color = color.fuchsia, style = shape.triangledown, text = 'Short CC', textcolor = color.white)
alertcondition(buySignalCC, title = 'Mua mạnh + Cạn cung', message = 'Tín hiệu MUA mạnh kết hợp dấu hiệu cạn cung')
alertcondition(sellSignalCC, title = 'Bán mạnh + Cạn cung', message = 'Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cung')
if buySignalCC
alert('Mua mạnh + Cạn cung : Tín hiệu MUA mạnh kết hợp dấu hiệu cạn cung', alert.freq_once_per_bar_close)
if sellSignalCC
alert('Bán mạnh + Cạn cung : Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cung', alert.freq_once_per_bar_close)
// === Hiển thị tín hiệu Cạn cầu ===
//plotshape(demandDryUp, title = 'Cạn cầu', location = location.abovebar, color = color.orange, style = shape.circle, size = size.small)
alertcondition(demandDryUp, title = 'Cảnh báo cạn cầu', message = 'Phát hiện dấu hiệu cạn cầu: khối lượng thấp + giá không tăng + biên độ hẹp')
// === Kết hợp với tín hiệu bán để tăng độ tin cậy ===
sellSignalCD = sellSignal and demandDryUp
plotshape(sellSignalCD, title = 'Bán + Cạn cầu', location = location.abovebar, color = color.red, style = shape.triangledown, text = 'Short CCầu', textcolor = color.white)
alertcondition(sellSignalCD, title = 'Bán mạnh + Cạn cầu', message = 'Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cầu')
if sellSignalCD
alert('Bán mạnh + Cạn cầu : Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cầu', alert.freq_once_per_bar_close)
//====================================================
Reversal Strategy (RSI & Volume & Automantic support resistance)// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org
// © RoseZero
//@version=6
indicator('Chien luoc dao chieu manh(RSI + Volume + Ho tro auto)', overlay = true)
//===Tham so nguoi dung===
rsiOversold = input.int(30, 'Nguong RSI qua ban')
rsiOverbought = input.int(70, 'Nguong RSI qua mua')
rsiLow = input.int(35, 'Nguong qua ban')
rsiHigh = input.int(55, 'Nguong qua mua')
volMultiplier = input.float(1.5, 'nguong khoi luong tang (so voi TB)')
mult = input.float(1.5, 'Nguong nhan do lon nen', step = 0.1)
supportLength = input.int(20, 'Do dai vung ho tro')
resistLength = input.int(20, 'Do dai vung khang cu')
length = input.int(20, 'So nen trung binh')
volume_threshold = input.float(1.2, title = 'Nguong volume dao chieu')
fastEMA = input.int(21, title = 'EMA nhanh')
slowEMA = input.int(55, title = 'EMA cham')
depth = input.int(3, title = 'Pivot Depth')
rsiLen = input.int(14, title = 'RSI Length')
//==============================================================================
// === Dấu hiệu Cạn Cung ===
lowVolMultiplier = input.float(0.5, title = 'Ngưỡng khối lượng thấp (Cạn cung)')
lowRangeMultiplier = input.float(0.7, title = 'Ngưỡng biên độ giá thấp (Cạn cung)')
avgVolCC = ta.sma(volume, 20)
avgRangeCC = ta.sma(high - low, 20)
isLowVolume = volume < avgVolCC * lowVolMultiplier
isNarrowRange = (high - low) < avgRangeCC * lowRangeMultiplier
isSideways = math.abs(close - close ) < avgRangeCC * 0.3
supplyDryUp = isLowVolume and isNarrowRange and isSideways
// === Dấu hiệu Cạn Cầu ===
lowVolMultiplier2 = input.float(0.5, title = 'Ngưỡng khối lượng thấp (Cạn cầu)')
lowRangeMultiplier2 = input.float(0.7, title = 'Ngưỡng biên độ giá thấp (Cạn cầu)')
avgVolCD = ta.sma(volume, 20)
avgRangeCD = ta.sma(high - low, 20)
isLowVolumeCD = volume < avgVolCD * lowVolMultiplier2
isNarrowRangeCD = (high - low) < avgRangeCD * lowRangeMultiplier2
isWeakDemand = close <= close or close - close < avgRangeCD * 0.2
demandDryUp = isLowVolumeCD and isNarrowRangeCD and isWeakDemand
//=====================================================================================
ema34 = ta.ema(close, 34)
ema89 = ta.ema(close, 89)
volAvg = ta.sma(volume, 20)
plot(ema34, color = color.green, title = 'EMA 34')
plot(ema89, color = color.orange, title = 'EMA 89')
emaUp = ta.crossover(ema34, ema89)
emaDow = ta.crossunder(ema34, ema89)
alertcondition(emaUp, title = 'EMA34 cat len tren EMA89', message = 'EMA34 cat len tren EMA89 xu huong gia di len')
alertcondition(emaDow, title = 'EMA34 cat xuong duoi EMA89', message = 'EMA34 cat xuong duoi EMA*9 xu huong gia di xuong')
// dieu kien pha len ema va nguoc lai============================================================================================================
breakoutEma = close < ema34 and close < ema89 and close > ema34 and close > ema89
breakdownEma = close > ema34 and close > ema89 and close < ema34 and close < ema89
//dieu kien test lai EMA sau break
retestUpEma = breakoutEma and close < ema34 * 1.02 and close > ema89 * 0.98
retestDownEma = breakdownEma and close > ema34 * 0.98 and close < ema89 * 1.02
//canh bao gia test lai cum ema
alertcondition(retestUpEma, title = 'Canh bao test lai EMA gia tang', message = 'Gia dang test lai cum EMA khi gia tang')
alertcondition(retestDownEma, title = 'Canh bao test lai EMA gia giam', message = 'Gia dang test lai cum EMA khi gia giam')
//Tinh toan co bao Pivot
pivotHigh = ta.pivothigh(high, depth, depth)
pivotLow = ta.pivotlow(low, depth, depth)
ema = ta.ema(close, fastEMA)
ma = ta.sma(close, slowEMA)
rsii = ta.rsi(close, rsiLen)
//Volume Breakout check
volStrong = volume > ta.sma(volume, 20) * volume_threshold
//Mo hinh nen : Pinbar, Engulfing, Doji
isPinBar = math.abs(close - open) / math.abs(high - low) < 0.2
isBullEngulfing = close > open and open < close and close > open
isBearishEngulfing = close < open and open > close and close < open
isDoji = math.abs(close - open) / math.abs(high - low) < 0.1
//Dao chieu tang manh va giam manh
candlePattern = isPinBar or isBullEngulfing or isDoji
candlePattern2 = isPinBar or isBearishEngulfing or isDoji
priceCondition = close > ema and close > ma and rsii < 30 and volStrong
priceCondition2 = close < ema and close < ma and rsii > 70 and volStrong
bullishSignal = not na(pivotLow) and candlePattern and priceCondition and volStrong
if bullishSignal
alert('Dao chieu tang manh: Xuat hien nen dao chieu Tang(PInBar, BullishEngulf, Doji)', alert.freq_once_per_bar_close)
bearishSignal = not na(pivotHigh) and candlePattern2 and priceCondition2 and volStrong
if bearishSignal
alert('Dao chieu giam manh: Xuat hien nen dao chieu Giam(PinBar, BearishEngul, Doji)', alert.freq_once_per_bar_close)
//EMA & Trend
emaFast = ta.ema(close, fastEMA)
emaSlow = ta.ema(close, slowEMA)
plot(emaFast, title = 'EMA nhanh', color = color.blue)
plot(emaSlow, 'EMA cham', color = color.purple)
//===Ho tro tu dong===
supportZone = ta.lowest(low, supportLength)
resistZone = ta.highest(high, resistLength)
nearSupport = math.abs(low - supportZone) < syminfo.mintick * 100
nearResistance = math.abs(high - resistZone) < syminfo.mintick * 100
plot(supportZone, 'Ho tro', color = color.gray)
plot(resistZone, 'Khang cu', color = color.orange)
//===Mo hinh nen dao chieu tang & giam===
//Bullish: Hammer, Engulfing, piercing
body = math.abs(close - open)
avgbody = ta.sma(body, length)
upperWick = high - math.max(open, close)
lowerWick = math.min(open, close) - low
isHammerUp = lowerWick > 2 * body and upperWick < body and close > open
//engulfingUp = close < open and close > open and close > open and open < close
piercingUp = close > open and open < close and close > (open + close ) / 2
bullishCandle = isHammerUp or isBullEngulfing or piercingUp
//Bearish: Inverted Hammer, Bearish Engulfing, Dark cloud Cover
isHammerDow = upperWick > 2 * body and lowerWick < body and close < open
//engulfingDow = close > open and close < open and close < open and open > close
darkCloud = close < open and open > close and close < (open + close ) / 2
bearishCandle = isHammerDow or isBearishEngulfing or darkCloud
//========================================================================
//===Chi bao RSI & Volume===
rsi = ta.rsi(close, 14)
oversold = rsi < rsiOversold
overbought = rsi > rsiOverbought
avgVol = ta.sma(volume, 20)
volumeSpike = volume > avgVol * volMultiplier
rsiLL = rsi < rsiLow
rsiHH = rsi > rsiHigh
// nen rut chan 50%
fibo50=high/2+low/2
Pinbarbullish=close>fibo50 and open>fibo50 and volumeSpike and rsiLL // and close ta.ema(close,89)
plotshape(Pinbarbullish, style = shape.labelup, location = location.belowbar, color = color.green, text = 'L', textcolor = color.white, size = size.tiny)
plotshape(Pinbarbearish, style = shape.labeldown, location = location.abovebar, color = color.red, text = 'S', textcolor = color.white, size = size.tiny)
if Pinbarbullish
alert('Pin Bar dao chieu tang', alert.freq_once_per_bar_close)
if Pinbarbearish
alert('Pin Bar dao chieu giam', alert.freq_once_per_bar_close)
//===dieu kien tin hieu===
buySignal = bullishCandle and oversold and volumeSpike and nearSupport
sellSignal = bearishCandle and overbought and volumeSpike and nearResistance
//Canh bao nag cao
if buySignal
alert('Tin hieu MUA manh:Nen dao chieu tai vung ho tro kem RSI thap & Volume lon(LONG)', alert.freq_once_per_bar_close)
if sellSignal
alert('Tin hieu BAN manh:Nen dao chieu tai vung khang cu kem RSI cao & Volume lon(SHORT)', alert.freq_once_per_bar_close)
//===Hien canh bao===
alertcondition(buySignal, title = 'Tin hieu MUA', message = 'Nen dao chieu TANG tai vung ho tro(RSI thap + Volume lon)')
alertcondition(sellSignal, title = 'Tin hieu BAN', message = 'Nen dao chieu GIAM tai vung ho(RSI cao + Volume lon)')
plotshape(buySignal, style = shape.triangleup, location = location.belowbar, color = color.green, text = 'Long', textcolor = color.white)
plotshape(sellSignal, style = shape.triangledown, location = location.abovebar, color = color.red, text = 'Short', textcolor = color.white)
//Pin Bar ket hop volume lon & RSI qua mua / qua ban
isStrongBullPin = close > open and high - close > 2 * (close - open) and volume > volAvg * volMultiplier and rsi < rsiOversold
isStrongBearPin = open > close and close - low > 2 * (open - close) and volume > volAvg * volMultiplier and rsi > rsiOverbought
plotshape(isStrongBullPin, title = 'Canh bao Pinbar MUA manh', location = location.belowbar, color = color.green, style = shape.labelup, text = "Pb Mua", textcolor = color.white)
plotshape(isStrongBearPin, title = 'Canh bao Pinbar BAN manh', location = location.abovebar, color = color.red, style = shape.labeldown, text = 'Pb Ban', textcolor = color.white)
alertcondition(isStrongBullPin, title = 'Canh bao PinBar MUA manh', message = 'Phat hien PinBar MUA manh(vol cao + RSI qua ban)')
alertcondition(isStrongBearPin, title = 'Canh bao PInBar BAN manh', message = 'Phat hien PinBar BAN manh(vol cao+ RSI qua mua)')
if isStrongBullPin
alert('Pin Bar tin hieu mua:Phat hien PinBar MUA manh(vol cao + RSI qua ban)', alert.freq_once_per_bar_close)
if isStrongBearPin
alert('Pin Bar tin hieu ban:Phat hien PinBar BAN manh(vol cao+ RSI qua mua)', alert.freq_once_per_bar_close)
//================================================================
bool pv2_sv = input.bool (true, title='Plot 2nd order pivots')
bool msb_sv = input.bool (true, title='Plot MSB lines')
bool box_sv = input.bool (true, title='Plot Orderblocks')
bool m_sv = input.bool (true, title='Plot Breakerblocks')
bool range_sv = input.bool (true, title='Plot Range')
bool range_eq_sv = input.bool (true, title='Plot Range 0.5 Line')
bool range_q_sv = input.bool (true, title='Plot Range 0.25 and 0.75 Lines')
bool log_sv = input.bool (true, title='Use Log Scale')
bool msb_a_sv = input.bool (true, title='Alert MSB')
bool ob_a_sv = input.bool (true, title='Alert Orderblock test')
bool bb_a_sv = input.bool (true, title='Alert Breakerblock test')
bool r_a_sv = input.bool (true, title='Alert New Range')
bool rt_a_sv = input.bool (true, title='Alert Range test')
color u_s = input.color (color.new(color.red,90), title='Untested Supply Color')
color t_s = input.color (color.new(color.red,70), title='Tested Supply Color')
color u_d = input.color (color.new(color.green,90), title='Untested Demand Color')
color t_d = input.color (color.new(color.green,70), title='Tested Demand Color')
color u_b = input.color ( color.new(color.blue,90), title='Untested Breaker Color')
color t_b = input.color (color.new(color.blue, 70), title='Tested Breaker Color')
var float pvh1_price = array.new_float (30, na) // high
var int pvh1_time = array.new_int (30, na)
var float pvl1_price = array.new_float (30, na) // low
var int pvl1_time = array.new_int (30, na)
var float pvh2_price = array.new_float (10, na) // higher high
var int pvh2_time = array.new_int (10, na)
var float pvl2_price = array.new_float (10, na) // lower low
var int pvl2_time = array.new_int (10, na)
var float htcmrll_price = na // high that created most recent ll
var int htcmrll_time = na
var float ltcmrhh_price = na // low that created most recent hh
var int ltcmrhh_time = na
var box long_boxes = array.new_box() // orderblocks
var box short_boxes = array.new_box()
var box m_long_boxes = array.new_box() // breakerblocks
var box m_short_boxes = array.new_box()
var line bull_bos_lines = array.new_line() // MSB lines
var line bear_bos_lines = array.new_line()
var line range_h_lines = array.new_line() // Range lines
var line range_25_lines = array.new_line()
var line range_m_lines = array.new_line()
var line range_75_lines = array.new_line()
var line range_l_lines = array.new_line()
var label la_ph2 = array.new_label() // 2nd order pivots
var label la_pl2 = array.new_label()
var float temp_pv_0 = na
var float temp_pv_1 = na
var float temp_pv_2 = na
var int temp_time = na
var float last_range_h = na
var float last_range_l = na
var line range_m = na
var line range_25 = na
var line range_75 = na
var float box_top = na
var float box_bottom = na
var int h_a_time = 0
var int l_a_time = 0
var int mh_a_time = 0
var int ml_a_time = 0
var int rh_a_time = 0
var int rl_a_time = 0
bool pvh = high < high and high > high
bool pvl = low > low and low < low
int pv1_time = bar_index
float pv1_high = high
float pv1_low = low
bool new_ph_2nd = false
bool new_pl_2nd = false
string alert = na
if barstate.isconfirmed
if pvh
array.pop(pvh1_price)
array.pop(pvh1_time)
array.unshift(pvh1_price, pv1_high)
array.unshift(pvh1_time, pv1_time)
if array.size(pvh1_price) > 2
temp_pv_0 := array.get(pvh1_price, 0)
temp_pv_1 := array.get(pvh1_price, 1)
temp_pv_2 := array.get(pvh1_price, 2)
if temp_pv_0 < temp_pv_1 and temp_pv_1 > temp_pv_2
array.pop(pvh2_price)
array.pop(pvh2_time)
array.unshift(pvh2_price, temp_pv_1)
array.unshift(pvh2_time, array.get(pvh1_time, 1))
new_ph_2nd := true
if temp_pv_1 > array.get(pvh2_price, 1)
for i = 0 to array.size(pvl2_time) - 1 by 1
temp_ltcmrhh_time = array.get(pvl2_time, i)
if temp_ltcmrhh_time < array.get(pvh2_time, 0)
ltcmrhh_price := array.get(pvl2_price, i)
ltcmrhh_time := temp_ltcmrhh_time
break
if temp_pv_0 < ltcmrhh_price
if msb_sv
array.push(bear_bos_lines, line.new(x1=ltcmrhh_time, y1=ltcmrhh_price, x2=bar_index, y2=ltcmrhh_price, color=color.rgb(11, 238, 18), width=3))
box_top := array.get(pvh2_price, 0)
box_bottom := math.max(low , low )
array.push(short_boxes, box.new(left=array.get(pvh2_time, 0), top=box_top, right=bar_index, bottom=box_bottom, bgcolor= box_sv ? u_s : na ,border_color=na, extend=extend.right))
if msb_a_sv
alert := alert + 'Bearish MSB @ ' + str.tostring(ltcmrhh_price) + ' ' + 'New Supply Zone : '+ str.tostring(box_top) + ' - ' + str.tostring(box_bottom) + ' '
ltcmrhh_price := na
if pvl
array.pop(pvl1_price)
array.pop(pvl1_time)
array.unshift(pvl1_price, pv1_low)
array.unshift(pvl1_time, pv1_time)
if array.size(pvl1_price) > 2
temp_pv_0 := array.get(pvl1_price, 0)
temp_pv_1 := array.get(pvl1_price, 1)
temp_pv_2 := array.get(pvl1_price, 2)
if temp_pv_0 > temp_pv_1 and temp_pv_1 < temp_pv_2
array.pop(pvl2_price)
array.pop(pvl2_time)
array.unshift(pvl2_price, temp_pv_1)
array.unshift(pvl2_time, array.get(pvl1_time, 1))
new_pl_2nd := true
if temp_pv_1 < array.get(pvl2_price, 1)
for i = 0 to array.size(pvh2_time) - 1 by 1
temp_htcmrll_time = array.get(pvh2_time, i)
if temp_htcmrll_time < array.get(pvl2_time, 0)
htcmrll_price := array.get(pvh2_price, i)
htcmrll_time := temp_htcmrll_time
break
if temp_pv_0 > htcmrll_price
if msb_sv
array.push(bull_bos_lines, line.new(x1=htcmrll_time, y1=htcmrll_price, x2=bar_index, y2=htcmrll_price, color=color.rgb(236, 5, 5), width=3))
box_top := math.min(high , high )
box_bottom := array.get(pvl2_price, 0)
array.push(long_boxes, box.new(left=array.get(pvl2_time, 0), top=box_top, right=bar_index, bottom=box_bottom, bgcolor= box_sv ? u_d : na, border_color=na, extend=extend.right))
if msb_a_sv
alert := alert + 'Bullish MSB @ ' + str.tostring(htcmrll_price) + ' ' + 'New Demand Zone : '+ str.tostring(box_bottom) + ' - ' + str.tostring(box_top) + ' '
htcmrll_price := na
if array.size(short_boxes) > 0
for i = array.size(short_boxes) - 1 to 0 by 1
tbox = array.get(short_boxes, i)
top = box.get_top(tbox)
bottom = box.get_bottom(tbox)
ago = box.get_left(tbox)
if array.get(pvh1_price, 0) > bottom
if box_sv
box.set_bgcolor(tbox, t_s)
if ob_a_sv and close < bottom
if array.get(pvh1_time, 0) != h_a_time
h_a_time := array.get(pvh1_time, 0)
alert := alert + 'Supply Zone Test @ ' + str.tostring(array.get(pvh1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvl1_price, 0) > top
if m_sv
box.set_bgcolor(tbox, u_b)
array.push(m_long_boxes, tbox)
else
box.delete(tbox)
array.remove(short_boxes, i)
if msb_sv
line.delete(array.get(bear_bos_lines, i))
array.remove(bear_bos_lines, i)
if array.size(long_boxes) > 0
for i = array.size(long_boxes) - 1 to 0 by 1
lbox = array.get(long_boxes, i)
top = box.get_top(lbox)
bottom = box.get_bottom(lbox)
ago = box.get_left(lbox)
if array.get(pvl1_price, 0) < top
if box_sv
box.set_bgcolor(lbox, t_d)
if ob_a_sv and close > top
if array.get(pvl1_time, 0) != l_a_time
l_a_time := array.get(pvl1_time, 0)
alert := alert + 'Demand Zone Test @ ' + str.tostring(array.get(pvl1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvh1_price, 0) < bottom
if m_sv
box.set_bgcolor(lbox, u_b)
array.push(m_short_boxes, lbox)
else
box.delete(lbox)
array.remove(long_boxes, i)
if msb_sv
line.delete(array.get(bull_bos_lines, i))
array.remove(bull_bos_lines, i)
if array.size(m_short_boxes) > 0
for i = array.size(m_short_boxes) - 1 to 0 by 1
tbox = array.get(m_short_boxes, i)
top = box.get_top(tbox)
bottom = box.get_bottom(tbox)
ago = box.get_left(tbox)
if array.get(pvh1_price, 0) > bottom
box.set_bgcolor(tbox, t_b)
if bb_a_sv and close < bottom
if array.get(pvh1_time, 0) != mh_a_time
mh_a_time := array.get(pvh1_time, 0)
alert := alert + 'Breakerblock Test Up @ ' + str.tostring(array.get(pvh1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvl1_price, 0) > top
box.delete(tbox)
array.remove(m_short_boxes, i)
if array.size(m_long_boxes) > 0
for i = array.size(m_long_boxes) - 1 to 0 by 1
lbox = array.get(m_long_boxes, i)
top = box.get_top(lbox)
bottom = box.get_bottom(lbox)
ago = box.get_left(lbox)
if array.get(pvl1_price, 0) < top
box.set_bgcolor(lbox, t_b)
if bb_a_sv and close > top
if array.get(pvl1_time, 0) != ml_a_time
ml_a_time := array.get(pvl1_time, 0)
alert := alert + 'Breakerblock Test Down @ ' + str.tostring(array.get(pvl1_price, 0)) + ' (age = ' + str.tostring(bar_index-ago) + ' bars) '
if array.get(pvh1_price, 0) < bottom
box.delete(lbox)
array.remove(m_long_boxes, i)
if range_sv and (new_ph_2nd or new_pl_2nd) and (array.get(pvh2_price, 0) < array.get(pvh2_price, 1) and array.get(pvl2_price, 0) > array.get(pvl2_price, 1) and array.get(pvh2_price, 0) > array.get(pvl2_price, 1) and array.get(pvl2_price, 0) < array.get(pvh2_price, 1)) and (array.get(pvl2_price, 1) > nz(last_range_h) or na(last_range_l)? true : (array.get(pvh2_price, 1) < last_range_l))
temp_time := math.min(array.get(pvh2_time, 1), array.get(pvl2_time, 1))
last_range_h := array.get(pvh2_price, 1)
last_range_l := array.get(pvl2_price, 1)
temp_pv_0 := log_sv ? math.exp((math.log(last_range_h) + math.log(last_range_l))/2) : (last_range_h + last_range_l)/2
temp_pv_1 := log_sv ? math.exp((math.log(last_range_h) + math.log(temp_pv_0))/2) : (last_range_h + temp_pv_0)/2
temp_pv_2 := log_sv ? math.exp((math.log(last_range_l) + math.log(temp_pv_0))/2) : (last_range_l + temp_pv_0)/2
array.push(range_h_lines, line.new(x1=temp_time, y1=last_range_h, x2=bar_index, y2=last_range_h, color= color.white, width=2, extend=extend.right))
array.push(range_l_lines, line.new(x1=temp_time, y1=last_range_l, x2=bar_index, y2=last_range_l, color= color.white, width=2, extend=extend.right))
if range_eq_sv
array.push(range_m_lines, line.new(x1=temp_time, y1=temp_pv_0, x2=bar_index, y2=temp_pv_0, color= color.rgb(246, 6, 6), width=2, extend=extend.right))
if range_q_sv
array.push(range_25_lines, line.new(x1=temp_time, y1=temp_pv_1, x2=bar_index, y2=temp_pv_1, style=line.style_dashed, color=color.rgb(1, 54, 249), width=2, extend=extend.right))
array.push(range_75_lines, line.new(x1=temp_time, y1=temp_pv_2, x2=bar_index, y2=temp_pv_2, style=line.style_dashed, color=color.rgb(1, 54, 249), width=2, extend=extend.right))
if r_a_sv
alert := alert + 'New Range : ' + str.tostring(last_range_h) + ' - ' + str.tostring(last_range_l) + '. Mean = ' + str.tostring(temp_pv_0) + ' '
if array.size(range_h_lines) > 0
for i = array.size(range_h_lines) - 1 to 0 by 1
range_h = array.get(range_h_lines, i)
top = line.get_y1(range_h)
range_l = array.get(range_l_lines, i)
bottom = line.get_y1(range_l)
temp_time := line.get_x1(range_h)
if array.get(pvh1_price, 0) > top
if rt_a_sv and close < top
if array.get(pvh1_time, 0) != rh_a_time
rh_a_time := array.get(pvh1_time, 0)
alert := alert + 'Range High Test @ ' + str.tostring(array.get(pvh1_price, 0)) + ' '
if array.get(pvl1_price, 0) < bottom
if rt_a_sv and close > bottom
if array.get(pvl1_time, 0) != rl_a_time
rl_a_time := array.get(pvl1_time, 0)
alert := alert + 'Range Low Test @ ' + str.tostring(array.get(pvl1_price, 0)) + ' '
if range_eq_sv
range_m := array.get(range_m_lines, i)
if range_q_sv
range_25 := array.get(range_25_lines, i)
range_75 := array.get(range_75_lines, i)
if array.get(pvh1_price, 0) < bottom or array.get(pvl1_price, 0) > top
line.delete(range_h)
array.remove(range_h_lines, i)
line.delete(range_l)
array.remove(range_l_lines, i)
if range_eq_sv
line.delete(range_m)
array.remove(range_m_lines, i)
if range_q_sv
line.delete(range_25)
array.remove(range_25_lines, i)
line.delete(range_75)
array.remove(range_75_lines, i)
last_range_h := na
last_range_l := na
if pv2_sv
if new_ph_2nd
array.push(la_ph2, label.new(x = array.get(pvh2_time, 0), y = array.get(pvh2_price, 0), xloc = xloc.bar_index, style = label.style_label_down, color = #770000FF, size = size.tiny))
if new_pl_2nd
array.push(la_pl2, label.new(x = array.get(pvl2_time, 0), y = array.get(pvl2_price, 0), xloc = xloc.bar_index, style = label.style_label_up, color = #007700FF, size = size.tiny))
alert := not na(alert) ? (alert + 'Current price = ' + str.tostring(close) + ' ') : na
exec = not na(alert) ? true : false
//if exec==true
//alert(alert, alert.freq_once_per_bar_close)
//xac dinh dieu kien khoi luong lon
// mau cay nen mua
buyCandle = close > open and volumeSpike ? color.rgb(4, 128, 8) : na
// mau cay nen ban
sellCandle = close < open and volumeSpike ? color.rgb(147, 23, 230) : na
// ve nen tuy chinh
plotcandle(open, high, low, close, color = buyCandle, title = "Buy Candle")
plotcandle(open, high, low, close, color = sellCandle, title = "Sell Candle")
//plot(close)
//=== Lọc pin bar intraday ===
isIntraday = timeframe.multiplier >= 15 and timeframe.multiplier <= 60 // M15 đến H1
//isPinBar = math.abs(close - open) / math.abs(high - low) < 0.2
volSpike = volume > ta.sma(volume, 20) * 1.5
//rsi = ta.rsi(close, 14)
rsiExtreme = rsi < 30 or rsi > 70
//nearSupport = math.abs(low - ta.lowest(low, 20)) < syminfo.mintick * 100
//nearResistance = math.abs(high - ta.highest(high, 20)) < syminfo.mintick * 100
validBullPin = isPinBar and close > open and high - close > 2 * (close - open) and volSpike and rsi < 30 and nearSupport and isIntraday
validBearPin = isPinBar and open > close and close - low > 2 * (open - close) and volSpike and rsi > 70 and nearResistance and isIntraday
plotshape(validBullPin, location = location.belowbar, style = shape.labelup, color = color.green, text = "PB M15-H1")
plotshape(validBearPin, location = location.abovebar, style = shape.labeldown, color = color.red, text = "PB M15-H1")
alertcondition(validBullPin, title = "Pin Bar MUA intraday", message = "Phát hiện Pin Bar MUA mạnh (M15-H1)")
if validBullPin
alert("Pin bar MUA intraday : Phát hiện Pin Bar MUA mạnh (M15-H1)", alert.freq_once_per_bar_close)
alertcondition(validBearPin, title = "Pin Bar BÁN intraday", message = "Phát hiện Pin Bar BÁN mạnh (M15-H1)")
if validBearPin
alert("Pin bar BAN Intrday : Phát hiện Pin Bar BÁN mạnh (M15-H1)", alert.freq_once_per_bar_close)
//=======- Dùng H1 để xác định xu hướng, M15 để vào lệnh.
//Nếu pin bar xuất hiện ở H1, bạn có thể chờ xác nhận phá đỉnh/đáy ở M15 để vào lệnh.
//Kết hợp thêm EMA hoặc vùng cung cầu để tăng độ tin cậy
//====================================
trendUp = ema34 > ema89
trendDow = ema34 < ema89
//tin hieu vao lenh
enterLong = validBullPin and close > high and trendUp
enterShort = validBearPin and close < low and trendDow
plotshape(enterLong, location = location.belowbar, style = shape.triangleup, color = color.lime, text = "Long", textcolor = color.white)
plotshape(enterShort, location = location.abovebar, style = shape.triangledown, color = color.fuchsia, text = "Short", textcolor = color.white)
if enterLong
alert("Vao lenh Long: Pin Bar + Pha dinh + EMA xac nhan", alert.freq_once_per_bar_close)
if enterShort
alert("Vao lenh Short: Pin Bar + Pha day + EMA xac nhan", alert.freq_once_per_bar_close)
//==================================================================================
// === Hiển thị tín hiệu Cạn cung ===
//plotshape(supplyDryUp, title = 'Cạn cung', location = location.belowbar, color = color.yellow, style = shape.circle, size = size.small)
alertcondition(supplyDryUp, title = 'Cảnh báo cạn cung', message = 'Phát hiện dấu hiệu cạn cung: khối lượng thấp + giá đi ngang + biên độ hẹp')
// === Kết hợp với tín hiệu mua/bán để tăng độ tin cậy ===
buySignalCC = buySignal and supplyDryUp
sellSignalCC = sellSignal and supplyDryUp
plotshape(buySignalCC, title = 'Mua + Cạn cung', location = location.belowbar, color = color.lime, style = shape.triangleup, text = 'Long CC', textcolor = color.white)
plotshape(sellSignalCC, title = 'Bán + Cạn cung', location = location.abovebar, color = color.fuchsia, style = shape.triangledown, text = 'Short CC', textcolor = color.white)
alertcondition(buySignalCC, title = 'Mua mạnh + Cạn cung', message = 'Tín hiệu MUA mạnh kết hợp dấu hiệu cạn cung')
alertcondition(sellSignalCC, title = 'Bán mạnh + Cạn cung', message = 'Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cung')
if buySignalCC
alert('Mua mạnh + Cạn cung : Tín hiệu MUA mạnh kết hợp dấu hiệu cạn cung', alert.freq_once_per_bar_close)
if sellSignalCC
alert('Bán mạnh + Cạn cung : Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cung', alert.freq_once_per_bar_close)
// === Hiển thị tín hiệu Cạn cầu ===
//plotshape(demandDryUp, title = 'Cạn cầu', location = location.abovebar, color = color.orange, style = shape.circle, size = size.small)
alertcondition(demandDryUp, title = 'Cảnh báo cạn cầu', message = 'Phát hiện dấu hiệu cạn cầu: khối lượng thấp + giá không tăng + biên độ hẹp')
// === Kết hợp với tín hiệu bán để tăng độ tin cậy ===
sellSignalCD = sellSignal and demandDryUp
plotshape(sellSignalCD, title = 'Bán + Cạn cầu', location = location.abovebar, color = color.red, style = shape.triangledown, text = 'Short CCầu', textcolor = color.white)
alertcondition(sellSignalCD, title = 'Bán mạnh + Cạn cầu', message = 'Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cầu')
if sellSignalCD
alert('Bán mạnh + Cạn cầu : Tín hiệu BÁN mạnh kết hợp dấu hiệu cạn cầu', alert.freq_once_per_bar_close)
//====================================================
EMA72 com Difusor - Cor Dinâmica e Espessuras Ajustadas17 EMA
72 EMA (with diffuser included, green signals buy, red signals sell)
72 EMA on the weekly chart
Cumulative Volume Delta with EMA PlotCumulative Delta Volume is a key tool for analyzing the relationship between trading volume and price movement, often referred to as Volume Price Action.
In this indicator, an Exponential Moving Average (EMA) is applied to smooth out short-term noise and reduce volatility, making trends easier to identify. Traders can watch for EMA crossovers as confirmation signals for potential trend reversals, as well as buying or selling opportunities.
CVD — segments par session + MA14 — reset hebdoIts a simple CVD with Session, each session have a colors
The CVD start the Monday at 2 am (GMT +2)
I have add the volume for a futur dev
googogallaochoelochogoogogallaochoelocho make sure to try one when you there is one when you mihgt need to use it