Edo ControlEdo Control – Market Context, State and Coherence Indicator
Edo Control is a market context and structural analysis indicator designed to help traders evaluate the quality, stability and coherence of market conditions before considering any trading decision.
The indicator does not generate buy or sell signals, does not provide entries or exits, does not predict price direction, and does not replace risk management or trader judgment.
Its purpose is to answer a question that comes before any system or setup:
Do current market conditions justify considering a trade at all?
────────────────────────
GENERAL CONCEPTUAL FRAMEWORK
────────────────────────
Edo Control evaluates the market as a dynamic system composed of:
• Relative price position
• Strength and expansion of the movement
• Internal behavior and transitions
• Coherence across multiple timeframes
These dimensions are analyzed together and represented visually as states, not trading signals.
────────────────────────
CONCEPTUAL CALCULATION BASIS (HIGH LEVEL)
────────────────────────
The indicator combines two main families of metrics:
1) A price positioning metric based on oscillator-type logic, evaluating where price is located within its operational range and relative to an internal equilibrium level.
2) A movement strength and expansion metric based on trend-type logic, measuring whether the current movement is gaining, maintaining or losing intensity.
Both dimensions are dynamically compared and integrated into a normalized score representing the structural quality of the movement, not future direction.
This continuous score is used to classify the market into contextual states that are then displayed through candles, heatmaps and multi-timeframe panels.
────────────────────────
INDICATOR COMPONENTS
────────────────────────
1) Contextual Candles (Control Candles)
Colored candles represent internal market states, not trading signals.
Each color encodes specific combinations of:
• Structural continuation
• Momentum expansion
• Movement degradation
• Transitional phases
• Internal behavioral changes
They allow traders to visually distinguish between stable structure, weakening structure and instability zones.
They do not indicate entries or exits, do not repaint, and are calculated using confirmed data only.
2) Internal State Heatmap
The heatmap represents the intensity, acceleration and internal health of the movement, not trading triggers.
Three display modes are available:
• Multicolor: shows gradual transitions between exhaustion, balance and acceleration.
• Bicolor: summarizes relative strength based on dominant directional context.
• Hybrid: simplifies the reading into healthy or warning states.
The heatmap should be interpreted as internal pressure, balance or exhaustion, never as an entry signal.
3) Integrated Multi-Timeframe Analysis
Edo Control applies the same conceptual framework across multiple timeframes simultaneously.
Each timeframe is represented by a normalized value, typically on a 0 to 1 scale, reflecting the structural quality of the movement on that timeframe.
These values allow traders to assess:
• Timeframe alignment
• Contextual conflicts
• Progressive transitions
• Structural slope and evolution
The goal is to avoid trading against dominant higher-timeframe conditions and to understand the broader market context before executing on lower timeframes.
4) Trading Profiles
The indicator includes predefined profiles for:
• Scalping
• Intraday trading
• Swing trading
• Long-term / position trading
Each profile internally adapts the multi-timeframe structure and contextual sensitivity to the selected trading horizon, without manual optimization or curve fitting.
5) Learning Mode
Edo Control includes an optional learning mode designed to support historical and educational analysis.
This mode allows users to:
• Visualize past states
• Display explanatory labels
• Enable descriptive tooltips
• Study contextual evolution across different market conditions
It can be enabled or disabled freely and does not alter the indicator’s core logic.
6) Modular System and Configuration
All visual components can be enabled or disabled independently:
• Contextual candles
• Heatmap
• Multi-timeframe panels
• Legends and guides
• Learning mode
Users may adjust visual parameters such as opacity, size and layout, while the core logic remains protected to ensure consistent readings and prevent misconfiguration.
────────────────────────
PROTECTED CODE AND JUSTIFICATION
────────────────────────
Edo Control is a closed-source indicator.
Code protection is required because its value lies in:
• The specific combination of metrics
• The normalization system
• The state classification logic
• Multi-timeframe coherence
• The resulting contextual interpretation
This description provides all necessary conceptual information to understand what the indicator does and how it should be interpreted, without exposing implementation details.
────────────────────────
FINAL NOTES
────────────────────────
• Edo Control does not issue trading signals
• No alerts are generated
• It does not replace risk management
• It is designed as a contextual and market quality pre-filter
Use Edo Control to decide WHEN to trade, not HOW to trade.
The final trading decision always remains with the trader.
Analisis Trend
SILVER (XAGUSD) Targets📌 AG Target – XAU-Based Silver Target Levels
AG Target is a ratio-based indicator designed to analyze Silver (XAGUSD) using the price of Gold (XAUUSD) as a reference.
The indicator projects dynamic target, support, and resistance levels on the silver chart by dividing the Gold price by historically significant XAU/XAG ratios.
🔍 How It Works
Retrieves XAUUSD (Gold spot price)
Divides it by predefined XAU/XAG ratio levels
Plots the resulting values directly on the XAGUSD chart
Fixed ratio levels used:
44.260
39.628
31.707
These ratios represent historically important zones in the Gold–Silver ratio.
🎨 Visual Logic
Green line → XAG price is above the level
Red line → XAG price is below the level
Line thickness increases with level importance
🚨 Alert System
The indicator includes individual alerts and one combined alert:
Separate alerts for each ratio level crossover
A single combined alert triggers when XAG price crosses any of the target levels
Alerts are triggered only on real cross events, avoiding repeated signals.
🏷️ Label Features
Automatic target labels on the last bar
Toggle labels on/off
Adjustable transparency, size, and horizontal offset
Labels display:
Current target price
Corresponding XAU/XAG ratio
🎯 Who Is This For?
Traders using the Gold–Silver ratio
Macro and ratio-based analysts
Medium to long-term silver traders
Users who prefer clean, objective price levels on their charts
⚠️ Disclaimer
This indicator is not financial advice.
It is designed as a ratio-based reference tool and should be used together with other technical or fundamental analysis methods.
JD Box Proကျွန်တော် JD Moon ပါ၊
ဒီ Box Indicator က Intraday Trader တွေအတွက် အချိန်ကုန်သက်သာအောင် တကူးတက ဆွဲစရာမလိုအောင် Price Action သမားတွေအတွက် အသုံးလိုတဲ့အရာမို့ ဖန်တီးထားတာပါ၊ အရမ်း ရိုးရှင်းပြီး အရမ်း အသုံးဝင်ပါတယ်။ တစ်ရက်အတွင်း စျေးနှုန်းအရွေ့ကို စောင့်ကြည့်ဖို့ပါ။ အထူးသဖြင့်ကျွန်တော့်အတွက် ဖန်တီးထားတာဖြစ်ပြီး လိုအပ်သူတွေ ကျွန်တော့်လို Chart တိုင်းမှာ လှိုင်းဆွဲဖို့ ငပျင်းလေးတွေ ယူသုံးနိုင်ပါတယ်။
Trading Ocean Forex V6 - Premium🌊 TRADING OCEAN FOREX V6 - PREMIUM EDITION (BTCUSD/XAUUSD)
The ultimate all-in-one trading companion designed for serious traders who want clean signals, multi-timeframe confluence, and institutional-level zone analysis.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ KEY FEATURES
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📢 SMART BUY/SELL SIGNALS
• Proprietary signal algorithm with multiple filters
• Clean, non-cluttering signal markers (▲ ▼)
• Built-in noise reduction for quality entries
• Session-based filtering for optimal trading hours
📊 MULTI-TIMEFRAME STRUCTURE TABLE
• Real-time analysis across 4 timeframes: 15m, 30m, 1H, 4H
• Identifies market structure: Higher Highs, Higher Lows, Lower Highs, Lower Lows
• Shows trend direction for each timeframe (Bullish/Bearish/Ranging)
• Current stage detection: Impulse 🚀, Pullback 🔄, or Reversal ⚠️
• Instant bias summary showing alignment
🏦 SUPPLY & DEMAND ZONES
• Auto-detected institutional buying & selling zones
• Touch counter showing zone strength (⚡1, ⚡2, etc.)
• Smart visibility showing only nearest relevant zones
• Auto-cleanup of broken or exhausted zones
🎯 ACTION PANEL
Instant trade recommendations when signals appear:
• ✅ HIGH CONFIDENCE → Strong setup, consider taking
• ⚠️ PULLBACK ZONE → Good setup, wait for confirmation
• 🔶 MIXED SIGNALS → Risky, reduce position size
• ❌ COUNTER TREND → Against major trend, consider skipping
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 HOW TO USE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1️⃣ Wait for a BUY (▲) or SELL (▼) signal to appear
2️⃣ Check the Action Panel for instant recommendation
3️⃣ Verify confluence with the Structure Table:
• For LONGS: Look for majority bullish timeframes
• For SHORTS: Look for majority bearish timeframes
4️⃣ Note nearby Supply/Demand zones for TP/SL levels
5️⃣ Execute or skip based on overall confluence
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🟢 IDEAL LONG SETUP
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• BUY signal appears
• Action Panel: "HIGH CONFIDENCE" or "PULLBACK"
• Structure Table: 3-4 timeframes bullish
• Price at or near a Demand zone
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔴 IDEAL SHORT SETUP
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• SELL signal appears
• Action Panel: "HIGH CONFIDENCE" or "PULLBACK"
• Structure Table: 3-4 timeframes bearish
• Price at or near a Supply zone
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚙️ CUSTOMIZATION
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• Trading session times (Morning/Evening)
• EMA display settings
• Signal sensitivity filters
• Structure table position & visibility
• Action panel toggle
• Supply/Demand zone appearance
• Zone visibility count
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📈 BEST PRACTICES
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ RECOMMENDED:
• Trade in direction of 4H trend
• Wait for pullback entries when HTF aligned
• Use S/D zones for take-profit placement
• Trade during configured session hours
• Combine with your price action skills
⚠️ AVOID:
• Trading against 4H trend direction
• Entering on MIXED or COUNTER signals blindly
• Ignoring the multi-timeframe table
• Trading outside active sessions
• Over-leveraging on low-confidence setups
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
💡 WORKS BEST ON
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• Forex pairs (majors & crosses)
• Crypto (BTC, ETH, etc.)
• Timeframes: 5m, 15m, 30m, 1H
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ RISK DISCLAIMER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
This indicator is a decision-support tool, not financial advice. No indicator guarantees profits. Always:
• Use proper risk management (1-2% per trade)
• Set stop losses on every trade
• Backtest before live trading
• Never risk more than you can afford to lose
Past performance does not guarantee future results.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
💬 SUPPORT & FEEDBACK
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Found this indicator helpful? Please:
⭐ Leave a like and follow for updates
💬 Comment your results and feedback
📢 Share with fellow traders
Your feedback helps improve future versions!
Happy Trading! 🌊📈🚀
JD Moon - Intraday Box Multi-Colorကျွန်တော် JD Moon ပါ၊
ဒီ Box Indicator က Intraday Trader တွေအတွက် အချိန်ကုန်သက်သာအောင် တကူးတက ဆွဲစရာမလိုအောင် Price Action သမားတွေအတွက် အသုံးလိုတဲ့အရာမို့ ဖန်တီးထားတာပါ၊ အရမ်း ရိုးရှင်းပြီး အရမ်း အသုံးဝင်ပါတယ်။ တစ်ရက်အတွင်း စျေးနှုန်းအရွေ့ကို စောင့်ကြည့်ဖို့ပါ။ အထူးသဖြင့်ကျွန်တော့်အတွက် ဖန်တီးထားတာဖြစ်ပြီး လိုအပ်သူတွေ ကျွန်တော့်လို Chart တိုင်းမှာ လှိုင်းဆွဲဖို့ ငပျင်းလေးတွေ ယူသုံးနိုင်ပါတယ်။
TREND HOANOLink indicator : t.me
---------------------------------------------------
THE INDICATOR IS NAMED: "TREND HOANO"
Please note that this indicator is designed to follow the trend, market direction, and detect effective reversal points.
The indicator includes the following optional functions:
OPERATION MODE: It has 2 modes: "Mode 1" and "Mode 2"
If Mode 1 is selected: All indicators from HN1 to HN6, including all labels, will be fully displayed.
If Mode 2 is selected: Labels will only be displayed when the corresponding function is enabled in the INDICATOR section.
-------------------------------------------------------------
is a custom-built indicator developed by an individual. eloped exclusively for private (invite-only) use. It is designed specifically for analysis and testing purposes
This indicator is not intended for public distribution and may only be applied to charts with the author’s explicit permission. No guarantees or assurances of profit are provided. The indicator is offered “as is” and is intended solely for educational and reference purposes.
If you would like to request access, please contact the author directly
MicroChainAi Structure Stance📊 MicroChainAi Structure Stance|微链智控・结构力场
MicroChainAi Structure Stance 是一款围绕市场结构关系构建的结构解析指标,重点关注价格在关键结构区域中的受力状态、稳定性与结构转换过程。该指标用于提供行情所处结构阶段的判断依据,而非用于捕捉短期交易信号。
MicroChainAi Structure Stance is a structure-focused analysis indicator designed to interpret price behavior around key structural areas. It emphasizes force interaction, stability, and structural transitions, providing context on the current structural phase rather than producing short-term trading signals.
------------------------------
🧩 主要功能与特点|Main Features & Characteristics
📐 结构区域刻画|Structural Zone Mapping
围绕关键价格区域构建结构参考框架,用于观察价格在重要结构区间内的运行方式与反应强度。
Builds a structural reference framework around key price zones to observe how price behaves and reacts within important structural areas.
🔄 结构阶段识别|Structural Phase Identification
辅助判断行情处于结构延续、结构消耗或结构重组阶段,避免将不同结构环境混为一谈。
Helps distinguish between structural continuation, exhaustion, and reorganization phases to avoid misreading different market conditions.
⚖️ 价格受力状态观察|Price Force Observation
通过结构位置与价格行为的配合,提供对多空受力倾向与平衡状态的直观参考。
Provides visual context on directional force and balance by combining structure positioning with price behavior.
🧭 结构环境过滤|Structural Context Filtering
用于过滤结构混乱或不稳定的行情阶段,辅助在结构相对清晰的环境下执行交易规则。
Filters out structurally unstable or unclear conditions, supporting execution under more defined structural environments.
⚠️ 风险感知辅助|Risk Awareness Aid
在结构敏感区域附近提供风险提醒参考,用于仓位与风险控制,而非反向操作依据。
Offers risk-awareness cues near structurally sensitive areas to support position sizing and risk control, not counter-trend actions.
------------------------------
📘 使用建议|Usage Notes
当价格在关键结构区域内出现反复测试或明显反应时,可用于观察结构是否仍具约束力
When price repeatedly tests or reacts clearly within key structural areas, use it to evaluate whether structure remains influential.
当价格快速脱离原有结构并建立新平衡时,往往意味着结构阶段已发生变化
When price decisively leaves a prior structure and establishes a new balance, it often signals a structural phase shift.
建议结合更高时间周期的结构背景使用,以避免在局部结构中产生误判
It is recommended to use this indicator alongside higher-timeframe structural context to reduce local misinterpretation.
------------------------------
⚠️ 风险提示|Risk Disclaimer
本指标仅用于行情结构分析与研究参考,不构成任何投资建议
This indicator is intended for structural market analysis and research purposes only and does not constitute investment advice.
所有判断基于历史价格行为,可能存在滞后或失效情形
All interpretations are based on historical price behavior and may exhibit lag or failure.
请勿将任何单一工具作为交易决策的唯一依据
Do not rely on any single tool as the sole basis for trading decisions.
Engulfing Patter Indicator - po_vetru_pticaEngulfing with the ability to change parameters:
1. Single Engulfing
2. Double Engulfing
3. Triple Engulfing
4. Quadruple Engulfing
Plus breakout line after close level engulfing.
Extensive customization of parameters
MicroChainAi Trend HubMicroChainAi Trend Hub|微链智控・趋势中枢
MicroChainAi Trend Hub 是一款基于价格真实波动构建的趋势结构分析指标,通过动态趋势中枢与波动区间过滤,辅助判断当前市场的主导方向、趋势稳定度以及潜在的结构变化阶段。指标以趋势过滤与方向确认作为核心目标,而非频繁产生交易信号。
MicroChainAi Trend Hub is a trend structure analysis indicator built on real price volatility. By using a dynamic trend center and adaptive range filtering, it helps identify the market’s dominant direction, trend stability, and potential structural transitions. The indicator focuses on trend filtering and directional confirmation rather than generating frequent trading signals.
主要功能与特点|Main Features & Characteristics
动态趋势中枢|Dynamic Trend Center
根据市场波动强度自适应调整的趋势参考中枢,用于区分多头、空头及震荡结构,区别于传统固定参数均线。
A volatility-adaptive trend reference center that adjusts to changing market conditions, designed to distinguish bullish, bearish, and ranging structures. It is fundamentally different from traditional fixed-parameter moving averages.
趋势方向与状态识别|Trend Direction & State Identification
通过中枢的运行方向与价格相对位置,识别趋势延续、减弱或切换阶段,仅在结构发生变化时提示方向变化。
By evaluating the direction of the trend center and the relative position of price, the indicator identifies trend continuation, weakening, or transition phases, and only highlights directional changes when structural shifts occur.
多周期趋势共振评估|Multi-Timeframe Trend Confluence
对不同时间周期的趋势状态进行综合评估,辅助判断当前行情在多周期视角下是否保持一致。
Aggregates trend states across multiple timeframes to help assess whether the current market maintains directional consistency from a broader perspective.
结构支撑与阻力参考|Structural Support & Resistance Reference
自动标记关键结构位置,用于趋势延续或失效的辅助判断,而非精确入场点。
Automatically highlights key structural levels to assist in evaluating trend continuation or failure, rather than serving as precise entry signals.
风险控制辅助提示|Risk Management Assistance
在趋势运行过程中提示潜在风险释放区域,辅助进行仓位与风险管理。
Provides auxiliary risk-awareness markers during trend development, helping traders manage exposure and position risk.
使用建议|Usage Notes
当趋势中枢方向明确且价格稳定运行于中枢同侧时,行情更偏向顺势结构
When the trend center shows a clear direction and price remains consistently on the same side, market conditions tend to favor trend-following structures.
当价格频繁穿越趋势中枢,通常意味着趋势减弱或进入震荡阶段
When price frequently crosses the trend center, it often indicates trend weakening or a transition into a ranging environment.
建议结合更高时间周期趋势状态与个人交易规则一并使用
It is recommended to use this indicator in conjunction with higher-timeframe trend context and personal trading rules.
风险提示|Risk Disclaimer
本指标仅用于行情分析与研究参考,不构成任何投资建议
This indicator is intended for market analysis and research purposes only and does not constitute investment advice.
所有计算基于历史价格数据,存在滞后性与失效风险
All calculations are based on historical price data and may exhibit lag or failure under certain conditions.
请勿将单一指标或信号作为交易决策依据
Do not rely on any single indicator or signal as the sole basis for trading decisions.
Ghost Cipher [Bit2Billions]📌 Ghost Cipher — Range-State & Volatility Flow Engine
Ghost Cipher is a closed-source market state indicator built to identify **whether price is ranging, transitioning, or expanding**, using a volatility-driven range-state model.
Most indicators assume markets are either “trending” or “ranging” based on slope or moving averages. This approach fails during compression, false breakouts, and regime transitions.
Ghost Cipher solves this by classifying price into **distinct range states** using volatility behavior, range efficiency, and expansion pressure — before interpreting direction.
📌 Core Calculation Concept (Range-State Logic)
Ghost Cipher does not attempt to predict direction first.
Instead, it evaluates **how price is behaving** by measuring:
* Volatility compression vs expansion
* Range containment vs escape
* Directional efficiency within a defined range
* Breakout follow-through probability
Price is continuously classified into one of several internal **range states**, such as:
* Balanced / Contained range
* Compression / coil state
* Expansion / breakout phase
* Post-expansion transition
Directional tools only activate once the range state allows them to be meaningful.
This avoids false signals caused by applying trend logic inside non-trending conditions.
📌 Reason for Mashup (Why Multiple Elements Exist)
Ghost Cipher combines smoothing, volatility, liquidity context, and range logic **because range-state determination cannot be made from a single measurement**.
* Volatility alone cannot define structure
* Trend slope alone ignores compression
* Liquidity zones without range context are unreliable
Each component exists **only to support range-state classification**.
This is not a mashup of tools — it is **one range-state model expressed through multiple analytical outputs**.
📌 How the Components Work Together
All modules in Ghost Cipher reference the same internal range-state engine:
1. **Adaptive Smoothing Layer** filters noise and defines the active price envelope.
2. **Volatility Engine** measures compression, expansion, and regime pressure.
3. **Range Boundary Logic** detects containment, equilibrium, and escape attempts.
4. **Liquidity & Reaction Zones** are identified only at range extremes or expansion points.
5. **Trend Bias Tools** activate only during expansion-approved states.
6. **Dashboard Layer** summarizes the current range state and volatility condition.
Because all outputs depend on the same range-state classification:
* Trend signals do not appear during compression
* Liquidity zones are contextually valid
* Breakouts are evaluated by expansion quality, not candle count
📌 What Problem This Script Solves
Ghost Cipher is designed for traders who experience:
* False breakouts
* Trend signals inside ranges
* Overtrading during compression
* Conflicting volatility and trend tools
* Difficulty identifying regime transitions
By classifying market state first, Ghost Cipher provides:
* Clear identification of non-trading conditions
* Valid breakout vs fakeout context
* Controlled activation of directional bias
* Cleaner charts with fewer false signals
📌 How Traders Use Ghost Cipher
Ghost Cipher is **not** an entry system.
Traders use it to:
* Identify when the market is tradable
* Avoid compression and chop
* Confirm valid expansion phases
* Understand post-breakout behavior
* Maintain consistency across markets and timeframes
All outputs are **contextual**, not automated trades.
📌 Why This Script Is Original
Ghost Cipher does not rely on:
* Fixed Bollinger logic
* Simple ATR thresholds
* Moving-average slope detection
Its originality lies in:
* Continuous range-state classification
* Volatility-driven regime validation
* Conditional activation of directional logic
* Unified state engine shared across all modules
This behavior cannot be achieved by combining standard volatility or trend indicators.
📌 Why This Script Is Invite-Only
Ghost Cipher replaces multiple manual processes:
* Range marking
* Compression detection
* Breakout validation
* Volatility regime filtering
* Trend activation timing
Its value lies in **how range-state and volatility flow are classified and enforced**, which requires proprietary logic and is therefore provided as a closed-source, invite-only script.
📌 Key Features & Components
1. Candles & Visualization
* Custom Heikin-Ashi–style candle coloring for a clean chart.
* Multi-timeframe overlays to highlight higher-timeframe influence.
2. Smoothed Trend Processing
* Proprietary smoothing for noise-reduced trend detection.
* Zero-Lag Multi-Ribbon: layered momentum ribbon with gradient shading for lag-free directional assessment.
3. Liquidity & Institutional Mapping
* Real-time liquidity depth visualization.
* Detection of pockets, imbalance zones, and resting liquidity clusters.
* Smart Bullish & Bearish Order Blocks with mitigation-focused logic.
4. Dynamic Demand & Supply Engine
* Auto-detection of institutional demand/supply zones.
* Adaptive boundaries respond to volatility, displacement, and liquidity conditions.
5. Volatility & Channel Tools
* Adaptive Bollinger-style volatility bands.
* Macro trendlines, break structures, and volumetric channel mapping.
6. Intelligent Market Flow Tools
* Dynamic Magic Line: adapts to real-time volatility, range compression, and volume shifts.
* CRT Candle Range Theory: detects ranges, equilibrium zones, and breakout/reaction signals.
7. Market Sessions
* Highlights bull/bear sessions for directional bias and structural insight.
📌 Dashboard Metrics
* Volume Delta Dashboard: aggregated BTC delta across major exchanges; multi-asset pairing for comparison.
* Market Overview Panel: current bias, trend regime, and structured analyst notes.
📌 Chart Clarity & Design Standards
* Only essential real-time labels displayed; historical labels hidden.
* Organized visuals with consistent colors, line types, and modular design for quick interpretation.
📌 How to Use / What Traders Gain
* Reduces manual charting and repetitive analysis.
* Speeds workflow using rule-based, automated visualization.
* Cuts through market noise for consistent, structured insights.
* Supports multi-timeframe and multi-market analysis.
📌 Inputs & Settings
* Default settings pre-configured
* Simple Show/Hide toggles for modules
* Minimal exposed fields for ease of use
📌 Recommended Timeframes & Markets
* Works best on 15M, 1H, 4H, Daily, and higher
* Suitable across forex, crypto, indices, and liquid equities
* Pivot-based modules may show noise on illiquid assets
📌 Performance & Limitations
* May draw many objects → disable unused modules for speed
* Refresh the chart if historical buffer issues occur
* TradingView platform limitations handled internally
📌 License & Legal
* Proprietary © 2025
* Redistribution, resale, or disclosure prohibited
* Independently developed with proprietary extensions
* Any resemblance to other tools may result from public-domain concepts
📌 Respect & Transparency
* Built on widely recognized public trading concepts.
* Developed with respect for the TradingView community.
* Any overlaps or similarities can be addressed constructively.
📌 Disclaimer
* Educational purposes only
* Not financial advice
* Trading carries risk — always use paper testing and proper risk management
📌 FAQs
* Source code is not public
* Works best on 15m, 1H, 4H, Daily, Weekly charts
* Modules can be hidden/shown with toggles
* Alerts can be set up manually by users
* Supports multiple markets: forex, crypto, indices, and equities
📌 About Ghost Trading Suite
Author: BIT2BILLIONS
Project: Ghost Trading Suite © 2025
Indicators: Ghost Matrix, Ghost Protocol, Ghost Cipher, Ghost Shadow
Strategies: Ghost Robo, Ghost Robo Plus
Pine Version: V6
The Ghost Trading Suite is designed to simplify and automate many aspects of chart analysis. It helps traders identify market structure, divergences, support and resistance levels, and momentum efficiently, reducing manual charting time.
The suite includes several integrated tools — such as Ghost Matrix, Ghost Protocol, Ghost Cipher, Ghost Shadow, Ghost Robo, and Ghost Robo Plus — each combining analytical modules for enhanced clarity in trend direction, volatility, pivot detection, and momentum tracking.
Together, these tools form a cohesive framework that assists in visualizing market behavior, measuring momentum, detecting pivots, and analyzing price structure effectively.
This project focuses on providing adaptable and professional-grade tools that turn complex market data into clear, actionable insights for technical analysis.
Crafted with 💖 by BIT2BILLIONS for Traders. That's All Folks!
📌 Changelog
v1.0 Core Release
* Custom Heikin-Ashi Candles: Clean, visually intuitive candle designs for effortless chart reading.
* Smoothed Moving Averages: Advanced smoothing algorithms for precise trend tracking and confirmation.
* Liquidity Depth Visualization: Real-time insight into liquidity levels, depth pockets, and imbalance zones.
* Dynamic Demand & Supply Mapping: Automatic detection of institutional demand and supply zones with adaptive boundaries.
* High-Timeframe Candle Zones (HTF): Dual HTF candle overlays for macro-level trend context and control over candle count.
* Trend Lines & Channels: Macro and aggressive volumetric trendlines for structured market flow analysis.
* Zero-Lag Moving Average Ribbon: Layered ribbon with shaded gradients for smoother, lag-free momentum visualization.
* Volatility Bands: Adaptive Bollinger-style bands for dynamic range analysis.
* Dynamic Magic Line: Self-adjusting line responding to real-time volatility and volume shifts.
* CRT Candle Range Theory: Automatic detection and visualization of CRT candle ranges and range-based signals.
* Bull & Bear Sessions: Highlights key market sessions to identify directional bias and volatility shifts.
* Order Blocks: Smart detection of bullish and bearish institutional order blocks.
* Dashboard Module:
* Volume Delta Dashboard: Aggregated delta volume from all major exchanges for BTC, with the ability to pair up to 4 additional assets.
* Market Overview Panel: Displays current bias, trend insights, and actionable analyst notes.
Eagle Algo Pro v0.2This script, "Eagle Algo Pro v0.2," combines trend-following and mean-reversion concepts to assist traders in identifying potential trade entries. It is designed to work on various timeframes and integrates three distinct analytical components:
1. Eagle Trend Strategy (Channel Breakout):
This module utilizes a Donchian-style channel (Highest High and Lowest Low over a user-defined period) to detect trend breakouts.
- Logic: A "CALL" signal is generated when the price closes above the upper channel line, indicating bullish momentum. Conversely, a "PUT" signal is generated when the price closes below the lower channel line.
- Utility: Helps traders spot the beginning of new trends or breakouts from consolidation.
2. S/R & Reversal Strategy (Support/Resistance & Pivots):
This component identifies key Support and Resistance zones using Pivot Points derived from historical price action.
- Logic: The script calculates pivot highs and lows to draw dynamic support/resistance boxes. It then looks for price rejections (wicks) near these zones combined with RSI filtering (Overbought/Oversold conditions).
- Utility: Useful for finding reversal points where price is likely to bounce.
3. RiViL Channel (Linear Regression):
A Linear Regression Channel that visually displays the current trend direction and deviation levels.
- Utility: Provides visual context on whether the price is overextended (near the edges of the channel) or moving with the mean trend.
Dashboard Features:
The script includes a performance dashboard that tracks historical signals for both strategies, displaying Total Signals, Wins, Losses, and Win Rate based on the chart history. This allows for quick backtesting and parameter tuning.
Disclaimer:
This tool is for educational purposes and market analysis only. Past performance does not guarantee future results.
Sri - Pivot (Daily /Weekly / Monthly / 6M)📌 Sri – Pivot (Daily / Weekly / Monthly / 6M)
Sri – Pivot+ is a multi-timeframe pivot and CPR framework designed to visualize short-term trading zones and higher-timeframe market structure simultaneously on a single chart.
The script combines fixed higher-timeframe pivots (Weekly, Monthly, 6-Month) with an independently configurable CPR engine (CPR2) that supports multiple pivot methodologies and developing levels.
This indicator is built to help traders contextualize intraday price action within higher-timeframe support, resistance, and equilibrium zones, rather than treating pivots as isolated levels.
🔹 Core Concepts Used
This script is not a single pivot calculator, but a layered pivot architecture built around:
Higher-Timeframe Structural Levels
Central Pivot Range (CPR) compression & expansion logic
Dynamic time-adaptive pivot resolution
Developing (in-progress) CPR projection
🔹 What Makes This Script Different
1️⃣ Fixed Higher-Timeframe Structural Pivots (Auto-Anchored)
The script automatically plots only the current active levels for:
Weekly pivots
Monthly pivots
6-Month (Half-Yearly) pivots
Each timeframe uses:
Full Pivot + BC + TC (CPR)
S1–S5 / R1–R5
Distinct color systems and line styles to visually separate structural importance
These levels are anchored to the exact period open/close timestamps, avoiding repainting and misalignment issues commonly seen in simpler pivot scripts.
Purpose: Identify institutional reference zones where reactions are statistically more meaningful.
2️⃣ CPR2 – Independent Advanced CPR Engine
CPR2 is a separate pivot engine running alongside structural pivots, allowing traders to overlay short-term tradable zones without interfering with higher-timeframe context.
CPR2 supports:
Traditional
Fibonacci
Classic
Camarilla pivots
Selectable CPR resolutions:
Auto
Daily
Weekly
Monthly
Quarterly
Half-Yearly
Yearly
The Auto mode adapts to the chart timeframe, switching resolution intelligently (e.g., intraday → Daily / Weekly).
3️⃣ Developing CPR (Forward Projection)
Unlike static pivots, this script calculates and projects:
Developing CPR
Developing R1 / S1
These levels update during the active session using evolving OHLC data and can be:
Extended forward (holiday-aware)
Visualized as filled CPR zones
Purpose: Anticipate future equilibrium zones before the session closes.
4️⃣ Historical vs Current Pivot Control
Users can independently choose:
Only current session levels
Or historical pivot levels (lookback-controlled)
This prevents chart clutter while still allowing contextual back-analysis.
🔹 Practical Trading Use Cases
Trend Days
Price holding above CPR and respecting higher-timeframe R/S levels.
Range Days
CPR compression with price oscillating between S1–R1.
Reversal Zones
Confluence between:
Weekly / Monthly pivots
Developing CPR boundaries
Camarilla or Fibonacci extensions
🔹 Design & Performance Considerations
Uses time-anchored security calls to avoid repainting
Optimized drawing logic to respect TradingView limits
Clear visual hierarchy (Weekly → Monthly → 6M → CPR2)
Suitable for index, equity, and futures markets
⚠️ Important Notes
This is not a buy/sell signal indicator
Designed for context, planning, and confluence
Best used alongside price action, volume, or trend tools
📊 Recommended Chart Usage
Intraday charts: 5m / 15m / 30m
Swing charts: 1H / 4H / Daily
Works on all liquid instruments
Angular Moving AveragesMETHODOLOGICAL GUIDE: ANGULAR MOVING AVERAGES
Pedagogical Introduction
Most traders make the mistake of viewing moving averages as simple support or resistance lines. However, the true power of a moving average lies in its slope vector. This script is designed to transform visual subjectivity into precise mathematical data, allowing the trader to quantify the acceleration or deceleration of a trend through an angular measurement system and a dynamic "pool" of alerts.
1. Dynamic Level System (Highs & Lows)
This module projects horizontal lines marking the most recent significant highs and lows detected by the algorithm. While its primary function is structural, its true power lies in its integration with the RSI.
• Color Logic: These lines are not static; they change color based on the state of the RSI oscillator (user-configurable).
◦ Fuchsia (Overbought/Oversold): Activated when the RSI reaches critical thresholds (default >= 70 or <= 30). It indicates that the price has reached a threshold of mass participation or exhaustion.
◦ Yellow (Transition Zones): Indicates that the price is entering cautionary terrain (60-70 or 30-40).
◦ Gray (Neutral Zone): The market is in a relative equilibrium (40-60), ideal for identifying consolidation phases.
• Utility: Allows the trader to know at a glance whether current support and resistance levels are validated by a momentum condition in the RSI.
2. Fibonacci Reference Frame (Background Structure)
As a visual complement, the script integrates an Automatic Fibonacci Retracement based on recent highs and lows. This system is designed as a low-opacity "watermark" to avoid obstructing price action.
• Reaction Zones: The system delimits three key bands:
1. Zone 23.6% to 38.2%: The first retracement filter.
2. Zone 38.2% to 50.0%: The movement's equilibrium level.
3. Zone 50.0% to 61.8%: The area of maximum relevance for continuity or reversal.
3. The Control Center (Angular Dashboard)
The table is a real-time data processor that divides its analysis into three fundamental pillars, as shown in the technical capture:
A. Moving Average Angle Matrix
Located in the upper left, it measures the vectorial slope of 5 different moving average architectures: Simple (S), Exponential (E), Weighted (W), Hull (H), and ALMA (A).
• Data Interpretation: The numbers inside the cells represent the exact angle of the vector. A positive number indicates an ascent, and a negative number indicates a descent.
• Period Versatility: The system allows for custom lengths for each type. For example, a user can compare three ALMA 10-period averages simultaneously to observe subtle variations in the micro-trend.
B. Quantitative High/Low Reference
The yellow section of the table displays the nominal values (exact prices) of the last detected Highs and Lows. This facilitates quick and precise order management (Stop Loss or Take Profit) without the need for external tools.
C. Angular Alerts Pool (Alert & Color Logic)
This is the most critical and advanced section of the table. It acts as the "filter" that decides which information is relevant to the trader.
• Smart Color-Coding: Cells turn Green or Red when angles meet specific pre-configured criteria.
• Lateralization Detection: A key pedagogical aspect is observing when short-term averages (following the price) mark green while long-term ones remain red. This divergence alerts the trader to transition or sideways phases, preventing entries in false trends.
• "Waterfall" Configuration: Allows for confirming that the movement has constant inertia (such as the three cascading ALMA 10s) before executing a trade.
• Total Integration: The Alerts Pool can also affect the visualization of the high and low levels on the chart.
Customization and Technical Restrictions
This system has been designed as a highly adaptable tool for any trading style. All numerical values, moving average lengths, colors, and visualization elements are fully user-configurable, with one single exception:
• Fibonacci Values: The levels 23.6%, 38.2%, 50.0%, and 61.8% remain fixed to ensure the integrity of the mathematical retracement metric. However, their colors and visibility can be customized to suit any visual theme (Dark or Light).
MODULAR CONFIGURATION & HYPER-SCALABLE ALERTS POOL
This system is not a rigid tool; it is a technical engineering environment designed for objective market measurement. Although specific setups are shown in the visual examples, the user has absolute control to adapt the indicator to their own analysis methodology.
1. Moving Average Configuration & Algorithmic Versatility
The engine processes 5 families of algorithms (SMA, EMA, WMA, HULL, and ALMA) with total flexibility:
• Custom Lengths: Although the system includes default values (10, 50, 100, 200), you can freely reconfigure them. For example, you can work with "pairs" of averages (two 20-period and two 55-period) to analyze different sensitivities.
• Style Personalization: The user decides which averages to display on the chart to maintain operational clarity, while the engine continues to process the rest of the data in the background.
• Instant Refresh: Any change in configuration is immediately updated in both the 20 vectors and the data table (Dashboard).
2. The Technical Alerts Pool: Centralized Intelligence
The alert management unifies up to 22 technical variables into a single output, optimizing TradingView resources and the trader's attention.
• Operational Efficiency: When the alarm sounds on your device, the Dashboard will accurately indicate which of the 22 variables (Price Breakouts or Angular Vectors) triggered the signal.
• Threshold Logic:
◦ Value 0: Alert disabled.
◦ Positive Value ($>0$): Identifies the strengthening of a bullish trend. The alert triggers when the angle is greater than or equal to the programmed value.
◦ Negative Value ($<0$): Identifies the strengthening of a bearish trend. The alert triggers when the angle is less than or equal to the programmed value.
• Mathematical Integrity: The program operates internally with high-precision decimals. If you program an alert at 20°, the system will only trigger it upon reaching the exact value (e.g., 20.00°). The Dashboard's visual rounding to whole numbers is purely aesthetic; the execution is strictly technical.
Technical Case Analysis (visual examples)
The following sequence of attached screenshots demonstrates the system's filtering and detection capabilities:
1. Bearish Trend Scenario
1. Initial Setup: This image shows two overlapping menus. First, the Style tab (where Hull averages are selected as a visual reference) and, second, the Alerts menu with negative values configured to detect downward trend strength.
2. Chart Response: The next capture shows the technical result: 20 aligned vectors and the price confirming the downward movement after the programmed breakouts.
2. Bullish Trend Scenario.
1. Threshold Setup: Capture showing the adjustment of values in the configuration menu, this time set with positive parameters to identify upward trend acceleration.
2. Chart Response: Image illustrating the expansion of the vectorial fan and the health of the bullish trend in full development.
Consolidation Filtering:
In these examples, a critical feature is evident: during periods of consolidation or sideways ranges, fast averages react to price noise, but slow ones maintain their trajectory. Thanks to the Alerts Pool, the user can filter this behavior and receive notifications only when the trend regains its real angular strength.
TECHNICAL ARCHITECTURE: VECTORIAL PRECISION
Total scale independence and cross-device consistency
The major problem with conventional angular indicators is that their appearance changes depending on the zoom level or screen size, leading to subjective and erroneous signals. This indicator solves this issue through a vector-based architecture that maintains absolute integrity.
You can observe the same asset, on the same timeframe and at the same time, from a mobile phone or a large desktop monitor; the angle and projected force will be identical. The inclination of the vectors is an objective measurement that does not depend on how you stretch or compress the chart on your screen.
Visual stability example (Standard scenario):
In this first link , you can observe the behavior of the vectors on a chart with normal proportions. I have used the Bar Replay tool to keep the scenario fixed and allow for a real comparison.
Visual stability example (Deformed chart):
In this second link , I have extremely deformed the chart. As you can see, while the price and candles change their visual appearance, the vectors maintain the exact same angle and position, proving that the force measurement is undisturbed by scaling.
TRADING ECOSYSTEM: ANGULAR VOLATILITY & EDITOR'S PICK SEAL
This moving average indicator serves as a complement to my Angular Volatility methodology. It is part of an analytical system that I have shared chronologically and transparently, allowing for a clear understanding of how these tools evolve within the market.
It is important to highlight that the technical robustness of this approach was officially recognized when my second publication in this series received the Editor’s Pick distinction. This endorsement from TradingView moderators validates the technical foundation of the angular analysis that I continue to expand today with this new script, designed to measure vector and force.
To fully understand the ecosystem and how this indicator enhances volatility and directional readings, you may consult the following public publications in their order of development:
1. Core Methodology (Script):
2. Awarded Market Analysis (Editor’s Pick):
3. Technical Educational Series (Case Studies):
EVALUATION ACCESS & CONTACT PROTOCOL
To allow you to personally verify the effectiveness of this vector and force system in your own trading, I am granting a 15-day temporary evaluation access.
How to request and manage your access:
1. Initial Request: Leave a comment directly on this publication requesting the trial. This allows me to immediately identify your profile and enable the invitation.
2. Activation and Location: Once I receive your comment, I will activate your access. You can find the indicator on your TradingView chart by going to the "Indicators" menu and looking for the folder named "Invite-only scripts". I will reply to your comment simply to confirm that access has been granted and to provide the expiration date.
3. Communication: To avoid cluttering the public comments section, I will send you a Private Message (TradingView Chat) with additional details. Through this private chat, we can maintain fluid communication. If you require permanent access, you can contact me via Facebook (link available in my author profile).
Important Note on Privacy:
Please do not share emails, phone numbers, or external links in the public comments. TradingView prohibits the exchange of personal data in this section, and both parties could face sanctions. For any details requiring external contact, please use the link in my profile or the private chat.
MARKET CALIBRATION, TIMEFRAMES, AND FUTURE UPDATES
It is fundamental to understand that this system does not use a generic formula. Each market and each timeframe requires exhaustive study and individual calibration to ensure that the vectors accurately represent the real force of the movement.
Currently, the script is calibrated exclusively for Cryptocurrency and Forex markets (options you will find in the settings menu). If there is solid interest from the community, I will undertake the calibration process for other assets such as Stocks, Indices, or Commodities—a task that requires time, patience, and rigorous technical study.
Regarding timeframes, the system is optimized to work on 1m, 5m, 15m, 30m, 1h, 4h, Daily, and Weekly charts. Outside of these ranges, the indicator will not perform readings to protect the integrity of the analysis. However, additional timeframes can be added upon direct request from subscribers, with the understanding that each new timeframe must undergo its own individual calibration process before being integrated into the code.
ADAPTABILITY AND FUTURE MOVING AVERAGES
Although the core of the indicator is optimized for a specific moving average configuration, the system has been designed with a flexible architecture that allows for the integration of other types of averages based on trading needs.
Technical Limits and Customized Versions:
It is important to consider that each added type of moving average consumes processing resources within TradingView. Due to the calculation and validation limits imposed by the platform to maintain chart performance, it is not feasible to include every possible variation within a single script.
However, this limitation is easily resolved through the creation of derivative or specific versions. Upon request from subscribers, these new moving averages can be incorporated into future releases or customized versions, ensuring that the tool adapts to your strategy without sacrificing fluid performance and vectorial precision.
Wyckoff Accumulation Distribution [Wisco]Labels Accumulation, Manipulation and Distribution areas on the chart in real time, non repainted. Many settings to adjust line thickness, opacity, color, etc.
Flexible Moving Average SuiteFlexible Moving Average Suite is a customizable moving average indicator that allows traders to configure up to 4 independent moving average lines with full control over calculation method, period, source, color, and line width.
Key Features:
Dual Calculation Methods: Choose between Simple Moving Average (SMA) or Exponential Moving Average (EMA) for each line independently
Full Customization: Adjust period length (1-∞), data source (close, open, high, low, etc.), color, and line width for each MA
Individual Toggle Controls: Show or hide each moving average line as needed
Default Configuration: Pre-configured with commonly used Fibonacci-based periods (5, 13, 21, 34) for quick start
Clean Visualization: Professional color scheme with distinct colors for easy identification
How to Use:
Add the indicator to your chart
Open Settings → "均线系统设置" (Moving Average Settings)
For each MA line (MA1-MA4):
Toggle visibility on/off
Select calculation type (SMA/EMA)
Choose data source (default: close)
Set period length
Adjust line width
Pick your preferred color
Click "OK" to apply changes
Best Practices:
Use multiple timeframes to identify trend alignment
Shorter periods (5-13) respond quickly to price changes, suitable for entry signals
Longer periods (21-34+) help identify major trend direction
Color-code your MAs consistently across charts for better visual recognition
Combine with price action and volume for confirmation
Technical Details:
Written in Pine Script v6
Overlay indicator (displays on price chart)
Lightweight and efficient
Open source under Mozilla Public License 2.0
No repainting
Default Settings:
MA1: EMA(5) - Yellow (#f6c309)
MA2: EMA(13) - Orange (#fb9800)
MA3: EMA(21) - Deep Orange (#fb6500)
MA4: EMA(34) - Red (#f60c0c)
This indicator is ideal for traders who need a simple, reliable, and highly customizable moving average solution without unnecessary complexity.
中文说明 (Chinese Description)
灵活均线系统 是一个可定制的移动平均线指标,允许交易者配置最多4条独立的移动平均线,并完全控制计算方法、周期、数据源、颜色和线宽。
主要特点:
双重计算方法: 每条线可独立选择简单移动平均线(SMA)或指数移动平均线(EMA)
完全自定义: 为每条MA调整周期长度(1-∞)、数据源(收盘、开盘、最高、最低等)、颜色和线宽
独立开关控制: 根据需要显示或隐藏每条移动平均线
默认配置: 预配置常用的斐波那契周期(5、13、21、34)以便快速开始
清晰可视化: 专业配色方案,不同颜色便于识别
使用方法:
将指标添加到图表
打开设置 → "均线系统设置"
对于每条MA线(MA1-MA4):
切换显示/隐藏
选择计算类型(SMA/EMA)
选择数据源(默认:收盘价)
设置周期长度
调整线宽
选择您喜欢的颜色
点击"确定"应用更改
最佳实践:
使用多个时间周期识别趋势一致性
较短周期(5-13)快速响应价格变化,适合入场信号
较长周期(21-34+)帮助识别主要趋势方向
在不同图表上一致地为MA配色,以获得更好的视觉识别
结合价格行为和成交量进行确认
技术详情:
使用Pine Script v6编写
覆盖指标(显示在价格图表上)
轻量高效
Mozilla Public License 2.0开源
不会重绘
默认设置:
MA1: EMA(5) - 黄色 (#f6c309)
MA2: EMA(13) - 橙色 (#fb9800)
MA3: EMA(21) - 深橙色 (#fb6500)
MA4: EMA(34) - 红色 (#f60c0c)
该指标非常适合需要简单、可靠且高度可定制的移动平均线解决方案的交易者。
PK Scalper Pro Neon Cloud Killzone Dashboard 📌 Overview
PK Scalper Pro — Neon Cloud + Killzone Dashboard (JST) combines a Wilders ATR trail,
Fibonacci entry zones, session/killzone context, and a 7-factor environment score
to form a dynamic trend-following scalping strategy.
It adapts in real time to volatility, aiming for higher entry precision and optimized risk.
⚠️ For educational and research purposes only. Past performance does not guarantee future results.
🎯 Strategy Objectives
React quickly to sharp moves and reversals while using hysteresis (bar confirmation)
to suppress noise and deliver stable scalping signals.
✨ Key Features
Neon Cloud visualization (Full / Entry / Premium-Discount / Fib Bands / Upper / Middle / Lower modes)
7-factor scalping score (ATR compression / ADX / Volume / Candle range / Range compression / RSI / BB width)
— quantified 0–10 to measure environment suitability
Stable state machine combining Sensitivity × Stability (confirmation bars)
to determine start/end states reliably
📊 Trading Rules
Long Entry:
Trend = +1 and price <= f2 (78.6%), with is_scalping_time = true
Optimal zone: between f3 (88.6%) and l100 (trail); automatic “Fib Entry (Long)” label
Short Entry:
Trend = −1 and price >= f2 (78.6%), with is_scalping_time = true
Optimal zone: between f3 and l100; automatic “Fib Entry (Short)” label
Exit / Reversal:
Reverse or close on Trend crossover/crossunder
When is_scalping_time = false is confirmed, prioritize taking profit
💰 Risk Management Parameters
Recommended timeframes: 1–15m (FX / Indices / Crypto)
Example: Account $10,000 / Commission 0.02% / Slippage 1.0 pips / Risk 1% per trade
SL = ATR(14) × 1.5, TP = SL × Target R:R (default 2.0)
⚙️ Trading Parameters & Considerations
ATRPeriod = 200 / ATRFactor = 8 / trailType = "modified"
Sensitivity = "Medium" (entry ≈6, exit ≈4) / Stability = "Normal" (confirmation bars = 3)
Fibonacci: ex↔trail range → f1=61.8, f2=78.6, f3=88.6, eq=50, l100=trail
Killzone shown in JST; priority order NY > LDN > TKY, with remaining time countdown
🖼 Visual Support
Highlights optimal zone (f3→100%) and Premium/Discount areas; PRIME conditions shown with purple background
Dashboard displays direction 📈/📉, score, confirmation progress, Killzone (JST), TP/SL guidance, and Session info
🔧 Strategy Improvements & Uniqueness
Introduces a 7-factor score + hysteresis to quantify and stabilize “enter/stop” conditions
Defines precise deep pullback zone (88.6–100%) as optimal entry area
Neon multi-layer cloud + fixed-row dashboard for high visibility and live stability
✅ Summary
PK Scalper Pro integrates momentum (Trend), volatility adjustment (ATR), and multi-factor scoring
into a responsive scalping framework.
Its clear visuals and practical design improve reproducibility and decision confidence.
⚠️ No guarantee of future profits — always apply disciplined position sizing and risk management.
Harmonic Oscillator - Multi-Component Momentum ConsensusHarmonic Oscillator - Multi-Component Momentum Consensus
Harmonic Oscillator is a seven-component momentum analysis system that transforms standard oscillators into a unified consensus framework. The indicator combines RSI, Stochastic RSI, MACD, EMA Trend, Momentum, Volume, and Divergence Zone detection into a single composite oscillator with automatic regime classification and qualified voting.
Rather than monitoring multiple separate indicators, traders can observe how these momentum calculations align or diverge through a single panel displaying vote count (X/7), regime state (TRENDING/BIAS/RANGING), and a normalized composite line.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗢𝗩𝗘𝗥𝗩𝗜𝗘𝗪
Traditional momentum analysis often requires monitoring multiple oscillators simultaneously: RSI for momentum strength, Stochastic for extreme zones, MACD for trend-following momentum, and so on. Each indicator has its own scale, its own interpretation rules, and its own blind spots.
Harmonic Oscillator addresses this by implementing a voting system where seven independent components each cast a vote based on their specific criteria. The indicator then:
• Counts votes to show consensus level (displayed as X/7)
• Blends three oscillators into a single normalized composite line (0-100 scale)
• Classifies market regime based on composite position and baseline confirmation
• Detects divergences between price structure and oscillator structure
• Filters signals through optional higher timeframe trend alignment
The result is a unified view of momentum conditions that may help traders identify when multiple factors are agreeing versus conflicting.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗛𝗢𝗪 𝗜𝗧 𝗪𝗢𝗥𝗞𝗦
The indicator is built around one core principle: momentum readings are more meaningful when multiple independent calculations agree.
𝗧𝗵𝗲 𝗦𝗲𝘃𝗲𝗻 𝗩𝗼𝘁𝗶𝗻𝗴 𝗖𝗼𝗺𝗽𝗼𝗻𝗲𝗻𝘁𝘀
Each component analyzes a different aspect of momentum and casts a bullish, bearish, or neutral vote:
𝟭. 𝗥𝗦𝗜 (𝗠𝗼𝗺𝗲𝗻𝘁𝘂𝗺-𝗔𝘄𝗮𝗿𝗲)
What it does: RSI is calculated with additional RMA smoothing to reduce noise. The voting logic requires both threshold position AND slope confirmation. RSI must be above 50 with rising slope to vote bullish, or below 50 with falling slope to vote bearish. Special conditions detect potential reversals (RSI below 30 but rising).
How to interpret it: A green RSI arrow in the panel indicates bullish momentum with directional confirmation. A red arrow indicates bearish. Gray dash means RSI is not showing clear directional conviction.
𝟮. 𝗦𝘁𝗼𝗰𝗵𝗮𝘀𝘁𝗶𝗰 𝗥𝗦𝗜 (𝗦𝗹𝗼𝗽𝗲 𝗔𝗻𝗮𝗹𝘆𝘀𝗶𝘀)
What it does: Stochastic RSI uses EMA smoothing on K and D lines for stability. The vote requires K-line momentum alignment: K above D with positive slope for bullish, K below D with negative slope for bearish.
How to interpret it: This component captures turning points in momentum. When SRSI votes while RSI doesn't (or vice versa), it may indicate the oscillators are at different phases of a move.
𝟯. 𝗠𝗔𝗖𝗗 (𝗛𝗶𝘀𝘁𝗼𝗴𝗿𝗮𝗺 𝗔𝗰𝗰𝗲𝗹𝗲𝗿𝗮𝘁𝗶𝗼𝗻)
What it does: Rather than voting on histogram direction alone, MACD votes on histogram acceleration, which is the rate of change of the histogram. This approach aims to identify momentum shifts before the histogram crosses zero.
How to interpret it: MACD acceleration can signal momentum changes early. A bullish vote means histogram is positive and accelerating, OR negative but accelerating upward.
𝟰. 𝗘𝗠𝗔 𝗧𝗿𝗲𝗻𝗱 (𝗣𝗼𝘀𝗶𝘁𝗶𝗼𝗻 + 𝗦𝗹𝗼𝗽𝗲)
What it does: Requires both price position relative to EMA AND slope confirmation. Price above EMA with positive EMA slope = bullish vote. Price below EMA with negative slope = bearish vote.
How to interpret it: This prevents votes in ambiguous situations where price is above a falling EMA or below a rising EMA. The EMA vote indicates clear trend alignment.
𝟱. 𝗠𝗼𝗺𝗲𝗻𝘁𝘂𝗺 (𝗥𝗮𝘁𝗲 𝗼𝗳 𝗖𝗵𝗮𝗻𝗴𝗲)
What it does: Uses smoothed Rate of Change (ROC) with the same qualification requirement: ROC positive AND increasing for bullish, ROC negative AND decreasing for bearish.
How to interpret it: Pure momentum measurement. When MOM agrees with trend components, directional conviction may be higher.
𝟲. 𝗩𝗼𝗹𝘂𝗺𝗲 (𝗖𝗼𝗻𝗳𝗶𝗿𝗺𝗮𝘁𝗶𝗼𝗻)
What it does: Compares current volume to recent average. Votes bullish when volume is elevated (1.2x+ average) on an up candle. Votes bearish when elevated volume accompanies a down candle.
How to interpret it: Volume confirmation adds weight to directional moves. Low volume readings during directional moves may indicate less conviction.
𝟳. 𝗗𝗶𝘃𝗲𝗿𝗴𝗲𝗻𝗰𝗲 𝗭𝗼𝗻𝗲
What it does: Detects when price and oscillator are in extreme zones with structural disagreement. Votes bullish when oscillator is oversold but price is making higher lows. Votes bearish when oscillator is overbought but price is making lower highs.
How to interpret it: This component specifically looks for potential reversal setups where momentum and price structure are disagreeing.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗪𝗛𝗬 𝗧𝗛𝗘𝗦𝗘 𝗖𝗢𝗠𝗣𝗢𝗡𝗘𝗡𝗧𝗦 𝗪𝗢𝗥𝗞 𝗧𝗢𝗚𝗘𝗧𝗛𝗘𝗥
The seven components are designed to capture different aspects of momentum:
1. 𝗥𝗦𝗜 + 𝗦𝘁𝗼𝗰𝗵𝗮𝘀𝘁𝗶𝗰 𝗥𝗦𝗜: Two approaches to measuring momentum strength and turning points
2. 𝗠𝗔𝗖𝗗 + 𝗠𝗼𝗺𝗲𝗻𝘁𝘂𝗺: Trend-following momentum and pure rate of change
3. 𝗘𝗠𝗔 𝗧𝗿𝗲𝗻𝗱: Price position relative to moving average with slope confirmation
4. 𝗩𝗼𝗹𝘂𝗺𝗲: Participation confirmation on directional moves
5. 𝗗𝗶𝘃𝗲𝗿𝗴𝗲𝗻𝗰𝗲 𝗭𝗼𝗻𝗲: Structural disagreement detection in extreme zones
When multiple factors align (RSI slope confirms, MACD accelerates, EMA trend agrees, volume confirms), this represents broad momentum agreement. Such conditions may warrant attention, though they do not guarantee any particular outcome.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗛𝗢𝗪 𝗧𝗢 𝗨𝗦𝗘
This section provides step-by-step guidance for interpreting the indicator's visual elements.
𝗦𝘁𝗲𝗽 𝟭: 𝗖𝗵𝗲𝗰𝗸 𝘁𝗵𝗲 𝗥𝗲𝗴𝗶𝗺𝗲 𝗖𝗹𝗮𝘀𝘀𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻
The regime label at the top of the status panel provides immediate market context:
• TRENDING ▲ or TRENDING ▼: Composite oscillator at extremes (above 65 or below 35) with 200 EMA baseline confirming direction. This may indicate sustained directional momentum.
• BIAS ▲ or BIAS ▼: Composite showing moderate lean (above 55 or below 45) without extreme readings. Directional tendency without full momentum extension.
• RANGING: Composite near midpoint (45-55 zone). This may indicate consolidation, indecision, or transition between directional moves.
The regime classification helps contextualize other readings. A high vote count during TRENDING may indicate trend continuation. The same vote count during RANGING may indicate an emerging directional move.
𝗦𝘁𝗲𝗽 𝟮: 𝗢𝗯𝘀𝗲𝗿𝘃𝗲 𝘁𝗵𝗲 𝗩𝗼𝘁𝗲 𝗖𝗼𝘂𝗻𝘁
The vote count (displayed as X/7) shows how many components currently agree:
• 6/7 or 7/7: High consensus. Most or all components showing directional agreement through their different calculation methods.
• 4/7 or 5/7: Moderate consensus. Majority agreement with some components neutral or conflicting.
• 1/7 to 3/7: Low consensus. Components are in disagreement or showing mixed readings.
The consensus meter bar at the bottom of the oscillator panel also visualizes this. Brighter colors indicate higher consensus.
𝗦𝘁𝗲𝗽 𝟯: 𝗥𝗲𝗮𝗱 𝘁𝗵𝗲 𝗖𝗼𝗺𝗽𝗼𝘀𝗶𝘁𝗲 𝗢𝘀𝗰𝗶𝗹𝗹𝗮𝘁𝗼𝗿
The main oscillator line blends RSI, Stochastic RSI, and MACD using winsorized normalization:
• Above 75 zone: Extended bullish momentum (overbought region)
• Above 85 zone: Extreme overbought
• Below 25 zone: Extended bearish momentum (oversold region)
• Below 15 zone: Extreme oversold
• 45-55 zone: Neutral/consolidation area
The signal line (thinner line) provides crossover reference. When composite crosses above signal = bullish momentum shift. Below = bearish shift.
Important: Like all oscillators, the composite can remain at extremes during strong directional moves. Overbought does not mean "sell"; it means momentum is extended.
𝗦𝘁𝗲𝗽 𝟰: 𝗖𝗵𝗲𝗰𝗸 𝗜𝗻𝗱𝗶𝘃𝗶𝗱𝘂𝗮𝗹 𝗖𝗼𝗺𝗽𝗼𝗻𝗲𝗻𝘁𝘀
The status panel shows each component's current vote with arrows:
• ▲ (green): Component voting bullish
• ▼ (red): Component voting bearish
• — (gray): Component neutral/no vote
This breakdown helps identify which factors are agreeing and which are diverging. For example, if RSI and SRSI show bullish but MACD shows bearish, momentum may be mixed.
𝗦𝘁𝗲𝗽 𝟱: 𝗪𝗮𝘁𝗰𝗵 𝗳𝗼𝗿 𝗗𝗶𝘃𝗲𝗿𝗴𝗲𝗻𝗰𝗲𝘀
Divergence labels appear when price and oscillator structure disagree:
• ▲ DIV (bullish): Price makes lower low, oscillator makes higher low. Appears only in oversold zone (below 25).
• ▼ DIV (bearish): Price makes higher high, oscillator makes lower high. Appears only in overbought zone (above 75).
Divergences indicate structural disagreement that may precede reversals. However, divergences can persist or resolve without reversal. They are one input for analysis, not standalone signals.
𝗦𝘁𝗲𝗽 𝟲: 𝗖𝗼𝗺𝗯𝗶𝗻𝗲 𝗠𝘂𝗹𝘁𝗶𝗽𝗹𝗲 𝗙𝗮𝗰𝘁𝗼𝗿𝘀
The indicator provides the most context when multiple elements align:
Example Scenario A (Trend Continuation):
Composite holding above 65 for eight bars. Regime reads TRENDING▲, votes at 6/7, no divergence labels. The oscillator hasn't touched the 85 extreme zone yet. Components are aligned with room to extend before reaching overbought conditions.
Example Scenario B (Momentum Fading):
Regime shows BIAS▼ during a two-day selloff. But votes just dropped from 5/7 to 3/7, and the composite crossed above the signal line. The regime label says bearish while components are losing agreement. This type of disconnect often appears before moves stall or reverse.
Example Scenario C (Exhaustion Warning):
After a rally, composite hits 87 in the extreme zone. A ▼ DIV label appears. Votes drop from 7/7 to 4/7 over three bars. None of this guarantees reversal, but multiple warning signs appearing together (extreme reading, divergence, falling consensus) suggest caution.
Example Scenario D (Breakout From Consolidation):
Regime has shown RANGING for two days, composite hovering 48-52, votes stuck at 2/7 to 3/7. Then regime flips to BIAS▲, votes jump to 5/7, composite breaks above 55. When all three shift together after a quiet period, consolidation may be resolving into a directional move.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗡𝗔𝗩𝗜𝗚𝗔𝗧𝗜𝗡𝗚 𝗗𝗜𝗙𝗙𝗘𝗥𝗘𝗡𝗧 𝗠𝗔𝗥𝗞𝗘𝗧 𝗖𝗢𝗡𝗗𝗜𝗧𝗜𝗢𝗡𝗦
𝗧𝗿𝗲𝗻𝗱𝗶𝗻𝗴 𝗠𝗮𝗿𝗸𝗲𝘁𝘀
In trending conditions, traders may observe the regime classification showing "TRENDING" with baseline confirmation, composite remaining in the upper or lower half of the range, and high consensus readings (5-7 votes) persisting across multiple bars. The qualification requirements help maintain agreement during trends. A sustained move where RSI stays above 50 with positive slope, MACD histogram accelerates, and EMA slope confirms will show consistent directional votes. Divergences may appear in extreme zones but may not resolve immediately during strong trends.
𝗥𝗮𝗻𝗴𝗶𝗻𝗴 𝗠𝗮𝗿𝗸𝗲𝘁𝘀
In ranging or consolidating conditions, the regime classification will often show "RANGING" or alternate between brief directional readings. The composite typically oscillates around the 50 line without reaching sustained extremes, and vote counts fluctuate without reaching high consensus for extended periods. Divergences appearing at range extremes may be more significant in these conditions, potentially indicating range boundaries.
𝗛𝗶𝗴𝗵 𝗩𝗼𝗹𝗮𝘁𝗶𝗹𝗶𝘁𝘆 𝗘𝘃𝗲𝗻𝘁𝘀
During high volatility events, components may respond rapidly to price changes. Vote counts can swing from high bullish to high bearish consensus quickly. The regime classification helps contextualize whether these swings are occurring within a larger trending structure or representing genuine momentum reversals. The composite may reach extreme zones (85+ or 15-) during volatility spikes.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗧𝗘𝗖𝗛𝗡𝗜𝗖𝗔𝗟 𝗗𝗘𝗧𝗔𝗜𝗟𝗦
• Normalization uses winsorized statistics: extreme values are clipped before scaling to prevent outliers from dominating the composite blend
• Qualification logic requires directional confirmation (slope, acceleration) beyond simple threshold positions
• Divergence detection uses pivot comparison with left/right bar lookback, filtered to extreme zones only
• Regime classification combines composite position thresholds with 200 EMA slope direction
• HTF data uses confirmed bars only with request.security() lookahead disabled
• All signals fire on bar close only (non-repainting): historical display matches live behavior
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗨𝗡𝗜𝗤𝗨𝗘 𝗙𝗘𝗔𝗧𝗨𝗥𝗘𝗦
• 𝗦𝗲𝘃𝗲𝗻-𝗖𝗼𝗺𝗽𝗼𝗻𝗲𝗻𝘁 𝗩𝗼𝘁𝗶𝗻𝗴: Each component uses qualification criteria beyond simple thresholds, reducing noise from single-indicator false signals
• 𝗤𝘂𝗮𝗹𝗶𝗳𝗶𝗲𝗱 𝗩𝗼𝘁𝗲𝘀: Components only vote when showing directional conviction (slope confirmation, acceleration, etc.), not just static positions
• 𝗖𝗼𝗺𝗽𝗼𝘀𝗶𝘁𝗲 𝗡𝗼𝗿𝗺𝗮𝗹𝗶𝘇𝗮𝘁𝗶𝗼𝗻: Three oscillators blended using winsorized statistics for a smoother, more stable reading than any single oscillator
• 𝗔𝘂𝘁𝗼𝗺𝗮𝘁𝗶𝗰 𝗥𝗲𝗴𝗶𝗺𝗲 𝗗𝗲𝘁𝗲𝗰𝘁𝗶𝗼𝗻: TRENDING/BIAS/RANGING classification provides immediate market context
• 𝗛𝗧𝗙 𝗗𝗶𝘃𝗲𝗿𝗴𝗲𝗻𝗰𝗲 𝗙𝗶𝗹𝘁𝗲𝗿: When enabled, divergence signals are filtered by higher timeframe trend direction to reduce counter-trend noise
• 𝗡𝗼𝗻-𝗥𝗲𝗽𝗮𝗶𝗻𝘁𝗶𝗻𝗴: All calculations use confirmed bar data only. Historical display matches what was shown in real-time.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗦𝗘𝗧𝗧𝗜𝗡𝗚𝗦 𝗢𝗩𝗘𝗥𝗩𝗜𝗘𝗪
𝗖𝗼𝗿𝗲 𝗦𝗲𝘁𝘁𝗶𝗻𝗴𝘀
• 𝗦𝗶𝗴𝗻𝗮𝗹 𝗠𝗼𝗱𝗲: Alert threshold only (no visual change). Controls when High Consensus alerts fire:
- Conservative = 6+ votes to trigger alert
- Balanced = 5+ votes (default)
- Aggressive = 4+ votes
• 𝗛𝗧𝗙 𝗙𝗶𝗹𝘁𝗲𝗿: When enabled, divergence signals are filtered by higher timeframe trend. Bullish divergences only appear when HTF is bullish (price above HTF EMA). Bearish divergences only appear when HTF is bearish. Helps avoid counter-trend signals.
• 𝗛𝗧𝗙 𝗧𝗶𝗺𝗲𝗳𝗿𝗮𝗺𝗲: Timeframe used for HTF filter (default 4H). The indicator checks if price is above/below the 50 EMA on this timeframe.
𝗗𝗶𝘀𝗽𝗹𝗮𝘆 𝗦𝗲𝘁𝘁𝗶𝗻𝗴𝘀
• Show Divergences: Toggle divergence labels on/off
• Show Consensus Meter: Toggle vote count bar at bottom of oscillator
• Show Status Panel: Toggle the info table
• Show OB/OS Zone Fills: Toggle colored fill zones for extreme areas
𝗧𝗮𝗯𝗹𝗲 𝗦𝗲𝘁𝘁𝗶𝗻𝗴𝘀
• Table Position: 9 position options (corners, centers, edges)
• Table Font Size: Tiny/Small/Normal
• Table Layout: Horizontal (wide, desktop) or Vertical (compact, mobile-friendly)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗔𝗟𝗘𝗥𝗧𝗦
14 alert conditions available:
𝗗𝗶𝘃𝗲𝗿𝗴𝗲𝗻𝗰𝗲 𝗔𝗹𝗲𝗿𝘁𝘀
• Bullish Divergence / Bearish Divergence: Divergence detected in extreme zone
• Any Divergence: Either type detected
𝗖𝗿𝗼𝘀𝘀𝗼𝘃𝗲𝗿 𝗔𝗹𝗲𝗿𝘁𝘀
• Bullish Crossover / Bearish Crossover: Composite crosses signal line
• Any Crossover: Either type detected
𝗘𝘅𝘁𝗿𝗲𝗺𝗲 𝗭𝗼𝗻𝗲 𝗔𝗹𝗲𝗿𝘁𝘀
• Extreme Overbought / Extreme Oversold: Composite enters 85/15 zones
• Exit Overbought / Exit Oversold: Composite exits 85/15 zones
𝗥𝗲𝗴𝗶𝗺𝗲 𝗔𝗹𝗲𝗿𝘁𝘀
• Regime to Bullish / Regime to Bearish: Regime classification changes direction
𝗖𝗼𝗻𝘀𝗲𝗻𝘀𝘂𝘀 𝗔𝗹𝗲𝗿𝘁𝘀
• High Bull Consensus / High Bear Consensus: Vote count reaches Signal Mode threshold (6+/5+/4+ depending on mode). Alert only, no visual change.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗟𝗜𝗠𝗜𝗧𝗔𝗧𝗜𝗢𝗡𝗦
• 𝗔𝗻𝗮𝗹𝘆𝘀𝗶𝘀 𝘁𝗼𝗼𝗹, 𝗻𝗼𝘁 𝗮 𝘀𝗶𝗴𝗻𝗮𝗹 𝗴𝗲𝗻𝗲𝗿𝗮𝘁𝗼𝗿: This indicator displays consensus, regime state, and divergences for the trader to interpret. It does not tell you when to buy or sell.
• 𝗖𝗼𝗻𝘀𝗲𝗻𝘀𝘂𝘀 𝗰𝗮𝗻 𝗹𝗮𝗴: By the time all components agree, price movement may have already begun. High consensus readings indicate current agreement, not future direction.
• 𝗘𝘅𝘁𝗿𝗲𝗺𝗲𝘀 𝗰𝗮𝗻 𝗽𝗲𝗿𝘀𝗶𝘀𝘁: Like all oscillators, the composite can remain at extremes during strong directional moves. Overbought does not mean "must reverse."
• 𝗗𝗶𝘃𝗲𝗿𝗴𝗲𝗻𝗰𝗲𝘀 𝗮𝗿𝗲 𝗻𝗼𝘁 𝗴𝘂𝗮𝗿𝗮𝗻𝘁𝗲𝗲𝗱: Divergences indicate structural disagreement. They may precede reversals but can also persist or resolve without reversal.
• 𝗟𝗮𝗴𝗴𝗶𝗻𝗴 𝗶𝗻𝗱𝗶𝗰𝗮𝘁𝗼𝗿: All signals are derived from historical price data and confirm on bar close.
• 𝗣𝗮𝘀𝘁 𝗽𝗮𝘁𝘁𝗲𝗿𝗻𝘀 𝗱𝗼 𝗻𝗼𝘁 𝗴𝘂𝗮𝗿𝗮𝗻𝘁𝗲𝗲 𝗳𝘂𝘁𝘂𝗿𝗲 𝗿𝗲𝘀𝘂𝗹𝘁𝘀.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗖𝗢𝗡𝗖𝗟𝗨𝗦𝗜𝗢𝗡
Harmonic Oscillator provides a structured framework for analyzing momentum through seven independent components, a normalized composite oscillator, and automatic regime classification. The indicator is designed to help traders identify when multiple momentum factors are agreeing versus conflicting, which may provide useful context for analysis.
The voting system, qualification requirements, and regime detection work together to present a unified view of momentum conditions that would otherwise require monitoring multiple separate indicators.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔶 𝗗𝗜𝗦𝗖𝗟𝗔𝗜𝗠𝗘𝗥
Trading is risky and most traders lose money. This indicator is provided for informational and educational purposes only. It does not constitute financial advice, and past performance does not guarantee future results. All content, tools, and analysis should not be considered as recommendations to buy or sell any asset. Users are solely responsible for their own trading decisions. Always use proper risk management and consider consulting a qualified financial advisor before making trading decisions.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Built with PineScript v6. Non-repainting. All signals confirmed on bar close.
Dealing Range Auto-Zone v2.1Dealing Range Auto-Zone v2.1 - Summary
Purpose: Automatically creates zone-based support/resistance levels within a dealing range using percentage-based spacing with ATR-driven recommendations.
How It Works:
Click two points to define dealing range (high and low)
Set step % (e.g., 0.25% = one zone every 0.25% move)
Indicator calculates exact zone count and draws upper/lower zone boundaries
Optional center lines show midpoint of each zone
Key Features:
Zone-based S/R - Upper and lower boundaries instead of single lines (creates "price zones" rather than precise levels)
Auto-calculated spacing - Uses exact % steps with math.round() for optimal coverage (minimizes gaps near boundaries)
Adjustable zone width - Default 50% of step (e.g., 0.25% step = 0.125% zone width on each side)
Ghost zones - Extends zones above/below range for anticipating breakouts
ATR-based recommendations - Calculates Daily ATR and suggests Tight/Balanced/Wide step % based on current volatility
Smart validation - Compares your step % to ATR recommendations and shows if it's appropriate for current market conditions
Use Case:
Converts dealing ranges into tradeable S/R zones for 15s-5m intraday scalping. Makes it clear when price is "in a zone" vs "at a precise line." Ideal for MNQ, MGC, and other liquid futures/crypto.
Version 2.1 Changes:
New Features:
Daily ATR calculation with automatic Tight/Balanced/Wide step % recommendations
Volatility-based auto-recommendations (compares ATR(14) vs ATR(50))
Smart validation system that evaluates your step % choice and provides feedback
Info table shows all three ATR recommendations (Tight/Balanced/Wide)
Improvements:
Changed from math.floor() to math.round() for zone count calculation (eliminates gaps near boundaries)
Streamlined info table (removed redundant rows: Range points, Step %, Total Lines)
Added color-coded validation (green checkmark for appropriate settings, orange warning for extreme values)
Bug Fixes:
Fixed tooltip compilation error (moved dynamic ATR data to info table only)
Corrected validation logic to properly categorize step % ranges
Info Table Now Shows:
Range % (dealing range size as %)
Exact Zones (calculated, including fractional)
Zones Drawn (rounded to nearest whole number)
Zone Width (in price points and % of step)
Daily ATR (value and %)
Auto Rec (all three recommendations: T/B/W)
Your Step (with validation: ✓ Tight/Balanced/Wide or ⚠️ Very Tight/Wide)
Ticker DataTicker Data is a high-efficiency dashboard designed for traders and analysts who need immediate context on a ticker without cluttering their chart.
This script aggregates fundamental data, price performance, and key institutional support levels into a single, customizable table. It allows you to assess the "character" of a stock in seconds by overlaying essential metrics directly onto your chart.
Key Features
1. Institutional Anchors (Auto-VWAPs)
Instead of manually drawing Anchored VWAPs for every ticker, this script automatically calculates and displays the three most important levels for trend management:
VWAP IPO: The volume-weighted average price since the stock's inception.
VWAP YTD: The volume-weighted average price starting from Jan 1st of the current year.
VWAP Earnings: The volume-weighted average price since the most recent earnings report.
Visual Logic: Text turns Green if price is above the VWAP, and Red if below.
2. Trend & Momentum
5-Day MA: Displays the 5-day Simple Moving Average based on Daily data. This serves as a "momentum guardrail"—if the price is above the 5DMA, short-term momentum is bullish.
Timeframe Independence: The 5DMA and performance stats are forced to the Daily timeframe, ensuring consistent data even if you view the chart on 15m or 1H intervals.
3. Fundamental Context
Market Cap: Current market capitalization.
Float & Float %: Displays the number of floating shares and the percentage of total shares they represent. Vital for gauging volatility potential (low float = higher volatility).
4. Price Performance & Range
Performance: % change over the last Week (1W), Month (1M), and Quarter (3M).
52-Week High/Low:
Off 52W High: The % drawdown from the 52-week high.
Above 52W Low: The % extension from the 52-week low.
5. Event & History Awareness
Earnings Countdown: Displays the number of days until the next earnings report. Text turns Red inside the "Danger Zone" (less than 7 days).
IPO Timer: Calculates exactly how many years have passed since the stock's public listing, allowing you to quickly filter for fresh merchandise vs. mature assets.
Settings & Customization
This script is built for "Chart Real Estate" management. You have full control over the visual layout via the inputs tab:
Display Toggles: Every metric (Float %, Dist from High/Low, IPO Timer, VWAPs, etc.) has its own checkbox. Uncheck what you don't need to keep the table compact.
Table Positioning:
Location: Pin the table to any corner (Top/Bottom, Left/Right).
Size: Scale the table from Tiny to Large to fit your resolution.
Push Down: A unique feature that adds empty transparent rows to the top of the table. This pushes the data down so it does not obscure the most recent price candles or the ticker header.
Visual Styling:
Alignment: Independently control the text alignment (Left, Center, Right) for both the Labels and the Data columns.
Colors: Fully customizable Background and Text colors.
Note: The default text color is Black (optimized for Light Mode charts). If you use Dark Mode, simply switch the "Text Color" input to White.
Technical Notes
Data Source: Moving averages and VWAP anchors are calculated using Daily ('D') data to ensure institutional relevance.
ELMEHDI VIP (v4.0)ABO SALTAN //@version=5
indicator(title = 'ELMEHDI VIP (v4.0)', shorttitle = 'EL MEHDI KHEYI(v4.0)', overlay = true, max_boxes_count = 500, max_labels_count = 500, max_lines_count = 500, max_bars_back = 500, max_polylines_count = 100)
bullcolor = #339b44
bearcolor = #af3232
ema150 = ta.ema(close, 150)
ema250 = ta.ema(close, 250)
gr_customalert = "Custom Alerts"
gr_signal = "General Configurations"
gr_PullBacksignal = "Trading Assistants"
gr_RiskManage = "Risk Management"
gr_dash = "Dashboard Configurations"
//symbol info
symInfoCheck = false
symInfo = syminfo.ticker + ' | ' + timeframe.period + (timeframe.isminutes ? 'M' : na)
date = str.tostring(dayofmonth(time_close)) + '/' + str.tostring(month(time_close)) + '/' + str.tostring(year(time_close))
//text positioning
textVPosition = 'middle'
textHPosition = 'center'
//symbol info positioning
symVPosition = 'top'
symHPosition = 'left'
//cell size
width = 0
height1 = 0
//title settings
c_title = #b2b5be80
s_title = 'large'
a_title = 'center'
//subtitle settings
c_subtitle = #b2b5be80
s_subtitle = 'normal'
a_subtitle = 'center'
c_bg = color.new(color.blue, 100)
// Get user input
showSignals = input(true, "Show Signal's", group=gr_signal)
//showSignals = true
sensitivity = input.float(2.4, "Sensitivity", 0.1, step=0.1, group=gr_signal)
STuner = input.int(10, "Signal Tuner(1-25)", minval = 1, maxval = 25, group=gr_signal)
Presets = "All Signals"
//Presets = input.string("All Signals", "Presets", , group=gr_signal)
filterstyle = input.string("Trending Signals ", "Signal Mode / Filters", ["Trending Signals ", "Contrarian Signals ", "High Volume ", "Strong ", "Swing ", "Smooth ", "Scalping ", "Scalping+ "], group=gr_signal)
//TextStyle = input.string("Minimal", "Signal Style", , group=gr_signal)
//periodTrendCloud = input.string("Smooth", "Trend Cloud Style", , group=gr_Other_Settings)
TextStyle = "Minimal"
consSignalsFilter = filterstyle == "Trending Signals " ? true : false
StrongSignalsOnly = filterstyle == "Strong " ? true : false
highVolSignals = filterstyle == "High Volume " ? true : false
signalsTrendCloud = (filterstyle == "Smooth ") ? true : (filterstyle == "Scalping ") ? true : (filterstyle == "Scalping+ ") ? true : (filterstyle == "Swing ") ? true : false
ContrarianOnly = filterstyle == "Contrarian Signals " ? true : false
TrendMap = 'Trend Gradient'
momentumCandles = false
assistantenable = input(true,'', group=gr_PullBacksignal, inline = 'sexyshit')
assistantmode = input.string('Trend Assistant', 'Assistant | Mode', , group = gr_PullBacksignal, inline = 'sexyshit')
Show_PR = input.bool(true, title="", group = gr_PullBacksignal , inline = "Features1")
MSTuner = input.int(8, "Reversal Dot | Tuner(2-30)", minval = 2, maxval = 30, group=gr_PullBacksignal, inline = "Features1")
LongTrendAverage = assistantmode == 'Trend Tracker' and assistantenable == true ? true : false
analyscloud = assistantmode == 'Trend Assistant' and assistantenable == true ? true : false
showTrendCloud = (filterstyle == "Smooth ") ? true : (filterstyle == "Scalping ") ? true : (filterstyle == "Scalping+ ") ? true : (filterstyle == "Swing ") ? true : false
periodTrendCloud = (filterstyle == "Smooth ") ? "Smooth" : (filterstyle == "Scalping ") ? "Scalping" : (filterstyle == "Scalping+ ") ? "Scalping+" : (filterstyle == "Swing ") ? "Swing" : na
//ScalpingPlus = input(false, "Fast trend cloud", group=gr_Other_Settings)
//fastTrendCloudLen = input.int(55, "Fast trend cloud", 2, group=gr_Other_Settings)
fill(plot(showTrendCloud and periodTrendCloud == "Smooth" ? na : assistantenable == true and assistantmode == 'Trend Tracker' ? ema150 : na, "", na, editable=false), plot(showTrendCloud and periodTrendCloud == "Smooth" ? na : assistantenable == true and assistantmode == 'Trend Tracker' ? ema250 : na, "", na, editable=false), ema150 > ema250 ? color.new(bullcolor, 70) : ema150 < ema250 ? color.new(bearcolor, 70) : na)
showDashboard = input(true, "Smart Panel", group = gr_dash , inline = "Features1")
locationDashboard = input.string("Bottom Right", "Dashboard Location", , group = gr_dash , tooltip="Smart Panel")
sizeDashboard = input.string("Small", "Dashboard Size", , group = gr_dash , tooltip="Smart Panel")
tpLabels = input(true, "Dynamic Take Profit Lables", group=gr_RiskManage)
ShowTpSlAreas = input(true, "Show take Profit/Stop-loss Area", group=gr_RiskManage)
ShowTrailingSL = input(false, "Show trailing Stop-loss", group=gr_RiskManage)
usePercSL = input(false, "SL/TRAILING", inline="1", group=gr_RiskManage)
percTrailingSL = input.float(1, "", 0, step=0.1, inline="1", group=gr_RiskManage)
useTP1 = input(true, "", inline="1", group=gr_RiskManage)
multTP1 = input.float(1, "TP 1", 0, inline="1", group=gr_RiskManage)
useTP2 = input(true, "", inline="4", group=gr_RiskManage)
multTP2 = input.float(2, "TP 2", 0, inline="4", group=gr_RiskManage)
useTP3 = input(true, "", inline="4", group=gr_RiskManage)
multTP3 = input.float(3, "TP 3", 0, inline="4", group=gr_RiskManage)
ShowSwings = input(false, "Show Market Structure", inline="3", group=gr_RiskManage)
periodSwings = input.int(10, "", 2, inline="3", group=gr_RiskManage)
//showTS = input(title='Show Trend Shifter', defval=false, group='Contrarian SIGNALS')
// showsignals = input(title='Show Signals', defval=false, group='Contrarian SIGNALS')
// Alerts Managemnt
Normalbuy_alert = input.bool(title='Buy Signal', defval=false, inline = "NB", group=gr_customalert)
Strongbuy_alert = input.bool(title='Strong Buy', defval=true, inline = "NB", group=gr_customalert)
Normalsell_alert = input.bool(title='Sell Signal', defval=false , inline = "NS", group=gr_customalert)
Strongsell_alert = input.bool(title='Strong Sell', defval=true , inline = "NS", group=gr_customalert)
slalert = input.bool(title='Stop-Loss', defval=true , inline = "SLTP1", group=gr_customalert)
tp1alert = input.bool(title='Target 1', defval=true , inline = "SLTP1", group=gr_customalert)
tp2alert = input.bool(title='Target 2', defval=true , inline = "TP2TP3", group=gr_customalert)
tp3alert = input.bool(title='Target 3', defval=true , inline = "TP2TP3", group=gr_customalert)
bullcrosscloud_alert = input.bool(title='Bullish Cloud', defval=false, inline = "CD", group=gr_customalert)
bearcrosscloud_alert = input.bool(title='Bearish Cloud', defval=false, inline = "CD", group=gr_customalert)
showCons = false
paintCons = false
// Signal Text
SimpleBuy = "Buy"
StrongB = "Strong Buy"
SimpleSell = "Sell"
StrongS = "Strong Sell"
if TextStyle == "Normal"
SimpleBuy := "Buy"
StrongB := "BUY"
SimpleSell:= "Sell"
StrongS := "Strong Sell"
if TextStyle == "Minimal"
SimpleBuy := "⬆"
StrongB := "⬆⬆"
SimpleSell:= "⬇"
StrongS := "⬇⬇"
// Signal Text Color
// bullsignalcolor = #ffffff
// bearsignalcolor = color.rgb(255, 255, 255)
// if TextStyle == "Normal"
// bullsignalcolor := color.rgb(255, 255, 255)
// bearsignalcolor := color.rgb(255, 255, 255)
// if TextStyle == "Minimal"
// bullsignalcolor := color.rgb(255, 255, 255)
// bearsignalcolor := color.rgb(255, 255, 255)
src = close
RSII = ta.ema(ta.rsi(src, 50), 30)
TR = math.abs(RSII - RSII )
wwalpha = 1 / 50
WWMA = 0.0
WWMA := wwalpha * TR + (1 - wwalpha) * nz(WWMA )
ATRRSI = 0.0
ATRRSI := wwalpha * WWMA + (1 - wwalpha) * nz(ATRRSI )
TsFast = ta.ema(ta.rsi(src, 50), 30)
TsUP = TsFast + ATRRSI * 4.236
TsDN = TsFast - ATRRSI * 4.236
textWatermark = table.new(textVPosition + '_' + textHPosition, 1, 3)
TsSlow = 0.0
TsSlow := TsUP < nz(TsSlow ) ? TsUP : TsFast > nz(TsSlow ) and TsFast < nz(TsSlow ) ? TsDN : TsDN > nz(TsSlow ) ? TsDN : TsDN < nz(TsSlow ) and TsFast > nz(TsSlow ) ? TsUP : nz(TsSlow )
Colorh = TsFast > 55 ? color.rgb(255, 0, 0) : TsFast < 45 ? color.rgb(0, 255, 8) : #ffffff
//QQF = plot(TsFast, 'TS FAST', color=color.new(color.maroon, 100), linewidth=2, display=display.none, editable = false)
//QQS = plot(TsSlow, 'TS SLOW', color=color.new(color.white, 100), linewidth=2, display=display.none , editable = false)
//plot(TsFast, color=Colorh, linewidth=2, style=plot.style_area, histbase=50)
//BearLimit = hline(60, color=color.gray, linestyle=hline.style_dashed)
//BullLimt = hline(40, color=color.gray, linestyle=hline.style_dashed)
bulllim = 45
bearlim = 55
BullSignalr = ta.crossover(TsFast, TsSlow) and TsFast < bulllim
BearSignallr = ta.crossunder(TsFast, TsSlow) and TsFast > bearlim
/////////////////////////////////////////////////////////
// Trap Detector
////////////////////////////////////////////////////////
// Functions
wavetrend(src, chlLen, avgLen) =>
esa = ta.ema(src, chlLen)
d = ta.ema(math.abs(src - esa), chlLen)
ci = (src - esa) / (0.015 * d)
wt1 = ta.ema(ci, avgLen)
wt2 = ta.sma(wt1, 3)
f_top_fractal(src) => src < src and src < src and src > src and src > src
f_bot_fractal(src) => src > src and src > src and src < src and src < src
f_fractalize (src) => f_top_fractal(src) ? 1 : f_bot_fractal(src) ? -1 : 0
f_findDivs(src, topLimit, botLimit) =>
fractalTop = f_fractalize(src) > 0 and src >= topLimit ? src : na
fractalBot = f_fractalize(src) < 0 and src <= botLimit ? src : na
highPrev = ta.valuewhen(fractalTop, src , 0)
highPrice = ta.valuewhen(fractalTop, high , 0)
lowPrev = ta.valuewhen(fractalBot, src , 0)
lowPrice = ta.valuewhen(fractalBot, low , 0)
bearSignal = fractalTop and high > highPrice and src < highPrev
bullSignal = fractalBot and low < lowPrice and src > lowPrev
// Get components
= wavetrend(close, 5*MSTuner, 10*MSTuner)
= f_findDivs(wt2, 10, -35)
= f_findDivs(wt2, 40, -70)
wtDivBull = wtDivBull1 or wtDivBull2
wtDivBear = wtDivBear1 or wtDivBear2
plotshape(ta.crossover(wt1, wt2) and Show_PR and wt2 <= -60)
plotshape(ta.crossunder(wt1, wt2) and Show_PR and wt2 >= 60)
rsi = ta.rsi(close ,14)
// Functions
f_chartTfInMinutes() =>
float _resInMinutes = timeframe.multiplier * (
timeframe.isseconds ? 1. / 60 :
timeframe.isminutes ? 1. :
timeframe.isdaily ? 60. * 24 :
timeframe.isweekly ? 60. * 24 * 7 :
timeframe.ismonthly ? 60. * 24 * 30.4375 : na)
atr(len) =>
tr = ta.tr
atr = 0.0
atr := nz(atr + (tr - atr ) / len, tr)
supertrend(src, factor, len) =>
atr = ta.atr(len)
upperBand = src + factor * atr
lowerBand = src - factor * atr
prevLowerBand = nz(lowerBand )
prevUpperBand = nz(upperBand )
lowerBand := lowerBand > prevLowerBand or close < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close > prevUpperBand ? upperBand : prevUpperBand
int direction = na
float superTrend = na
prevSuperTrend = superTrend
if prevSuperTrend == prevUpperBand
direction := close > upperBand ? 1 : -1
else
direction := close < lowerBand ? -1 : 1
superTrend := direction == 1 ? lowerBand : direction == -1 ? upperBand : na
dchannel(len)=>
hh = ta.highest(len)
ll = ta.lowest (len)
trend = 0
trend := close > hh ? 1 : close < ll ? -1 : nz(trend )
trendScalper(show, len1, len2, len3, colorBull, colorBear, colorBarBull, colorBarBear) =>
avgOC = math.avg(open, close)
ha_o = 0.0, ha_o := na(ha_o ) ? avgOC : (ha_o + ohlc4 ) / 2
ema1 = ta.ema(ha_o, len1), ema2 = ta.ema(ha_o, len2), ema3 = ta.ema(ha_o, len3)
ris1 = ema1 > ema1 , ris2 = ema2 > ema2 , ris3 = ema3 > ema3
fal1 = ema1 < ema1 , fal2 = ema2 < ema2 , fal3 = ema3 < ema3
colorEma1 = ris1 ? colorBull : fal1 ? colorBear : na, colorEma2 = ris2 ? colorBull : fal2 ? colorBear : na, colorEma3 = ris3 ? colorBull : fal3 ? colorBear : na
fillEma1 = avgOC > ema1 ? colorBull : avgOC < ema1 ? colorBear : na, fillEma2 = ema1 > ema2 ? colorBull : ema1 < ema2 ? colorBear : na, fillEma3 = ema2 > ema3 ? colorBull : ema2 < ema3 ? colorBear : na
colorBar = close < ema1 and close < ema2 ? colorBarBear : colorBarBull
candlesMom() =>
= ta.macd(close, 2, 4, 3)
(macd > 10 and macd > macd ) or (macd < 10 and macd < macd )
trailingSL(buy, sell, factor, len, usePerc, perc) =>
atr = atr(len)
upperBand = high + (usePerc ? high * (perc / 100) : factor * atr)
lowerBand = low - (usePerc ? low * (perc / 100) : factor * atr)
prevLowerBand = nz(lowerBand )
prevUpperBand = nz(upperBand )
lowerBand := lowerBand > prevLowerBand or buy ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or sell ? upperBand : prevUpperBand
int direction = na
float stop = na
prevSuperTrend = stop
if prevSuperTrend == prevUpperBand
direction := buy ? 1 : -1
else
direction := sell ? -1 : 1
stop := direction == 1 ? lowerBand : direction == -1 ? upperBand : na
add_to_zz(zz, val, bi) =>
array.unshift(zz, bi)
array.unshift(zz, val)
if array.size(zz) > 12
array.pop(zz)
update_zz(zz, val, bi, dir) =>
if array.size(zz) == 0
add_to_zz(zz, val, bi)
else
if dir == 1 and val > array.get(zz, 0) or dir == -1 and val < array.get(zz, 0)
array.set(zz, 0, val)
array.set(zz, 1, bi)
0
// Get components
vosc = ta.obv - ta.ema(ta.obv, 20)
bs = ta.ema(nz(math.abs((open - close) / (high - low) * 100)), 3)
ema = ta.ema(close, 200)
emaBull = close > ema
equal_tf(res) => str.tonumber(res) == f_chartTfInMinutes()
higher_tf(res) => str.tonumber(res) > f_chartTfInMinutes()
too_small_tf(res) => (timeframe.isweekly and res=="1") or (timeframe.ismonthly and str.tonumber(res) < 10)
securityNoRep(sym, res, src) =>
bool bull = na
bull := equal_tf(res) ? src : bull
bull := higher_tf(res) ? request.security(sym, res, src, barmerge.gaps_off, barmerge.lookahead_off) : bull
bull_array = request.security_lower_tf(syminfo.tickerid, higher_tf(res) ? str.tostring(f_chartTfInMinutes()) : too_small_tf(res) ? (timeframe.isweekly ? "3" : "10") : res, src)
if array.size(bull_array) > 1 and not equal_tf(res) and not higher_tf(res)
bull := array.pop(bull_array)
array.clear(bull_array)
bull
//TF1Bull = securityNoRep(syminfo.tickerid, "1" , emaBull)
//TF3Bull = securityNoRep(syminfo.tickerid, "3" , emaBull)
TF5Bull = securityNoRep(syminfo.tickerid, "5" , emaBull)
//TF10Bull = securityNoRep(syminfo.tickerid, "10" , emaBull)
TF15Bull = securityNoRep(syminfo.tickerid, "15" , emaBull)
TF30Bull = securityNoRep(syminfo.tickerid, "30" , emaBull)
TF60Bull = securityNoRep(syminfo.tickerid, "60" , emaBull)
//TF120Bull = securityNoRep(syminfo.tickerid, "120" , emaBull)
TF240Bull = securityNoRep(syminfo.tickerid, "240" , emaBull)
//TF720Bull = securityNoRep(syminfo.tickerid, "720" , emaBull)
//TFDBull = securityNoRep(syminfo.tickerid, "1440", emaBull)
hma55 = ta.hma(close, 55 )
= ta.macd(close, 12, 26, 9)
supertrend = supertrend(close, sensitivity, STuner)
maintrend = dchannel(30)
confBull = (ta.crossover (close, supertrend) or (ta.crossover (close, supertrend) and maintrend < 0)) and macd > 0 and macd > macd and ema150 > ema250 and hma55 > hma55 and maintrend > 0
confBear = (ta.crossunder(close, supertrend) or (ta.crossunder(close, supertrend) and maintrend > 0)) and macd < 0 and macd < macd and ema150 < ema250 and hma55 < hma55 and maintrend < 0
trendcloud = supertrend(ohlc4, periodTrendCloud == "Swing" ? 7 : 4, 10)
hma = periodTrendCloud == "Scalping+" ? ta.hma(close, 55) : na
none = close > 0
= ta.dmi(14, 14)
consFilter = adx > 20
ContBear = TsFast > 65
ContBull = TsFast < 35
StrongFilter = ta.ema(close, 200)
//volFilter = (ta.ema(volume, 25) - ta.ema(volume, 26)) / ta.ema(volume, 26) > 0
volFilter = (ta.ema(volume, 15) - ta.ema(volume, 20)) / ta.ema(volume, 25) > 0
trendFilter = trendcloud
bull = (Presets == "All Signals" ? ta.crossover (close, supertrend) : confBull and not confBull ) and Presets != "Trend Scalper" and (StrongSignalsOnly ? close > StrongFilter : none) and (ContrarianOnly ? ContBull : none) and (consSignalsFilter ? consFilter : none) and (highVolSignals ? volFilter : none) and (signalsTrendCloud ? (periodTrendCloud == "Smooth" ? ema150 > ema250 : close > trendFilter) : none)
bear = (Presets == "All Signals" ? ta.crossunder(close, supertrend) : confBear and not confBear ) and Presets != "Trend Scalper" and (StrongSignalsOnly ? close < StrongFilter : none) and (ContrarianOnly ? ContBear : none) and (consSignalsFilter ? consFilter : none) and (highVolSignals ? volFilter : none) and (signalsTrendCloud ? (periodTrendCloud == "Smooth" ? ema150 < ema250 : close < trendFilter) : none)
countBull = ta.barssince(bull)
countBear = ta.barssince(bear)
trigger = nz(countBull, bar_index) < nz(countBear, bar_index) ? 1 : 0
= trendScalper(Presets == "Trend Scalper" ? true : false, 5, 9, 21, bullcolor, bearcolor, bullcolor, bearcolor)
trailingStop = trailingSL(bull, bear, 2.2, 14, usePercSL, percTrailingSL)
float _ph = ta.highestbars(high, periodSwings) == 0 ? high : na
float _pl = ta.lowestbars (low, periodSwings) == 0 ? low : na
var _dir = 0, dir_ = _pl and na(_ph) ? -1 : _dir, _dir := _ph and na(_pl) ? 1 : dir_, dirChg = ta.change(_dir)
var zz = array.new_float(0), zzOld = array.copy(zz)
float zzLive = _ph or _pl ? (dirChg ? add_to_zz(zz, _dir == 1 ? _ph : _pl, bar_index) : update_zz(zz, _dir == 1 ? _ph : _pl, bar_index, _dir)) : na
float hb_ = ta.highestbars(10) == 0 ? high : na
float lb_ = ta.lowestbars (10) == 0 ? low : na
var int dir = 0
float zz_ = na
float pp = na
var int consCnt = 0
var float condHi = na
var float condLo = na
float H_ = ta.highest(5)
float L_ = ta.lowest (5)
var line lineUp = na
var line lineDn = na
bool breakUp = false
bool breakDn = false
var float pvh1_price = array.new_float(1000, na)
var int pvh1_time = array.new_int (1000, na)
var float pvl1_price = array.new_float(1000, na)
var int pvl1_time = array.new_int (1000, na)
var float pvh2_price = array.new_float(1000, na)
var int pvh2_time = array.new_int (1000, na)
var float pvl2_price = array.new_float(1000, na)
var int pvl2_time = array.new_int (1000, na)
var float htcmrll_price = na
var int htcmrll_time = na
var float ltcmrhh_price = na
var int ltcmrhh_time = na
var box long_boxes = array.new_box()
var box short_boxes = array.new_box()
var float temp_pv_0 = na
var float temp_pv_1 = na
var float temp_pv_2 = na
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
var buyBars = array.new_box(365, na)
for i = 0 to 364
box.delete(array.get(buyBars, i))
var sellBars = array.new_box(365, na)
for i = 0 to 364
box.delete(array.get(sellBars, i))
// Colors
green = bullcolor, green50 = color.new(green, 50), green20 = color.new(green, 80)
red = bearcolor, red50 = color.new(red, 50), red20 = color.new(red, 80)
silver = #B2B5BE, silver50 = color.new(silver, 50), silver20 = color.new(silver, 80)
// Plots
atrBand = usePercSL ? (trigger ? low : high) * (percTrailingSL / 100) : ta.atr(14) * 2.2
atrStop = trigger ? low - atrBand : high + atrBand
lastTrade(src) => ta.valuewhen(bull or bear, src, 0)
entry_y = lastTrade(close)
stop_y = lastTrade(atrStop)
tp1_y = (entry_y-lastTrade(atrStop))*multTP1 + entry_y
tp2_y = (entry_y-lastTrade(atrStop))*multTP2 + entry_y
tp3_y = (entry_y-lastTrade(atrStop))*multTP3 + entry_y
labelTpSl(cond, y, txt, color) =>
label labelTpSl = ShowTpSlAreas and cond ? label.new(bar_index + 1, y, txt, xloc.bar_index, yloc.price, color, label.style_label_left, color.white, size.normal) : na
label.delete(labelTpSl )
labelTpSl(none, entry_y, "Entry : " + str.tostring(math.round_to_mintick(entry_y)), #089981)
labelTpSl(none, stop_y , "Stop loss : " + str.tostring(math.round_to_mintick(atrStop)), bearcolor)
labelTpSl(useTP1 and multTP1 != 0, tp1_y, "TP 1 : " + str.tostring(math.round_to_mintick(tp1_y)), #089981)
labelTpSl(useTP2 and multTP2 != 0, tp2_y, "TP 2 : " + str.tostring(math.round_to_mintick(tp2_y)), #089981)
labelTpSl(useTP3 and multTP3 != 0, tp3_y, "TP 3 : " + str.tostring(math.round_to_mintick(tp3_y)), #089981)
lineTpSl(cond, y, color, style) =>
line lineTpSl = ShowTpSlAreas and cond ? line.new(bar_index - (trigger ? countBull : countBear), y, bar_index + 1, y, xloc.bar_index, extend.none, color, style) : na
line.delete(lineTpSl )
lineTpSl(none, entry_y, #089981, line.style_dashed)
lineTpSl(none, stop_y , bearcolor , line.style_solid )
lineTpSl(useTP1 and multTP1 != 0, tp1_y, bullcolor, line.style_dotted)
lineTpSl(useTP2 and multTP2 != 0, tp2_y, bullcolor, line.style_dotted)
lineTpSl(useTP3 and multTP3 != 0, tp3_y, bullcolor, line.style_dotted)
//buy = showSignals and bull ? label.new(bar_index, low , close > StrongFilter ? StrongB : SimpleBuy , xloc.bar_index, yloc.belowbar, bullcolor, label.style_label_up , color.rgb(255, 255, 255), size.normal) : na
//sell = showSignals and bear ? label.new(bar_index, high, close < StrongFilter ? StrongS : SimpleSell , xloc.bar_index, yloc.abovebar, bearcolor , label.style_label_down, color.rgb(255, 255, 255), size.normal) : na
buy = (showSignals and bull ? label.new(bar_index, low , close > StrongFilter ? StrongB : SimpleBuy , xloc.bar_index, yloc.belowbar, bullcolor, label.style_label_up , color.rgb(255, 255, 255), size.normal) : na)
sell = showSignals and bear ? label.new(bar_index, high, close < StrongFilter ? StrongS : SimpleSell , xloc.bar_index, yloc.abovebar, bearcolor , label.style_label_down, color.rgb(255, 255, 255), size.normal) : na
tpLabels(tp) =>
tp1Bull = ta.crossover (rsi, 70), tp2Bull = ta.crossover (rsi, 75), tp3Bull = ta.crossover (rsi, 80)
tp1Bull := tp1Bull and (nz(ta.barssince(tp1Bull) , 9999) > countBull), tp2Bull := tp2Bull and (ta.barssince(tp1Bull) <= countBull), tp2Bull := tp2Bull and (nz(ta.barssince(tp2Bull) , 9999) > countBull), tp3Bull := tp3Bull and (ta.barssince(tp2Bull) <= countBull), tp3Bull := tp3Bull and (nz(ta.barssince(tp3Bull) , 9999) > countBull)
tp1Bear = ta.crossunder(rsi, 30), tp2Bear = ta.crossunder(rsi, 25), tp3Bear = ta.crossunder(rsi, 20)
tp1Bear := tp1Bear and (nz(ta.barssince(tp1Bear) , 9999) > countBear), tp2Bear := tp2Bear and (ta.barssince(tp1Bear) <= countBear), tp2Bear := tp2Bear and (nz(ta.barssince(tp2Bear) , 9999) > countBear), tp3Bear := tp3Bear and (ta.barssince(tp2Bear) <= countBear), tp3Bear := tp3Bear and (nz(ta.barssince(tp3Bear) , 9999) > countBear)
if Presets != "Trend Scalper" and tpLabels
trigger ? (tp == 1 ? tp1Bull : tp == 2 ? tp2Bull : tp3Bull) : (tp == 1 ? tp1Bear : tp == 2 ? tp2Bear : tp3Bear)
plotshape(tpLabels(1), "", shape.xcross, location.abovebar, trigger ? green : na , 0, "TP 1", trigger ? green : na , true)
plotshape(tpLabels(2), "", shape.xcross, location.abovebar, trigger ? green : na , 0, "TP 2", trigger ? green : na , false)
plotshape(tpLabels(3), "", shape.xcross, location.abovebar, trigger ? green : na , 0, "TP 3", trigger ? green : na , false)
plotshape(tpLabels(1), "", shape.xcross, location.belowbar, trigger ? na : red, 0, "TP 1", trigger ? na : red, true)
plotshape(tpLabels(2), "", shape.xcross, location.belowbar, trigger ? na : red, 0, "TP 2", trigger ? na : red, false)
plotshape(tpLabels(3), "", shape.xcross, location.belowbar, trigger ? na : red, 0, "TP 3", trigger ? na : red, false)
var label zzLabel = na
if array.size(zz) > 12 and ShowSwings
if array.get(zz, 0) != array.get(zzOld, 0) or array.get(zz, 1) != array.get(zzOld, 1)
if array.get(zz, 2) == array.get(zzOld, 2) and array.get(zz, 3) == array.get(zzOld, 3)
label.delete(zzLabel)
zzLabel := label.new(math.round(array.get(zz, 1)), array.get(zz, 0), _dir == 1 ? array.get(zz, 0) > array.get(zz, 4) ? ((array.get(zz, 4) < array.get(zz, 8)) ? "High" : "HH") : "LH" : array.get(zz, 0) < array.get(zz, 4) ? ((array.get(zz, 4) > array.get(zz, 8)) ? "Low" : "LL") : "HL", xloc.bar_index, yloc.price, color.new(color.white, 100), _dir == 1 ? label.style_label_down : label.style_label_up, _dir == 1 ? bullcolor : bearcolor)
if showCons and barstate.isconfirmed
dir := hb_ and na(lb_) ? 1 : lb_ and na(hb_) ? -1 : dir
if hb_ and lb_
if dir == 1
zz_ := hb_
else
zz_ := lb_
else
zz_ := hb_ ? hb_ : lb_ ? lb_ : na
for x = 0 to 1000
if na(close) or dir != dir
break
if zz_
if na(pp)
pp := zz_
else
if dir == 1 and zz_ > pp
pp := zz_
if dir == -1 and zz_ < pp
pp := zz_
if pp != pp
if consCnt > 5
if pp > condHi
breakUp := true
if pp < condLo
breakDn := true
if consCnt > 0 and pp <= condHi and pp >= condLo
consCnt += 1
else
consCnt := 0
else
consCnt += 1
if consCnt >= 5
if consCnt == 5
condHi := H_
condLo := L_
else
line.delete(lineUp)
line.delete(lineDn)
condHi := math.max(condHi, high)
condLo := math.min(condLo, low )
lineUp := line.new(bar_index, condHi , bar_index - consCnt, condHi , color=bearcolor , style=line.style_dashed)
lineDn := line.new(bar_index, condLo , bar_index - consCnt, condLo , color=color.lime, style=line.style_dashed)
fill(plot(condHi, "", na, 1, plot.style_stepline, editable=false), plot(condLo, "", na, 1, plot.style_stepline, editable=false), paintCons and consCnt > 5 ? color.white : na, "", false)
//buy_col = color.new(#0ac20a,0)
//sell_col = color.new(#fd1605,0)
//text_col = color.new(#FFFFFF,0)
// -------- Bearish trend (blue) color selection --------
// getSellColor(count) =>
// if count == 1
// color.new(#11e7f2,0)
// else
// if count == 2
// color.new(#11d9f2,0)
// else
// if count == 3
// color.new(#11cbf2,0)
// else
// if count == 4
// color.new(#11aff2,0)
// else
// if count == 5
// color.new(#1193f2,0)
// else
// if count == 6
// color.new(#1176f2,0)
// else
// if count == 7
// color.new(#105df4,0)
// else
// if count == 8
// color.new(#1051f5,0)
// else
// if count == 9
// color.new(#0f44f5,0)
// else
// if count == 10
// color.new(#0c3de0,0)
// else
// if count == 11
// color.new(#0935ca,0)
// else
// if count == 12
// color.new(#062eb4,0)
// else
// if count == 13
// color.new(#02269e,0)
// -------- Bullish trend (blue) color selection --------
// getBuyColor(count) =>
// if count == 1
// color.new(#eef211,0)
// else
// if count == 2
// color.new(#efdc11,0)
// else
// if count == 3
// color.new(#f0c511,0)
// else
// if count == 4
// color.new(#f1af11,0)
// else
// if count == 5
// color.new(#f29811,0)
// else
// if count == 6
// color.new(#f28811,0)
// else
// if count == 7
// color.new(#f27811,0)
// else
// if count == 8
// color.new(#f26811,0)
// else
// if count == 9
// color.new(#f25811,0)
// else
// if count == 10
// color.new(#ea420d,0)
// else
// if count == 11
// color.new(#e12c09,0)
// else
// if count == 12
// color.new(#d81605,0)
// else
// if count == 13
// color.new(#cf0000,0)
// -------- Calculate bearish trend sequence --------
buySetup = 0
buySetup := close < close ? buySetup == 13 ? 1 : buySetup + 1 : 0
// -------- Calculate bullish trend sequence --------
sellSetup = 0
sellSetup := close > close ? sellSetup == 13 ? 1 : sellSetup + 1 : 0
// -------- Paint bars --------
//barColour = buySetup >= 1 ? getBuyColor(buySetup) : sellSetup >= 1 ? getSellColor(sellSetup) : na
// Candle Coloring
// Input
FastteyLength = 12
SjlowLeyLength = 26
srrrc = close
signalXLength = 9
// Data reference
= ta.macd(srrrc, FastteyLength, SjlowLeyLength, signalXLength)
// 4 level of green
greenHigh = #7bff00
greenMidHigh = #7bff00
greenMidLow = #7bff00
greenLow = #7bff00
// Yellow
yellowLow = #693d8e
// 4 level of red
redHigh = #ff0000
redMidHigh = #ff0000
redMidLow = #ff0000
redLow = #ff0000
// Default color
candleBody = yellowLow
// Ranging trend
if histX > 0
if histX > histX and histX > 0
candleBody := greenLow
if histX < 0
if histX < histX and histX < 0
candleBody := redLow
// Bullish trend
if MacdX > 0 and histX > 0
candleBody := greenMidLow
if histX > histX and MacdX > 0 and histX > 0
candleBody := greenMidHigh
if histX > histX and MacdX > 0 and histX > 0
candleBody := greenHigh
// Bearish trend
if MacdX < 0 and histX < 0
candleBody := redMidLow
if histX < histX and MacdX < 0 and histX < 0
candleBody := redMidHigh
if histX < histX and MacdX < 0 and histX < 0
candleBody := redHigh
barcolor(candleBody)
//barcolor(TrendMap == 'RSI Gradient' ? barColour : na, title='Bar colors (heatmap)',editable=false)
//barcolor(momentumCandles and candlesMom() ? color.rgb(187, 187, 187) : TrendMap == 'Signal Based' ? (Presets == "Trend Scalper" ? colorBar : na(countBull) and na(countBear) ? color.gray : trigger ? bullcolor : bearcolor) : TrendMap == 'RSI Gradient' ? barColour : TrendMap == 'Trend Gradient' ? candleBody : na , editable=false)
//plotcandle(open, high, low, close , color = momentumCandles and candlesMom() ? color.rgb(187, 187, 187) : TrendMap == 'Signal Based' ? (Presets == "Trend Scalper" ? colorBar : na(countBull) and na(countBear) ? color.gray : trigger ? bullcolor : bearcolor) : TrendMap == 'RSI Gradient' ? barColour : TrendMap == 'Trend Gradient' ? candleBody : na , editable=false , wickcolor = momentumCandles and candlesMom() ? color.rgb(187, 187, 187) : TrendMap == 'Signal Based' ? (Presets == "Trend Scalper" ? colorBar : na(countBull) and na(countBear) ? color.gray : trigger ? bullcolor : bearcolor) : TrendMap == 'RSI Gradient' ? barColour : TrendMap == 'Trend Gradient' ? candleBody : na , editable=false , bordercolor = momentumCandles and candlesMom() ? color.rgb(187, 187, 187) : TrendMap == 'Signal Based' ? (Presets == "Trend Scalper" ? colorBar : na(countBull) and na(countBear) ? color.gray : trigger ? bullcolor : bearcolor) : TrendMap == 'RSI Gradient' ? barColour : TrendMap == 'Trend Gradient' ? candleBody : na , editable=false , editable = false)
fill(plot(showTrendCloud and periodTrendCloud == "Smooth" ? ema150 : na, "", na, editable=false), plot(showTrendCloud and periodTrendCloud == "Smooth" ? ema250 : na, "", na, editable=false), ema150 > ema250 ? color.new(bullcolor, 70) : ema150 < ema250 ? color.new(bearcolor, 70) : na)
plot(ShowTrailingSL and trigger and nz(ta.barssince(low < trailingStop), bar_index) > countBull ? trailingStop : na, "", green, 1, plot.style_linebr, editable=false)
plot(ShowTrailingSL and not trigger and nz(ta.barssince(high > trailingStop), bar_index) > countBear ? trailingStop : na, "", red , 1, plot.style_linebr, editable=false)
p0 = plot(avgOC, "", na , editable=false)
p1 = plot(ema5 , "", colorEma5 , editable=false)
p2 = plot(ema9 , "", colorEma9 , editable=false)
p3 = plot(ema21, "", colorEma21, editable=false)
plot(LongTrendAverage ? ta.ema(close, 250) : na, 'Trend Tracer', linewidth=2, color=close > ta.ema(close, 250) ? color.new(bullcolor, 45) : color.new(bearcolor, 45))
fill(p0, p1, fillEma5 )
fill(p1, p2, fillEma9 )
fill(p2, p3, fillEma21)
fill(plot(showTrendCloud and periodTrendCloud != "Smooth" and periodTrendCloud != "Scalping+" and trendcloud != 0 and close > trendcloud ? trendcloud : na, "", bullcolor, 1, plot.style_linebr, editable=false), p0, color.new(bullcolor, 90))
fill(plot(showTrendCloud and periodTrendCloud != "Smooth" and periodTrendCloud != "Scalping+" and trendcloud != 0 and close < trendcloud ? trendcloud : na, "", bearcolor , 1, plot.style_linebr, editable=false), p0, color.new(bearcolor , 90))
//fill(plot(hma, "", hma > hma ? green : hma < hma ? red : na, editable=false), plot(hma , "", hma > hma ? green : hma < hma ? red : na, editable=false), hma > hma ? green : hma < hma ? red : na)
////////////////////////////////////////////////////////////////////////////////////////////////
// Get user input
indicatorTF = "Chart"
// Functions
sqz(bbLen, bbMult, kcLen, kcMult, source) =>
upperBB = ta.sma(source, bbLen) + ta.stdev(source, bbLen) * bbMult
lowerBB = ta.sma(source, bbLen) - ta.stdev(source, bbLen) * bbMult
upperKC = ta.sma(source, kcLen) + ta.sma(ta.tr, kcLen) * kcMult
lowerKC = ta.sma(source, kcLen) - ta.sma(ta.tr, kcLen) * kcMult
sqzOn = lowerBB > lowerKC and upperBB < upperKC
sqzOff = lowerBB < lowerKC and upperBB > upperKC
qqe(rsiLen, rsiSmooth, factor, source, bbLen, bbMult) =>
rsiMa = ta.ema(ta.rsi(source, rsiLen), rsiSmooth)
delta = ta.ema(ta.ema(math.abs(ta.mom(rsiMa, 1)), rsiLen * 2 - 1), rsiLen * 2 - 1) * factor
longBand = 0.0, longBand := rsiMa > longBand and rsiMa > longBand ? math.max(longBand , rsiMa - delta) : rsiMa - delta
shortBand = 0.0, shortBand := rsiMa < shortBand and rsiMa < shortBand ? math.min(shortBand , rsiMa + delta) : rsiMa + delta
cross1 = ta.cross(rsiMa, shortBand )
cross2 = ta.cross(rsiMa, longBand )
trend = 0.0, trend := cross1 ? 1 : cross2 ? -1 : nz(trend , 1)
fastDelta = trend == 1 ? longBand : shortBand
_hist = rsiMa - 50
_line = fastDelta - 50
= ta.bb(_line, bbLen, bbMult)
// Get components
cond(_offset) =>
top = ta.highest(high, 10)
bot = ta.lowest(low, 10)
osc = ta.ema(hlc3, 5) - ta.ema(ohlc4, 20)
oscRis = osc > osc
oscFal = osc < osc
oscA0 = osc > 0
oscB0 = osc < 0
oscTop = oscFal and oscRis
oscBot = oscRis and oscFal
bullR = oscB0 and oscBot and ((osc > ta.valuewhen(oscB0 and oscBot, osc, 1) and bot < ta.valuewhen(oscB0 and oscBot, bot, 1)))
bearR = oscA0 and oscTop and ((osc < ta.valuewhen(oscA0 and oscTop, osc, 1) and top > ta.valuewhen(oscA0 and oscTop, top, 1)))
bullH = oscB0 and oscBot and ((osc < ta.valuewhen(oscB0 and oscBot, osc, 1) and bot > ta.valuewhen(oscB0 and oscBot, bot, 1)))
bearH = oscA0 and oscTop and ((osc > ta.valuewhen(oscA0 and oscTop, osc, 1) and top < ta.valuewhen(oscA0 and oscTop, top, 1)))
= sqz(20, 2, 20, 2, close)
= qqe(6, 6, 3, close, 50, 0.001)
= qqe(6, 5, 1.618, close, 50, 1)
= ta.dmi(14, 14)
[osc , oscRis , oscFal , oscA0 , oscB0 , oscTop , oscBot , bullR , bearR , bullH , bearH , sqzOn , sqzOff , _hist1 , upper1 , lower1 , _hist2 , _line2 , tvr ]
tf = indicatorTF == "Chart" ? timeframe.period : indicatorTF == "1 minute" ? "1" : indicatorTF == "3 minutes" ? "3" : indicatorTF == "5 minutes" ? "5" : indicatorTF == "10 minutes" ? "10" : indicatorTF == "15 minutes" ? "15" : indicatorTF == "30 minutes" ? "30" : indicatorTF == "45 minutes" ? "45" : indicatorTF == "1 hour" ? "60" : indicatorTF == "2 hours" ? "120" : indicatorTF == "3 hours" ? "180" : indicatorTF == "4 hours" ? "240" : indicatorTF == "12 hours" ? "720" : indicatorTF == "1 day" ? "1D" : indicatorTF == "1 week" ? "1W" : indicatorTF == "1 month" ? "1M" : na
= request.security(syminfo.tickerid, tf, cond(indicatorTF != "Chart" and barstate.isrealtime ? 1 : 0))
//colorTVR = tvr < 15 ? #F6525F : tvr > 15 and tvr < 25 ? #B2B5BE : #66BB6A
// Plots
//plot(Presets == "Money Moves TrendVR" ? tvr : na, "", colorTVR, editable=false)
TrendText = "Trending"
if tvr < 15 and tvr < 25
TrendText := "No trend"
if tvr > 15 and tvr < 25
TrendText := "Ranging"
//------------------------------------------------------------------------------------------------------- Volatitiry
//Calculates Volatility for Dashboard
atrr = 3 * ta.atr(10)
stdAtr = 2 * ta.stdev(atrr, 20)
smaAtr = ta.sma(atrr, 20)
topAtrDev = smaAtr + stdAtr
bottomAtrDev = smaAtr - stdAtr
calcDev = (atrr - bottomAtrDev) / (topAtrDev - bottomAtrDev)
percentVol = 40 * calcDev + 30
AvrLength = 21
PercentFilter = 144
xAavrVolume = ta.rma(volume, AvrLength)
nResLess = volume * 100 / xAavrVolume < PercentFilter ? 0 : volume
nRes = nResLess
clr = close < open ? #b2b5be : #00dbff
//plot(nRes, color=clr, style=plot.style_columns, title='Volume Filter', transp=20)
VolitiText = "Inactive"
if nRes
VolitiText := "Active"
//////////////////////////////////////////
ema69 = ta.ema(close, 9)
totalSentTxt = ema69 > ema69 ? 'Bullish' : ema69 < ema69 ? 'Bearish' : 'Flat'
// INputs
//Timezones
tz_incr = 0
use_exchange = false
//------------------------------------------------------------------------------
//Settings
//-----------------------------------------------------------------------------{
//Session A
NYSes = true
NYTxt = 'New York'
NYTime = '1300-2200'
//Session B
LDSes = true
sesb_txt = 'London'
sesb_ses = '0700-1600'
//Session C
show_sesc = true
sesc_txt = 'Tokyo'
sesc_ses = '0000-0900'
//Session D
show_sesd = true
sesd_txt = 'Sydney'
sesd_ses = '2100-0600'
//-----------------------------------------------------------------------------}
//Sessions
//-----------------------------------------------------------------------------{
tff = timeframe.period
var tz = use_exchange ? syminfo.timezone :
str.format('UTC{0}{1}', tz_incr >= 0 ? '+' : '-', math.abs(tz_incr))
is_sesa = math.sign(nz(time(tff, NYTime, tz)))
is_sesb = math.sign(nz(time(tff, sesb_ses, tz)))
is_sesc = math.sign(nz(time(tff, sesc_ses, tz)))
is_sesd = math.sign(nz(time(tff, sesd_ses, tz)))
////////////////////////////////////////////
SessionText = "Default"
if is_sesd
SessionText := sesd_txt
if is_sesc
SessionText := sesc_txt
if is_sesb
SessionText := sesb_txt
if is_sesa
SessionText := NYTxt
if is_sesd and is_sesc
SessionText := "Sydney/Tokyo"
if is_sesb and is_sesc
SessionText := "Tokyo/London"
if is_sesb and is_sesa
SessionText := "London/Newyork"
if is_sesa and is_sesd
SessionText := "Newyork/Sydney"
//-----------------------------------------------------------------------------}
//Overlays color.green : color.red
//
var dashboard_loc = locationDashboard == "Top Right" ? position.top_right : locationDashboard == "Middle Right" ? position.middle_right : locationDashboard == "Bottom Right" ? position.bottom_right : locationDashboard == "Top Center" ? position.top_center : locationDashboard == "Middle Center" ? position.middle_center : locationDashboard == "Bottom Center" ? position.bottom_center : locationDashboard == "Top Left" ? position.top_left : locationDashboard == "Middle Left" ? position.middle_left : position.bottom_left
var dashboard_size = sizeDashboard == "Large" ? size.large : sizeDashboard == "Normal" ? size.normal : sizeDashboard == "Small" ? size.small : size.tiny
var dashboard = showDashboard ? table.new(dashboard_loc, 3, 7, color.rgb(0, 0, 0, 60), #3d384300, 2, color.rgb(30, 34, 45 , 60), 1) : na
dashboard_cell(column, row, txt, signal=false) => table.cell(dashboard, column, row, txt, 0, 0, signal ? #000000 : color.white, text_size=dashboard_size)
dashboard_cell_bg(column, row, col) => table.cell_set_bgcolor(dashboard, column, row, col)
if barstate.islast and showDashboard
// MTF Trend
dashboard_cell(0, 0 , "MTF")
dashboard_cell(0, 2 , "M5") , dashboard_cell_bg(0, 2 , TF5Bull ? color.rgb(70, 153, 67) : #880000)
dashboard_cell(0, 3 , "M15") , dashboard_cell_bg(0, 3 , TF15Bull ? color.rgb(70, 153, 67) : #880000)
dashboard_cell(0, 4 , "M30") , dashboard_cell_bg(0, 4 , TF30Bull ? color.rgb(70, 153, 67) : #880000)
dashboard_cell(0, 5 , "1H") , dashboard_cell_bg(0, 5 , TF60Bull ? color.rgb(70, 153, 67) : #880000)
dashboard_cell(0, 6 , "4H") , dashboard_cell_bg(0, 6 , TF240Bull ? color.rgb(70, 153, 67) : #880000)
// Middel part
dashboard_cell(1, 0 , "PoseidonPips")
dashboard_cell(1, 2 , "Market State")
dashboard_cell(1, 3 , "Volatility")
dashboard_cell(1, 4 , "Institutional Activity")
dashboard_cell(1, 5 , "Current Session (UTC)")
dashboard_cell(1, 6 , "Trend Pressure")
// End part
dashboard_cell(2, 0 , "")
dashboard_cell(2, 2 , TrendText)
dashboard_cell(2, 3 , str.tostring(percentVol, '##.##') + '%')
dashboard_cell(2, 4 , VolitiText)
dashboard_cell(2, 5 , SessionText)
dashboard_cell(2, 6 , totalSentTxt)
// Alerts
// Cross Functions for SL and TP
f_sl_crossed() =>
ret = false
crossBull = low >= ta.lowest(low, 5) and low < ta.lowest(low, 5)
crossBear = high <= ta.highest(high, 5) and high > ta.highest(high, 5)
ret := trigger ? crossBull : crossBear
ret
f_tp_crossed(tp) =>
ret = false
crossBull = high <= tp and high > tp
crossBear = low >= tp and low < tp
ret := trigger ? crossBull : crossBear
ret
// Alert Conditions
alert04 = bull and close <= StrongFilter
alert07 = bull and close > StrongFilter
alert09 = f_sl_crossed()
alert11 = f_tp_crossed(60.0)
alert12 = f_tp_crossed(80.0)
alert13 = f_tp_crossed(100.0)
alert14 = periodTrendCloud == "Smooth" ? ta.crossunder(ema150, ema250) : (close < trendcloud) and (close > trendcloud )
alert15 = periodTrendCloud == "Smooth" ? ta.crossover(ema150, ema250) : (close > trendcloud) and (close < trendcloud )
// Signal Alerts
if alert04 and Normalbuy_alert
alert('Buy Signal Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
if alert07 and Strongbuy_alert
alert('Strong Buy Signal Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
if (bear and close >= StrongFilter) and Normalsell_alert
alert('Sell Signal Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
if (bear and close < StrongFilter) and Strongsell_alert
alert('Strong Sell Signal Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
// Risk Management Alerts
if alert09 and slalert
alert('SL Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
if alert11 and tp1alert
alert('Target 1 Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
if alert12 and tp2alert
alert('Target 2 Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
if alert13 and tp3alert
alert('Target 3 Alert !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
// Cloud Alerts
if alert15 and bullcrosscloud_alert
alert('Cloud Turned Bullish !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
if alert14 and bearcrosscloud_alert
alert('Cloud Turned Bearish !!!', alert.freq_once_per_bar_close)
alert(syminfo.tickerid)
// Alert Conditions for TradingView
alertcondition(alert04, "Normal Buy Alert", "Normal Buy Signal")
alertcondition(alert07, "Strong Buy Alert", "Strong Buy Signal")
alertcondition((bear and close >= StrongFilter), "Normal Sell Alert", "Normal Sell Signal")
alertcondition((bear and close < StrongFilter), "Strong Sell Alert", "Strong Sell Signal")
alertcondition(alert09, "SL Crossed Alert", "Stop Loss Crossed")
alertcondition(alert11, "TP1 Crossed Alert", "Target 1 Crossed")
alertcondition(alert12, "TP2 Crossed Alert", "Target 2 Crossed")
alertcondition(alert13, "TP3 Crossed Alert", "Target 3 Crossed")
// Input
fastLength = 12
slowLength = 26
srcceed = close
signalLength = 9
// Data reference
= ta.macd(srcceed, fastLength, slowLength, signalLength)
// 4 level of green
greenHighh = #7bff00
greenMidHighh = #7bff00
greenMidLowh = #7bff00
greenLowh = #7bff00
// Yellow
yellowLowh = #693d8e
// 4 level of red
redHighh = #ff0000
redMidHighh = #ff0000
redMidLowh = #ff0000
redLowh = #ff0000
// Default color
candleBodyd = yellowLowh
// Ranging trend
if hist > 0
if hist > hist and hist > 0
candleBodyd := greenLowh
if hist < 0
if hist < hist and hist < 0
candleBodyd := redLowh
// Bullish trend
if macdda > 0 and hist > 0
candleBodyd := greenMidLowh
if hist > hist and macd > 0 and hist > 0
candleBodyd := greenMidHighh
if hist > hist and macd > 0 and hist > 0
candleBodyd := greenHighh
// Bearish trend
if macdda < 0 and hist < 0
candleBodyd := redMidLowh
if hist < hist and macd < 0 and hist < 0
candleBodyd := redMidHighh
if hist < hist and macd < 0 and hist < 0
candleBodyd := redHighh
barcolor(candleBodyd) // Include suggestion by Shaheen204
//
tenkan_len = 365
tenkan_mult = 3
kijun_len = 365
kijun_mult = 7
spanB_len = 365
spanB_mult = 10
offset = 1
//------------------------------------------------------------------------------
avg(src,length,mult)=>
atr = ta.atr(50)*mult
up = hl2 + atr
dn = hl2 - atr
upper = 0.,lower = 0.
upper := src < upper ? math.min(up,upper ) : up
lower := src > lower ? math.max(dn,lower ) : dn
os = 0,max = 0.,min = 0.
os := src > upper ? 1 : src < lower ? 0 : os
spt = os == 1 ? lower : upper
max := ta.cross(src,spt) ? math.max(src,max ) : os == 1 ? math.max(src,max ) : spt
min := ta.cross(src,spt) ? math.min(src,min ) : os == 0 ? math.min(src,min ) : spt
math.avg(max,min)
//------------------------------------------------------------------------------
tenkan = avg(close,tenkan_len,tenkan_mult)
kijun = avg(close,kijun_len,kijun_mult)
senkouA = math.avg(kijun,tenkan)
senkouB = avg(close,spanB_len,spanB_mult)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Smart Money Concept
settings = "Settings"
zigzag_len = input.int(9, "ZigZag Length", group=settings)
show_zigzag = input.bool(false, "Show Zigzag", group=settings)
fib_factor = input.float(0.33, "Fib Factor for breakout confirmation", 0, 1, 0.01, group=settings)
text_size = input.string(size.tiny, "Text Size", , group=settings)
delete_boxes = input.bool(true, "Delete Old/Broken Boxes", group=settings)
bu_ob_inline_color = "Bu-OB Colors"
be_ob_inline_color = "Be-OB Colors"
bu_bb_inline_color = "Bu-BB Colors"
be_bb_inline_color = "Be-BB Colors"
bu_ob_display_settings = "Bu-OB Display Settings"
bu_ob_color = input.color(color.new(color.green, 70), "Color", group=bu_ob_display_settings, inline=bu_ob_inline_color)
bu_ob_border_color = input.color(color.green, "Border Color", group=bu_ob_display_settings, inline=bu_ob_inline_color)
bu_ob_text_color = input.color(color.green, "Text Color", group=bu_ob_display_settings, inline=bu_ob_inline_color)
be_ob_display_settings = "Be-OB Display Settings"
be_ob_color = input.color(color.new(color.red, 70), "Color", group=be_ob_display_settings, inline=be_ob_inline_color)
be_ob_border_color = input.color(color.red, "Border Color", group=be_ob_display_settings, inline=be_ob_inline_color)
be_ob_text_color = input.color(color.red, "Text Color", group=be_ob_display_settings, inline=be_ob_inline_color)
bu_bb_display_settings = "Bu-BB & Bu-MB Display Settings"
bu_bb_color = input.color(color.new(color.green, 70), "Color", group=bu_bb_display_settings, inline=bu_bb_inline_color)
bu_bb_border_color = input.color(color.green, "Border Color", group=bu_bb_display_settings, inline=bu_bb_inline_color)
bu_bb_text_color = input.color(color.green, "Text Color", group=bu_bb_display_settings, inline=bu_bb_inline_color)
be_bb_display_settings = "Be-BB & Be-MB Display Settings"
be_bb_color = input.color(color.new(color.red, 70), "Color", group=be_bb_display_settings, inline=be_bb_inline_color)
be_bb_border_color = input.color(color.red, "Border Color", group=be_bb_display_settings, inline=be_bb_inline_color)
be_bb_text_color = input.color(color.red, "Text Color", group=be_bb_display_settings, inline=be_bb_inline_color)
var float high_points_arr = array.new_float(5)
var int high_index_arr = array.new_int(5)
var float low_points_arr = array.new_float(5)
var int low_index_arr = array.new_int(5)
var box bu_ob_boxes = array.new_box(5)
var box be_ob_boxes = array.new_box(5)
var box bu_bb_boxes = array.new_box(5)
var box be_bb_boxes = array.new_box(5)
to_up = high >= ta.highest(zigzag_len)
to_down = low <= ta.lowest(zigzag_len)
trend = 1
trend := nz(trend , 1)
trend := trend == 1 and to_down ? -1 : trend == -1 and to_up ? 1 : trend
last_trend_up_since = ta.barssince(to_up )
low_val = ta.lowest(nz(last_trend_up_since > 0 ? last_trend_up_since : 1, 1))
low_index = bar_index - ta.barssince(low_val == low)
last_trend_down_since = ta.barssince(to_down )
high_val = ta.highest(nz(last_trend_down_since > 0 ? last_trend_down_since : 1, 1))
high_index = bar_index - ta.barssince(high_val == high)
if ta.change(trend) != 0
if trend == 1
array.push(low_points_arr, low_val)
array.push(low_index_arr, low_index)
if trend == -1
array.push(high_points_arr, high_val)
array.push(high_index_arr, high_index)
f_get_high(ind) =>
f_get_low(ind) =>
f_delete_box(box_arr) =>
if delete_boxes
box.delete(array.shift(box_arr))
else
array.shift(box_arr)
0
= f_get_high(0)
= f_get_high(1)
= f_get_low(0)
= f_get_low(1)
if ta.change(trend) != 0 and show_zigzag
if trend == 1
line.new(h0i, h0, l0i, l0)
if trend == -1
line.new(l0i, l0, h0i, h0)
market = 1
market := nz(market , 1)
// market := market == 1 and close < l0 and low < l0 - math.abs(h0 - l0) * fib_factor ? -1 : market == -1 and close > h0 and high > h0 + math.abs(h0 - l0) * fib_factor ? 1 : market
last_l0 = ta.valuewhen(ta.change(market) != 0, l0, 0)
last_h0 = ta.valuewhen(ta.change(market) != 0, h0, 0)
market := last_l0 == l0 or last_h0 == h0 ? market : market == 1 and l0 < l1 and l0 < l1 - math.abs(h0 - l1) * fib_factor ? -1 : market == -1 and h0 > h1 and h0 > h1 + math.abs(h1 - l0) * fib_factor ? 1 : market
bu_ob_index = bar_index
bu_ob_index := nz(bu_ob_index , bar_index)
for i=h1i to l0i
index = bar_index - i
if open > close
bu_ob_index := bar_index
bu_ob_since = bar_index - bu_ob_index
be_ob_index = bar_index
be_ob_index := nz(be_ob_index , bar_index)
for i=l1i to h0i
index = bar_index - i
if open < close
be_ob_index := bar_index
be_ob_since = bar_index - be_ob_index
be_bb_index = bar_index
be_bb_index := nz(be_bb_index , bar_index)
for i=h1i - zigzag_len to l1i
index = bar_index - i
if open > close
be_bb_index := bar_index
be_bb_since = bar_index - be_bb_index
bu_bb_index = bar_index
bu_bb_index := nz(bu_bb_index , bar_index)
for i=l1i - zigzag_len to h1i
index = bar_index - i
if open < close
bu_bb_index := bar_index
bu_bb_since = bar_index - bu_bb_index
if ta.change(market) != 0
if market == 1
line.new(h1i, h1, h0i, h1, color=color.green, width=1)
label.new(int(math.avg(h1i, l0i)), h1, "BoS", color=color.new(color.black, 100), style=label.style_label_down, textcolor=color.green, size=size.small)
bu_ob = box.new(bu_ob_index, high , bar_index + 10, low , bgcolor=bu_ob_color, border_color=bu_ob_border_color, text="Bu-OB", text_color=bu_ob_text_color, text_halign=text.align_right, text_size=text_size)
bu_bb = box.new(bu_bb_index, high , bar_index + 10, low , bgcolor=bu_bb_color, border_color=bu_bb_border_color, text=l0 < l1 ? "Bu-BB" : "Bu-MB", text_color=bu_bb_text_color, text_halign=text.align_right, text_size=text_size)
array.push(bu_ob_boxes, bu_ob)
array.push(bu_bb_boxes, bu_bb)
if market == -1
line.new(l1i, l1, l0i, l1, color=color.red, width=1)
label.new(int(math.avg(l1i, h0i)), l1, "BoS", color=color.new(color.black, 100), style=label.style_label_up, textcolor=color.red, size=size.small)
be_ob = box.new(be_ob_index, high , bar_index + 10, low , bgcolor=be_ob_color, border_color=be_ob_border_color, text="Be-OB", text_color=be_ob_text_color, text_halign=text.align_right, text_size=text_size)
be_bb = box.new(be_bb_index, high , bar_index + 10, low , bgcolor=be_bb_color, border_color=be_bb_border_color, text=h0 > h1 ? "Be-BB" : "Be-MB", text_color=be_bb_text_color, text_halign=text.align_right, text_size=text_size)
array.push(be_ob_boxes, be_ob)
array.push(be_bb_boxes, be_bb)
for bull_ob in bu_ob_boxes
bottom = box.get_bottom(bull_ob)
top = box.get_top(bull_ob)
if close < bottom
f_delete_box(bu_ob_boxes)
else if close < top
alert("Price in the BU-OB zone")
else
box.set_right(bull_ob, bar_index + 10)
for bear_ob in be_ob_boxes
top = box.get_top(bear_ob)
bottom = box.get_bottom((bear_ob))
if close > top
f_delete_box(be_ob_boxes)
if close > bottom
alert("Price in the BE-OB zone")
else
box.set_right(bear_ob, bar_index + 10)
for bear_bb in be_bb_boxes
top = box.get_top(bear_bb)
bottom = box.get_bottom(bear_bb)
if close > top
f_delete_box(be_bb_boxes)
else if close > bottom
alert("Price in the BE-BB zone")
else
box.set_right(bear_bb, bar_index + 10)
for bull_bb in bu_bb_boxes
bottom = box.get_bottom(bull_bb)
top = box.get_top(bull_bb)
if close < bottom
f_delete_box(bu_bb_boxes)
else if close < top
alert("Price in the BU-BB zone")
else
box.set_right(bull_bb, bar_index + 10)
alertcondition(ta.change(market) != 0, "MSB", "MSB")
enableAutoTrend = input(true, "Enable Auto Trendlines", group="AUTO TRENDLINES SETTINGS")
srcTrendChannel = input(close, "Trend channel source", group="AUTO TRENDLINES SETTINGS")
lenTrendChannel = input.int(50, "Trend channel loopback", 2, group="AUTO TRENDLINES SETTINGS")
a = ta.wma(srcTrendChannel, lenTrendChannel), b = ta.sma(srcTrendChannel, lenTrendChannel)
A = 4 * b - 3 * a, B = 3 * a - 2 * b
m = (A - B) / (lenTrendChannel - 1)
d = 0., for i = 0 to lenTrendChannel - 1 by 1
l = B + m * i
d += math.pow(srcTrendChannel - l, 2)
rmse = math.sqrt(d / (lenTrendChannel - 1)) * 2
l(css, k) =>
line lr = enableAutoTrend ? line.new(bar_index - lenTrendChannel + 1, A + k, bar_index, B + k, extend=extend.right, color=css) : na
line.delete(lr )
l(#808080, rmse), l(#808080, 0), l(#808080,-rmse)
// ==========================================================================================
// === Dashboard with Telegram Link ===
var table myTable = table.new(position.top_center, 1, 1, border_width=1, frame_color=color.black, bgcolor=color.white)
table.cell(myTable, 0, 0, "", bgcolor=color.blue, text_color=color.white, text_size=size.normal)
INDIBOT ABO SALTAN
//@version=5
indicator("INDIBOT", shorttitle = "INDIBOT", overlay = true, max_lines_count = 500, max_labels_count = 500, max_boxes_count = 500, max_bars_back = 500, max_polylines_count = 100)
//-----------------------------------------------------------------------------{
//Boolean set
//-----------------------------------------------------------------------------{
s_BOS = 0
s_CHoCH = 1
i_BOS = 2
i_CHoCH = 3
i_pp_CHoCH = 4
green_candle = 5
red_candle = 6
s_CHoCHP = 7
i_CHoCHP = 8
boolean =
array.from(
false
, false
, false
, false
, false
, false
, false
, false
, false
)
//-----------------------------------------------------------------------------{
// User inputs
//-----------------------------------------------------------------------------{
show_swing_ms = input.string ("All" , "Swing " , inline = "1", group = "MARKET STRUCTURE" , options = )
show_internal_ms = input.string ("All" , "Internal " , inline = "2", group = "MARKET STRUCTURE" , options = )
internal_r_lookback = input.int (5 , "" , inline = "2", group = "MARKET STRUCTURE" , minval = 2)
swing_r_lookback = input.int (50 , "" , inline = "1", group = "MARKET STRUCTURE" , minval = 2)
ms_mode = input.string ("Manual" , "Market Structure Mode" , inline = "a", group = "MARKET STRUCTURE" , tooltip = " Use selected lenght Use automatic lenght" ,options = )
show_mtf_str = input.bool (true , "MTF Scanner" , inline = "9", group = "MARKET STRUCTURE" , tooltip = "Display Multi-Timeframe Market Structure Trend Directions. Green = Bullish. Red = Bearish")
show_eql = input.bool (false , "Show EQH/EQL" , inline = "6", group = "MARKET STRUCTURE")
plotcandle_bool = input.bool (false , "Plotcandle" , inline = "3", group = "MARKET STRUCTURE" , tooltip = "Displays a cleaner colored candlestick chart in place of the default candles. (requires hiding the current ticker candles)")
barcolor_bool = input.bool (false , "Bar Color" , inline = "4", group = "MARKET STRUCTURE" , tooltip = "Color the candle bodies according to market strucutre trend")
i_ms_up_BOS = input.color (#089981 , "" , inline = "2", group = "MARKET STRUCTURE")
i_ms_dn_BOS = input.color (#f23645 , "" , inline = "2", group = "MARKET STRUCTURE")
s_ms_up_BOS = input.color (#089981 , "" , inline = "1", group = "MARKET STRUCTURE")
s_ms_dn_BOS = input.color (#f23645 , "" , inline = "1", group = "MARKET STRUCTURE")
lvl_daily = input.bool (false , "Day " , inline = "1", group = "HIGHS & LOWS MTF")
lvl_weekly = input.bool (false , "Week " , inline = "2", group = "HIGHS & LOWS MTF")
lvl_monthly = input.bool (false , "Month" , inline = "3", group = "HIGHS & LOWS MTF")
lvl_yearly = input.bool (false , "Year " , inline = "4", group = "HIGHS & LOWS MTF")
css_d = input.color (color.blue , "" , inline = "1", group = "HIGHS & LOWS MTF")
css_w = input.color (color.blue , "" , inline = "2", group = "HIGHS & LOWS MTF")
css_m = input.color (color.blue , "" , inline = "3", group = "HIGHS & LOWS MTF")
css_y = input.color (color.blue , "" , inline = "4", group = "HIGHS & LOWS MTF")
s_d = input.string ('⎯⎯⎯' , '' , inline = '1', group = 'HIGHS & LOWS MTF' , options = )
s_w = input.string ('⎯⎯⎯' , '' , inline = '2', group = 'HIGHS & LOWS MTF' , options = )
s_m = input.string ('⎯⎯⎯' , '' , inline = '3', group = 'HIGHS & LOWS MTF' , options = )
s_y = input.string ('⎯⎯⎯' , '' , inline = '4', group = 'HIGHS & LOWS MTF' , options = )
ob_show = input.bool (true , "Show Last " , inline = "1", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Display volumetric order blocks on the chart Ammount of volumetric order blocks to show")
ob_num = input.int (5 , "" , inline = "1", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Orderblocks number", minval = 1, maxval = 10)
ob_metrics_show = input.bool (true , "Internal Buy/Sell Activity" , inline = "2", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Display volume metrics that have formed the orderblock")
css_metric_up = input.color (color.new(#089981, 50) , " " , inline = "2", group = "VOLUMETRIC ORDER BLOCKS")
css_metric_dn = input.color (color.new(#f23645 , 50) , "" , inline = "2", group = "VOLUMETRIC ORDER BLOCKS")
ob_swings = input.bool (false , "Swing Order Blocks" , inline = "a", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Display swing volumetric order blocks")
css_swing_up = input.color (color.new(color.gray , 90) , " " , inline = "a", group = "VOLUMETRIC ORDER BLOCKS")
css_swing_dn = input.color (color.new(color.silver, 90) , "" , inline = "a", group = "VOLUMETRIC ORDER BLOCKS")
ob_filter = input.string ("None" , "Filtering " , inline = "d", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Filter out volumetric order blocks by BOS/CHoCH/CHoCH+", options = )
ob_mitigation = input.string ("Absolute" , "Mitigation " , inline = "4", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Trigger to remove volumetric order blocks", options = )
ob_pos = input.string ("Precise" , "Positioning " , inline = "k", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Position of the Order Block Cover the whole candle Cover half candle Adjust to volatility Same as Accurate but more precise", options = )
use_grayscale = input.bool (false , "Grayscale" , inline = "6", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Use gray as basic order blocks color")
use_show_metric = input.bool (true , "Show Metrics" , inline = "7", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Show volume associated with the orderblock and his relevance")
use_middle_line = input.bool (true , "Show Middle-Line" , inline = "8", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Show mid-line order blocks")
use_overlap = input.bool (true , "Hide Overlap" , inline = "9", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = "Hide overlapping order blocks")
use_overlap_method = input.string ("Previous" , "Overlap Method " , inline = "Z", group = "VOLUMETRIC ORDER BLOCKS" , tooltip = " Preserve the most recent volumetric order blocks Preserve the previous volumetric order blocks", options = )
ob_bull_css = input.color (color.new(#089981 , 90) , "" , inline = "1", group = "VOLUMETRIC ORDER BLOCKS")
ob_bear_css = input.color (color.new(#f23645 , 90) , "" , inline = "1", group = "VOLUMETRIC ORDER BLOCKS")
show_acc_dist_zone = input.bool (false , "" , inline = "1", group = "Accumulation And Distribution")
zone_mode = input.string ("Fast" , "" , inline = "1", group = "Accumulation And Distribution" , tooltip = " Find small zone pattern formation Find bigger zone pattern formation" ,options = )
acc_css = input.color (color.new(#089981 , 60) , "" , inline = "1", group = "Accumulation And Distribution")
dist_css = input.color (color.new(#f23645 , 60) , "" , inline = "1", group = "Accumulation And Distribution")
show_lbl = input.bool (true , "Show swing point" , inline = "1", group = "High and Low" , tooltip = "Display swing point")
show_mtb = input.bool (true , "Show High/Low/Equilibrium" , inline = "2", group = "High and Low" , tooltip = "Display Strong/Weak High And Low and Equilibrium")
toplvl = input.color (color.red , "Premium Zone " , inline = "3", group = "High and Low")
midlvl = input.color (color.gray , "Equilibrium Zone" , inline = "4", group = "High and Low")
btmlvl = input.color (#089981 , "Discount Zone " , inline = "5", group = "High and Low")
fvg_enable = input.bool (false , " " , inline = "1", group = "FAIR VALUE GAP" , tooltip = "Display fair value gap")
what_fvg = input.string ("FVG" , "" , inline = "1", group = "FAIR VALUE GAP" , tooltip = "Display fair value gap", options = )
fvg_num = input.int (5 , "Show Last " , inline = "1a", group = "FAIR VALUE GAP" , tooltip = "Number of fvg to show")
fvg_upcss = input.color (color.new(#089981, 80) , "" , inline = "1", group = "FAIR VALUE GAP")
fvg_dncss = input.color (color.new(color.red , 80) , "" , inline = "1", group = "FAIR VALUE GAP")
fvg_extend = input.int (10 , "Extend FVG" , inline = "2", group = "FAIR VALUE GAP" , tooltip = "Extend the display of the FVG.")
fvg_src = input.string ("Close" , "Mitigation " , inline = "3", group = "FAIR VALUE GAP" , tooltip = " Use the close of the body as trigger Use the extreme point of the body as trigger", options = )
fvg_tf = input.timeframe ("" , "Timeframe " , inline = "4", group = "FAIR VALUE GAP" , tooltip = "Timeframe of the fair value gap")
t = color.t (ob_bull_css)
invcol = color.new (color.white , 100)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - UDT }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
type bar
float o = open
float c = close
float h = high
float l = low
float v = volume
int n = bar_index
int t = time
type Zphl
line top
line bottom
label top_label
label bottom_label
bool stopcross
bool sbottomcross
bool itopcross
bool ibottomcross
string txtup
string txtdn
float topy
float bottomy
float topx
float bottomx
float tup
float tdn
int tupx
int tdnx
float itopy
float itopx
float ibottomy
float ibottomx
float uV
float dV
type FVG
box box
line ln
bool bull
float top
float btm
int left
int right
type ms
float p
int n
float l
type msDraw
int n
float p
color css
string txt
bool bull
type obC
float top
float btm
int left
float avg
float dV
float cV
int wM
int blVP
int brVP
int dir
float h
float l
int n
type obD
box ob
box eOB
box blB
box brB
line mL
type zone
chart.point points
float p
int c
int t
type hqlzone
box pbx
box ebx
box lbx
label plb
label elb
label lbl
type ehl
float pt
int t
float pb
int b
type pattern
string found = "None"
bool isfound = false
int period = 0
bool bull = false
type alerts
bool chochswing = false
bool chochplusswing = false
bool swingbos = false
bool chochplus = false
bool choch = false
bool bos = false
bool equal = false
bool ob = false
bool swingob = false
bool zone = false
bool fvg = false
bool obtouch = false
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - General Setup }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
bar b = bar.new()
var pattern p = pattern.new()
alerts blalert = alerts.new()
alerts bralert = alerts.new()
if p.isfound
p.period += 1
if p.period == 50
p.period := 0
p.found := "None"
p.isfound := false
p.bull := na
switch
b.c > b.o => boolean.set(green_candle, true)
b.c < b.o => boolean.set(red_candle , true)
f_zscore(src, lookback) =>
(src - ta.sma(src, lookback)) / ta.stdev(src, lookback)
var int iLen = internal_r_lookback
var int sLen = swing_r_lookback
vv = f_zscore(((close - close ) / close ) * 100,iLen)
if ms_mode == "Dynamic"
switch
vv >= 1.5 or vv <= -1.5 => iLen := 10
vv >= 1.6 or vv <= -1.6 => iLen := 9
vv >= 1.7 or vv <= -1.7 => iLen := 8
vv >= 1.8 or vv <= -1.8 => iLen := 7
vv >= 1.9 or vv <= -1.9 => iLen := 6
vv >= 2.0 or vv <= -2.0 => iLen := 5
=> iLen
var msline = array.new(0)
iH = ta.pivothigh(high, iLen, iLen)
sH = ta.pivothigh(high, sLen, sLen)
iL = ta.pivotlow (low , iLen, iLen)
sL = ta.pivotlow (low , sLen, sLen)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - ARRAYS }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
hl () =>
= request.security(syminfo.tickerid , 'D' , hl() , lookahead = barmerge.lookahead_on)
= request.security(syminfo.tickerid , 'W' , hl() , lookahead = barmerge.lookahead_on)
= request.security(syminfo.tickerid , 'M' , hl() , lookahead = barmerge.lookahead_on)
= request.security(syminfo.tickerid , '12M', hl() , lookahead = barmerge.lookahead_on)
lstyle(style) =>
out = switch style
'⎯⎯⎯' => line.style_solid
'----' => line.style_dashed
'····' => line.style_dotted
mtfphl(h, l ,tf ,css, pdhl_style) =>
var line hl = line.new(
na
, na
, na
, na
, xloc = xloc.bar_time
, color = css
, style = lstyle(pdhl_style)
)
var line ll = line.new(
na
, na
, na
, na
, xloc = xloc.bar_time
, color = css
, style = lstyle(pdhl_style)
)
var label lbl = label.new(
na
, na
, xloc = xloc.bar_time
, text = str.format('P{0}L', tf)
, color = invcol
, textcolor = css
, size = size.small
, style = label.style_label_left
)
var label hlb = label.new(
na
, na
, xloc = xloc.bar_time
, text = str.format('P{0}H', tf)
, color = invcol
, textcolor = css
, size = size.small
, style = label.style_label_left
)
hy = ta.valuewhen(h != h , h , 1)
hx = ta.valuewhen(h == high , time , 1)
ly = ta.valuewhen(l != l , l , 1)
lx = ta.valuewhen(l == low , time , 1)
if barstate.islast
extension = time + (time - time ) * 50
line.set_xy1(hl , hx , hy)
line.set_xy2(hl , extension , hy)
label.set_xy(hlb, extension , hy)
line.set_xy1(ll , lx , ly)
line.set_xy2(ll , extension , ly)
label.set_xy(lbl, extension , ly)
if lvl_daily
mtfphl(pdh , pdl , 'D' , css_d, s_d)
if lvl_weekly
mtfphl(pwh , pwl , 'W' , css_w, s_w)
if lvl_monthly
mtfphl(pmh , pml, 'M' , css_m, s_m)
if lvl_yearly
mtfphl(pyh , pyl , '12M', css_y, s_y)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - Market Structure }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
method darkcss(color css, float factor, bool bull) =>
blue = color.b(css) * (1 - factor)
red = color.r(css) * (1 - factor)
green = color.g(css) * (1 - factor)
color.rgb(red, green, blue, 0)
method f_line(msDraw d, size, style) =>
var line id = na
var label lbl = na
id := line.new(
d.n
, d.p
, b.n
, d.p
, color = d.css
, width = 1
, style = style
)
if msline.size() >= 250
line.delete(msline.shift())
msline.push(id)
lbl := label.new(
int(math.avg(d.n, b.n))
, d.p
, d.txt
, color = invcol
, textcolor = d.css
, style = d.bull ? label.style_label_down : label.style_label_up
, size = size
, text_font_family = font.family_monospace
)
structure(bool mtf) =>
msDraw drw = na
bool isdrw = false
bool isdrwS = false
var color css = na
var color icss = na
var int itrend = 0
var int trend = 0
bool bull_ob = false
bool bear_ob = false
bool s_bull_ob = false
bool s_bear_ob = false
n = bar_index
var ms up = ms.new(
array.new()
, array.new< int >()
, array.new()
)
var ms dn = ms.new(
array.new()
, array.new< int >()
, array.new()
)
var ms sup = ms.new(
array.new()
, array.new< int >()
, array.new()
)
var ms sdn = ms.new(
array.new()
, array.new< int >()
, array.new()
)
switch show_swing_ms
"All" => boolean.set(s_BOS , true ), boolean.set(s_CHoCH, true ) , boolean.set(s_CHoCHP, true )
"CHoCH" => boolean.set(s_BOS , false), boolean.set(s_CHoCH, true ) , boolean.set(s_CHoCHP, false )
"CHoCH+" => boolean.set(s_BOS , false), boolean.set(s_CHoCH, false) , boolean.set(s_CHoCHP, true )
"BOS" => boolean.set(s_BOS , true ), boolean.set(s_CHoCH, false) , boolean.set(s_CHoCHP, false )
"None" => boolean.set(s_BOS , false), boolean.set(s_CHoCH, false) , boolean.set(s_CHoCHP, false )
=> na
switch show_internal_ms
"All" => boolean.set(i_BOS, true ), boolean.set(i_CHoCH, true ), boolean.set(i_CHoCHP, true )
"CHoCH" => boolean.set(i_BOS, false), boolean.set(i_CHoCH, true ), boolean.set(i_CHoCHP, false)
"CHoCH+" => boolean.set(i_BOS, false), boolean.set(i_CHoCH, false ), boolean.set(i_CHoCHP, true )
"BOS" => boolean.set(i_BOS, true ), boolean.set(i_CHoCH, false ), boolean.set(i_CHoCHP, false)
"None" => boolean.set(i_BOS, false), boolean.set(i_CHoCH, false ), boolean.set(i_CHoCHP, false)
=> na
switch
iH =>
up.p.unshift(b.h )
up.l.unshift(b.h )
up.n.unshift(n )
iL =>
dn.p.unshift(b.l )
dn.l.unshift(b.l )
dn.n.unshift(n )
sL =>
sdn.p.unshift(b.l )
sdn.l.unshift(b.l )
sdn.n.unshift(n )
sH =>
sup.p.unshift(b.h )
sup.l.unshift(b.h )
sup.n.unshift(n )
// INTERNAL BULLISH STRUCTURE
if up.p.size() > 0 and dn.l.size() > 1
if ta.crossover(b.c, up.p.first())
bool CHoCH = na
string txt = na
if itrend < 0
CHoCH := true
switch
not CHoCH =>
txt := "BOS"
css := i_ms_up_BOS
blalert.bos := true
if boolean.get(i_BOS) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
up.n.first()
, up.p.first()
, i_ms_up_BOS
, txt
, true
)
CHoCH =>
dn.l.first() > dn.l.get(1) ? blalert.chochplus : blalert.choch
txt := dn.l.first() > dn.l.get(1) ? "CHoCH+" : "CHoCH"
css := i_ms_up_BOS.darkcss(0.25, true)
if (dn.l.first() > dn.l.get(1) ? boolean.get(i_CHoCHP) : boolean.get(i_CHoCH)) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
up.n.first()
, up.p.first()
, i_ms_up_BOS.darkcss(0.25, true)
, txt
, true
)
if mtf == false
switch
ob_filter == "None" => bull_ob := true
ob_filter == "BOS" and txt == "BOS" => bull_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => bull_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => bull_ob := true
itrend := 1
up.n.clear()
up.p.clear()
// INTERNAL BEARISH STRUCTURE
if dn.p.size() > 0 and up.l.size() > 1
if ta.crossunder(b.c, dn.p.first())
bool CHoCH = na
string txt = na
if itrend > 0
CHoCH := true
switch
not CHoCH =>
bralert.bos := true
txt := "BOS"
css := i_ms_dn_BOS
if boolean.get(i_BOS) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
dn.n.first()
, dn.p.first()
, i_ms_dn_BOS
, txt
, false
)
CHoCH =>
if up.l.first() < up.l.get(1)
bralert.chochplus := true
else
bralert.choch := true
txt := up.l.first() < up.l.get(1) ? "CHoCH+" : "CHoCH"
css := i_ms_dn_BOS.darkcss(0.25, false)
if (up.l.first() < up.l.get(1) ? boolean.get(i_CHoCHP) : boolean.get(i_CHoCH)) and mtf == false and na(drw)
isdrw := true
drw := msDraw.new(
dn.n.first()
, dn.p.first()
, i_ms_dn_BOS.darkcss(0.25, false)
, txt
, false
)
if mtf == false
switch
ob_filter == "None" => bear_ob := true
ob_filter == "BOS" and txt == "BOS" => bear_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => bear_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => bear_ob := true
itrend := -1
dn.n.clear()
dn.p.clear()
// SWING BULLISH STRUCTURE
if sup.p.size() > 0 and sdn.l.size() > 1
if ta.crossover(b.c, sup.p.first())
bool CHoCH = na
string txt = na
if trend < 0
CHoCH := true
switch
not CHoCH =>
blalert.swingbos := true
txt := "BOS"
icss := s_ms_up_BOS
if boolean.get(s_BOS) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sup.n.first()
, sup.p.first()
, s_ms_up_BOS
, txt
, true
)
CHoCH =>
if sdn.l.first() > sdn.l.get(1)
blalert.chochplusswing := true
else
blalert.chochswing := true
txt := sdn.l.first() > sdn.l.get(1) ? "CHoCH+" : "CHoCH"
icss := s_ms_up_BOS.darkcss(0.25, true)
if (sdn.l.first() > sdn.l.get(1) ? boolean.get(s_CHoCHP) : boolean.get(s_CHoCH)) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sup.n.first()
, sup.p.first()
, s_ms_up_BOS.darkcss(0.25, true)
, txt
, true
)
if mtf == false
switch
ob_filter == "None" => s_bull_ob := true
ob_filter == "BOS" and txt == "BOS" => s_bull_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => s_bull_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => s_bull_ob := true
trend := 1
sup.n.clear()
sup.p.clear()
// SWING BEARISH STRUCTURE
if sdn.p.size() > 0 and sup.l.size() > 1
if ta.crossunder(b.c, sdn.p.first())
bool CHoCH = na
string txt = na
if trend > 0
CHoCH := true
switch
not CHoCH =>
bralert.swingbos := true
txt := "BOS"
icss := s_ms_dn_BOS
if boolean.get(s_BOS) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sdn.n.first()
, sdn.p.first()
, s_ms_dn_BOS
, txt
, false
)
CHoCH =>
if sup.l.first() < sup.l.get(1)
bralert.chochplusswing := true
else
bralert.chochswing := true
txt := sup.l.first() < sup.l.get(1) ? "CHoCH+" : "CHoCH"
icss := s_ms_dn_BOS.darkcss(0.25, false)
if (sup.l.first() < sup.l.get(1) ? boolean.get(s_CHoCHP) : boolean.get(s_CHoCH)) and mtf == false and na(drw)
isdrwS := true
drw := msDraw.new(
sdn.n.first()
, sdn.p.first()
, s_ms_dn_BOS.darkcss(0.25, false)
, txt
, false
)
if mtf == false
switch
ob_filter == "None" => s_bear_ob := true
ob_filter == "BOS" and txt == "BOS" => s_bear_ob := true
ob_filter == "CHoCH" and txt == "CHoCH" => s_bear_ob := true
ob_filter == "CHoCH+" and txt == "CHoCH+" => s_bear_ob := true
trend := -1
sdn.n.clear()
sdn.p.clear()
= structure(false)
if isdrw
f_line(drw, size.small, line.style_dashed)
if isdrwS
f_line(drw, size.small, line.style_solid)
= request.security("", "15" , structure(true))
= request.security("", "60" , structure(true))
= request.security("", "240" , structure(true))
= request.security("", "1440" , structure(true))
if show_mtf_str
var tab = table.new(position = position.top_right, columns = 10, rows = 10, bgcolor = na, frame_color = color.rgb(54, 58, 69, 0), frame_width = 1, border_color = color.rgb(54, 58, 69, 100), border_width = 1)
table.cell(tab, 0, 1, text = "15" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 0, 2, text = "1H" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 0, 3, text = "4H" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 0, 4, text = "1D" , text_color = color.silver, text_halign = text.align_center, text_size = size.normal, bgcolor = chart.bg_color, text_font_family = font.family_monospace, width = 2)
table.cell(tab, 1, 1, text = itrend15 == 1 ? "BULLISH" : itrend15 == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend15 == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend15 == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 1, 2, text = itrend1H == 1 ? "BULLISH" : itrend1H == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend1H == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend1H == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 1, 3, text = itrend4H == 1 ? "BULLISH" : itrend4H == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend4H == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend4H == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 1, 4, text = itrend1D == 1 ? "BULLISH" : itrend1D == -1 ? "BEARISH" : na , text_halign = text.align_center, text_size = size.normal, text_color = itrend1D == 1 ? i_ms_up_BOS.darkcss(-0.25, true) : itrend1D == -1 ? i_ms_dn_BOS.darkcss(0.25, false) : color.gray, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 0, 5, text = "Detected Pattern", text_halign = text.align_center, text_size = size.normal, text_color = color.silver, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.cell(tab, 0, 6, text = p.found, text_halign = text.align_center, text_size = size.normal, text_color = na(p.bull) ? color.white : p.bull ? i_ms_up_BOS.darkcss(-0.25, true) : p.bull == false ? i_ms_dn_BOS.darkcss(0.25, false) : na, bgcolor = chart.bg_color, text_font_family = font.family_monospace)
table.merge_cells(tab, 0, 5, 1, 5)
table.merge_cells(tab, 0, 6, 1, 6)
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - Strong/Weak High/Low And Equilibrium }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
var phl = Zphl.new(
na
, na
, label.new(na , na , color = invcol , textcolor = i_ms_dn_BOS , style = label.style_label_down , size = size.tiny , text = "")
, label.new(na , na , color = invcol , textcolor = i_ms_up_BOS , style = label.style_label_up , size = size.tiny , text = "")
, true
, true
, true
, true
, ""
, ""
, 0
, 0
, 0
, 0
, high
, low
, 0
, 0
, 0
, 0
, 0
, 0
, na
, na
)
zhl(len)=>
upper = ta.highest(len)
lower = ta.lowest(len)
var float out = 0
out := b.h > upper ? 0 : b.l < lower ? 1 : out
top = out == 0 and out != 0 ? b.h : 0
btm = out == 1 and out != 1 ? b.l : 0
= zhl(sLen)
= zhl(iLen)
upphl(trend) =>
var label lbl = label.new(
na
, na
, color = invcol
, textcolor = toplvl
, style = label.style_label_down
, size = size.small
)
if top
phl.stopcross := true
phl.txtup := top > phl.topy ? "HH" : "HL"
if show_lbl
topl = label.new(
b.n - swing_r_lookback
, top
, phl.txtup
, color = invcol
, textcolor = toplvl
, style = label.style_label_down
, size = size.small
)
line.delete(phl.top )
phl.top := line.new(
b.n - sLen
, top
, b.n
, top
, color = toplvl)
phl.topy := top
phl.topx := b.n - sLen
phl.tup := top
phl.tupx := b.n - sLen
if itop
phl.itopcross := true
phl.itopy := itop
phl.itopx := b.n - iLen
phl.tup := math.max(high, phl.tup)
phl.tupx := phl.tup == high ? b.n : phl.tupx
phl.uV := phl.tup != phl.tup ? b.v : phl.uV
if barstate.islast
line.set_xy1(
phl.top
, phl.tupx
, phl.tup
)
line.set_xy2(
phl.top
, b.n + 50
, phl.tup
)
label.set_x(
lbl
, b.n + 50
)
label.set_y(
lbl
, phl.tup
)
dist = math.abs(phl.uV / (phl.uV + phl.dV)) * 100
label.set_text (lbl, trend < 0
? "Strong High | " + str.tostring(phl.uV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)"
: "Weak High | " + str.tostring(phl.uV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)")
dnphl(trend) =>
var label lbl = label.new(
na
, na
, color = invcol
, textcolor = btmlvl
, style = label.style_label_up
, size = size.small
)
if btm
phl.sbottomcross := true
phl.txtdn := btm > phl.bottomy ? "LH" : "LL"
if show_lbl
btml = label.new(
b.n - swing_r_lookback
, btm, phl.txtdn
, color = invcol
, textcolor = btmlvl
, style = label.style_label_up
, size = size.small
)
line.delete(phl.bottom )
phl.bottom := line.new(
b.n - sLen
, btm
, b.n
, btm
, color = btmlvl
)
phl.bottomy := btm
phl.bottomx := b.n - sLen
phl.tdn := btm
phl.tdnx := b.n - sLen
if ibtm
phl.ibottomcross := true
phl.ibottomy := ibtm
phl.ibottomx := b.n - iLen
phl.tdn := math.min(low, phl.tdn)
phl.tdnx := phl.tdn == low ? b.n : phl.tdnx
phl.dV := phl.tdn != phl.tdn ? b.v : phl.dV
if barstate.islast
line.set_xy1(
phl.bottom
, phl.tdnx
, phl.tdn
)
line.set_xy2(
phl.bottom
, b.n + 50
, phl.tdn
)
label.set_x(
lbl
, b.n + 50
)
label.set_y(
lbl
, phl.tdn
)
dist = math.abs(phl.dV / (phl.uV + phl.dV)) * 100
label.set_text (lbl, trend > 0
? "Strong Low | " + str.tostring(phl.dV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)"
: "Weak Low | " + str.tostring(phl.uV, format.volume) + " (" + str.tostring(math.round(dist,0)) + "%)")
midphl() =>
avg = math.avg(phl.bottom.get_y2(), phl.top.get_y2())
var line l = line.new(
y1 = avg
, y2 = avg
, x1 = b.n - sLen
, x2 = b.n + 50
, color = midlvl
, style = line.style_solid
)
var label lbl = label.new(
x = b.n + 50
, y = avg
, text = "Equilibrium"
, style = label.style_label_left
, color = invcol
, textcolor = midlvl
, size = size.small
)
if barstate.islast
more = (phl.bottom.get_x1() + phl.bottom.get_x2()) > (phl.top.get_x1() + phl.top.get_x2()) ? phl.top.get_x1() : phl.bottom.get_x1()
line.set_xy1(l , more , avg)
line.set_xy2(l , b.n + 50, avg)
label.set_x (lbl , b.n + 50 )
label.set_y (lbl , avg )
dist = math.abs((l.get_y2() - close) / close) * 100
label.set_text (lbl, "Equilibrium (" + str.tostring(math.round(dist,0)) + "%)")
hqlzone() =>
if barstate.islast
var hqlzone dZone = hqlzone.new(
box.new(
na
, na
, na
, na
, bgcolor = color.new(toplvl, 70)
, border_color = na
)
, box.new(
na
, na
, na
, na
, bgcolor = color.new(midlvl, 70)
, border_color = na
)
, box.new(
na
, na
, na
, na
, bgcolor = color.new(btmlvl, 70)
, border_color = na
)
, label.new(na, na, text = "Premium" , color = invcol, textcolor = toplvl, style = label.style_label_down, size = size.small)
, label.new(na, na, text = "Equilibrium", color = invcol, textcolor = midlvl, style = label.style_label_left, size = size.small)
, label.new(na, na, text = "Discount" , color = invcol, textcolor = btmlvl, style = label.style_label_up , size = size.small)
)
dZone.pbx.set_lefttop(int(math.max(phl.topx, phl.bottomx)) , phl.tup)
dZone.pbx.set_rightbottom(b.n + 50 , 0.95 * phl.tup + 0.05 * phl.tdn)
dZone.ebx.set_lefttop(int(math.max(phl.topx, phl.bottomx)), 0.525 * phl.tup + 0.475 * phl.tdn)
dZone.ebx.set_rightbottom(b.n + 50 , 0.525 * phl.tdn + 0.475 * phl.tup)
dZone.lbx.set_lefttop(int(math.max(phl.topx, phl.bottomx)), 0.95 * phl.tdn + 0.05 * phl.tup)
dZone.lbx.set_rightbottom(b.n + 50 , phl.tdn)
dZone.plb.set_xy( int(math.avg(math.max(phl.topx, phl.bottomx), int(b.n + 50))) , phl.tup)
dZone.elb.set_xy( int(b.n + 50) , math.avg(phl.tup, phl.tdn))
dZone.lbl.set_xy( int(math.avg(math.max(phl.topx, phl.bottomx), int(b.n + 50))) , phl.tdn)
if show_mtb
upphl (trend)
dnphl (trend)
hqlzone()
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - Volumetric Order Block }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
method eB(box b, bool ext, color css, bool swing) =>
b.unshift(
box.new(
na
, na
, na
, na
, xloc = xloc.bar_time
, text_font_family = font.family_monospace
, extend = ext ? extend.right : extend.none
, border_color = swing ? color.new(css, 0) : color.new(color.white,100)
, bgcolor = css
, border_width = 1
)
)
method eL(line l, bool ext, bool solid, color css) =>
l.unshift(
line.new(
na
, na
, na
, na
, width = 1
, color = css
, xloc = xloc.bar_time
, extend = ext ? extend.right : extend.none
, style = solid ? line.style_solid : line.style_dashed
)
)
method drawVOB(bool cdn, bool bull, color css, int loc, bool swing) =>
= request.security(
syminfo.tickerid
, ""
,
, lookahead = barmerge.lookahead_off
)
var obC obj = obC.new(
array.new()
, array.new()
, array.new< int >()
, array.new()
, array.new()
, array.new()
, array.new< int >()
, array.new< int >()
, array.new< int >()
, array.new< int >()
, array.new()
, array.new()
, array.new< int >()
)
var obD draw = obD.new(
array.new()
, array.new()
, array.new()
, array.new()
, array.new()
)
if barstate.isfirst
for i = 0 to ob_num - 1
draw.mL .eL(false, false, use_grayscale ? color.new(color.gray, 0) : color.new(css,0))
draw.ob .eB(false, use_grayscale ? color.new(color.gray, 90) : css, swing)
draw.blB.eB(false, css_metric_up , swing)
draw.brB.eB(false, css_metric_dn , swing)
draw.eOB.eB(true , use_grayscale ? color.new(color.gray, 90) : css, swing)
float pos = ob_pos == "Full"
? (bull ? high : low)
: ob_pos == "Middle"
? ohlc4
: ob_pos == "Accurate"
? hl2
: hl2
if cdn
obj.h.clear()
obj.l.clear()
obj.n.clear()
for i = 0 to math.abs((loc - b.n)) - 1
obj.h.push(hH )
obj.l.push(lL )
obj.n.push(b.t )
// obj.h.reverse()
// obj.l.reverse()
int iU = obj.l.indexof(obj.l.min()) + 1
int iD = obj.h.indexof(obj.h.max()) + 1
obj.dir.unshift(
bull
? (b.c > b.o ? 1 : -1)
: (b.c > b.o ? 1 : -1)
)
obj.top.unshift(
bull
? pos
: obj.h.max()
)
obj.btm.unshift(
bull
? obj.l.min()
: pos
)
obj.left.unshift(
bull
? obj.n.get(obj.l.indexof(obj.l.min()))
: obj.n.get(obj.h.indexof(obj.h.max()))
)
obj.avg.unshift(
math.avg(obj.top.first(), obj.btm.first())
)
obj.cV.unshift(
bull
? b.v
: b.v
)
if ob_pos == "Precise"
switch bull
true =>
if obj.avg.get(0) < (b.c < b.o ? b.c : b.o ) and obj.top.get(0) > hlcc4
obj.top.set(0, obj.avg.get(0))
obj.avg.set(0, math.avg(obj.top.first(), obj.btm.first()))
false =>
if obj.avg.get(0) > (b.c < b.o ? b.o : b.c ) and obj.btm.get(0) < hlcc4
obj.btm.set(0, obj.avg.get(0))
obj.avg.set(0, math.avg(obj.top.first(), obj.btm.first()))
obj.blVP.unshift ( 0 )
obj.brVP.unshift ( 0 )
obj.wM .unshift ( 1 )
if use_overlap
int rmP = use_overlap_method == "Recent" ? 1 : 0
if obj.avg.size() > 1
if bull
? obj.btm.first() < obj.top.get(1)
: obj.top.first() > obj.btm.get(1)
obj.wM .remove(rmP)
obj.cV .remove(rmP)
obj.dir .remove(rmP)
obj.top .remove(rmP)
obj.avg .remove(rmP)
obj.btm .remove(rmP)
obj.left .remove(rmP)
obj.blVP .remove(rmP)
obj.brVP .remove(rmP)
if barstate.isconfirmed
for x = 0 to ob_num - 1
tg = switch ob_mitigation
"Middle" => obj.avg
"Absolute" => bull ? obj.btm : obj.top
for in tg
if (bull ? cC < pt : cC > pt)
obj.wM .remove(idx)
obj.cV .remove(idx)
obj.dir .remove(idx)
obj.top .remove(idx)
obj.avg .remove(idx)
obj.btm .remove(idx)
obj.left .remove(idx)
obj.blVP .remove(idx)
obj.brVP .remove(idx)
if barstate.islast
if obj.avg.size() > 0
// Alert
if bull
? ta.crossunder(low , obj.top.get(0))
: ta.crossover (high, obj.btm.get(0))
switch bull
true => blalert.obtouch := true
false => bralert.obtouch := true
float tV = 0
obj.dV.clear()
seq = math.min(ob_num - 1, obj.avg.size() - 1)
for j = 0 to seq
tV += obj.cV.get(j)
if j == seq
for y = 0 to seq
obj.dV.unshift(
math.floor(
(obj.cV.get(y) / tV) * 100)
)
obj.dV.reverse()
for i = 0 to math.min(ob_num - 1, obj.avg.size() - 1)
dmL = draw.mL .get(i)
dOB = draw.ob .get(i)
dblB = draw.blB.get(i)
dbrB = draw.brB.get(i)
deOB = draw.eOB.get(i)
dOB.set_lefttop (obj.left .get(i) , obj.top.get(i))
deOB.set_lefttop (b.t , obj.top.get(i))
dOB.set_rightbottom (b.t , obj.btm.get(i))
deOB.set_rightbottom(b.t + (b.t - b.t ) * 100 , obj.btm.get(i))
if use_middle_line
dmL.set_xy1(obj.left.get(i), obj.avg.get(i))
dmL.set_xy2(b.t , obj.avg.get(i))
if ob_metrics_show
dblB.set_lefttop (obj.left.get(i), obj.top.get(i))
dbrB.set_lefttop (obj.left.get(i), obj.avg.get(i))
dblB.set_rightbottom(obj.left.get(i), obj.avg.get(i))
dbrB.set_rightbottom(obj.left.get(i), obj.btm.get(i))
rpBL = dblB.get_right()
rpBR = dbrB.get_right()
dbrB.set_right(rpBR + (b.t - b.t ) * obj.brVP.get(i))
dblB.set_right(rpBL + (b.t - b.t ) * obj.blVP.get(i))
if use_show_metric
txt = switch
obj.cV.get(i) >= 1000000000 => str.tostring(math.round(obj.cV.get(i) / 1000000000,3)) + "B"
obj.cV.get(i) >= 1000000 => str.tostring(math.round(obj.cV.get(i) / 1000000,3)) + "M"
obj.cV.get(i) >= 1000 => str.tostring(math.round(obj.cV.get(i) / 1000,3)) + "K"
obj.cV.get(i) < 1000 => str.tostring(math.round(obj.cV.get(i)))
deOB.set_text(
str.tostring(
txt + " (" + str.tostring(obj.dV.get(i)) + "%)")
)
deOB.set_text_size (size.auto)
deOB.set_text_halign(text.align_left)
deOB.set_text_color (use_grayscale ? color.silver : color.new(css, 0))
if ob_metrics_show and barstate.isconfirmed
if obj.wM.size() > 0
for i = 0 to obj.avg.size() - 1
switch obj.dir.get(i)
1 =>
switch obj.wM.get(i)
1 => obj.blVP.set(i, obj.blVP.get(i) + 1), obj.wM.set(i, 2)
2 => obj.blVP.set(i, obj.blVP.get(i) + 1), obj.wM.set(i, 3)
3 => obj.brVP.set(i, obj.brVP.get(i) + 1), obj.wM.set(i, 1)
-1 =>
switch obj.wM.get(i)
1 => obj.brVP.set(i, obj.brVP.get(i) + 1), obj.wM.set(i, 2)
2 => obj.brVP.set(i, obj.brVP.get(i) + 1), obj.wM.set(i, 3)
3 => obj.blVP.set(i, obj.blVP.get(i) + 1), obj.wM.set(i, 1)
var hN = array.new(1, b.n)
var lN = array.new(1, b.n)
var hS = array.new(1, b.n)
var lS = array.new(1, b.n)
if iH
hN.pop()
hN.unshift(int(b.n ))
if iL
lN.pop()
lN.unshift(int(b.n ))
if sH
hS.pop()
hS.unshift(int(b.n ))
if sL
lS.pop()
lS.unshift(int(b.n ))
if ob_show
bull_ob.drawVOB(true , ob_bull_css, hN.first(), false)
bear_ob.drawVOB(false, ob_bear_css, lN.first(), false)
if ob_swings
s_bull_ob.drawVOB(true , css_swing_up, hS.first(), true)
s_bear_ob.drawVOB(false, css_swing_dn, lS.first(), true)
if bull_ob
blalert.ob := true
if bear_ob
bralert.ob := true
if s_bull_ob
blalert.swingob := true
if s_bear_ob
blalert.swingob := true
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - End }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{ - FVG | VI | OG }
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
//{----------------------------------------------------------------------------------------------------------------------------------------------}
ghl() => request.security(syminfo.tickerid, fvg_tf, [high , low , close , open ])
tfG() => request.security(syminfo.tickerid, fvg_tf, )
cG(bool bull) =>
= ghl()
= tfG()
var FVG draw = FVG.new(
array.new()
, array.new()
)
var FVG cords = array.new()
float pup = na
float pdn = na
bool cdn = na
int pos = 2
cc = timeframe.change(fvg_tf)
if barstate.isfirst
for i = 0 to fvg_num - 1
draw.box.unshift(box.new (na, na, na, na, border_color = color.new(color.white, 100), xloc = xloc.bar_time))
draw.ln.unshift (line.new(na, na, na, na, xloc = xloc.bar_time, width = 1, style = line.style_solid))
switch what_fvg
"FVG" =>
pup := bull ? gl : l
pdn := bull ? h : gh
cdn := bull ? gl > h and cc : gh < l and cc
pos := 2
"VI" =>
pup := bull
? (gc > go
? go
: gc)
: (gc > go
? go
: gc )
pdn := bull
? (gc > go
? gc
: go )
: (gc > go
? gc
: go)
cdn := bull
? go > gc and gh > gl and gc > gc and go > go and gh < math.min(gc, go) and cc
: go < gc and gl < gh and gc < gc and go < go and gl > math.max(gc, go) and cc
pos := 1
"OG" =>
pup := bull ? b.l : gl
pdn := bull ? gh : gh
cdn := bull ? gl > gh and cc : gh < gl and cc
pos := 1
if not na(cdn ) and cdn
cords.unshift(
FVG.new(
na
, na
, bull
? true
OSTDV SeppeMILLIONAIRE CHEAT CODE, time based stdv levels works best on gold. Pre determined pivots.
Fixed Zone Flow ABO SALTAN (Non-Repaint)//@version=5
indicator("Fixed Zone Flow (Non-Repaint)", overlay=false)
// ===== INPUTS =====
lenFast = input.int(10, "Fast Length")
lenSlow = input.int(21, "Slow Length")
signal = input.int(4, "Signal Smooth")
buyLevel = input.int(-60, "BUY Level (Fixed)")
sellLevel = input.int(60, "SELL Level (Fixed)")
// ===== CORE =====
price = hlc3
basis = ta.ema(price, lenFast)
dev = ta.ema(math.abs(price - basis), lenFast)
ci = (price - basis) / (0.015 * dev)
fzf = ta.ema(ci, lenSlow)
sig = ta.sma(fzf, signal)
// ===== FIXED BUY / SELL =====
fixedBuy = ta.crossover(fzf, buyLevel)
fixedSell = ta.crossunder(fzf, sellLevel)
// ===== PLOTS =====
plot(fzf, title="FZF", color=color.aqua, linewidth=2)
plot(sig, title="Signal", color=color.orange)
hline(buyLevel, "FIXED BUY", color=color.green, linestyle=hline.style_dashed)
hline(sellLevel, "FIXED SELL", color=color.red, linestyle=hline.style_dashed)
hline(0, "Zero", color=color.gray)
// ===== SIGNAL MARKERS =====
plotshape(fixedBuy, title="BUY",
style=shape.labelup,
location=location.bottom,
color=color.lime,
text="BUY",
textcolor=color.black)
plotshape(fixedSell, title="SELL",
style=shape.labeldown,
location=location.top,
color=color.red,
text="SELL",
textcolor=color.white)






















