SMART MONEY SMT+BOS+ENTRYThis advanced trading indicator combines Smart Money Theory (SMT) and Break of Structure (BOS) analysis with synchronized multi-asset monitoring. The core concept identifies institutional activity by detecting discrepancies between correlated assets, revealing potential accumulation zones and reversal points before they become apparent to retail traders.
Key Features
Smart Money Detection:
Real-time divergence analysis between two selected assets (e.g., BTC/ETH, Gold/Silver, Currency pairs)
Identification of institutional accumulation/distribution patterns
Trend confirmation through structural sweeps and momentum shifts
Structural Analysis:
Break of Structure (BOS) detection with multi-factor confirmation
ATR-based candle size filtering to eliminate false breakouts
Clear structural shift identification with visual confirmation
Risk-Managed Execution:
Dual entry modes: Immediate (on BOS close) or Retest (on pullback to level)
Automated stop-loss placement at last structural extreme
Dynamic take-profit calculation based on user-defined risk/reward ratio
Support for long-only, short-only, or bidirectional trading strategies
Visual Interface
Colored arrows signaling buy/sell opportunities at optimal entry points
Real-time stop-loss and take-profit level visualization
SMT divergence markers above/below price action
Structural level indicators for clear market context
Configuration Options
Asset Pair Selection - Primary and secondary symbols for comparative analysis
Trading Direction - Long, Short, or Both directions
Swing Sensitivity - Adjustable pivot point detection period
Risk/Reward Ratio - Customizable profit targets relative to risk
BOS Confirmation Filter - Minimum candle body size requirement via ATR percentage
Optimal Application
Best performance on correlated assets (crypto pairs, commodities, indices)
Effective across multiple timeframes (M15 for entries, H4/D1 for context)
Combines well with volume profile and order flow analysis
Suitable for both discretionary and systematic trading approaches
Technical Advantages
Dual-asset synchronization for early signal detection
Multi-layer filtering system reducing false positives
Integrated risk management with visual guidance
Customizable sensitivity for different market conditions
Русская версия
Индикатор Smart Money Theory (SMT) + Break of Structure (BOS)
Обзор
Этот продвинутый торговый индикатор объединяет анализ Smart Money Theory (SMT) и Break of Structure (BOS) с синхронизированным мониторингом нескольких активов. Основная концепция выявляет активность институциональных игроков путем обнаружения расхождений между коррелирующими активами, показывая зоны накопления и точки разворота до того, как они становятся очевидными для розничных трейдеров.
Ключевые возможности
Детекция "умных денег":
Анализ дивергенций в реальном времени между двумя выбранными активами
Выявление паттернов накопления/распределения институциональными участниками
Подтверждение тренда через структурные сдвиги и изменения импульса
Структурный анализ:
Обнаружение Break of Structure (BOS) с многофакторным подтверждением
Фильтрация по размеру свечи на основе ATR для устранения ложных пробоев
Четкая идентификация структурных сдвигов с визуальным подтверждением
Управление рисками:
Два режима входа: Немедленный (при закрытии BOS) или Ретест (при откате к уровню)
Автоматическое размещение стоп-лосса на последнем структурном экстремуме
Динамический расчет тейк-профита на основе заданного риск-риворда
Поддержка лонг-стратегий, шорт-стратегий или обоих направлений
Визуальный интерфейс
Цветные стрелки, сигнализирующие о точках входа на покупку/продажу
Визуализация уровней стоп-лосса и тейк-профита в реальном времени
Маркеры SMT-дивергенций над/под ценовым действием
Индикаторы структурных уровней для четкого контекста рынка
Настройки
Выбор пары активов - Основной и вторичный символы для сравнительного анализа
Направление торговли - Лонг, Шорт или Оба направления
Чувствительность свингов - Настраиваемый период детекции точек разворота
Коэффициент риск/вознаграждение - Настраиваемые цели по прибыли относительно риска
Фильтр подтверждения BOS - Минимальный размер тела свечи в процентах от ATR
Оптимальное применение
Наилучшие результаты на коррелирующих активах (криптопары, товары, индексы)
Эффективен на различных таймфреймах (M15 для входов, H4/D1 для контекста)
Хорошо сочетается с анализом Volume Profile и ордерного потока
Подходит как для дискреционного, так и для системного трейдинга
Технические преимущества
Синхронизация двух активов для раннего обнаружения сигналов
Многоуровневая система фильтрации, снижающая ложные срабатывания
Интегрированное управление рисками с визуальным сопровождением
Настраиваемая чувствительность под разные рыночные условия
Trend Analysis
SMA Dow-Flow MTF (SAXO Logical Alert)This script is an advanced MTF (multi-timeframe) monitor that combines the concepts of Dow Theory and SMA (Single Moving Average) to capture the moment when trends align across multiple timeframes. It is particularly focused on visualizing when lower timeframes synchronize with the direction of higher timeframes, without being distracted by short-term noise. 1. Trend Determination Mechanism (Core Logic): Rather than the usual simple determination of whether a price is above or below a moving average, this is based on updates of "low lows and highs." Pivot Detection: Points where the SMA moves in a "V" or "inverted V" shape are recorded as reversal candidates ($lastH$, $lastL$). Trend Reversal Conditions: Uptrend: When the price clearly breaks above the most recent SMA high ($lastH$). Downtrend: When the price clearly breaks below the most recent SMA low ($lastL$). 2. Indicator Features ① Sync Hierarchy: This script counts the degree to which the direction of each time period matches that of the higher time period, starting from the lower time period. The 5-minute time period forms a trend. The 15-minute time period follows the same direction as the 5-minute time period. The 1-hour time period follows the same direction as the 15-minute time period... (continues up to the daily time period). This ensures that an alert is sent out when the larger trend (daily or 4-hourly) swallows up the smaller trend (5-minute or 15-minute). ② Set Selection: You can switch between the "Yen Set (AUDJPY, EURJPY, etc.)" and the "Dollar Set (EURUSD, GBPUSD, etc.)." This allows you to grasp the strength or weakness of a specific currency (e.g., a weak yen or a strong dollar) at a glance.
This script's alert function does not simply sound when the trends match, but is designed to pinpoint the moment when the number of trend synchronizations increases (i.e., when momentum increases).
Below, we will explain in detail how it works and the meaning of the notifications.
1. Alert Conditions
An alert will only be triggered when all three of the following conditions are met.
Increase in Sync Count: For example, if only two time frames, the 5-minute and 15-minute ones, were aligned (Sync: 2), and the 1-hour one also aligns in the same direction (Sync: 3), the alert will be triggered.
Above the set minimum count (alert_min): The default setting is "3." In this case, a notification will be triggered the moment three, four, or five time frames are synchronized.
Selected Set Only: If the "Yen Set" is displayed, an alert will not be triggered even if a currency pair in the Dollar Set is synchronized.
2. How to Read the Alert Message
When you receive a notification, the following message will be displayed.
USDJPY: 4-Bar Synchronization (Upward)
USDJPY: A Currency Pair Gaining Momentum
4-Bar Synchronization: Indicates that the direction of the four timeframes (5-minute, 15-minute, 1-hour, and 4-hour) is consistent, starting with the lowest timeframe.
Upward/Downward: The direction of the synchronization.
このスクリプトは、「ダウ理論」と「移動平均線(SMA)」の考え方を組み合わせ、複数の時間足でトレンドが揃った瞬間を捉えるための高度なMTF(マルチタイムフレーム)モニターです。特に、短期的なノイズに惑わされず、上位足の方向に下位足が同期したタイミングを視覚化することに特化しています。1. トレンド判断の仕組み(コアロジック)通常の「移動平均線より上か下か」という単純な判定ではなく、「押し安値・戻り高値」の更新をベースにしています。ピボットの検知: SMAが「V字」または「逆V字」に動いた地点を、反転の候補($lastH$, $lastL$)として記録します。トレンド転換の条件:上昇トレンド: 価格が直近のSMA高値($lastH$)を明確に上抜けたとき。下落トレンド: 価格が直近のSMA安値($lastL$)を明確に下抜けたとき。2. インジケーターの特徴① 同期(Sync)の階層構造このスクリプトは、下位足から順に「どれだけ上位足と方向が一致しているか」をカウントします。5分足がトレンドを形成。15分足が5分足と同じ方向。1時間足が15分足と同じ方向……(日足まで続く)これにより、「大きな流れ(日足・4時間足)に、小さな流れ(5分・15分)が飲み込まれた瞬間」を逃さずアラート通知します。② セット選択機能「円セット(AUDJPY, EURJPYなど)」と「ドルセット(EURUSD, GBPUSDなど)」を切り替えて表示できます。これにより、特定の通貨の強弱(円安・ドル高など)を一目で把握できるのが強みです。
このスクリプトのアラート機能は、単に「トレンドが一致した」ときに鳴るのではなく、**「トレンドの同期数が増加した瞬間(=勢いが増した瞬間)」**をピンポイントで通知するように設計されています。
以下に、その仕組みと通知内容の意味を詳しく解説します。
1. アラートが発生する条件
アラートは、以下の3つの条件がすべて揃った時にのみ発信されます。
同期数(Sync Count)の増加: 例えば、それまで「5分足と15分足」の2つしか揃っていなかった(Sync: 2)のが、新しく「1時間足」も同じ方向に揃った(Sync: 3)という変化の瞬間に鳴ります。
設定した最小数以上 (alert_min): 初期設定では「3」になっています。この場合、3つ、4つ、または5つの時間足が同期した瞬間に通知が飛びます。
選択中のセットのみ: 「円セット」を表示している時は、ドルセットの通貨ペアが同期してもアラートは鳴りません。
2. アラートメッセージの読み方
通知が来ると、以下のようなメッセージが表示されます。
USDJPY: 4足同期 (上昇)
USDJPY: 勢いが出た通貨ペア
4足同期: 下位足から順に「5分・15分・1時間・4時間」の4つの時間足で方向が一致したことを示します。
上昇 / 下落: その同期している方向です。
Market Waves [Smart Trend & Signals]Market Waves
Overview
Market Waves is a comprehensive technical analysis tool designed to identify market trends with minimal lag while filtering out noise. By combining a modified Hull Moving Average (HMA) with Volatility Bands (ATR), this indicator provides a clear visual representation of market direction, entry signals, and automated Take Profit targets.
Key Features
1. Low-Lag Trend Detection
The core of this indicator uses a custom HMA variation to smooth out price action without the delay common in standard moving averages.
• Bullish Trend: The trend ribbon turns Teal when price breaks above the lower volatility band.
• Bearish Trend: The trend ribbon turns Red when price breaks below the upper volatility band.
2. Smart Signals & Power Filter
The indicator generates two types of signals to help you gauge entry quality:
• Standard Signals (BUY / SELL): Generated purely on trend reversals. Good for early entries.
• Power Signals (BUY+ / SELL+): These are high-probability setups that pass a multi-factor filter:
• Trend Confirmation: The primary trend must flip.
• RSI Momentum: RSI must be above 50 (for Buy) or below 50 (for Sell).
• Volume Spike: Volume must exceed the 20-period average (optional in settings).
3. Automated Take Profit Targets
Upon every new signal, the indicator automatically projects three Take Profit levels based on market volatility (ATR) at the moment of entry:
• TP1: Conservative target (1x Risk).
• TP2: Moderate target (2x Risk).
• MAX PROFIT: Aggressive target (4x Risk).
4. Accumulation Bar Coloring
Candles are colored to reflect the true strength of the move:
• Teal/Red: Strong trend active.
• Gray: Accumulation or consolidation phase. This helps traders avoid chopping markets or weak signals.
5. Confidence Score
A dynamic percentage (50% - 99%) is displayed above signals, calculated based on the steepness and momentum of the wave change, giving you an instant metric of the trend's initial strength.
How to Use
1. Identify Trend: Look at the colored ribbon. Do not trade against the ribbon color.
2. Wait for Signals: Look for "BUY" or "SELL" labels. For higher accuracy, wait for the "+" signals (e.g., "BUY+").
3. Confirm with Color: Ensure the bar color is not Gray (Weak/Accumulation). A Teal bar confirms a Buy; a Red bar confirms a Sell.
4. Manage Trade: Use the trend ribbon as a trailing stop-loss and the projected TP lines for exiting positions.
Settings
• Wave Length: Adjusts the smoothness of the trend (Default: 24).
• Sensitivity Factor: Multiplier for the ATR bands. Higher values reduce false signals but may delay entry (Default: 2.0).
• Show Signals/TP: Toggles for visual elements to keep the chart clean.
TXG Wick DetectorOverview The TradeX Guru Wick Detector is a price action utility designed to automatically identify potential "Liquidity Grabs" and "Stop Hunts." It highlights candles where the market has aggressively rejected lower prices, signaling that Smart Money may be absorbing sell orders (the "Samosa Crust Break").
How It Works This script calculates the ratio of the lower wick relative to the total candle range.
If the lower wick represents more than 50% of the total candle size (customizable), a Teal Diamond (💎) is plotted below the bar.
This visual cue alerts you to a strong rejection of lower prices, often found at the end of a correction or during a "Stop Hunt" at key support levels.
Features
Automated Detection: Instantly spots high-rejection candles across any timeframe.
Customizable Sensitivity: Adjust the "Wick %" threshold in the settings to filter for stronger or weaker signals.
Visual Clarity: Non-intrusive diamond markers that do not clutter your chart.
Watermark: Includes the TradeX Guru brand mark for easy sharing.
🚀 How to Use This Tool for Analysis
Do not trade every diamond blindly. Use this 3-Step "Pro" Protocol to filter for high-probability setups:
1. Location (Context is King) Only consider signals that appear at Key Areas of Value:
Support Zones: Is price testing a historical support line?
Round Numbers: Is the signal near a psychological level (e.g., Nifty 25,000, BankNifty 50,000)?
High Volume Nodes (VPVR): Is price rejecting a high-volume cluster?
Rule: If a diamond appears in the middle of a random trend ("No Man's Land"), ignore it.
2. The Trap (The Hunt)
Watch for price to dip below your key level first.
The appearance of the Teal Diamond confirms that this dip was rejected. This suggests that "Stop Loss Liquidity" was hunted and absorbed by institutional buyers.
3. The Trigger (Entry & Risk)
Entry: Wait for the diamond candle to close. Enter on the next candle if bullish momentum continues.
Stop Loss: Place your SL strictly below the Low of the diamond candle.
Logic: If price breaks below the wick, the rejection has failed, and the setup is invalid.
Settings Guide
Wick Size % (Default 0.50): The wick must be 50% of the candle.
Increase to 0.60 for fewer, higher-quality signals.
Decrease to 0.40 for more frequent signals (scalping).
Disclaimer This tool is for educational purposes only. Price action patterns do not guarantee future performance. Always manage your risk.
EMA Crossover Arrows (6 EMA & 20 EMA)EMA Crossover Arrows (6 EMA & 20 EMA) - Quick Signal Detector
📊 OVERVIEW
A simple yet powerful indicator that automatically marks exact moments when the 6 EMA crosses the 20 EMA - giving you clear visual signals for potential trend changes without any chart clutter.
🎯 WHAT IT SHOWS
Two precise crossover signals:
- Blue Triangle Up (↑): 6 EMA crosses ABOVE 20 EMA (Bullish signal)
- Pink Triangle Down (↓): 6 EMA crosses BELOW 20 EMA (Bearish signal)
✨ KEY FEATURES
✓ Clean arrow markers appear only at crossover moments
✓ No lag - signals appear in real-time as crossovers occur
✓ Works on ANY timeframe (1min, 5min, 1H, daily, etc.)
✓ Non-intrusive - arrows don't clutter your chart
✓ Perfect for swing trading and trend following
✓ Zero configuration required
⚙️ TECHNICAL DETAILS
- 6 EMA: Fast-moving average for quick trend detection
- 20 EMA: Slower average providing trend confirmation
- Crossover detection uses Pine Script's built-in ta.crossover/crossunder functions
- No repainting - signals are final once the bar closes
Vietnam Asset Monitoring ToolVietNamese Asset Correlation Tracking Chart
This chart monitors the relationship between major asset classes which Vietnamese analyst should monitor:
Gold Price: Gold is currently in the spotlight as international trade tensions show no signs of easing.
U.S. Dollar Index (DXY): The strength of the U.S. dollar, a key indicator that has relative correlations with most asset classes.
VN30: Vietnam’s benchmark stock index, representing the top 30 leading listed companies.
VNREAL: The stock index tracking Vietnam’s real estate–related companies.
Hanoi Residential Property Prices: Apartment and landed house prices in Hanoi, compiled and aggregated by **VietRealty.Pro**
Development in progress..
RSL Buy Signal Alert the relative Strength Index from Levy is checked. If it is above a dynamic value, an alert is triggered
MACD Buy E Sell EditavelMacd personalizavel com sell para cruzamento de venda e buy para cruzamento de compra
Trinity Trend Dashboard"Trinity Trend Dashboard with Trend Alerts & Custom Colors" indicator
### Trading Dashboard – Quick User Guide
**Purpose**
This indicator displays a compact status dashboard showing how the current price relates to several key levels:
- Previous day's VWAP
- Current (session) VWAP
- Previous day's High
- Previous day's Low
- Donchian Channel basis line (midpoint of highest high / lowest low over chosen period)
Each level shows whether price is **Above** (bullish) or **Below** (bearish), with colored backgrounds to make it instantly readable.
An **overall trend summary** combines all five signals into one clear status:
- **Strong Bullish** → all 5 signals are bullish
- **Strong Bearish** → all 5 signals are bearish
- **Mixed Trend** → anything in between
**How to Read the Dashboard**
- **Left column** = name of the level
- **Right column** = current price position ("Above" or "Below")
- **Green background** = price is above the level (bullish signal)
- **Red background** → price is below the level (bearish signal)
- **Bottom merged row** = overall trend verdict + large colored background
**Key Settings You Can Change**
- **Table Position** → top-right (default), top-left, bottom-left, bottom-right
- **Font Size** → tiny / small (default) / normal / large
- **Donchian Channel Period** → default 20 bars (classic value; adjust for faster/slower basis line)
- **Colors** (fully customizable):
- Left column text color (default: yellow)
- Bullish background (default: lime green)
- Bearish background (default: red)
- Mixed trend background (default: gray)
- Header background & text color
- **Alert toggles** → turn on/off notifications for:
- Trend changed → Strong Bullish
- Trend changed → Strong Bearish
- Trend changed → Mixed Trend
**Alerts**
Alerts fire only when the **overall trend status changes** (e.g. Mixed → Strong Bullish).
Recommended setup in TradingView:
1. Add the indicator to chart
2. Create alert → select this indicator
3. Condition = "Any alert() function call"
4. Frequency = "Once Per Bar Close" (cleanest for daily/lower-timeframe use)
5. Add your preferred notification (popup, email, webhook, etc.)
**Tips for Best Use**
- Works on any timeframe, but shines on intraday charts (5 min – 1 hour) when using daily previous levels.
- Previous-day levels update automatically at the start of each new trading day.
- On very low-liquidity symbols, VWAP may behave differently — test first.
- For scalping/day trading: watch when overall status flips to Strong Bullish/Bearish — often strong momentum confirmation.
- Customize colors so they stand out clearly against your chart background (e.g. darker green/red if chart is bright).
Enjoy cleaner, faster decision-making — all important levels in one glance!
7 - 16 Trend Reversal CountThe indicator operates by counting consecutive price movements and is primarily divided into two main phases:
Phase 1: Counts to 9
Buy Setup (Downtrend): Completed when there are nine consecutive candles where the current bar's close is lower than the close four bars prior.
Sell Setup (Uptrend): Completed when there are nine consecutive candles where the current bar's close is higher than the close four bars prior.
The appearance of the number 9 suggests a short-term trend reversal is likely.
Phase 2: Counts to 13
This phase begins after a setup is completed and aims to find the point of total trend exhaustion.
A count of 13 is considered a powerful signal of an imminent, significant trend reversal.
Y'all know what it is.
Multi-Timeframe Moving Average Tracker
Tracks user-defined higher timeframe moving averages on a 1-min chart (maybe higher?).
Useful to see where current price is in relation to a higher timeframe (e.g., 5-min, 1-hr) moving average like the 50 period. This allows the trader to determine size position risk based on personal rules (e.g., price below the 1-hr 40p EMA is high risk for lower price, so position size needs to be lightened, etc).
The higher timeframe moving average is live and plotted on the lower chart as a line (user-defined type and color) with the timeframe and period noted. It will move as the period closes (i.e., 5-min period closes every 5 minutes, 1-hr period closes every 60 minutes, etc.).
Ultimate Trend Dashboard [Multi-Timeframe]This is a Universal Market Scanner designed for Crypto, Forex, and Metals (Gold/Silver). Instead of checking multiple charts one by one, this dashboard monitors 4 different timeframes instantly from a single screen.
### 🧠 How It Works ( The Logic) The system uses a "Double Confirmation" strategy to determine the true trend direction: 1. Supertrend: Checks if the momentum is Bullish or Bearish. 2. EMA 200 Filter: Checks if the price is above or below the 200-period Exponential Moving Average (The most important long-term trend line).
A signal is only generated if BOTH indicators agree.
### 📊 Dashboard Overview The panel on the screen scans the following timeframes (Adjustable in settings): * 15 Minutes (Scalping Trend) * 1 Hour (Intraday Trend) * 4 Hours (Swing Trend) * Daily (Major Trend)
### 🚦 How to Use (Step-by-Step)
1. Look at the "TOTAL" Row: The script calculates a score based on all timeframes.
2. STRONG BUY 🚀 (All Green): * Meaning: All timeframes (Short & Long term) are Bullish. * Action: Look for Long entries. Do not Short.
3. STRONG SELL 🔻 (All Red): * Meaning: All timeframes are Bearish. * Action: Look for Short entries. Do not Buy.
4. NEUTRAL ⚠️ (Mixed Colors): * Meaning: The market is confused (e.g., Daily is Bullish but 15min is Bearish). * Action: Wait. Do not force a trade until the trend aligns.
### ⚙️ Customization * You can change the Timeframes (e.g., set them to 5m, 15m, 1h, 4h) in the settings. * You can move the table position (Right, Left, Center) to fit your screen. * Works on ANY asset class (BTC, ETH, XAUUSD, EURUSD, Stocks).
StealthFX Signals NavigatorThe StealthFX Signals Navigator is a high-performance trend-following suite designed for traders who demand institutional-grade clarity without the clutter. Inspired by the sleek aesthetics of premium toolkits like LuxAlgo, this indicator strips away the noise to provide a singular, high-probability "path of least resistance" for your trades.
🛡️ The Core Philosophy: "Trade with the Giant"
Most retail traders fail because they fight the primary trend. The Navigator solves this by using a 200-period EMA Filter.
Blue Signals (BUY): Only occur when price action is confirmed above the 200 EMA.
Purple Signals (SELL): Only occur when price action is confirmed below the 200 EMA.
🎯 Precision Entry & Risk Management
Stop guessing where to exit. The Navigator uses a volatility-adjusted ATR engine to calculate your targets the moment a signal prints.
Pip-Clamped Logic: To ensure trades remain realistic, the script automatically clamps your Stop Loss between 30 and 100 pips (with a hard safety cap at 200), making it ideal for Forex and Indices.
1:2 Risk-Reward: Every signal aims for a mathematical edge, setting a Take Profit (Blue Line) that is double the distance of your Stop Loss (Purple Line).
🧹 The "Clean Chart" Evolution
We believe a cluttered chart leads to a cluttered mind.
Smart-Hiding: Unlike standard indicators that leave old lines everywhere, the Navigator tracks price in real-time. The moment your TP or SL is touched, the lines vanish.
Signal Priority: The script resets with every new momentum shift, ensuring you are always looking at the most relevant trade setup.
🚀 Key Features
Modern Aesthetic: A sleek Neon Blue & Deep Purple theme designed for dark-mode enthusiasts.
Universal Scaling: Works across Forex, Crypto, and Stocks thanks to its "Mintick" sensitive calculation engine.
Zero Repaint: Signals confirm on the close of the bar, providing stable historical data for backtesting.
Integrated Alerts: Set-and-forget notifications for both Buy and Sell entries.
📈 How to Use
Identify the Bias: Watch the gray 200 EMA.
Execute: When a label appears, immediately set your limit orders at the displayed Blue (TP) and Purple (SL) levels.
Patience: Let the trade run. The lines will disappear automatically once the outcome is decided.
Best Timeframes: 15m, 1h, 4h. Best Assets: Major FX Pairs (EURUSD, GBPUSD), Gold (XAUUSD), and US Tech Indices.
Dynamic Gann Fan & Cycle - Lite FrameworkFree Lite edition of a Gann-inspired structure framework.
Plots pivot-based Gann fan angles to visualize potential support/resistance “rails,” and highlights momentum regimes when price rides key angles (2x1 / 3x1).
This is not a buy/sell signal tool — it’s designed to provide chart context for discretionary traders studying structure.
Growth Comparison (Gold, Silver, Copper, Platinum & Crypto)
Data Sources
The symbols configured this time point to globally trusted data sources (providers).
・OANDA (XAUUSD, XAGUSD, XCUUSD, XPTUSD):
Data from OANDA, one of the world's largest FX and commodity providers. It reflects the “spot prices” for gold, silver, copper, and platinum in near real-time.
・BINANCE (BTCUSDT, ETHUSDT, XRPUSDT):
Data from Binance, the world's largest cryptocurrency exchange. It has the highest trading volume and is used as the global standard price indicator. Retrieves BTC, ETH, and XRP.
How the Script Works (Technical Explanation)
・Fixed Starting Price:
The script internally stores the price on the set “comparison start date” (e.g., January 1, 2025).
・Real-Time Calculation:
It constantly retrieves the latest current price and continuously calculates the percentage using the following formula.
Formula: (Current Price - January 1, 2025 Price) ÷ January 1, 2025 Price × 100
*Since January 1 is a global market holiday (New Year's Day) with no prices available, the script automatically adopts the next market opening price (e.g., January 2 morning's open price) as the baseline.
・Automatic label tracking:
The program displays labels like “GOLD” at the right edge of the graph. This ensures you never lose track of which line corresponds to which asset, even when lines overlap.
Translated with DeepL.com (free version)
PSP with Color ThemesEnglish Description
The PSP with Color Themes indicator is a sophisticated tool for detecting price swing divergences between the current trading instrument and a selected reference asset. This indicator implements PSP (Price Swing Divergence) logic to identify moments when price movements between two correlated assets diverge from their typical relationship. Traders can select from multiple professionally designed color themes or customize their own color scheme, with adjustable opacity for optimal chart visibility. The core functionality compares candlestick patterns between the current chart and the reference symbol, highlighting bullish signals when the current asset rises while the reference falls (or vice versa in inverse mode). This divergence detection helps identify potential momentum shifts and trading opportunities before they become apparent in single-asset analysis. The indicator offers flexible configuration including inverse correlation mode for negatively correlated pairs and a clean visual presentation that doesn't clutter the price chart while providing immediate visual cues through colored candlesticks.
Русское описание
Индикатор PSP с цветовыми темами представляет собой продвинутый инструмент для обнаружения дивергенций колебаний цены между текущим торговым инструментом и выбранным эталонным активом. Этот индикатор реализует логику PSP (Price Swing Divergence) для выявления моментов, когда движения цен между двумя коррелирующими активами отклоняются от их типичной взаимосвязи. Трейдеры могут выбирать из нескольких профессионально разработанных цветовых тем или настраивать собственную цветовую схему с регулируемой прозрачностью для оптимальной видимости на графике. Основная функция сравнивает свечные модели между текущим графиком и эталонным символом, выделяя бычьи сигналы, когда текущий актив растет, а эталонный падает (или наоборот в инверсном режиме). Это обнаружение дивергенций помогает выявить потенциальные сдвиги импульса и торговые возможности до того, как они станут очевидными при анализе одного актива. Индикатор предлагает гибкую настройку, включая режим обратной корреляции для отрицательно коррелированных пар, и чистое визуальное представление, которое не загромождает ценовой график, обеспечивая при этом мгновенные визуальные подсказки через окрашенные свечи.
Koko's Capital Flow Channel Koko’s Capital Flow Channel is a structured EMA channel system designed to reduce over-trading and eliminate chase entries. It separates Early Direction signals (clearing bars) from Smart Entries (inside-channel confirmations), helping traders execute with patience and clarity.
Koko’s Capital Flow Channel™ provides a clean, psychology-friendly framework for traders transitioning from fast scalping to higher timeframes.
What it does
This indicator uses an EMA-based channel to define structure and trend flow, then delivers two tiers of signals:
Early Direction Signals (Early BUY / Early SELL)
Trigger on a clearing bar (break/close condition depending on your setting)
Used for directional awareness and early positioning
Smart Entry Signals (BUY-S / SELL-S)
Trigger only when price returns inside the channel and prints a qualifying candle
Designed to reduce impulsive entries and improve execution quality
Why it’s different
Many tools fire signals everywhere. This channel is built to create clarity and restraint:
Less noise
Fewer, higher-quality signals
Built-in structure + intent filters
Optional ATR filtering to avoid low-quality breaks
Best use cases
Daily / swing trading
Trend continuation and pullback entries
Traders learning discipline and consistency
Burned-out scalpers who want calmer, higher-quality setups
Recommended settings
Timeframe: Daily (works on others but Daily is the intended home)
Start with:
Clearing Bar Mode: Cross (or Over/Under “event” logic if enabled)
Candle Body: Body Only
Intent: Bullish/Bearish Candle
ATR Filter: Clearing Bar Strength, ATR(14), Multiplier 1.0
Signal Key
BUY-E / SELL-E = Early Direction signal (clearing bar)
BUY-S / SELL-S = Smart Entry signal (inside-channel confirmation)
5) How to Use It (simple instructions section)
Workflow
Wait for Early BUY-E / SELL-E to confirm flow direction
Only take Smart Entries (BUY-S / SELL-S) when price returns inside the channel
Use the channel boundaries for structure (helps avoid chasing)
Alerts
You can create alerts for:
Early BUY / Early SELL
Smart BUY / Smart SELL
Risk Disclaimer (safe + standard)
Disclaimer: This indicator is for educational and informational purposes only and is not financial advice. Markets involve risk. Always manage risk appropriately and test settings before live use.
Order Blocks INDIBOT 3D | INDIBOT ABO SALTAN 11 //@version=6
indicator("Order Blocks INDIBOT 3D | INDIBOT ABO SALTAN 11 ", overlay = true,
max_boxes_count = 500, max_labels_count = 500, max_lines_count = 500, max_polylines_count = 100, max_bars_back = 5000)
//#region CONSTANTS
// Core constants that control stored OB capacity and label size.
const int MAX_STORED_OBS = 50
const int retestSize = 4
//#endregion
//#region INPUTS
// Core user controls for OB behavior, volume delta, 3D style and alerts.
grpOB = "ORDER BLOCKS"
swingLen = input.int(5, "Swing Length", minval = 1, group = grpOB, inline = "sw", display = display.none)
bullObColor = input.color(color.new(color.teal, 55), "", group = grpOB, inline = "sw")
bearObColor = input.color(color.new(color.red, 55), "", group = grpOB, inline = "sw")
invMethod = input.string("Wick", "Invalidation", options = , group = grpOB, display = display.none)
showNearestX = input.int(3, "Show Nearest", minval = 1, maxval = 20, group = grpOB, display = display.none)
extendZones = input.int(10, "Extend Zones", minval = 0, group = grpOB,
tooltip = "This will extend the zones by X candles.", display = display.none)
showRetestLbl = input.bool(true, "Retest Labels", group = grpOB, inline = "tog")
hideInvalid = input.bool(true, "Hide Invalidated Zones", group = grpOB, inline = "tog")
grpVD = "VOLUME DELTA"
vdEnable = input.bool(true, "Enable", group = grpVD, inline = "vd")
vdBullColor = input.color(color.new(color.teal, 65), "", group = grpVD, inline = "vd")
vdBearColor = input.color(color.new(color.red, 65), "", group = grpVD, inline = "vd")
vd3D = input.bool(true, "3D", group = grpVD, inline = "3d", tooltip = "Adds 3D-style depth faces.") and vdEnable
vd3DDepth = input.int(5, "", group = grpVD, inline = "3d", minval = 1, maxval = 5, display = display.none)
displayStyle = input.string("Vertical", "Display Style", options = , group = grpVD,
tooltip = "Horizontal: split shown top/bottom. Vertical: split shown left/right across the zone.", display = display.none)
vdTfIn = input.timeframe("", "Volume Delta Timeframe", group = grpVD,
tooltip = "Lower timeframe used to estimate delta")
showTotalVol = input.bool(true, "Display Total Volume", group = grpVD,
tooltip = "Displays total volume (Bull+Bear) from the active delta source.", inline = "vd2") and vdEnable
showDeltaPct = input.bool(true, "Show Delta %", group = grpVD, inline = "vd2",
tooltip = "Shows bullish vs bearish volume split. If selected TF is lower than chart TF, uses LTF data; otherwise uses chart TF.") and vdEnable
vdTextColor = input.color(color.white, "", group = grpVD, inline = "vd2")
grpAL = "ALERTS"
alBullOB = input.bool(true, "Bullish Order Block", group = grpAL, inline = "oba")
alBearOB = input.bool(true, "Bearish Order Block", group = grpAL, inline = "oba")
alBullRetest = input.bool(true, "Bullish OB Retest", group = grpAL, inline = "obr")
alBearRetest = input.bool(true, "Bearish OB Retest", group = grpAL, inline = "obr")
//#endregion
//#region TYPES
// Custom structs for order blocks and 3D poly drawing.
type PolyParams
array points
color lineColor
color fillColor
int lineWidth
type ObRec
int leftIndex
int leftTime
int createdIndex
int createdTime
float top
float bottom
bool isBull
bool active
bool retested
int retestIndex
int retestTime
int invalidIndex
int invalidTime
float bullVol
float bearVol
float totalVol
float bullPct
float bearPct
bool hasDelta
type RetestRec
int barIndex
bool isBull
int obLeftIndex
int obCreatedIndex
//#endregion
//#region GENERIC HELPERS
// Small utilities: clearing drawings, geometry helpers, nearest-OB picking.
method clearAll(array bx, array pl, array lb) =>
if bx.size() > 0
for i = 0 to bx.size() - 1
bx.get(i).delete()
bx.clear()
if pl.size() > 0
for i = 0 to pl.size() - 1
pl.get(i).delete()
pl.clear()
if lb.size() > 0
for i = 0 to lb.size() - 1
lb.get(i).delete()
lb.clear()
// Builds a simple side face for 3D-style boxes using chart points.
method sideBox(array pts, int x, float btm, float top, float depthY, int widthX) =>
pts.unshift(chart.point.from_index(x, btm))
pts.unshift(chart.point.from_index(x + widthX, btm + depthY))
pts.unshift(chart.point.from_index(x + widthX, top + depthY))
pts.unshift(chart.point.from_index(x, top))
pts.unshift(chart.point.from_index(x, btm))
// Returns true if a candle's high/low intersects the OB zone.
touchesZone(float zTop, float zBot, float cHigh, float cLow) =>
cHigh >= zBot and cLow <= zTop
// Distance from price to zone in price units, used to rank nearest zones.
zoneDistance(float px, float zTop, float zBot) =>
px > zTop ? px - zTop : px < zBot ? zBot - px : 0.0
// Inserts a distance+index pair into a sorted list, capped at kMax.
method insertBest(array dists, array idxs, float dist, int idx, int kMax) =>
if dists.size() == 0
dists.push(dist)
idxs.push(idx)
else
int pos = dists.size()
if dists.size() > 0
for j = 0 to dists.size() - 1
if dist < dists.get(j)
pos := j
break
dists.insert(pos, dist)
idxs.insert(pos, idx)
while dists.size() > kMax
dists.pop()
idxs.pop()
// Picks the k nearest bull/bear OBs to current price (optionally including invalid).
pickNearest(array store, bool wantBull, int kMax, bool includeInvalid) =>
array dists = array.new_float()
array idxs = array.new_int()
if store.size() > 0
for i = 0 to store.size() - 1
ObRec ob = store.get(i)
if ob.isBull == wantBull
bool ok = includeInvalid ? true : ob.active
if ok
float dist = zoneDistance(close, ob.top, ob.bottom)
dists.insertBest(idxs, dist, i, kMax)
idxs
formatVol(float v) =>
str.tostring(v, format.volume)
//#endregion
//#region VOLUME ENGINE (CHART OR LOWER TF)
// Per-bar total / bull / bear volume
tfSec(string tf) =>
timeframe.in_seconds(tf)
int chartSec = tfSec(timeframe.period)
int srcSec = tfSec(vdTfIn)
bool useLtf = not na(chartSec) and not na(srcSec) and srcSec < chartSec
getBarVols() =>
float tot = na
float bull = na
float bear = na
if not useLtf or vdTfIn == ""
float v = volume
bool up = close > open
bool dn = close < open
tot := v
bull := up ? v : 0.0
bear := dn ? v : 0.0
else
array oArr = request.security_lower_tf(syminfo.tickerid, vdTfIn, open)
array cArr = request.security_lower_tf(syminfo.tickerid, vdTfIn, close)
array vArr = request.security_lower_tf(syminfo.tickerid, vdTfIn, volume)
float tSum = 0.0
float bSum = 0.0
float sSum = 0.0
int n = array.size(vArr)
if n > 0
for i = 0 to n - 1
float v2 = array.get(vArr, i)
float o2 = array.get(oArr, i)
float c2 = array.get(cArr, i)
tSum += v2
if c2 > o2
bSum += v2
else if c2 < o2
sSum += v2
tot := tSum
bull := bSum
bear := sSum
= getBarVols()
//#endregion
//#region POC ENGINE (MOST-TOUCHED PRICE + VOLUME)
// Finds a POC between swing and BOS, then aggregates volume.
findMostTouchedPrice(int fromIdx, int toIdx, int nBins) =>
int span = toIdx - fromIdx
if span <= 0 or na(fromIdx) or na(toIdx)
else
float minP = 1e10
float maxP = -1e10
for idx = fromIdx to toIdx
int rel = bar_index - idx
if rel >= 0
float lo = low
float hi = high
if not na(lo) and not na(hi)
if lo < minP
minP := lo
if hi > maxP
maxP := hi
if not (minP < maxP)
else
float step = (maxP - minP) / nBins
step := step <= 0 ? syminfo.mintick : step
array diffCnt = array.new_float(nBins, 0.0)
for idx = fromIdx to toIdx
int rel2 = bar_index - idx
if rel2 >= 0
float lo2 = low
float hi2 = high
if not na(lo2) and not na(hi2)
int sBin = int(math.floor((lo2 - minP) / step))
int eBin = int(math.floor((hi2 - minP) / step))
sBin := sBin < 0 ? 0 : sBin > nBins - 1 ? nBins - 1 : sBin
eBin := eBin < 0 ? 0 : eBin > nBins - 1 ? nBins - 1 : eBin
float cStart = diffCnt.get(sBin)
diffCnt.set(sBin, cStart + 1.0)
if eBin + 1 < nBins
float cEnd = diffCnt.get(eBin + 1)
diffCnt.set(eBin + 1, cEnd - 1.0)
int bestBin = 0
float bestCnt = 0.0
float runCnt = 0.0
for i = 0 to nBins - 1
runCnt += diffCnt.get(i)
if runCnt > bestCnt
bestCnt := runCnt
bestBin := i
float poc = minP + (bestBin + 0.5) * step
// Aggregates total / bull / bear volume at a single price level (POC) for a range.
volumeAtPrice(int fromIdx, int toIdx, float poc) =>
int touches = 0
float totVol = 0.0
float bullVol = 0.0
float bearVol = 0.0
int span = toIdx - fromIdx
if not na(poc) and span >= 0
for step = 0 to span
int idx = toIdx - step
int rel = bar_index - idx
if rel >= 0
float lo = low
float hi = high
if not na(lo) and not na(hi) and lo <= poc and hi >= poc
touches += 1
float vTot = barTotVol
float vBull = barBullVol
float vBear = barBearVol
if not na(vTot)
totVol += vTot
if not na(vBull)
bullVol += vBull
if not na(vBear)
bearVol += vBear
// Wrapper: find POC first, then compute volume at that POC for the BOS range.
calcMostTouchedPriceVol(int fromIdx, int toIdx, int nBins) =>
= findMostTouchedPrice(fromIdx, toIdx, nBins)
= volumeAtPrice(fromIdx, toIdx, poc)
//#endregion
//#region ORDER BLOCK ENGINE (POC-BASED)
// Detects swing highs/lows, confirms BOS, anchors OB at first POC touch.
var array obs = array.new()
var array obRetests = array.new()
var int lastBullRetestBar = na
var int lastBearRetestBar = na
var float shPrice = na
var int shIdx = na
var float slPrice = na
var int slIdx = na
bool evNewBullOB = false
bool evNewBearOB = false
bool evBullRetest = false
bool evBearRetest = false
float ph = ta.pivothigh(high, swingLen, swingLen)
float pl = ta.pivotlow(low, swingLen, swingLen)
if not na(ph)
shPrice := ph
shIdx := bar_index - swingLen
if not na(pl)
slPrice := pl
slIdx := bar_index - swingLen
bool bosBearNow = not na(slPrice) and bar_index > slIdx and close < slPrice and close >= slPrice
bool bosBullNow = not na(shPrice) and bar_index > shIdx and close > shPrice and close <= shPrice
bool bosBear = bosBearNow
bool bosBull = bosBullNow
// Precompute BOS ranges and POC stats in global scope
int bosIdxBear = bar_index - 1
int fromIdxBear = slIdx
int toIdxBear = bosIdxBear
= calcMostTouchedPriceVol(fromIdxBear, toIdxBear, 40)
int bosIdxBull = bar_index - 1
int fromIdxBull = shIdx
int toIdxBull = bosIdxBull
= calcMostTouchedPriceVol(fromIdxBull, toIdxBull, 40)
// Keeps OB array trimmed to recent history and limits max stored OBs.
pruneObs() =>
int minLeft = math.max(0, bar_index - 4999)
if obs.size() > 0
for i = obs.size() - 1 to 0
ObRec ob = obs.get(i)
if ob.leftIndex < minLeft
obs.remove(i)
while obs.size() > MAX_STORED_OBS
bool removed = false
if obs.size() > 0
for j = obs.size() - 1 to 0
ObRec ob2 = obs.get(j)
if not ob2.active
obs.remove(j)
removed := true
break
if not removed and obs.size() > 0
obs.pop()
// Creates and seeds an OB record using a POC-anchored candle and BOS volumes.
addObFromPoc(int baseIdx, float top, float bottom, bool isBull, float totSeed, float bullSeed, float bearSeed, int createdIdx) =>
int offLeft = bar_index - baseIdx
int offCreated = bar_index - createdIdx
int leftTime = time
int createdTm = time
float tot = totSeed
float bVol = bullSeed
float sVol = bearSeed
bool hasDelta = tot > 0.0
float bullPct = hasDelta ? math.round((bVol / tot) * 100.0) : 50.0
float bearPct = hasDelta ? 100.0 - bullPct : 50.0
obs.unshift(ObRec.new(baseIdx, leftTime, createdIdx, createdTm, top, bottom, isBull,
true, false, na, na, na, na, bVol, sVol, tot, bullPct, bearPct, hasDelta))
pruneObs()
// Returns true if a proposed zone overlaps any active OB
obOverlapsActive(float zoneTop, float zoneBottom) =>
float zTop = math.max(zoneTop, zoneBottom)
float zBot = math.min(zoneTop, zoneBottom)
bool overlaps = false
if obs.size() > 0
for i = 0 to obs.size() - 1
ObRec ob = obs.get(i)
if ob.active
float oTop = math.max(ob.top, ob.bottom)
float oBot = math.min(ob.top, ob.bottom)
bool rangeOverlap = zTop >= oBot and zBot <= oTop
if rangeOverlap
overlaps := true
break
overlaps
// Returns true if there is a price gap between anchorIdx and bosIdx.
hasGapBetween(int anchorIdx, int bosIdx, bool isBull) =>
bool gap = false
int fromIdx = math.min(anchorIdx, bosIdx)
int toIdx = math.max(anchorIdx, bosIdx)
if toIdx - fromIdx >= 1
for absIdx = fromIdx + 1 to toIdx
int relNow = bar_index - absIdx
int relPrev = relNow + 1
if relNow >= 0 and relPrev >= 0
float hiPrev = high
float loPrev = low
float hiNow = high
float loNow = low
if not na(hiPrev) and not na(loPrev) and not na(hiNow) and not na(loNow)
if isBull
if loNow > hiPrev
gap := true
break
else
if hiNow < loPrev
gap := true
break
gap
// Bearish BOS → Bearish OB
if bosBear
int bosIdx = bosIdxBear
int fromIdx = fromIdxBear
int toIdx = toIdxBear
if not na(pocB) and touchesB > 0 and not na(fromIdx) and not na(toIdx)
int spanB = toIdx - fromIdx
int bestIdx = na
float runMaxHigh = na
if spanB >= 0
for step = 0 to spanB
int idx = toIdx - step
int rel = bar_index - idx
if rel >= 0
float lo = low
float hi = high
if not na(lo) and not na(hi)
runMaxHigh := na(runMaxHigh) ? hi : math.max(runMaxHigh, hi)
bool touches = lo <= pocB and hi >= pocB
if touches and hi == runMaxHigh
bestIdx := idx
bool gapLeg = not na(bestIdx) ? hasGapBetween(bestIdx, bosIdx, false) : false
if not na(bestIdx) and not gapLeg
int relBest = bar_index - bestIdx
float top = high
float bottom = low
if not obOverlapsActive(top, bottom)
addObFromPoc(bestIdx, top, bottom, false, totVolB, bullVolB, bearVolB, bosIdx)
evNewBearOB := true
slPrice := na
slIdx := na
// Bullish BOS → Bullish OB
if bosBull
int bosIdx2 = bosIdxBull
int fromIdx2 = fromIdxBull
int toIdx2 = toIdxBull
if not na(pocH) and touchesH > 0 and not na(fromIdx2) and not na(toIdx2)
int spanH = toIdx2 - fromIdx2
int bestIdx2 = na
float runMinLow = na
if spanH >= 0
for step = 0 to spanH
int idx2 = toIdx2 - step
int rel2 = bar_index - idx2
if rel2 >= 0
float lo2 = low
float hi2 = high
if not na(lo2) and not na(hi2)
runMinLow := na(runMinLow) ? lo2 : math.min(runMinLow, lo2)
bool touches = lo2 <= pocH and hi2 >= pocH
if touches and lo2 == runMinLow
bestIdx2 := idx2
bool gapLeg2 = not na(bestIdx2) ? hasGapBetween(bestIdx2, bosIdx2, true) : false
if not na(bestIdx2) and not gapLeg2
int relBest2 = bar_index - bestIdx2
float top2 = high
float bottom2 = low
if not obOverlapsActive(top2, bottom2)
addObFromPoc(bestIdx2, top2, bottom2, true, totVolH, bullVolH, bearVolH, bosIdx2)
evNewBullOB := true
shPrice := na
shIdx := na
// Invalidation and retest detection for existing OBs.
if obs.size() > 0
for i = 0 to obs.size() - 1
ObRec ob = obs.get(i)
if ob.active
bool invalid = false
int invIdx = na
int invTime = na
if ob.isBull
if invMethod == "Wick"
invalid := low < ob.bottom
invIdx := bar_index
invTime := time
else
if bar_index > 0
invalid := close < ob.bottom
invIdx := bar_index - 1
invTime := time
else
if invMethod == "Wick"
invalid := high > ob.top
invIdx := bar_index
invTime := time
else
if bar_index > 0
invalid := close > ob.top
invIdx := bar_index - 1
invTime := time
if invalid
ob.active := false
ob.invalidIndex := invIdx
ob.invalidTime := invTime
bool retestPrev = false
int retestBar = na
int retestTm = na
if bar_index > 0
if ob.isBull
bool opensAbovePrev = open > ob.top
bool closesAbovePrev = close > ob.top
bool wickTouchesPrev = low <= ob.top and low >= ob.bottom
retestPrev := opensAbovePrev and closesAbovePrev and wickTouchesPrev
else
bool opensBelowPrev = open < ob.bottom
bool closesBelowPrev = close < ob.bottom
bool wickTouchesPrev = high >= ob.bottom and high <= ob.top
retestPrev := opensBelowPrev and closesBelowPrev and wickTouchesPrev
if retestPrev
retestBar := bar_index - 1
retestTm := time
if retestPrev and not na(retestBar) and retestBar > ob.createdIndex
ob.retested := true
ob.retestIndex := retestBar
ob.retestTime := retestTm
int lastSideBar = ob.isBull ? lastBullRetestBar : lastBearRetestBar
bool canLog = na(lastSideBar) or retestBar - lastSideBar >= 4
if canLog
obRetests.unshift(RetestRec.new(retestBar, ob.isBull, ob.leftIndex, ob.createdIndex))
if ob.isBull
evBullRetest := true
lastBullRetestBar := retestBar
else
evBearRetest := true
lastBearRetestBar := retestBar
obs.set(i, ob)
//#endregion
//#region DRAW ENGINE (ZONES + VOLUME + 3D)
// Handles all boxes, polylines and labels for OBs and 3D faces.
bool showVD = vdEnable
bool isVert = displayStyle == "Vertical"
bool isHorz = not isVert
float dayAtr = ta.atr(14)
var array allBoxes = array.new()
var array allPolys = array.new()
var array allLabels = array.new()
drawPoly(PolyParams pp) =>
if not na(pp) and not na(pp.points) and pp.points.size() > 0
allPolys.unshift(polyline.new(points = pp.points, line_color = pp.lineColor, fill_color = pp.fillColor))
method pushBox(array store, box b) =>
store.unshift(b)
method pushLabel(array store, label l) =>
store.unshift(l)
// Chooses base colors for OB zones depending on vdEnable and bull/bear type.
obColors(ObRec ob) =>
color bullCol = vdEnable ? vdBullColor : bullObColor
color bearCol = vdEnable ? vdBearColor : bearObColor
color baseCol = ob.isBull ? bullCol : bearCol
color faded = ob.active ? baseCol : color.new(baseCol, 85)
// Computes right-most bar index for drawing an OB, considering extension and invalidation.
obRightIndex(ObRec ob) =>
int activeRight = bar_index + extendZones
if ob.active
activeRight
else
na(ob.invalidIndex) ? activeRight : ob.invalidIndex
// Draws the main OB zone box on the chart.
drawObZoneBox(ObRec ob, color faded) =>
int xR = obRightIndex(ob)
int xL = ob.leftIndex
int minBar = bar_index - 4999
if xL < minBar
xL := minBar
xR := math.max(xR, xL)
box bx = box.new(left = xL, right = xR, top = ob.top, bottom = ob.bottom, xloc = xloc.bar_index, bgcolor = faded, border_color = na, border_width = 0)
allBoxes.pushBox(bx)
// Draws a retest marker (triangle) when price revisits an OB.
drawRetestLabels(array bullAct, array bearAct, array bullInv, array bearInv) =>
int ret = 0
if showRetestLbl and obRetests.size() > 0
int minBar = bar_index - 4999
int lastBullLbl = na
int lastBearLbl = na
for i = obRetests.size() - 1 to 0
RetestRec r = obRetests.get(i)
if r.barIndex < minBar or r.barIndex > bar_index
RetestRec _trash = obRetests.remove(i)
else
bool hasDisplayedParent = false
if r.isBull
if bullAct.size() > 0
for j = 0 to bullAct.size() - 1
ObRec ob = obs.get(bullAct.get(j))
if ob.leftIndex == r.obLeftIndex and ob.createdIndex == r.obCreatedIndex
hasDisplayedParent := true
break
if not hasDisplayedParent and not hideInvalid and bullInv.size() > 0
for j = 0 to bullInv.size() - 1
ObRec ob = obs.get(bullInv.get(j))
if ob.leftIndex == r.obLeftIndex and ob.createdIndex == r.obCreatedIndex
hasDisplayedParent := true
break
else
if bearAct.size() > 0
for j = 0 to bearAct.size() - 1
ObRec ob = obs.get(bearAct.get(j))
if ob.leftIndex == r.obLeftIndex and ob.createdIndex == r.obCreatedIndex
hasDisplayedParent := true
break
if not hasDisplayedParent and not hideInvalid and bearInv.size() > 0
for j = 0 to bearInv.size() - 1
ObRec ob = obs.get(bearInv.get(j))
if ob.leftIndex == r.obLeftIndex and ob.createdIndex == r.obCreatedIndex
hasDisplayedParent := true
break
if not hasDisplayedParent
continue
int age = bar_index - r.barIndex
if age >= 0 and age <= 4999
if r.isBull
if not na(lastBullLbl) and r.barIndex - lastBullLbl < 3
continue
lastBullLbl := r.barIndex
else
if not na(lastBearLbl) and r.barIndex - lastBearLbl < 3
continue
lastBearLbl := r.barIndex
float yPrice = close
color baseCol = r.isBull ? bullObColor : bearObColor
st = r.isBull ? label.style_triangleup : label.style_triangledown
yl = r.isBull ? yloc.belowbar : yloc.abovebar
label newLbl = label.new(r.barIndex, yPrice, "", xloc = xloc.bar_index, yloc = yl, style = st,
color = color.new(baseCol, 0), textcolor = color.new(baseCol, 0), size = retestSize, force_overlay = true)
allLabels.pushLabel(newLbl)
ret
// Returns geometry used for volume overlay and 3D top view.
obGeom(ObRec ob) =>
int rawL = ob.leftIndex
int rawR = obRightIndex(ob)
int minBar = bar_index - 4999
int xL = math.max(rawL, minBar)
int xR = math.max(rawR, xL)
int widthX = vd3DDepth
int xR2 = xR + widthX
float yT = ob.top
float yB = ob.bottom
float h = yT - yB
// Converts bull/bear percentages into display strings (if enabled).
deltaTexts(float bullPct, float bearPct) =>
string bullTxt = showDeltaPct ? str.tostring(bullPct) + "%" : ""
string bearTxt = showDeltaPct ? str.tostring(bearPct) + "%" : ""
// Draws a text label with total volume on the right-bottom corner of the OB.
drawTotalVolLabel(int xL, int xR, float yT, float yB, float h, float total) =>
if showTotalVol
int cx = xR - 1
if cx < xL
cx := xL
float cy = yB + h * 0.25
string txt = formatVol(total)
label lb = label.new(cx, cy, txt, xloc = xloc.bar_index, style = label.style_label_right,
textcolor = vdTextColor, color = #ffffff00, size = size.small, force_overlay = true)
allLabels.pushLabel(lb)
// Fills the OB with bull/bear split either vertically or horizontally.
drawDeltaFills(int xL, int xR, float yT, float yB, float h, float bullPct, string bullTxt, string bearTxt) =>
color bullCol = vdEnable ? vdBullColor : bullObColor
color bearCol = vdEnable ? vdBearColor : bearObColor
if isVert
int splitX = xL + int((xR - xL) * (bullPct / 100.0))
splitX := xR - xL >= 2 ? math.max(xL + 1, math.min(xR - 1, splitX)) : xL
box bBull = box.new(xL, yT, splitX, yB, xloc = xloc.bar_index, bgcolor = bullCol, border_width = 0, text = bullTxt, text_color = vdTextColor, text_size = size.small)
box bBear = box.new(splitX, yT, xR, yB, xloc = xloc.bar_index, bgcolor = bearCol, border_width = 0, text = bearTxt, text_color = vdTextColor, text_size = size.small)
allBoxes.pushBox(bBull)
allBoxes.pushBox(bBear)
else
float midY = yB + h * (bullPct / 100.0)
box bBull = box.new(xL, midY, xR, yB, xloc = xloc.bar_index, bgcolor = bullCol, border_width = 0, text = bullTxt, text_color = vdTextColor, text_size = size.small)
box bBear = box.new(xL, yT, xR, midY, xloc = xloc.bar_index, bgcolor = bearCol, border_width = 0, text = bearTxt, text_color = vdTextColor, text_size = size.small)
allBoxes.pushBox(bBull)
allBoxes.pushBox(bBear)
// Track first visible bar index for 3D top face clipping.
var int leftVisIdx = na
if na(leftVisIdx) and time >= chart.left_visible_bar_time
leftVisIdx := bar_index
// Draws the 3D front faces and top faces based on bull/bear split and style.
drawDelta3D(int xL, int xR, int widthX, int xR2, float yT, float yB, float h, float bullPct) =>
color bullCol = vdEnable ? vdBullColor : bullObColor
color bearCol = vdEnable ? vdBearColor : bearObColor
float depthY = dayAtr * (0.1 * vd3DDepth)
int visibleLeft = na(leftVisIdx) ? xL : math.max(xL, leftVisIdx)
int visibleRight = xR
if isHorz
float midY = yB + h * (bullPct / 100.0)
if bullPct > 0
array ptsFrontBull = array.new()
ptsFrontBull.sideBox(xR, yB, midY, depthY, widthX)
drawPoly(PolyParams.new(ptsFrontBull, color.new(chart.fg_color, 90), color.new(bullCol, 70), 1))
if bullPct < 100
array ptsFrontBear = array.new()
ptsFrontBear.sideBox(xR, midY, yT, depthY, widthX)
drawPoly(PolyParams.new(ptsFrontBear, color.new(chart.fg_color, 90), color.new(bearCol, 70), 1))
if visibleRight > visibleLeft
array ptsTop = array.new()
ptsTop.unshift(chart.point.from_index(visibleRight + widthX, yT + depthY))
ptsTop.unshift(chart.point.from_index(visibleLeft + widthX, yT + depthY))
ptsTop.unshift(chart.point.from_index(visibleLeft, yT))
ptsTop.unshift(chart.point.from_index(visibleRight, yT))
ptsTop.unshift(chart.point.from_index(visibleRight + widthX, yT + depthY))
drawPoly(PolyParams.new(ptsTop, color.new(chart.fg_color, 90), color.new(bearCol, 70), 1))
else
array ptsFront = array.new()
ptsFront.sideBox(xR, yB, yT, depthY, widthX)
drawPoly(PolyParams.new(ptsFront, color.new(chart.fg_color, 90), color.new(bearCol, 70), 1))
if visibleRight > visibleLeft
float frac = bullPct / 100.0
int bullRight = visibleLeft + int((visibleRight - visibleLeft) * frac)
bullRight := math.max(visibleLeft, math.min(visibleRight, bullRight))
if bullPct > 0 and bullRight > visibleLeft
array ptsTopBull = array.new()
ptsTopBull.unshift(chart.point.from_index(bullRight + widthX, yT + depthY))
ptsTopBull.unshift(chart.point.from_index(visibleLeft + widthX, yT + depthY))
ptsTopBull.unshift(chart.point.from_index(visibleLeft, yT))
ptsTopBull.unshift(chart.point.from_index(bullRight, yT))
ptsTopBull.unshift(chart.point.from_index(bullRight + widthX, yT + depthY))
drawPoly(PolyParams.new(ptsTopBull, color.new(chart.fg_color, 90), color.new(bullCol, 70), 1))
if bullPct < 100 and visibleRight > bullRight
array ptsTopBear = array.new()
ptsTopBear.unshift(chart.point.from_index(visibleRight + widthX, yT + depthY))
ptsTopBear.unshift(chart.point.from_index(bullRight + widthX, yT + depthY))
ptsTopBear.unshift(chart.point.from_index(bullRight, yT))
ptsTopBear.unshift(chart.point.from_index(visibleRight, yT))
ptsTopBear.unshift(chart.point.from_index(visibleRight + widthX, yT + depthY))
drawPoly(PolyParams.new(ptsTopBear, color.new(chart.fg_color, 90), color.new(bearCol, 70), 1))
// Draws a full OB: zone, retest label, volume fill and 3D faces.
drawZoneAndVolume(ObRec ob) =>
= obColors(ob)
drawObZoneBox(ob, faded)
if showVD and ob.hasDelta
= obGeom(ob)
= deltaTexts(ob.bullPct, ob.bearPct)
drawTotalVolLabel(xL, xR, yT, yB, h, ob.totalVol)
drawDeltaFills(xL, xR, yT, yB, h, ob.bullPct, bullTxt, bearTxt)
if vd3D
drawDelta3D(xL, xR, widthX, xR2, yT, yB, h, ob.bullPct)
true
// Clear all previous drawings each bar before re-rendering current selection.
allBoxes.clearAll(allPolys, allLabels)
// Pick active and invalid OBs based on hideInvalid + showNearestX.
array bullActive = array.new_int()
array bearActive = array.new_int()
array bullInvalid = array.new_int()
array bearInvalid = array.new_int()
if hideInvalid
bullActive := pickNearest(obs, true, showNearestX, false)
bearActive := pickNearest(obs, false, showNearestX, false)
else
bullActive := pickNearest(obs, true, showNearestX, false)
bearActive := pickNearest(obs, false, showNearestX, false)
if obs.size() > 0
for i = 0 to obs.size() - 1
ObRec o = obs.get(i)
if not o.active
if o.isBull
bullInvalid.push(i)
else
bearInvalid.push(i)
if bearInvalid.size() > 0 and not hideInvalid
for i = 0 to bearInvalid.size() - 1
ObRec ob = obs.get(bearInvalid.get(i))
drawZoneAndVolume(ob)
if bearActive.size() > 0
for i = 0 to bearActive.size() - 1
ObRec ob = obs.get(bearActive.get(i))
drawZoneAndVolume(ob)
if bullInvalid.size() > 0 and not hideInvalid
for i = 0 to bullInvalid.size() - 1
ObRec ob = obs.get(bullInvalid.get(i))
drawZoneAndVolume(ob)
if bullActive.size() > 0
for i = 0 to bullActive.size() - 1
ObRec ob = obs.get(bullActive.get(i))
drawZoneAndVolume(ob)
// Draw all stored retest events on top of zones
drawRetestLabels(bullActive, bearActive, bullInvalid, bearInvalid)
//#endregion
//#region ALERTS
alertcondition(alBullOB and evNewBullOB, "Bullish Order Block", "New Bullish Order Block detected.")
alertcondition(alBearOB and evNewBearOB, "Bearish Order Block", "Bearish Order Block detected.")
alertcondition(alBullRetest and evBullRetest, "Bullish OB Retest", "Bullish Order Block retest.")
alertcondition(alBearRetest and evBearRetest, "Bearish OB Retest", "Bearish Order Block retest.")
if alBullOB and evNewBullOB
alert("Bullish Order Block detected.", alert.freq_once_per_bar)
if alBearOB and evNewBearOB
alert("Bearish Order Block detected.", alert.freq_once_per_bar)
if alBullRetest and evBullRetest
alert("Bullish Order Block retest.", alert.freq_once_per_bar)
if alBearRetest and evBearRetest
alert("Bearish Order Block retest.", alert.freq_once_per_bar)
// ==========================================================================================
// === Dashboard with Telegram Link ===
var table myTable = table.new(position.top_center, 1, 1, border_width=1, frame_color=color.black, bgcolor=color.white)
// Add Telegram Message to Dashboard
table.cell(myTable, 0, 0, "ABO SALTAN", bgcolor=color.blue, text_color=color.white, text_size=size.normal)
Sri - Keltner Channel Dual - CTF 📌 Sri – Keltner Channel Dual (Custom Timeframe)
Overview
Sri – Keltner Channel Dual (CTF without Toggle) is a dual-layer Keltner Channel overlay designed to visualize volatility structure across two independent higher or equal timeframes.
Unlike traditional Keltner Channel indicators that operate on a single timeframe or require manual mode selection, this script always plots two Keltner Channels at the same time, each calculated on its own user-defined timeframe.
This makes it especially useful for multi-timeframe confluence, trend validation, and volatility compression/expansion analysis.
🔹 Key Features
1️⃣ Dual Independent Keltner Channels
Two fully independent Keltner Channels
Each channel has its own timeframe, length, multiplier, source, and band style
Both channels are always active (no toggles, no repainting logic)
2️⃣ True Multi-Timeframe Calculation
Each channel is calculated using request.security() on its selected timeframe
No approximation or scaling of lower-timeframe data
Ensures true higher-timeframe structure on lower charts
3️⃣ Flexible Volatility Models
Each Keltner Channel can independently use:
Average True Range (ATR)
True Range
Raw Price Range (High – Low, smoothed)
This allows traders to compare classic ATR-based channels vs pure price-range volatility on the same chart.
4️⃣ EMA or SMA Basis Control
Each channel can independently switch between:
Exponential Moving Average (EMA)
Simple Moving Average (SMA)
This makes the script adaptable to both fast-reacting trend traders and smoother swing-based analysis.
5️⃣ Visual Confluence Zones
Upper bands and lower bands between Channel-1 and Channel-2 are filled
The fill highlights:
Volatility agreement
Compression zones
Expansion breakouts
Helps quickly identify high-probability trend continuation or exhaustion areas
📈 How to Use the Indicator
Common use cases:
Trend Confirmation
Price holding above both bases → bullish bias
Price holding below both bases → bearish bias
Volatility Compression
When both channels narrow and overlap → potential breakout zone
Multi-Timeframe Structure
Use Channel-1 for execution timeframe
Use Channel-2 for higher-timeframe context (e.g., 15m + 1H, or 1H + Daily)
Dynamic Support & Resistance
Upper and lower bands act as adaptive volatility-based levels
⚠️ Notes
This is not a signal-based or buy/sell indicator
Designed as a market structure and volatility framework
Best used alongside price action, volume, or momentum tools
🔒 Why This Script Is Closed-Source
While Keltner Channels are a known concept, this script focuses on a non-toggle, always-on dual timeframe architecture, combined with independent volatility modeling and visual confluence mapping, which is not provided as a single integrated tool in standard open-source implementations.
Carpe Diem Trading Algo - CoreCarpe Diem Trading Algo - CORE is the central signal engine of the Carpe Diem suite, built to select, track, and score multiple entry methods inside one unified framework. It is designed for traders who want one clean BUY/SELL stream that adapts to the market regime instead of juggling separate indicators.
CORE is inspired by well‑known technical analysis ideas (trend vs range regimes, Z‑Score, Stoch, structure breaks, money flow, ATR‑based risk), but every component is implemented from scratch and then extended, so it is not a wrapper or clone of any public script. What you see on the chart is a custom architecture that combines these concepts into a single regime‑aware, multi‑engine signal and risk/EDGE system.
At the base layer, CORE uses a custom range/regime engine that classifies price into bullish, bearish, or neutral conditions using an ATR‑normalized oscillator around a regime moving average. It measures the distance between price and a configurable MA, normalizes that distance by ATR, smooths it, and then applies a dead zone and “avoid ranging / only ranging” options to define where the system is allowed to trade. All signal engines run through this regime layer, so the same method behaves differently in clean trends vs choppy ranges instead of firing blindly in all conditions.
On top of the regime filter, CORE offers eight interchangeable signal engines that all feed the same BUY/SELL plots, each using classic ideas in a bespoke way:
DER Color‑Match: builds bullish/bearish pressure from weighted positive and negative returns, then creates a separate spike line and requires color‑matched agreement between signal and spike to confirm entries; this is a custom directional returns model, not a port of any public “DER” or “delta” script.
Z‑Score: computes the Z‑score of price over a configurable lookback, smooths it and uses zero‑line crosses only when they align with the background regime; this is a tailored Z‑score implementation inside the CORE regime system, not a direct copy of any existing Z‑score indicator.
TPR (Trend–Pullback–Resume): detects trend extensions away from the regime MA, waits for a controlled pullback into ATR‑scaled proximity bands, then looks for a resume of momentum with strict timeouts for each phase; this three‑stage pattern is coded specifically for CORE and is not based on any one published script.
WTMF Blend: combines a WaveTrend‑style oscillator and a Money Flow measure into a single normalized blend with configurable weights and a “lock‑until‑opposite” behavior; the formulas and blending logic are customized, and CORE does not reuse a public WaveTrend or money‑flow script.
MSB Structure Break & Retest: tracks swing highs/lows, detects breaks using either closes or wicks, and optionally waits for an ATR‑scaled retest window with relaxed or strict modes; it is built specifically for this algo and is not a clone of any existing “MSB/CHOCH” script.
Stoch Regime: uses a centered, sensitivity‑controlled Stoch K/D pair that is only allowed to signal in alignment with the bullish/bearish background regime; this is a custom, regime‑aware Stoch implementation rather than a direct lift of any public Stoch strategy.
Spike Thresholds: computes ATR‑normalized deviation from a moving average, smooths it, and uses separate long/short thresholds to detect spikes that also agree with the regime filter; it is a bespoke spike engine, not a republish of classic “spike” indicators.
Trajectory Momentum: measures ATR‑normalized momentum between fast and slow EMAs plus EMA‑smoothed acceleration, with the option to “lock until opposite” so trends are not exited on every minor correction; this is a custom trajectory design, not a copy of a known open‑source trend tool.
In addition to the main engines, CORE includes proprietary extension/exhaustion markers that run in the background as context only. They use a custom half‑cycle calculation with a configurable half‑length and ATR‑based bands around a composite price (close/open/high/low/median/typical/weighted/average) to track where price is pressing into statistically extended zones. When enabled, these markers plot small X’s at potential extension highs/lows and can trigger optional alerts, giving you an exhaustion layer that is designed specifically for CORE’s regime logic rather than copied from any public “exhaustion” or “extension band” script.
CORE also includes a dedicated DER Spike Strength filter that is unique to this script. It measures both distance and slope between the DER signal and its spike line, builds adaptive baselines over a dynamic lookback, and then derives dynamic thresholds that can gate DER entries or even invalidate an existing DER state when strength fades. You can choose whether strength is only an entry qualifier or also a post‑entry filter.
To evaluate methods over time, CORE runs an internal EDGE tracker that converts trade outcomes into an R‑based score per method and per context. For each BUY or SELL trigger, the script simulates a position with ATR‑based TP and SL, tracks how price evolves over a fixed evaluation window, and assigns an outcome within a bounded R range, including penalties for unresolved trades or both TP and SL being touched in the same bar. Those outcomes feed exponential moving statistics and are mapped into a 0–100 EDGE value. The EDGE model itself is a completely proprietary scoring framework that was designed specifically for CORE.
The risk panel in the top‑right is a persistent table rather than a simple label. For every engine, it shows the last persistent state (BUY, SELL, or FLAT) according to that engine’s logic and the current regime, plus a compact EDGE number that represents the recent average R performance of that engine in context (trend vs. range, long vs. short). The panel uses this EDGE value to drive a traffic‑light color scheme for each engine’s main cell: high EDGE values are shown with a green background to indicate lower historical risk and better recent performance, low EDGE values are shown with a red background to indicate higher historical risk and weaker recent performance, and mid‑range EDGE values are shown in a more neutral tone between those extremes. Cells that are still warming up, or for engines that are not currently being computed, are displayed in a neutral gray so you can immediately distinguish between active, proven engines and inactive or unready rows. This lets you read the panel as “Which engine currently carries the most favorable risk profile here?” instead of only seeing raw signals, and you can use it to avoid running a method that is currently underperforming in this regime while rotating toward engines that have demonstrated stronger recent R outcomes. Optional alerts can fire when the selected engine’s risk state flips between favorable and unfavorable zones so you are notified when the underlying EDGE profile for your chosen method materially changes.
Because this is a vendor‑grade, invite‑only tool, CORE also includes an automatic profile system to help avoid overfitting without forcing you to retune everything manually. Timeframe‑aware defaults adjust core inputs such as range length, dead‑zone size, DER length, Z‑Score lookback, and adaptive strength parameters depending on your chart resolution, and those defaults are further modified by profile (Conservative, Balanced, or Aggressive) and asset preset (Crypto, FX, Indices, or Stocks). You can override any parameter, but the auto profile is designed to give you robust starting points that already respect volatility and instrument behavior.
Usage guidelines:
Use the risk/EDGE panel as a live risk dashboard: focus on engines whose cells show strong green tones with higher EDGE numbers when you want to lean into the current regime, and treat red or gray cells with low EDGE as higher‑risk engines to deprioritize until their recent performance improves.
Choose a signal engine that matches your style (for example, DER or Trajectory for momentum, TPR or MSB for swing structure, or Stoch or Z‑Score for regime‑aware mean reversion).
Keep the range/regime and dead‑zone filters enabled if you want fewer but higher‑quality signals that avoid sideways noise.
Optionally enable extension/exhaustion markers as a context layer to highlight areas where price is statistically stretched, then combine that information with the main BUY/SELL engine (for example, taking TPR or Trajectory signals that align with exhaustion at the edge of a regime zone).
By default, signals are confirmed at bar close to avoid intrabar repaint of entries; you can still enable debug or extra plots for research, but the standard template is the clean BUY/SELL output with the risk/EDGE panel and, optionally, the extension markers.
Final points —
The source code is invite‑only because the combination of the regime engine, DER + adaptive strength framework, multi‑engine signal routing, proprietary extension/exhaustion context, and the fully proprietary R‑based EDGE and risk panel is original to the Carpe Diem suite. While CORE uses well‑known concepts, the way they are integrated and extended in this script is proprietary and not a reproduction of any specific open‑source indicator or strategy
COT: CTA POSITIONINGCOT: CTA POSITIONING
A comprehensive Commitment of Traders (COT) indicator that tracks institutional money manager positioning across futures markets. This indicator displays CTA (Commodity Trading Advisor) net positioning as a percentile rank, helping traders identify potential market extremes and contrarian opportunities.
Key Features:
Multi-Market Coverage: Automatically detects and displays COT data for 60+ futures contracts across equity indices, bonds, currencies, cryptocurrencies, metals, energy, grains, livestock, and softs
Percentile Rank Display: Shows CTA net positioning (long minus short) as a percentile over a customizable lookback period (default 156 weeks ≈ 3 years)
Extreme Zones: Visual highlighting of potential reversal zones when CTAs reach positioning extremes (>80th percentile = bearish, <20th percentile = bullish)
Liquidity Analysis Table (optional): Displays detailed positioning breakdown including:
Gross long and short positions
Net positioning
20-day average volume
Net position as % of average daily volume
Estimated days to unwind net position
Methodology:
The indicator pulls CFTC Commitment of Traders data from both Financial Traders (COT3) and Disaggregated (COT2) reports, focusing specifically on leveraged money managers (CTAs/hedge funds). It calculates:
Net Positioning = CTA Longs - CTA Shorts
Net as % of Open Interest
Percentile rank of current net positioning vs. lookback period
Interpretation:
High readings (>80): CTAs are extremely net long - potential bearish reversal signal
Low readings (<20): CTAs are extremely net short - potential bullish reversal signal
Works best as a contrarian indicator on weekly timeframes
Consider liquidity metrics to assess position size relative to market capacity
Settings:
Lookback Period: Adjustable percentile calculation window (default 156 periods)
Show Table: Toggle detailed positioning and liquidity data display
Supported Markets:
Equity Indices (ES, NQ, RTY, YM), Treasuries (ZT, ZF, ZN, ZB, UB), Currencies (6E, 6J, 6B, 6C, 6A), Crypto (BTC, ETH), Metals (GC, SI, HG, PL, PA), Energy (CL, NG, RB, HO, BZ), Grains (ZC, ZW, ZS, ZM, ZL), Livestock (LE, HE, GF), and Softs (SB, CT, KC, CC, OJ)
Note: COT data is released weekly on Fridays and reflects positions as of Tuesday close. This indicator works best on daily or weekly timeframes.
Data sourced from CFTC Commitment of Traders reports via TradingView's COT library.






















