ICT Silver Bullet | Flux Charts💎 GENERAL OVERVIEW
Introducing our new ICT Silver Bullet Indicator! This indicator is built around the ICT's "Silver Bullet" strategy. The strategy has 5 steps for execution and works best in 1-5 min timeframes. For more information about the process, check the "HOW DOES IT WORK" section.
Features of the new ICT Silver Bullet Indicator :
Implementation of ICT's Silver Bullet Strategy
Customizable Execution Settings
2 NY Sessions & London Session
Customizable Backtesting Dashboard
Alerts for Buy, Sell, TP & SL Signals
📌 HOW DOES IT WORK ?
ICT's Silver Bullet strategy has 5 steps :
1. Mark your market sessions open (This indicator has 3 -> NY 10-11, NY 14-15, LDN 03-04)
2. Mark the swing liquidity points
3. Wait for market to take down one liquidity side
4. Look for a market structure-shift for reversals
5. Wait for a FVG for execution
This indicator follows these steps and inform you step by step by plotting them in your chart. You can switch execution types between FVG and MSS.
🚩UNIQUENESS
This indicator is an all-in-one suit for the ICT's Silver Bullet concept. It's capable of plotting the strategy, giving signals, a backtesting dashboard and alerts feature. It's designed for simplyfing a rather complex strategy, helping you to execute it with clean signals. The backtesting dashboard allows you to see how your settings perform in the current ticker. You can also set up alerts to get informed when the strategy is executable for different tickers.
⚙️SETTINGS
1. General Configuration
Execution Type -> FVG execution type will require a FVG to take an entry, while the MSS setting will take an entry as soon as it detects a market structure-shift.
MSS Swing Length -> The swing length when finding liquidity zones for market structure-shift detection.
Breakout Method -> If "Wick" is selected, a bar wick will be enough to confirm a market structure-shift. If "Close" is selected, the bar must close above / below the liquidity zone to confirm a market structure-shift.
FVG Detection -> "Same Type" means that all 3 bars that formed the FVG should be the same type. (Bullish / Bearish). "All" means that bar types may vary between bullish / bearish.
FVG Detection Sensitivity -> You can turn this setting on and off. If it's off, any 3 consecutive bullish / bearish bars will be calculated as FVGs. If it's on, the size of FVGs will be filtered by the selected sensitivity. Lower settings mean less but larger FVGs.
2. TP / SL
TP / SL Method -> If "Fixed" is selected, you can adjust the TP / SL ratios from the settings below. If "Dynamic" is selected, the TP / SL zones will be auto-determined by the algorithm.
Risk -> The risk you're willing to take if "Dynamic" TP / SL Method is selected. Higher risk usually means a better winrate at the cost of losing more if the strategy fails.
Close Position @ Session End -> If this setting is enabled, the current position (if any) will be closed at the beginning of a new session, regardless if it hit the TP / SL zone. If it's off, the position will be open until it hits a TP / SL zone.
Search in scripts for "fvg"
RSI TrendsThis TradingView script combines RSI trend analysis with FVG (Fair Value Gap) detection to identify potential buy and sell opportunities in financial markets. The script is customizable and provides extensive visual feedback directly on the chart, enhancing both strategic entry and exit points for traders. Raw code of FVG was taken from LuxAlgo
Features
FVG Detection: Identifies Fair Value Gaps (FVG), and provides options to display these gaps based on user settings.
RSI Trend Bars: Utilizes the Relative Strength Index (RSI) to paint bars indicating overbought and oversold conditions. This helps traders understand current market sentiment and potential reversal points.
Customizable Settings: Users can customize the timeframe, FVG types, and RSI thresholds. This flexibility allows the script to be adapted to various trading styles and timeframes.
Historical Analysis: Option to display or hide historical FVGs, helping users analyze past market behavior without cluttering the chart.
Alert System: Integrated alerts for detected buy and sell signals based on RSI conditions and the presence or absence of FVGs. This feature notifies traders of potential trading opportunities.
Trading Signals
Buy, Buy+, and Buy++ Signals: These signals are triggered based on overbought conditions without corresponding bearish FVG presence, with increasing stringency for higher tiers of buy signals.
Sell, Sell+, and Sell++ Signals: These signals are based on oversold conditions devoid of bullish FVG presence, with each subsequent plus sign indicating a higher level of confirmation required to trigger the signal.
Use Case
Ideal for traders who rely on technical analysis and are looking for an automated way to spot potential buy and sell points using both price action gaps and momentum indicators.
Customization
All input parameters are adjustable directly from the indicator's settings panel, making it easy to tailor the tool to your trading needs and preferences.
Fair Value Gap Finder with Integrated Gann BoxTitle: Fair Value Gap Finder with Integrated Gann Box Analysis
Description:
The "Fair Value Gap Finder with Integrated Gann Box Analysis" is a unique technical indicator designed for traders who wish to incorporate the concepts of Fair Value Gaps (FVG) and Gann Box methodologies into their trading strategy. This tool is beneficial for both trend-following and scalping techniques across various markets and timeframes.
Functionality:
The indicator identifies Fair Value Gaps, which are areas on the chart where price has skipped a range, creating a 'gap'. Recognizing these zones can be crucial for understanding potential price support and resistance areas. Alongside FVG detection, this script employs Gann Box principles to project potential levels of interest. Gann Boxes are drawn automatically when an FVG is identified, providing additional insights based on W.D. Gann's theories, which relate to time and price symmetry.
Usage:
Upon detecting an FVG, the indicator will highlight the gap on the chart and overlay a Gann Box between the high and low points of the gap. Traders can use these zones to make informed decisions about entry and exit points, stop loss, and take profit levels. The script offers customization options for the appearance and behavior of the FVG boxes and Gann Lines, allowing users to adapt the tool to their preferences.
Originality:
What sets this indicator apart is the integration of FVG with Gann Box levels within a single tool, streamlining the analysis process. It takes the classic approach of identifying gaps and enriches it with the geometric significance of Gann's work, all while allowing users to visualize and interact with these levels in a user-friendly manner.
Open-Source Nature:
This script is open-source, making it a transparent solution for those who wish to understand the underlying calculations. While not all traders are versed in Pine Script, the logic of identifying FVGs and applying Gann Box levels is explained through the script's annotations and the user interface itself.
Instructions for Use:
Apply the script to your chart, and it will automatically detect FVGs.
Adjust the settings in the indicator's input menu to match your trading style and preferences.
Use the FVG and Gann Box levels as potential areas of interest for trade setups.
This script does not guarantee profits and should be used as part of a comprehensive trading plan. It is best used in conjunction with other analysis methods to confirm signals and strategies.
MTF Smart Money ConceptsOverview
This indicator displays major elements of Smart Money Concepts and price action trading with multi-timeframes(MTF) and layered market structures with color visualization.
What is Smart Money Concepts?
Smart Money Concepts(SMC) is one of the methodologies to interpret how financial market moves and to analyze it and execute trades, focusing on liquidity and order flow of financial institutions.
Smart money means the funds invested by large financial institutions such as banks, institutional traders/investors, market makers, hedge funds etc. contrary to retail traders/investors' money.
It is important to note that there is no proof or evidence that those institutions move the market as described in Smart Money Concepts.
Personally speaking, it is one of the interpretation of the market and another angle to view the market just like other technical analysis methodologies such as Elliott Wave Principle, Gann Theory, Wyckoff Method and even traditional price action trading.
Importance of MTF Analysis
MTF analysis(a.k.a Topdown analysis) is the foundation to technically analyze charts and the most fundamental skill in trading because lower timeframes are always influenced by upper timeframes where large financial institutions operate.
How to use
This indicator is designed to help traders analyze how the market moves in terms of SMC and price action with multi-timeframes and color visualization of the market structures, which makes this indicator unique and different from other indicators.
There is two key settings that you can use based on your trading style.
1.Upper timeframe selection
You have two options to determine upper timeframe; Auto mode and Manual mode.
When Auto mode selected, upper timeframe will be determined based on chart timeframe as follows.
Chart timeframe => Upper timeframe
1M=>15M
5M/15M=>1H
30M/1H=>4H
4H=>D
D=>W
W=>M
If you select Manual mode, you can fix an upper timeframe.
2.High/low settings
This affects all other settings of the indicator and most importantly designs the market structure.
This is the key setting to determine how you view the market as price action trading is all about highs and lows and story of how highs and lows have been created with the market structure.
You can specify left bars and right bars to identify swing highs/lows and these highs/lows become the basis to design the market structure and determine how SMC elements are displayed.
Example:
Left bar&right bar: 10
You can see bigger wave(magenta line) in the market structure(stepped line).
(Magenta line is a drawn object by manual)
Left bar&right bar: 4
With this setting, you can see smaller wave in the market structure.
Since market moves like wave as there is a lot of wave theories in financial investment/trading industry such as Elliott wave, Wolf wave etc., users can define market structure with this setting depending on what degree of wave they aim to trade.
Functions:
MTF Order Block
Concept
Order block is a block of orders where buying orders and selling orders are accumulated. Order blocks are created when the institutions move the market up and down, temporality placing orders in an opposite direction to the way they want to move, in order to match their own orders with counter-orders.
Visualization by the indicator
The indicator displays both chart timeframe's order blocks and upper timeframe's order blocks(MTF).
You can also select from two options how to display order blocks;
1. Show all order blocks
2. Show strong order blocks only
Note: Strong order blocks mean order blocks created at strong highs/lows. See also strong high/low below.
Alerts can be set when prices reach strong order blocks.
MTF Fair Value Gap(FVG)/Imbalance
Concept
Fair Value Gap(FVG)(Imbalance) is a void generated among three consecutive candlesticks.
FVG(s) is created when the market moves so rapidly generating buy side or sell side order imbalances.
FVG(s) is characterized by price action that prices tend to come back to the area where FVG(s) exists, filling in the space among the candlesticks.
Visualization by the indicator
The indicator displays both chart timeframe's FVG and upper timeframe's FVG.
MTF Liquidity Grab
Concept
Liquidity grab is price action to sweep liquidity for the institutions to move the market.
This price action often happens because the size of their orders is so huge and they need a bunch of counter-orders to match their orders. This is why prices sometimes come to areas where liquidity rest and swipe them before the market goes up/down.
Liquidity visualization
Where does liquidity rest?
The answer is above highs(buy side liquidity) and below lows(sell side liquidity).
Among all highs and lows, swing highs and lows are where liquidity is accumulated the most because swing highs and lows can be created only by the institutions, therefore massive liquidity is indicated.
Visualization by the indicator
The indicator displays liquidity dots so that users can easily identify where liquidity rests and liquidity grab of both a chart timeframe and an upper timeframe.
Alerts can be set when liquidity grab happens.
MTF Strong High/Low
Concept
Strong high/low literally means strong highs and lows among all highs and lows including swing highs and lows.
There is a few different definitions of strong high/low in price action trading and the definition in this indicator is as follows.
Strong high
A high that that breaks higher low or lower low
Strong low
A low that breaks lower high or higher high
Visualization by the indicator
The indicator displays strong highs and lows of both a chart timeframe and an upper timeframe.
MTF Market Structure Visualization
Concept
Market structure is a series of price movement with highs and lows which outlines the way the market directs. It is a basis to see trend occurrence, trend reversal and sideways and analyzing the market structures in multi-timeframes is the most fundamental technical skill in trading/investment.
Visualization by the indicator
The indicator displays market structures of both a chart timeframe and an upper timeframe and provide color visualization depending on bullish and bearish market structures.
The definition of bullish and bearish market structure is as follows.
Bullish market structure
When a price breaks a Lower High or Higher High
Bearish market structure
When a price breaks a Higher Low or Lower Low
Settings
All the functions above, colors and line settings are parameterized and can be turned on/off depending on users’ needs.
———————————————————————————
概要
Smart Money Concepts(SMC)およびプライスアクショントレードにおける重要な要素をマルチタイムフレームで表示することのできるインジケーターです。
相場構造(Market structure)をマルチタイムフレームで表示し、相場構造の強弱を色で可視化することができます。
Smart Money Concepts(スマートマネーコンセプト)とは?
Smart Money Concepts(以下SMC) は金融市場がどのように動くかを解釈し、分析し、取引を執行するための相場理論の一つであり、Liquidity(リクイディティ)および機関投資家のオーダーフロー(注文の流れ)に焦点を置いていることが特徴です。
Smart Money(スマートマネー)とは、銀行や機関投資家、マーケットメーカー、ヘッジファンドといった金融機関が動かす資金を意味し、個人投資家の資金と対をなす概念です。
重要な点は、実際に上記の金融機関がSmart Money Conceptsで語られているような相場の動かし方をしているかどうかを証明する明確なエビデンスはないということです。
個人的には、エリオット波動理論やギャン理論、ワイコフ理論、伝統的なプライスアクショントレーディングの方法論と同様に、マーケットの動きを解釈するための一つの方法論であり、マーケットの動きを別の角度から見る枠組みと捉えています。
マルチタイムフレーム(MTF)分析の重要性
MTF分析はチャートをテクニカルに分析する上での基礎であり、トレードにおいて最も重要なスキルです。なぜなら下位のタイムフレームは上記のような金融機関が資金運用を行う上位のタイムフレームの影響を常に受けるためです。
使い方
このインジケーターは、SMCまたはプライスアクショントレードの観点から、トレーダーがマーケットをマルチタイムフレームで分析することを支援するために開発しています。
相場構造(Market structure/マーケットストラクチャー)を方向性に応じて色で可視化することができるため、視覚的に相場の構造を判断できることがこのインジケータのユニークな点であり、他のインジケーターと異なる点です。
ユーザーのトレードスタイルに応じて、以下の二つの設定を行うことができます。
1.上位足の決定方法
ユーザーは上位足のタイムフレームを決定するにあたり、AutoモードとManualモードを選択することができます。
Autoモードを選択した場合、上位足はチャートのタイムフレームに応じて以下のように決定されます。
チャートタイムフレーム => 上位足タイムフレーム
1M=>15M
5M/15M=>1H
30M/1H=>4H
4H=>D
D=>W
W=>M
Manualモードを選択すると上位足のタイムフレームを固定することができます。
2.High/low(高値/安値) 設定
当設定はインジケーターの他の全ての機能に影響し、また最も重要である相場構造の定義に影響します。
当設定はユーザーがマーケットをどのように見るか(=どの程度の粒度)を決定する重要な設定です。なぜならプライスアクショントレードは、高値、安値とそれらが相場構造をどのように構築してきたかの一連の流れを分析することが全てだからです。
ユーザーは相場構造を決定付けるスイングハイ·スイングローを特定するためのバーの本数を設定することができます。ここで設定した内容が、相場構造を定義し、以下で説明するSMCの要素の表示を決定することになります。
例:
Left bar&right bar(左右のバーの数): 10
この場合、ステップラインで示した相場構造の中に大きな波(マゼンタの波)を見ることができます。
(マゼンタのラインは手動で描いたオブジェクト)
Left bar&right bar: 4
この設定では、上記に比べて小さい波を描いていることが確認できます。
相場理論の中にエリオット波動理論やウォルフ波動といった数多くの波動理論があることからわかるように、相場は波として動きます。どの粒度の波を狙うかというトレーダーのスタイルに応じて、設定を変更することができます。
機能
MTFオーダーブロック
コンセプト
オーダーブロックとは買い注文と売り注文が一連となって蓄積されたオーダー(注文)のブロックのことです。
オーダーブロックは機関投資家が相場を動かす際に、本来意図する方向とは一時的に逆に動かすことで、彼ら自身の注文をマッチングさせるための反対注文を発生させることで形成されます。
インジケーターによる表示
インジケーターはチャートタイムフレームのオーダーブロックと上位足のオーダーブロックの両方を表示することができます。
また、オーダーブロックの表示オプションとして、
1.全てのオーダーブロックを表示
2.Strong(ストロング)オーダーブロックのみを表示
を選択することが可能です。
注: StrongオーダーブロックはStrong High/Lowで形成されるオーダーブロックを指します。(下記参照)
また、オーダーブロック到達でのアラート設定も可能です。
MTFフェアーバリューギャップ(FVG)/インバランス
コンセプト
フェアーバリューギャップ(FVG)/インバランスとは連続する3つのローソク足の間に形成される溝(Gap)のことです。
フェアーバリューギャップはマーケットが非常に早く動いたことにより、買いオーダーと売りオーダーの需給バランスが崩れることによって発生します。
フェアーバリューギャップには、価格がフェアーバリューギャップが発生したエリアまで戻ってくる傾向があるという特徴が存在します。
インジケーターによる表示
インジケーターはチャートタイムフレームのフェアーバリューギャップと上位足のフェアーバリューギャップの両方を表示することができます。
MTF Liquidity Grab(リクイディティ·グラブ)
コンセプト
Liquidity(リクイディティ)とはマネー、つまり注文です。
Liquidity Grab(リクイディティ·グラブ)とは、機関投資家がマーケットを動かす際にLiquidityを取得するプライスアクションのことを指します。
このプライスアクションは、機関投資家が処理する注文サイズが非常に大きいため、自身の注文を出す際に大量の反対注文を必要とすることからしばしば発生します。
これが、価格がLiquidity(注文)の集まっているエリアに接近し、それら注文をスワイプ(狩り取る)した後に上昇·下落する理由です。
Liquidityの可視化
一般的にLiquidityは高値の上(buy side liquidity)、安値の下(sell side liquidity)に存在します。
全ての高値·安値の中で、スイングハイ·ローがliquidityが最も蓄積されているエリアということができます。なぜならスイングハイ·ローは機関投資家の注文によってのみ形成されるからです。
インジケーターによる表示
ユーザーがLiquidityポイントを簡単に識別できるようにLiquidityをドット表示することが可能です。またチャートタイムフレームと上位足の両方のLiquidity Grabを表示することができます。
Liquidity Grab発生時にアラートも設定可能です。
MTF Strong High/Low(ストロングハイ·ロー)
コンセプト
Strong high/lowは文字通り、強い高値·安値のことを指します。
トレーダーの間でいくつかの異なる定義が存在しますが、当インジケーターでの定義は以下の通りです。
Strong high
Higher low(ハイアーロー) または Lower low(ロワーロー)をブレイクした高値
Strong low
Lower higher (ロワーハイ) または Higher High(ハイアーハイ)をブレイクした安値
インジケーターによる表示
チャートタイムフレーム、上位足のStrong High/Lowを表示することが可能です。
相場構造可視化
コンセプト
相場構造(Market structure/マーケットストラクチャー)とは、相場の流れを成り立たせる高値と安値を元にした一連の値動きです。建物における骨組みに該当します。
トレンドの発生、転換、レンジを見極めるための基礎であり、マルチタイムフレームで相場構造を分析することは、投資·トレードにおいて最も重要なテクニカルスキルです。
インジケーターによる表示
チャートタイムフレームと上位足タイムフレーム両方の相場構造を表示することができます。
また、相場構造が強気の状態か弱気の状態かを色で可視化するため、上位足含めた相場の流れを視覚的に判断することが可能です。
相場構造の強弱の定義は以下の通りです。
強気の相場構造(Bullish market structure)
価格がLower HighまたはHigher Highをブレイクしたとき
弱気の相場構造(Bearish market structure)
価格がHigher LowまたはLower Lowをブレイクしたとき
設定
上記の全ての機能は色やライン設定含めパラメーターで設定が可能です。またユーザの必要に応じて表示·非表示を切り替えることができます。
PD Array Matrix [NINE Θ]PD Array Matrix
A comprehensive ICT-based indicator that combines multiple Premium/Discount Array concepts into a single, unified tool for Smart Money analysis.
Overview
PD Array Matrix provides traders with institutional-grade market structure analysis by integrating key ICT (Inner Circle Trader) concepts. This indicator automatically identifies and displays critical price levels, imbalances, and divergences that smart money uses to execute trades.
Key Features
Change in State of Delivery (CISD)
Automatically detects shifts in market delivery, signaling potential reversals or continuation setups.
Bullish and Bearish detection with directional filtering
Confirmation arrows for visual clarity
Wick-based invalidation for precise risk management
Customizable line styles, colors, and label formats
Order Blocks
Identifies institutional order flow zones where significant buying or selling occurred.
Box or Line display styles
Filter by direction: Both, Bullish, Bearish, or CISD Direction
CISD Direction mode only shows Order Blocks that align with the current market bias
Automatic invalidation when price mitigates the zone
Market Structure Levels
Tracks key liquidity levels that institutional traders target.
Minor Levels: Intermediate swing highs/lows (Buyside/Sellside)
Major Levels: Significant swing points with higher timeframe relevance
Automatic fill detection with optional historical display
Customizable display modes: Label Only, Price Only, Both, or Minimalistic
Fair Value Gaps (FVGs)
Detects price imbalances created by aggressive market moves.
Three display styles: Normal, Minimalist, and Classic
Optional Volume Imbalance detection (body-to-body gaps)
50% Consequent Encroachment line
Proximity-based display showing FVGs closest to current price
Inversion Fair Value Gaps (IFVGs)
Identifies when price inverts through an existing FVG, flipping its directional bias.
Automatic conversion from FVG to IFVG on body close
Configurable lookback period to filter old inversions
Independent display controls from regular FVGs
Invalidation tracking when price closes through the zone
Higher Timeframe FVGs
Displays Fair Value Gaps from higher timeframes on your current chart.
Auto Timeframe selection based on your chart
Manual timeframe override option
Seamless integration with lower timeframe analysis
SMT Divergences
Detects Smart Money Tool divergences between correlated instruments.
Auto SMT Mode: Automatically selects correlated pairs for:
Index Futures (NQ, ES, YM, RTY)
Metals (GC, SI, PL)
Energy (CL, RB, NG)
Forex Majors
Crypto (BTC, ETH)
Manual symbol selection for custom pairs
Dual symbol comparison for confluence
Automatic invalidation tracking
Session Filters
Limit all setups to specific trading sessions.
Two configurable session windows
Multiple timezone support
Applies to: FVGs, IFVGs, CISDs, Order Blocks, and SMTs
Active on timeframes ≤ 1 hour
Customization
Every component offers extensive customization:
Individual toggle controls for each feature
Color settings for bullish/bearish elements
Multiple line styles (Solid, Dashed, Dotted)
Label size and position options
Transparency controls
Historical display limits
This indicator is for educational and informational purposes only. It does not constitute financial advice. Past performance is not indicative of future results. Always conduct your own analysis and manage risk appropriately.
Smart Money Toolkit - PD Engine Bias Map [KedArc Quant]Description
Smart Money is an advanced multi-layer Smart Money Concepts framework that automatically detects structure shifts, premium-discount zones, and institutional order flow.
It is built around the PD Engine, which calculates the midpoint of the most recent market swing and dynamically determines BUY or SELL bias based on where current price trades relative to that equilibrium. This toolkit visualizes structure, order blocks, and bias context in one clean map, giving traders an institutional-grade view without unnecessary signal clutter.
Why It Is Unique
- All CHoCH, BOS, Order Block, FVG, and PD logic are coded from scratch.
- Uses true equilibrium (50 percent PD midpoint) for dynamic bias.
- Optimized for stability and non-repainting behavior.
- Designed for clarity with minimal, performance-safe visuals.
Entry and Exit Logic (Discretionary Framework)
- This toolkit is not a signal generator. It provides market context that guides discretionary trading.
BUY Bias (Discount Zone)
- Price trades below PD Mid: the market is in discount.
- Wait for a bullish CHoCH or reaction from a demand OB or FVG before buying.
- Target 1 = PD Mid. Target 2 = next opposite OB or FVG.
SELL Bias (Premium Zone)
- Price trades above PD Mid: the market is in premium.
- Wait for a bearish CHoCH or reaction from a supply OB or FVG before shorting.
- Target 1 = PD Mid. Target 2 = next opposite OB or FVG.
Institutional concept sequence: Bias → Structure Shift → Confirmation → Execution.
Input Configuration
Swing Sensitivity - Determines how far back to identify HH and LL pivots.
OB / FVG Detection - Toggles visual Order Block or Fair Value Gap zones.
PD Engine - Shows PD midpoint line, zone shading, and bias table.
Multi-TF Bias Sync - Optionally reads a higher timeframe bias for confirmation.
Color Themes - Switch between light, dark, or institutional palettes.
Formula / Logic Summary
Concept Formula
PD Mid (Equilibrium) (Recent Swing High + Recent Swing Low) / 2
BUY Bias close < PD Mid
SELL Bias close > PD Mid
CHoCH / BOS Pivot-based structure reversal: HH→LL or LL→HH
Order Block Last bullish or bearish candle before displacement.
FVG Gap between prior candle high/low and next candle range.
These formulas follow the structure used in institutional Smart Money Concepts.
How It Helps Traders
- Shows institutional premium and discount zones visually.
- Defines clear directional bias before entry.
- Combines structure, order blocks, FVG, and equilibrium in one layout.
- Works on any timeframe or asset.
- Prevents emotional trades by giving objective bias context.
Glossary
PD Mid Midpoint between recent swing high and low (market fair value).
Premium Zone Price above PD Mid; sellers control.
Discount Zone Price below PD Mid; buyers control.
CHoCH Change of Character, first reversal signal.
BOS Break of Structure, trend continuation confirmation.
OB Order Block, last institutional candle before move.
FVG Fair Value Gap, price imbalance often revisited.
FAQ
Q: Is this a signal indicator?
A: No. It is a contextual framework that supports manual decision-making.
Q: Does it repaint?
A: No. All structure logic is confirmed on bar close.
Q: Does it work on all markets?
A: Yes. It is purely price-based and timeframe independent.
Q: When does bias change?
A: Only after a new confirmed swing high or low.
Q: Can it be backtested?
A: You can build strategies on top of this context using your own entry and exit rules.
Disclaimer
This script is provided for educational purposes only.
It is not financial advice.
Trading carries risk. Past performance does not guarantee future results.
Use proper risk management and test on demo accounts before applying to live markets.
BPR (Ballanced price range) DetectorHow This BPR Detector Works
This indicator is designed to detect and visualize balanced price ranges (BPRs) on price charts. The indicator has two main components:
Regular FVG Detection - The indicator first detects regular Fair Value Gaps in price action, which are spaces where price has moved quickly leaving a gap. This is necessary because BPRs are derived from regular FVGs.
BPR Detection - When the price action inverts and moves through a regular FVG in the opposite direction, the indicator identifies this as a BPR. This concept is important in Inner Circle Trader (ICT) methodology as it can signal potential changes in trend direction. Additionally the detection logic is refined by incorporating displacement.
The main functionality preserved includes:
Detection of regular FVGs (required to find BPRs)
Conversion of regular FVGs to BPRs when price moves through them creating a FVG in the opposite direction
Visual display of both FVG and BPR zones
Mitigation tracking for both types of imbalances
Displacement visualization that helps identify energetic price moves
Key Settings
FVG Settings - Control the appearance and behaviour of regular Fair Value Gaps
BPR Settings - Control the appearance of Breaker Price Ranges (which have different colours by default)
Mitigation Settings - Define how the indicator determines when an imbalance has been filled
Displacement Settings - Optional highlighting of energetic price moves that may lead to imbalances
Naveen Prabhu with EMA//@version=6
indicator('Naveen Prabhu with EMA', overlay = true, max_labels_count = 500, max_lines_count = 500, max_boxes_count = 500)
a = input(2, title = 'Key Vaule. \'This changes the sensitivity\'')
c = input(5, title = 'ATR Period')
h = input(false, title = 'Signals from Heikin Ashi Candles')
BULLISH_LEG = 1
BEARISH_LEG = 0
BULLISH = +1
BEARISH = -1
GREEN = #089981
RED = #F23645
BLUE = #2157f3
GRAY = #878b94
MONO_BULLISH = #b2b5be
MONO_BEARISH = #5d606b
HISTORICAL = 'Historical'
PRESENT = 'Present'
COLORED = 'Colored'
MONOCHROME = 'Monochrome'
ALL = 'All'
BOS = 'BOS'
CHOCH = 'CHoCH'
TINY = size.tiny
SMALL = size.small
NORMAL = size.normal
ATR = 'Atr'
RANGE = 'Cumulative Mean Range'
CLOSE = 'Close'
HIGHLOW = 'High/Low'
SOLID = '⎯⎯⎯'
DASHED = '----'
DOTTED = '····'
SMART_GROUP = 'Smart Money Concepts'
INTERNAL_GROUP = 'Real Time Internal Structure'
SWING_GROUP = 'Real Time Swing Structure'
BLOCKS_GROUP = 'Order Blocks'
EQUAL_GROUP = 'EQH/EQL'
GAPS_GROUP = 'Fair Value Gaps'
LEVELS_GROUP = 'Highs & Lows MTF'
ZONES_GROUP = 'Premium & Discount Zones'
modeTooltip = 'Allows to display historical Structure or only the recent ones'
styleTooltip = 'Indicator color theme'
showTrendTooltip = 'Display additional candles with a color reflecting the current trend detected by structure'
showInternalsTooltip = 'Display internal market structure'
internalFilterConfluenceTooltip = 'Filter non significant internal structure breakouts'
showStructureTooltip = 'Display swing market Structure'
showSwingsTooltip = 'Display swing point as labels on the chart'
showHighLowSwingsTooltip = 'Highlight most recent strong and weak high/low points on the chart'
showInternalOrderBlocksTooltip = 'Display internal order blocks on the chart\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt is recommended to use the cumulative mean range method when a low amount of data is available'
orderBlockMitigationTooltip = 'Select what values to use for order block mitigation'
showEqualHighsLowsTooltip = 'Display equal highs and equal lows on the chart'
equalHighsLowsLengthTooltip = 'Number of bars used to confirm equal highs and equal lows'
equalHighsLowsThresholdTooltip = 'Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows\n\nLower values will return fewer but more pertinent results'
showFairValueGapsTooltip = 'Display fair values gaps on the chart'
fairValueGapsThresholdTooltip = 'Filter out non significant fair value gaps'
fairValueGapsTimeframeTooltip = 'Fair value gaps timeframe'
fairValueGapsExtendTooltip = 'Determine how many bars to extend the Fair Value Gap boxes on chart'
showPremiumDiscountZonesTooltip = 'Display premium, discount, and equilibrium zones on chart'
modeInput = input.string( HISTORICAL, 'Mode', group = SMART_GROUP, tooltip = modeTooltip, options = )
styleInput = input.string( COLORED, 'Style', group = SMART_GROUP, tooltip = styleTooltip,options = )
showTrendInput = input( false, 'Color Candles', group = SMART_GROUP, tooltip = showTrendTooltip)
showInternalsInput = input( false, 'Show Internal Structure', group = INTERNAL_GROUP, tooltip = showInternalsTooltip)
showInternalBullInput = input.string( ALL, 'Bullish Structure', group = INTERNAL_GROUP, inline = 'ibull', options = )
internalBullColorInput = input( GREEN, '', group = INTERNAL_GROUP, inline = 'ibull')
showInternalBearInput = input.string( ALL, 'Bearish Structure' , group = INTERNAL_GROUP, inline = 'ibear', options = )
internalBearColorInput = input( RED, '', group = INTERNAL_GROUP, inline = 'ibear')
internalFilterConfluenceInput = input( false, 'Confluence Filter', group = INTERNAL_GROUP, tooltip = internalFilterConfluenceTooltip)
internalStructureSize = input.string( TINY, 'Internal Label Size', group = INTERNAL_GROUP, options = )
showStructureInput = input( false, 'Show Swing Structure', group = SWING_GROUP, tooltip = showStructureTooltip)
showSwingBullInput = input.string( ALL, 'Bullish Structure', group = SWING_GROUP, inline = 'bull', options = )
swingBullColorInput = input( GREEN, '', group = SWING_GROUP, inline = 'bull')
showSwingBearInput = input.string( ALL, 'Bearish Structure', group = SWING_GROUP, inline = 'bear', options = )
swingBearColorInput = input( RED, '', group = SWING_GROUP, inline = 'bear')
swingStructureSize = input.string( SMALL, 'Swing Label Size', group = SWING_GROUP, options = )
showSwingsInput = input( false, 'Show Swings Points', group = SWING_GROUP, tooltip = showSwingsTooltip,inline = 'swings')
swingsLengthInput = input.int( 50, '', group = SWING_GROUP, minval = 10, inline = 'swings')
showHighLowSwingsInput = input( false, 'Show Strong/Weak High/Low',group = SWING_GROUP, tooltip = showHighLowSwingsTooltip)
showInternalOrderBlocksInput = input( true, 'Internal Order Blocks' , group = BLOCKS_GROUP, tooltip = showInternalOrderBlocksTooltip, inline = 'iob')
internalOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'iob')
showSwingOrderBlocksInput = input( true, 'Swing Order Blocks', group = BLOCKS_GROUP, tooltip = showSwingOrderBlocksTooltip, inline = 'ob')
swingOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'ob')
orderBlockFilterInput = input.string( 'Atr', 'Order Block Filter', group = BLOCKS_GROUP, tooltip = orderBlockFilterTooltip, options = )
orderBlockMitigationInput = input.string( HIGHLOW, 'Order Block Mitigation', group = BLOCKS_GROUP, tooltip = orderBlockMitigationTooltip, options = )
internalBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Internal Bullish OB', group = BLOCKS_GROUP)
internalBearishOrderBlockColor = input.color(color.new(#f77c80, 80), 'Internal Bearish OB', group = BLOCKS_GROUP)
swingBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Bullish OB', group = BLOCKS_GROUP)
swingBearishOrderBlockColor = input.color(color.new(#b22833, 80), 'Bearish OB', group = BLOCKS_GROUP)
showEqualHighsLowsInput = input( false, 'Equal High/Low', group = EQUAL_GROUP, tooltip = showEqualHighsLowsTooltip)
equalHighsLowsLengthInput = input.int( 3, 'Bars Confirmation', group = EQUAL_GROUP, tooltip = equalHighsLowsLengthTooltip, minval = 1)
equalHighsLowsThresholdInput = input.float( 0.1, 'Threshold', group = EQUAL_GROUP, tooltip = equalHighsLowsThresholdTooltip, minval = 0, maxval = 0.5, step = 0.1)
equalHighsLowsSizeInput = input.string( TINY, 'Label Size', group = EQUAL_GROUP, options = )
showFairValueGapsInput = input( false, 'Fair Value Gaps', group = GAPS_GROUP, tooltip = showFairValueGapsTooltip)
fairValueGapsThresholdInput = input( true, 'Auto Threshold', group = GAPS_GROUP, tooltip = fairValueGapsThresholdTooltip)
fairValueGapsTimeframeInput = input.timeframe('', 'Timeframe', group = GAPS_GROUP, tooltip = fairValueGapsTimeframeTooltip)
fairValueGapsBullColorInput = input.color(color.new(#00ff68, 70), 'Bullish FVG' , group = GAPS_GROUP)
fairValueGapsBearColorInput = input.color(color.new(#ff0008, 70), 'Bearish FVG' , group = GAPS_GROUP)
fairValueGapsExtendInput = input.int( 1, 'Extend FVG', group = GAPS_GROUP, tooltip = fairValueGapsExtendTooltip, minval = 0)
showDailyLevelsInput = input( false, 'Daily', group = LEVELS_GROUP, inline = 'daily')
dailyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'daily', options = )
dailyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'daily')
showWeeklyLevelsInput = input( false, 'Weekly', group = LEVELS_GROUP, inline = 'weekly')
weeklyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'weekly', options = )
weeklyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'weekly')
showMonthlyLevelsInput = input( false, 'Monthly', group = LEVELS_GROUP, inline = 'monthly')
monthlyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'monthly', options = )
monthlyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'monthly')
showPremiumDiscountZonesInput = input( false, 'Premium/Discount Zones', group = ZONES_GROUP , tooltip = showPremiumDiscountZonesTooltip)
premiumZoneColorInput = input.color( RED, 'Premium Zone', group = ZONES_GROUP)
equilibriumZoneColorInput = input.color( GRAY, 'Equilibrium Zone', group = ZONES_GROUP)
discountZoneColorInput = input.color( GREEN, 'Discount Zone', group = ZONES_GROUP)
type alerts
bool internalBullishBOS = false
bool internalBearishBOS = false
bool internalBullishCHoCH = false
bool internalBearishCHoCH = false
bool swingBullishBOS = false
bool swingBearishBOS = false
bool swingBullishCHoCH = false
bool swingBearishCHoCH = false
bool internalBullishOrderBlock = false
bool internalBearishOrderBlock = false
bool swingBullishOrderBlock = false
bool swingBearishOrderBlock = false
bool equalHighs = false
bool equalLows = false
bool bullishFairValueGap = false
bool bearishFairValueGap = false
type trailingExtremes
float top
float bottom
int barTime
int barIndex
int lastTopTime
int lastBottomTime
type fairValueGap
float top
float bottom
int bias
box topBox
box bottomBox
type trend
int bias
type equalDisplay
line l_ine = na
label l_abel = na
type pivot
float currentLevel
float lastLevel
bool crossed
int barTime = time
int barIndex = bar_index
type orderBlock
float barHigh
float barLow
int barTime
int bias
// @variable current swing pivot high
var pivot swingHigh = pivot.new(na,na,false)
// @variable current swing pivot low
var pivot swingLow = pivot.new(na,na,false)
// @variable current internal pivot high
var pivot internalHigh = pivot.new(na,na,false)
// @variable current internal pivot low
var pivot internalLow = pivot.new(na,na,false)
// @variable current equal high pivot
var pivot equalHigh = pivot.new(na,na,false)
// @variable current equal low pivot
var pivot equalLow = pivot.new(na,na,false)
// @variable swing trend bias
var trend swingTrend = trend.new(0)
// @variable internal trend bias
var trend internalTrend = trend.new(0)
// @variable equal high display
var equalDisplay equalHighDisplay = equalDisplay.new()
// @variable equal low display
var equalDisplay equalLowDisplay = equalDisplay.new()
// @variable storage for fairValueGap UDTs
var array fairValueGaps = array.new()
// @variable storage for parsed highs
var array parsedHighs = array.new()
// @variable storage for parsed lows
var array parsedLows = array.new()
// @variable storage for raw highs
var array highs = array.new()
// @variable storage for raw lows
var array lows = array.new()
// @variable storage for bar time values
var array times = array.new()
// @variable last trailing swing high and low
var trailingExtremes trailing = trailingExtremes.new()
// @variable storage for orderBlock UDTs (swing order blocks)
var array swingOrderBlocks = array.new()
// @variable storage for orderBlock UDTs (internal order blocks)
var array internalOrderBlocks = array.new()
// @variable storage for swing order blocks boxes
var array swingOrderBlocksBoxes = array.new()
// @variable storage for internal order blocks boxes
var array internalOrderBlocksBoxes = array.new()
// @variable color for swing bullish structures
var swingBullishColor = styleInput == MONOCHROME ? MONO_BULLISH : swingBullColorInput
// @variable color for swing bearish structures
var swingBearishColor = styleInput == MONOCHROME ? MONO_BEARISH : swingBearColorInput
// @variable color for bullish fair value gaps
var fairValueGapBullishColor = styleInput == MONOCHROME ? color.new(MONO_BULLISH,70) : fairValueGapsBullColorInput
// @variable color for bearish fair value gaps
var fairValueGapBearishColor = styleInput == MONOCHROME ? color.new(MONO_BEARISH,70) : fairValueGapsBearColorInput
// @variable color for premium zone
var premiumZoneColor = styleInput == MONOCHROME ? MONO_BEARISH : premiumZoneColorInput
// @variable color for discount zone
var discountZoneColor = styleInput == MONOCHROME ? MONO_BULLISH : discountZoneColorInput
// @variable bar index on current script iteration
varip int currentBarIndex = bar_index
// @variable bar index on last script iteration
varip int lastBarIndex = bar_index
// @variable alerts in current bar
alerts currentAlerts = alerts.new()
// @variable time at start of chart
var initialTime = time
// we create the needed boxes for displaying order blocks at the first execution
if barstate.isfirst
if showSwingOrderBlocksInput
for index = 1 to swingOrderBlocksSizeInput
swingOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
if showInternalOrderBlocksInput
for index = 1 to internalOrderBlocksSizeInput
internalOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
// @variable source to use in bearish order blocks mitigation
bearishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : high
// @variable source to use in bullish order blocks mitigation
bullishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : low
// @variable default volatility measure
atrMeasure = ta.atr(200)
// @variable parsed volatility measure by user settings
volatilityMeasure = orderBlockFilterInput == ATR ? atrMeasure : ta.cum(ta.tr)/bar_index
// @variable true if current bar is a high volatility bar
highVolatilityBar = (high - low) >= (2 * volatilityMeasure)
// @variable parsed high
parsedHigh = highVolatilityBar ? low : high
// @variable parsed low
parsedLow = highVolatilityBar ? high : low
// we store current values into the arrays at each bar
parsedHighs.push(parsedHigh)
parsedLows.push(parsedLow)
highs.push(high)
lows.push(low)
times.push(time)
leg(int size) =>
var leg = 0
newLegHigh = high > ta.highest( size)
newLegLow = low < ta.lowest( size)
if newLegHigh
leg := BEARISH_LEG
else if newLegLow
leg := BULLISH_LEG
leg
startOfNewLeg(int leg) => ta.change(leg) != 0
startOfBearishLeg(int leg) => ta.change(leg) == -1
startOfBullishLeg(int leg) => ta.change(leg) == +1
drawLabel(int labelTime, float labelPrice, string tag, color labelColor, string labelStyle) =>
var label l_abel = na
if modeInput == PRESENT
l_abel.delete()
l_abel := label.new(chart.point.new(labelTime,na,labelPrice),tag,xloc.bar_time,color=color(na),textcolor=labelColor,style = labelStyle,size = size.small)
drawEqualHighLow(pivot p_ivot, float level, int size, bool equalHigh) =>
equalDisplay e_qualDisplay = equalHigh ? equalHighDisplay : equalLowDisplay
string tag = 'EQL'
color equalColor = swingBullishColor
string labelStyle = label.style_label_up
if equalHigh
tag := 'EQH'
equalColor := swingBearishColor
labelStyle := label.style_label_down
if modeInput == PRESENT
line.delete( e_qualDisplay.l_ine)
label.delete( e_qualDisplay.l_abel)
e_qualDisplay.l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time ,na,level), xloc = xloc.bar_time, color = equalColor, style = line.style_dotted)
labelPosition = math.round(0.5*(p_ivot.barIndex + bar_index - size))
e_qualDisplay.l_abel := label.new(chart.point.new(na,labelPosition,level), tag, xloc.bar_index, color = color(na), textcolor = equalColor, style = labelStyle, size = equalHighsLowsSizeInput)
getCurrentStructure(int size,bool equalHighLow = false, bool internal = false) =>
currentLeg = leg(size)
newPivot = startOfNewLeg(currentLeg)
pivotLow = startOfBullishLeg(currentLeg)
pivotHigh = startOfBearishLeg(currentLeg)
if newPivot
if pivotLow
pivot p_ivot = equalHighLow ? equalLow : internal ? internalLow : swingLow
if equalHighLow and math.abs(p_ivot.currentLevel - low ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot, low , size, false)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := low
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.bottom := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastBottomTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel < p_ivot.lastLevel ? 'LL' : 'HL', swingBullishColor, label.style_label_up)
else
pivot p_ivot = equalHighLow ? equalHigh : internal ? internalHigh : swingHigh
if equalHighLow and math.abs(p_ivot.currentLevel - high ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot,high ,size,true)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := high
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.top := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastTopTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel > p_ivot.lastLevel ? 'HH' : 'LH', swingBearishColor, label.style_label_down)
drawStructure(pivot p_ivot, string tag, color structureColor, string lineStyle, string labelStyle, string labelSize) =>
var line l_ine = line.new(na,na,na,na,xloc = xloc.bar_time)
var label l_abel = label.new(na,na)
if modeInput == PRESENT
l_ine.delete()
l_abel.delete()
l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time,na,p_ivot.currentLevel), xloc.bar_time, color=structureColor, style=lineStyle)
l_abel := label.new(chart.point.new(na,math.round(0.5*(p_ivot.barIndex+bar_index)),p_ivot.currentLevel), tag, xloc.bar_index, color=color(na), textcolor=structureColor, style=labelStyle, size = labelSize)
deleteOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
for in orderBlocks
bool crossedOderBlock = false
if bearishOrderBlockMitigationSource > eachOrderBlock.barHigh and eachOrderBlock.bias == BEARISH
crossedOderBlock := true
if internal
currentAlerts.internalBearishOrderBlock := true
else
currentAlerts.swingBearishOrderBlock := true
else if bullishOrderBlockMitigationSource < eachOrderBlock.barLow and eachOrderBlock.bias == BULLISH
crossedOderBlock := true
if internal
currentAlerts.internalBullishOrderBlock := true
else
currentAlerts.swingBullishOrderBlock := true
if crossedOderBlock
orderBlocks.remove(index)
storeOrdeBlock(pivot p_ivot,bool internal = false,int bias) =>
if (not internal and showSwingOrderBlocksInput) or (internal and showInternalOrderBlocksInput)
array a_rray = na
int parsedIndex = na
if bias == BEARISH
a_rray := parsedHighs.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.max())
else
a_rray := parsedLows.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.min())
orderBlock o_rderBlock = orderBlock.new(parsedHighs.get(parsedIndex), parsedLows.get(parsedIndex), times.get(parsedIndex),bias)
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
if orderBlocks.size() >= 100
orderBlocks.pop()
orderBlocks.unshift(o_rderBlock)
drawOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
orderBlocksSize = orderBlocks.size()
if orderBlocksSize > 0
maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput
array parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize))
array b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes
for in parsedOrdeBlocks
orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor)
box b_ox = b_oxes.get(index)
b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow))
b_ox.set_border_color( internal ? na : orderBlockColor)
b_ox.set_bgcolor( orderBlockColor)
displayStructure(bool internal = false) =>
var bullishBar = true
var bearishBar = true
if internalFilterConfluenceInput
bullishBar := high - math.max(close, open) > math.min(close, open - low)
bearishBar := high - math.max(close, open) < math.min(close, open - low)
pivot p_ivot = internal ? internalHigh : swingHigh
trend t_rend = internal ? internalTrend : swingTrend
lineStyle = internal ? line.style_dashed : line.style_solid
labelSize = internal ? internalStructureSize : swingStructureSize
extraCondition = internal ? internalHigh.currentLevel != swingHigh.currentLevel and bullishBar : true
bullishColor = styleInput == MONOCHROME ? MONO_BULLISH : internal ? internalBullColorInput : swingBullColorInput
if ta.crossover(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BEARISH ? CHOCH : BOS
if internal
currentAlerts.internalBullishCHoCH := tag == CHOCH
currentAlerts.internalBullishBOS := tag == BOS
else
currentAlerts.swingBullishCHoCH := tag == CHOCH
currentAlerts.swingBullishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BULLISH
displayCondition = internal ? showInternalsInput and (showInternalBullInput == ALL or (showInternalBullInput == BOS and tag != CHOCH) or (showInternalBullInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBullInput == ALL or (showSwingBullInput == BOS and tag != CHOCH) or (showSwingBullInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bullishColor,lineStyle,label.style_label_down,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BULLISH)
p_ivot := internal ? internalLow : swingLow
extraCondition := internal ? internalLow.currentLevel != swingLow.currentLevel and bearishBar : true
bearishColor = styleInput == MONOCHROME ? MONO_BEARISH : internal ? internalBearColorInput : swingBearColorInput
if ta.crossunder(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BULLISH ? CHOCH : BOS
if internal
currentAlerts.internalBearishCHoCH := tag == CHOCH
currentAlerts.internalBearishBOS := tag == BOS
else
currentAlerts.swingBearishCHoCH := tag == CHOCH
currentAlerts.swingBearishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BEARISH
displayCondition = internal ? showInternalsInput and (showInternalBearInput == ALL or (showInternalBearInput == BOS and tag != CHOCH) or (showInternalBearInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBearInput == ALL or (showSwingBearInput == BOS and tag != CHOCH) or (showSwingBearInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bearishColor,lineStyle,label.style_label_up,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BEARISH)
fairValueGapBox(leftTime,rightTime,topPrice,bottomPrice,boxColor) => box.new(chart.point.new(leftTime,na,topPrice),chart.point.new(rightTime + fairValueGapsExtendInput * (time-time ),na,bottomPrice), xloc=xloc.bar_time, border_color = boxColor, bgcolor = boxColor)
deleteFairValueGaps() =>
for in fairValueGaps
if (low < eachFairValueGap.bottom and eachFairValueGap.bias == BULLISH) or (high > eachFairValueGap.top and eachFairValueGap.bias == BEARISH)
eachFairValueGap.topBox.delete()
eachFairValueGap.bottomBox.delete()
fairValueGaps.remove(index)
// @function draw fair value gaps
// @returns fairValueGap ID
drawFairValueGaps() =>
= request.security(syminfo.tickerid, fairValueGapsTimeframeInput, [close , open , time , high , low , time , high , low ],lookahead = barmerge.lookahead_on)
barDeltaPercent = (lastClose - lastOpen) / (lastOpen * 100)
newTimeframe = timeframe.change(fairValueGapsTimeframeInput)
threshold = fairValueGapsThresholdInput ? ta.cum(math.abs(newTimeframe ? barDeltaPercent : 0)) / bar_index * 2 : 0
bullishFairValueGap = currentLow > last2High and lastClose > last2High and barDeltaPercent > threshold and newTimeframe
bearishFairValueGap = currentHigh < last2Low and lastClose < last2Low and -barDeltaPercent > threshold and newTimeframe
if bullishFairValueGap
currentAlerts.bullishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentLow,last2High,BULLISH,fairValueGapBox(lastTime,currentTime,currentLow,math.avg(currentLow,last2High),fairValueGapBullishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentLow,last2High),last2High,fairValueGapBullishColor)))
if bearishFairValueGap
currentAlerts.bearishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentHigh,last2Low,BEARISH,fairValueGapBox(lastTime,currentTime,currentHigh,math.avg(currentHigh,last2Low),fairValueGapBearishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentHigh,last2Low),last2Low,fairValueGapBearishColor)))
getStyle(string style) =>
switch style
SOLID => line.style_solid
DASHED => line.style_dashed
DOTTED => line.style_dotted
drawLevels(string timeframe, bool sameTimeframe, string style, color levelColor) =>
= request.security(syminfo.tickerid, timeframe, [high , low , time , time],lookahead = barmerge.lookahead_on)
float parsedTop = sameTimeframe ? high : topLevel
float parsedBottom = sameTimeframe ? low : bottomLevel
int parsedLeftTime = sameTimeframe ? time : leftTime
int parsedRightTime = sameTimeframe ? time : rightTime
int parsedTopTime = time
int parsedBottomTime = time
if not sameTimeframe
int leftIndex = times.binary_search_rightmost(parsedLeftTime)
int rightIndex = times.binary_search_rightmost(parsedRightTime)
array timeArray = times.slice(leftIndex,rightIndex)
array topArray = highs.slice(leftIndex,rightIndex)
array bottomArray = lows.slice(leftIndex,rightIndex)
parsedTopTime := timeArray.size() > 0 ? timeArray.get(topArray.indexof(topArray.max())) : initialTime
parsedBottomTime := timeArray.size() > 0 ? timeArray.get(bottomArray.indexof(bottomArray.min())) : initialTime
var line topLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var line bottomLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var label topLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}H',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
var label bottomLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}L',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
topLine.set_first_point( chart.point.new(parsedTopTime,na,parsedTop))
topLine.set_second_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
topLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
bottomLine.set_first_point( chart.point.new(parsedBottomTime,na,parsedBottom))
bottomLine.set_second_point(chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
bottomLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
higherTimeframe(string timeframe) => timeframe.in_seconds() > timeframe.in_seconds(timeframe)
updateTrailingExtremes() =>
trailing.top := math.max(high,trailing.top)
trailing.lastTopTime := trailing.top == high ? time : trailing.lastTopTime
trailing.bottom := math.min(low,trailing.bottom)
trailing.lastBottomTime := trailing.bottom == low ? time : trailing.lastBottomTime
drawHighLowSwings() =>
var line topLine = line.new(na, na, na, na, color = swingBearishColor, xloc = xloc.bar_time)
var line bottomLine = line.new(na, na, na, na, color = swingBullishColor, xloc = xloc.bar_time)
var label topLabel = label.new(na, na, color=color(na), textcolor = swingBearishColor, xloc = xloc.bar_time, style = label.style_label_down, size = size.tiny)
var label bottomLabel = label.new(na, na, color=color(na), textcolor = swingBullishColor, xloc = xloc.bar_time, style = label.style_label_up, size = size.tiny)
rightTimeBar = last_bar_time + 20 * (time - time )
topLine.set_first_point( chart.point.new(trailing.lastTopTime, na, trailing.top))
topLine.set_second_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_text( swingTrend.bias == BEARISH ? 'Strong High' : 'Weak High')
bottomLine.set_first_point( chart.point.new(trailing.lastBottomTime, na, trailing.bottom))
bottomLine.set_second_point(chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_point( chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_text( swingTrend.bias == BULLISH ? 'Strong Low' : 'Weak Low')
drawZone(float labelLevel, int labelIndex, float top, float bottom, string tag, color zoneColor, string style) =>
var label l_abel = label.new(na,na,text = tag, color=color(na),textcolor = zoneColor, style = style, size = size.small)
var box b_ox = box.new(na,na,na,na,bgcolor = color.new(zoneColor,80),border_color = color(na), xloc = xloc.bar_time)
b_ox.set_top_left_point( chart.point.new(trailing.barTime,na,top))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,bottom))
l_abel.set_point( chart.point.new(na,labelIndex,labelLevel))
// @function draw premium/discount zones
// @returns void
drawPremiumDiscountZones() =>
drawZone(trailing.top, math.round(0.5*(trailing.barIndex + last_bar_index)), trailing.top, 0.95*trailing.top + 0.05*trailing.bottom, 'Premium', premiumZoneColor, label.style_label_down)
equilibriumLevel = math.avg(trailing.top, trailing.bottom)
drawZone(equilibriumLevel, last_bar_index, 0.525*trailing.top + 0.475*trailing.bottom, 0.525*trailing.bottom + 0.475*trailing.top, 'Equilibrium', equilibriumZoneColorInput, label.style_label_left)
drawZone(trailing.bottom, math.round(0.5*(trailing.barIndex + last_bar_index)), 0.95*trailing.bottom + 0.05*trailing.top, trailing.bottom, 'Discount', discountZoneColor, label.style_label_up)
parsedOpen = showTrendInput ? open : na
candleColor = internalTrend.bias == BULLISH ? swingBullishColor : swingBearishColor
plotcandle(parsedOpen,high,low,close,color = candleColor, wickcolor = candleColor, bordercolor = candleColor)
if showHighLowSwingsInput or showPremiumDiscountZonesInput
updateTrailingExtremes()
if showHighLowSwingsInput
drawHighLowSwings()
if showPremiumDiscountZonesInput
drawPremiumDiscountZones()
if showFairValueGapsInput
deleteFairValueGaps()
getCurrentStructure(swingsLengthInput,false)
getCurrentStructure(5,false,true)
if showEqualHighsLowsInput
getCurrentStructure(equalHighsLowsLengthInput,true)
if showInternalsInput or showInternalOrderBlocksInput or showTrendInput
displayStructure(true)
if showStructureInput or showSwingOrderBlocksInput or showHighLowSwingsInput
displayStructure()
if showInternalOrderBlocksInput
deleteOrderBlocks(true)
if showSwingOrderBlocksInput
deleteOrderBlocks()
if showFairValueGapsInput
drawFairValueGaps()
if barstate.islastconfirmedhistory or barstate.islast
if showInternalOrderBlocksInput
drawOrderBlocks(true)
if showSwingOrderBlocksInput
drawOrderBlocks()
lastBarIndex := currentBarIndex
currentBarIndex := bar_index
newBar = currentBarIndex != lastBarIndex
if barstate.islastconfirmedhistory or (barstate.isrealtime and newBar)
if showDailyLevelsInput and not higherTimeframe('D')
drawLevels('D',timeframe.isdaily,dailyLevelsStyleInput,dailyLevelsColorInput)
if showWeeklyLevelsInput and not higherTimeframe('W')
drawLevels('W',timeframe.isweekly,weeklyLevelsStyleInput,weeklyLevelsColorInput)
if showMonthlyLevelsInput and not higherTimeframe('M')
drawLevels('M',timeframe.ismonthly,monthlyLevelsStyleInput,monthlyLevelsColorInput)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = barmerge.lookahead_off) : close
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop , 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? math.min(nz(xATRTrailingStop ), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? math.max(nz(xATRTrailingStop ), src - nLoss) : iff_2
pos = 0
iff_3 = src > nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? -1 : nz(pos , 0)
pos := src < nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
//---------------------------------------------------------------------------------------------------------------------}
//ALERTS
//---------------------------------------------------------------------------------------------------------------------{
alertcondition(currentAlerts.internalBullishBOS, 'Internal Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.internalBullishCHoCH, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.internalBearishBOS, 'Internal Bearish BOS', 'Internal Bearish BOS formed')
alertcondition(currentAlerts.internalBearishCHoCH, 'Internal Bearish CHoCH', 'Internal Bearish CHoCH formed')
alertcondition(currentAlerts.swingBullishBOS, 'Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.swingBullishCHoCH, 'Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.swingBearishBOS, 'Bearish BOS', 'Bearish BOS formed')
alertcondition(currentAlerts.swingBearishCHoCH, 'Bearish CHoCH', 'Bearish CHoCH formed')
alertcondition(currentAlerts.internalBullishOrderBlock, 'Bullish Internal OB Breakout', 'Price broke bullish internal OB')
alertcondition(currentAlerts.internalBearishOrderBlock, 'Bearish Internal OB Breakout', 'Price broke bearish internal OB')
alertcondition(currentAlerts.swingBullishOrderBlock, 'Bullish Swing OB Breakout', 'Price broke bullish swing OB')
alertcondition(currentAlerts.swingBearishOrderBlock, 'Bearish Swing OB Breakout', 'Price broke bearish swing OB')
alertcondition(currentAlerts.equalHighs, 'Equal Highs', 'Equal highs detected')
alertcondition(currentAlerts.equalLows, 'Equal Lows', 'Equal lows detected')
alertcondition(currentAlerts.bullishFairValueGap, 'Bullish FVG', 'Bullish FVG formed')
alertcondition(currentAlerts.bearishFairValueGap, 'Bearish FVG', 'Bearish FVG formed')
alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')
plotshape(buy, title = 'Buy', text = 'Buy', style = shape.labelup, location = location.belowbar, color = color.new(color.green, 0), textcolor = color.new(color.white, 0), size = size.tiny)
plotshape(sell, title = 'Sell', text = 'Sell', style = shape.labeldown, location = location.abovebar, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), size = size.tiny)
//--------------------------------------------------------------------------------------
// EMA ADDITIONS (Editable)
//--------------------------------------------------------------------------------------
ema5Len = input.int(5, "5 EMA Length", minval = 1)
ema9Len = input.int(9, "9 EMA Length", minval = 1)
ema5 = ta.ema(src, ema5Len)
ema9 = ta.ema(src, ema9Len)
plot(ema5, "EMA 5", color = color.red, linewidth = 2)
plot(ema9, "EMA 9", color = color.blue, linewidth = 2)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
Naveen Prabhu with EMA//@version=6
indicator('Naveen Prabhu with EMA', overlay = true, max_labels_count = 500, max_lines_count = 500, max_boxes_count = 500)
a = input(2, title = 'Key Vaule. \'This changes the sensitivity\'')
c = input(5, title = 'ATR Period')
h = input(false, title = 'Signals from Heikin Ashi Candles')
BULLISH_LEG = 1
BEARISH_LEG = 0
BULLISH = +1
BEARISH = -1
GREEN = #089981
RED = #F23645
BLUE = #2157f3
GRAY = #878b94
MONO_BULLISH = #b2b5be
MONO_BEARISH = #5d606b
HISTORICAL = 'Historical'
PRESENT = 'Present'
COLORED = 'Colored'
MONOCHROME = 'Monochrome'
ALL = 'All'
BOS = 'BOS'
CHOCH = 'CHoCH'
TINY = size.tiny
SMALL = size.small
NORMAL = size.normal
ATR = 'Atr'
RANGE = 'Cumulative Mean Range'
CLOSE = 'Close'
HIGHLOW = 'High/Low'
SOLID = '⎯⎯⎯'
DASHED = '----'
DOTTED = '····'
SMART_GROUP = 'Smart Money Concepts'
INTERNAL_GROUP = 'Real Time Internal Structure'
SWING_GROUP = 'Real Time Swing Structure'
BLOCKS_GROUP = 'Order Blocks'
EQUAL_GROUP = 'EQH/EQL'
GAPS_GROUP = 'Fair Value Gaps'
LEVELS_GROUP = 'Highs & Lows MTF'
ZONES_GROUP = 'Premium & Discount Zones'
modeTooltip = 'Allows to display historical Structure or only the recent ones'
styleTooltip = 'Indicator color theme'
showTrendTooltip = 'Display additional candles with a color reflecting the current trend detected by structure'
showInternalsTooltip = 'Display internal market structure'
internalFilterConfluenceTooltip = 'Filter non significant internal structure breakouts'
showStructureTooltip = 'Display swing market Structure'
showSwingsTooltip = 'Display swing point as labels on the chart'
showHighLowSwingsTooltip = 'Highlight most recent strong and weak high/low points on the chart'
showInternalOrderBlocksTooltip = 'Display internal order blocks on the chart\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt is recommended to use the cumulative mean range method when a low amount of data is available'
orderBlockMitigationTooltip = 'Select what values to use for order block mitigation'
showEqualHighsLowsTooltip = 'Display equal highs and equal lows on the chart'
equalHighsLowsLengthTooltip = 'Number of bars used to confirm equal highs and equal lows'
equalHighsLowsThresholdTooltip = 'Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows\n\nLower values will return fewer but more pertinent results'
showFairValueGapsTooltip = 'Display fair values gaps on the chart'
fairValueGapsThresholdTooltip = 'Filter out non significant fair value gaps'
fairValueGapsTimeframeTooltip = 'Fair value gaps timeframe'
fairValueGapsExtendTooltip = 'Determine how many bars to extend the Fair Value Gap boxes on chart'
showPremiumDiscountZonesTooltip = 'Display premium, discount, and equilibrium zones on chart'
modeInput = input.string( HISTORICAL, 'Mode', group = SMART_GROUP, tooltip = modeTooltip, options = )
styleInput = input.string( COLORED, 'Style', group = SMART_GROUP, tooltip = styleTooltip,options = )
showTrendInput = input( false, 'Color Candles', group = SMART_GROUP, tooltip = showTrendTooltip)
showInternalsInput = input( false, 'Show Internal Structure', group = INTERNAL_GROUP, tooltip = showInternalsTooltip)
showInternalBullInput = input.string( ALL, 'Bullish Structure', group = INTERNAL_GROUP, inline = 'ibull', options = )
internalBullColorInput = input( GREEN, '', group = INTERNAL_GROUP, inline = 'ibull')
showInternalBearInput = input.string( ALL, 'Bearish Structure' , group = INTERNAL_GROUP, inline = 'ibear', options = )
internalBearColorInput = input( RED, '', group = INTERNAL_GROUP, inline = 'ibear')
internalFilterConfluenceInput = input( false, 'Confluence Filter', group = INTERNAL_GROUP, tooltip = internalFilterConfluenceTooltip)
internalStructureSize = input.string( TINY, 'Internal Label Size', group = INTERNAL_GROUP, options = )
showStructureInput = input( false, 'Show Swing Structure', group = SWING_GROUP, tooltip = showStructureTooltip)
showSwingBullInput = input.string( ALL, 'Bullish Structure', group = SWING_GROUP, inline = 'bull', options = )
swingBullColorInput = input( GREEN, '', group = SWING_GROUP, inline = 'bull')
showSwingBearInput = input.string( ALL, 'Bearish Structure', group = SWING_GROUP, inline = 'bear', options = )
swingBearColorInput = input( RED, '', group = SWING_GROUP, inline = 'bear')
swingStructureSize = input.string( SMALL, 'Swing Label Size', group = SWING_GROUP, options = )
showSwingsInput = input( false, 'Show Swings Points', group = SWING_GROUP, tooltip = showSwingsTooltip,inline = 'swings')
swingsLengthInput = input.int( 50, '', group = SWING_GROUP, minval = 10, inline = 'swings')
showHighLowSwingsInput = input( false, 'Show Strong/Weak High/Low',group = SWING_GROUP, tooltip = showHighLowSwingsTooltip)
showInternalOrderBlocksInput = input( true, 'Internal Order Blocks' , group = BLOCKS_GROUP, tooltip = showInternalOrderBlocksTooltip, inline = 'iob')
internalOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'iob')
showSwingOrderBlocksInput = input( true, 'Swing Order Blocks', group = BLOCKS_GROUP, tooltip = showSwingOrderBlocksTooltip, inline = 'ob')
swingOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'ob')
orderBlockFilterInput = input.string( 'Atr', 'Order Block Filter', group = BLOCKS_GROUP, tooltip = orderBlockFilterTooltip, options = )
orderBlockMitigationInput = input.string( HIGHLOW, 'Order Block Mitigation', group = BLOCKS_GROUP, tooltip = orderBlockMitigationTooltip, options = )
internalBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Internal Bullish OB', group = BLOCKS_GROUP)
internalBearishOrderBlockColor = input.color(color.new(#f77c80, 80), 'Internal Bearish OB', group = BLOCKS_GROUP)
swingBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Bullish OB', group = BLOCKS_GROUP)
swingBearishOrderBlockColor = input.color(color.new(#b22833, 80), 'Bearish OB', group = BLOCKS_GROUP)
showEqualHighsLowsInput = input( false, 'Equal High/Low', group = EQUAL_GROUP, tooltip = showEqualHighsLowsTooltip)
equalHighsLowsLengthInput = input.int( 3, 'Bars Confirmation', group = EQUAL_GROUP, tooltip = equalHighsLowsLengthTooltip, minval = 1)
equalHighsLowsThresholdInput = input.float( 0.1, 'Threshold', group = EQUAL_GROUP, tooltip = equalHighsLowsThresholdTooltip, minval = 0, maxval = 0.5, step = 0.1)
equalHighsLowsSizeInput = input.string( TINY, 'Label Size', group = EQUAL_GROUP, options = )
showFairValueGapsInput = input( false, 'Fair Value Gaps', group = GAPS_GROUP, tooltip = showFairValueGapsTooltip)
fairValueGapsThresholdInput = input( true, 'Auto Threshold', group = GAPS_GROUP, tooltip = fairValueGapsThresholdTooltip)
fairValueGapsTimeframeInput = input.timeframe('', 'Timeframe', group = GAPS_GROUP, tooltip = fairValueGapsTimeframeTooltip)
fairValueGapsBullColorInput = input.color(color.new(#00ff68, 70), 'Bullish FVG' , group = GAPS_GROUP)
fairValueGapsBearColorInput = input.color(color.new(#ff0008, 70), 'Bearish FVG' , group = GAPS_GROUP)
fairValueGapsExtendInput = input.int( 1, 'Extend FVG', group = GAPS_GROUP, tooltip = fairValueGapsExtendTooltip, minval = 0)
showDailyLevelsInput = input( false, 'Daily', group = LEVELS_GROUP, inline = 'daily')
dailyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'daily', options = )
dailyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'daily')
showWeeklyLevelsInput = input( false, 'Weekly', group = LEVELS_GROUP, inline = 'weekly')
weeklyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'weekly', options = )
weeklyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'weekly')
showMonthlyLevelsInput = input( false, 'Monthly', group = LEVELS_GROUP, inline = 'monthly')
monthlyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'monthly', options = )
monthlyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'monthly')
showPremiumDiscountZonesInput = input( false, 'Premium/Discount Zones', group = ZONES_GROUP , tooltip = showPremiumDiscountZonesTooltip)
premiumZoneColorInput = input.color( RED, 'Premium Zone', group = ZONES_GROUP)
equilibriumZoneColorInput = input.color( GRAY, 'Equilibrium Zone', group = ZONES_GROUP)
discountZoneColorInput = input.color( GREEN, 'Discount Zone', group = ZONES_GROUP)
type alerts
bool internalBullishBOS = false
bool internalBearishBOS = false
bool internalBullishCHoCH = false
bool internalBearishCHoCH = false
bool swingBullishBOS = false
bool swingBearishBOS = false
bool swingBullishCHoCH = false
bool swingBearishCHoCH = false
bool internalBullishOrderBlock = false
bool internalBearishOrderBlock = false
bool swingBullishOrderBlock = false
bool swingBearishOrderBlock = false
bool equalHighs = false
bool equalLows = false
bool bullishFairValueGap = false
bool bearishFairValueGap = false
type trailingExtremes
float top
float bottom
int barTime
int barIndex
int lastTopTime
int lastBottomTime
type fairValueGap
float top
float bottom
int bias
box topBox
box bottomBox
type trend
int bias
type equalDisplay
line l_ine = na
label l_abel = na
type pivot
float currentLevel
float lastLevel
bool crossed
int barTime = time
int barIndex = bar_index
type orderBlock
float barHigh
float barLow
int barTime
int bias
// @variable current swing pivot high
var pivot swingHigh = pivot.new(na,na,false)
// @variable current swing pivot low
var pivot swingLow = pivot.new(na,na,false)
// @variable current internal pivot high
var pivot internalHigh = pivot.new(na,na,false)
// @variable current internal pivot low
var pivot internalLow = pivot.new(na,na,false)
// @variable current equal high pivot
var pivot equalHigh = pivot.new(na,na,false)
// @variable current equal low pivot
var pivot equalLow = pivot.new(na,na,false)
// @variable swing trend bias
var trend swingTrend = trend.new(0)
// @variable internal trend bias
var trend internalTrend = trend.new(0)
// @variable equal high display
var equalDisplay equalHighDisplay = equalDisplay.new()
// @variable equal low display
var equalDisplay equalLowDisplay = equalDisplay.new()
// @variable storage for fairValueGap UDTs
var array fairValueGaps = array.new()
// @variable storage for parsed highs
var array parsedHighs = array.new()
// @variable storage for parsed lows
var array parsedLows = array.new()
// @variable storage for raw highs
var array highs = array.new()
// @variable storage for raw lows
var array lows = array.new()
// @variable storage for bar time values
var array times = array.new()
// @variable last trailing swing high and low
var trailingExtremes trailing = trailingExtremes.new()
// @variable storage for orderBlock UDTs (swing order blocks)
var array swingOrderBlocks = array.new()
// @variable storage for orderBlock UDTs (internal order blocks)
var array internalOrderBlocks = array.new()
// @variable storage for swing order blocks boxes
var array swingOrderBlocksBoxes = array.new()
// @variable storage for internal order blocks boxes
var array internalOrderBlocksBoxes = array.new()
// @variable color for swing bullish structures
var swingBullishColor = styleInput == MONOCHROME ? MONO_BULLISH : swingBullColorInput
// @variable color for swing bearish structures
var swingBearishColor = styleInput == MONOCHROME ? MONO_BEARISH : swingBearColorInput
// @variable color for bullish fair value gaps
var fairValueGapBullishColor = styleInput == MONOCHROME ? color.new(MONO_BULLISH,70) : fairValueGapsBullColorInput
// @variable color for bearish fair value gaps
var fairValueGapBearishColor = styleInput == MONOCHROME ? color.new(MONO_BEARISH,70) : fairValueGapsBearColorInput
// @variable color for premium zone
var premiumZoneColor = styleInput == MONOCHROME ? MONO_BEARISH : premiumZoneColorInput
// @variable color for discount zone
var discountZoneColor = styleInput == MONOCHROME ? MONO_BULLISH : discountZoneColorInput
// @variable bar index on current script iteration
varip int currentBarIndex = bar_index
// @variable bar index on last script iteration
varip int lastBarIndex = bar_index
// @variable alerts in current bar
alerts currentAlerts = alerts.new()
// @variable time at start of chart
var initialTime = time
// we create the needed boxes for displaying order blocks at the first execution
if barstate.isfirst
if showSwingOrderBlocksInput
for index = 1 to swingOrderBlocksSizeInput
swingOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
if showInternalOrderBlocksInput
for index = 1 to internalOrderBlocksSizeInput
internalOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
// @variable source to use in bearish order blocks mitigation
bearishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : high
// @variable source to use in bullish order blocks mitigation
bullishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : low
// @variable default volatility measure
atrMeasure = ta.atr(200)
// @variable parsed volatility measure by user settings
volatilityMeasure = orderBlockFilterInput == ATR ? atrMeasure : ta.cum(ta.tr)/bar_index
// @variable true if current bar is a high volatility bar
highVolatilityBar = (high - low) >= (2 * volatilityMeasure)
// @variable parsed high
parsedHigh = highVolatilityBar ? low : high
// @variable parsed low
parsedLow = highVolatilityBar ? high : low
// we store current values into the arrays at each bar
parsedHighs.push(parsedHigh)
parsedLows.push(parsedLow)
highs.push(high)
lows.push(low)
times.push(time)
leg(int size) =>
var leg = 0
newLegHigh = high > ta.highest( size)
newLegLow = low < ta.lowest( size)
if newLegHigh
leg := BEARISH_LEG
else if newLegLow
leg := BULLISH_LEG
leg
startOfNewLeg(int leg) => ta.change(leg) != 0
startOfBearishLeg(int leg) => ta.change(leg) == -1
startOfBullishLeg(int leg) => ta.change(leg) == +1
drawLabel(int labelTime, float labelPrice, string tag, color labelColor, string labelStyle) =>
var label l_abel = na
if modeInput == PRESENT
l_abel.delete()
l_abel := label.new(chart.point.new(labelTime,na,labelPrice),tag,xloc.bar_time,color=color(na),textcolor=labelColor,style = labelStyle,size = size.small)
drawEqualHighLow(pivot p_ivot, float level, int size, bool equalHigh) =>
equalDisplay e_qualDisplay = equalHigh ? equalHighDisplay : equalLowDisplay
string tag = 'EQL'
color equalColor = swingBullishColor
string labelStyle = label.style_label_up
if equalHigh
tag := 'EQH'
equalColor := swingBearishColor
labelStyle := label.style_label_down
if modeInput == PRESENT
line.delete( e_qualDisplay.l_ine)
label.delete( e_qualDisplay.l_abel)
e_qualDisplay.l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time ,na,level), xloc = xloc.bar_time, color = equalColor, style = line.style_dotted)
labelPosition = math.round(0.5*(p_ivot.barIndex + bar_index - size))
e_qualDisplay.l_abel := label.new(chart.point.new(na,labelPosition,level), tag, xloc.bar_index, color = color(na), textcolor = equalColor, style = labelStyle, size = equalHighsLowsSizeInput)
getCurrentStructure(int size,bool equalHighLow = false, bool internal = false) =>
currentLeg = leg(size)
newPivot = startOfNewLeg(currentLeg)
pivotLow = startOfBullishLeg(currentLeg)
pivotHigh = startOfBearishLeg(currentLeg)
if newPivot
if pivotLow
pivot p_ivot = equalHighLow ? equalLow : internal ? internalLow : swingLow
if equalHighLow and math.abs(p_ivot.currentLevel - low ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot, low , size, false)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := low
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.bottom := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastBottomTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel < p_ivot.lastLevel ? 'LL' : 'HL', swingBullishColor, label.style_label_up)
else
pivot p_ivot = equalHighLow ? equalHigh : internal ? internalHigh : swingHigh
if equalHighLow and math.abs(p_ivot.currentLevel - high ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot,high ,size,true)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := high
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.top := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastTopTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel > p_ivot.lastLevel ? 'HH' : 'LH', swingBearishColor, label.style_label_down)
drawStructure(pivot p_ivot, string tag, color structureColor, string lineStyle, string labelStyle, string labelSize) =>
var line l_ine = line.new(na,na,na,na,xloc = xloc.bar_time)
var label l_abel = label.new(na,na)
if modeInput == PRESENT
l_ine.delete()
l_abel.delete()
l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time,na,p_ivot.currentLevel), xloc.bar_time, color=structureColor, style=lineStyle)
l_abel := label.new(chart.point.new(na,math.round(0.5*(p_ivot.barIndex+bar_index)),p_ivot.currentLevel), tag, xloc.bar_index, color=color(na), textcolor=structureColor, style=labelStyle, size = labelSize)
deleteOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
for in orderBlocks
bool crossedOderBlock = false
if bearishOrderBlockMitigationSource > eachOrderBlock.barHigh and eachOrderBlock.bias == BEARISH
crossedOderBlock := true
if internal
currentAlerts.internalBearishOrderBlock := true
else
currentAlerts.swingBearishOrderBlock := true
else if bullishOrderBlockMitigationSource < eachOrderBlock.barLow and eachOrderBlock.bias == BULLISH
crossedOderBlock := true
if internal
currentAlerts.internalBullishOrderBlock := true
else
currentAlerts.swingBullishOrderBlock := true
if crossedOderBlock
orderBlocks.remove(index)
storeOrdeBlock(pivot p_ivot,bool internal = false,int bias) =>
if (not internal and showSwingOrderBlocksInput) or (internal and showInternalOrderBlocksInput)
array a_rray = na
int parsedIndex = na
if bias == BEARISH
a_rray := parsedHighs.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.max())
else
a_rray := parsedLows.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.min())
orderBlock o_rderBlock = orderBlock.new(parsedHighs.get(parsedIndex), parsedLows.get(parsedIndex), times.get(parsedIndex),bias)
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
if orderBlocks.size() >= 100
orderBlocks.pop()
orderBlocks.unshift(o_rderBlock)
drawOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
orderBlocksSize = orderBlocks.size()
if orderBlocksSize > 0
maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput
array parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize))
array b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes
for in parsedOrdeBlocks
orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor)
box b_ox = b_oxes.get(index)
b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow))
b_ox.set_border_color( internal ? na : orderBlockColor)
b_ox.set_bgcolor( orderBlockColor)
displayStructure(bool internal = false) =>
var bullishBar = true
var bearishBar = true
if internalFilterConfluenceInput
bullishBar := high - math.max(close, open) > math.min(close, open - low)
bearishBar := high - math.max(close, open) < math.min(close, open - low)
pivot p_ivot = internal ? internalHigh : swingHigh
trend t_rend = internal ? internalTrend : swingTrend
lineStyle = internal ? line.style_dashed : line.style_solid
labelSize = internal ? internalStructureSize : swingStructureSize
extraCondition = internal ? internalHigh.currentLevel != swingHigh.currentLevel and bullishBar : true
bullishColor = styleInput == MONOCHROME ? MONO_BULLISH : internal ? internalBullColorInput : swingBullColorInput
if ta.crossover(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BEARISH ? CHOCH : BOS
if internal
currentAlerts.internalBullishCHoCH := tag == CHOCH
currentAlerts.internalBullishBOS := tag == BOS
else
currentAlerts.swingBullishCHoCH := tag == CHOCH
currentAlerts.swingBullishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BULLISH
displayCondition = internal ? showInternalsInput and (showInternalBullInput == ALL or (showInternalBullInput == BOS and tag != CHOCH) or (showInternalBullInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBullInput == ALL or (showSwingBullInput == BOS and tag != CHOCH) or (showSwingBullInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bullishColor,lineStyle,label.style_label_down,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BULLISH)
p_ivot := internal ? internalLow : swingLow
extraCondition := internal ? internalLow.currentLevel != swingLow.currentLevel and bearishBar : true
bearishColor = styleInput == MONOCHROME ? MONO_BEARISH : internal ? internalBearColorInput : swingBearColorInput
if ta.crossunder(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BULLISH ? CHOCH : BOS
if internal
currentAlerts.internalBearishCHoCH := tag == CHOCH
currentAlerts.internalBearishBOS := tag == BOS
else
currentAlerts.swingBearishCHoCH := tag == CHOCH
currentAlerts.swingBearishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BEARISH
displayCondition = internal ? showInternalsInput and (showInternalBearInput == ALL or (showInternalBearInput == BOS and tag != CHOCH) or (showInternalBearInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBearInput == ALL or (showSwingBearInput == BOS and tag != CHOCH) or (showSwingBearInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bearishColor,lineStyle,label.style_label_up,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BEARISH)
fairValueGapBox(leftTime,rightTime,topPrice,bottomPrice,boxColor) => box.new(chart.point.new(leftTime,na,topPrice),chart.point.new(rightTime + fairValueGapsExtendInput * (time-time ),na,bottomPrice), xloc=xloc.bar_time, border_color = boxColor, bgcolor = boxColor)
deleteFairValueGaps() =>
for in fairValueGaps
if (low < eachFairValueGap.bottom and eachFairValueGap.bias == BULLISH) or (high > eachFairValueGap.top and eachFairValueGap.bias == BEARISH)
eachFairValueGap.topBox.delete()
eachFairValueGap.bottomBox.delete()
fairValueGaps.remove(index)
// @function draw fair value gaps
// @returns fairValueGap ID
drawFairValueGaps() =>
= request.security(syminfo.tickerid, fairValueGapsTimeframeInput, [close , open , time , high , low , time , high , low ],lookahead = barmerge.lookahead_on)
barDeltaPercent = (lastClose - lastOpen) / (lastOpen * 100)
newTimeframe = timeframe.change(fairValueGapsTimeframeInput)
threshold = fairValueGapsThresholdInput ? ta.cum(math.abs(newTimeframe ? barDeltaPercent : 0)) / bar_index * 2 : 0
bullishFairValueGap = currentLow > last2High and lastClose > last2High and barDeltaPercent > threshold and newTimeframe
bearishFairValueGap = currentHigh < last2Low and lastClose < last2Low and -barDeltaPercent > threshold and newTimeframe
if bullishFairValueGap
currentAlerts.bullishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentLow,last2High,BULLISH,fairValueGapBox(lastTime,currentTime,currentLow,math.avg(currentLow,last2High),fairValueGapBullishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentLow,last2High),last2High,fairValueGapBullishColor)))
if bearishFairValueGap
currentAlerts.bearishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentHigh,last2Low,BEARISH,fairValueGapBox(lastTime,currentTime,currentHigh,math.avg(currentHigh,last2Low),fairValueGapBearishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentHigh,last2Low),last2Low,fairValueGapBearishColor)))
getStyle(string style) =>
switch style
SOLID => line.style_solid
DASHED => line.style_dashed
DOTTED => line.style_dotted
drawLevels(string timeframe, bool sameTimeframe, string style, color levelColor) =>
= request.security(syminfo.tickerid, timeframe, [high , low , time , time],lookahead = barmerge.lookahead_on)
float parsedTop = sameTimeframe ? high : topLevel
float parsedBottom = sameTimeframe ? low : bottomLevel
int parsedLeftTime = sameTimeframe ? time : leftTime
int parsedRightTime = sameTimeframe ? time : rightTime
int parsedTopTime = time
int parsedBottomTime = time
if not sameTimeframe
int leftIndex = times.binary_search_rightmost(parsedLeftTime)
int rightIndex = times.binary_search_rightmost(parsedRightTime)
array timeArray = times.slice(leftIndex,rightIndex)
array topArray = highs.slice(leftIndex,rightIndex)
array bottomArray = lows.slice(leftIndex,rightIndex)
parsedTopTime := timeArray.size() > 0 ? timeArray.get(topArray.indexof(topArray.max())) : initialTime
parsedBottomTime := timeArray.size() > 0 ? timeArray.get(bottomArray.indexof(bottomArray.min())) : initialTime
var line topLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var line bottomLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var label topLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}H',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
var label bottomLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}L',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
topLine.set_first_point( chart.point.new(parsedTopTime,na,parsedTop))
topLine.set_second_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
topLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
bottomLine.set_first_point( chart.point.new(parsedBottomTime,na,parsedBottom))
bottomLine.set_second_point(chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
bottomLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
higherTimeframe(string timeframe) => timeframe.in_seconds() > timeframe.in_seconds(timeframe)
updateTrailingExtremes() =>
trailing.top := math.max(high,trailing.top)
trailing.lastTopTime := trailing.top == high ? time : trailing.lastTopTime
trailing.bottom := math.min(low,trailing.bottom)
trailing.lastBottomTime := trailing.bottom == low ? time : trailing.lastBottomTime
drawHighLowSwings() =>
var line topLine = line.new(na, na, na, na, color = swingBearishColor, xloc = xloc.bar_time)
var line bottomLine = line.new(na, na, na, na, color = swingBullishColor, xloc = xloc.bar_time)
var label topLabel = label.new(na, na, color=color(na), textcolor = swingBearishColor, xloc = xloc.bar_time, style = label.style_label_down, size = size.tiny)
var label bottomLabel = label.new(na, na, color=color(na), textcolor = swingBullishColor, xloc = xloc.bar_time, style = label.style_label_up, size = size.tiny)
rightTimeBar = last_bar_time + 20 * (time - time )
topLine.set_first_point( chart.point.new(trailing.lastTopTime, na, trailing.top))
topLine.set_second_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_text( swingTrend.bias == BEARISH ? 'Strong High' : 'Weak High')
bottomLine.set_first_point( chart.point.new(trailing.lastBottomTime, na, trailing.bottom))
bottomLine.set_second_point(chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_point( chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_text( swingTrend.bias == BULLISH ? 'Strong Low' : 'Weak Low')
drawZone(float labelLevel, int labelIndex, float top, float bottom, string tag, color zoneColor, string style) =>
var label l_abel = label.new(na,na,text = tag, color=color(na),textcolor = zoneColor, style = style, size = size.small)
var box b_ox = box.new(na,na,na,na,bgcolor = color.new(zoneColor,80),border_color = color(na), xloc = xloc.bar_time)
b_ox.set_top_left_point( chart.point.new(trailing.barTime,na,top))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,bottom))
l_abel.set_point( chart.point.new(na,labelIndex,labelLevel))
// @function draw premium/discount zones
// @returns void
drawPremiumDiscountZones() =>
drawZone(trailing.top, math.round(0.5*(trailing.barIndex + last_bar_index)), trailing.top, 0.95*trailing.top + 0.05*trailing.bottom, 'Premium', premiumZoneColor, label.style_label_down)
equilibriumLevel = math.avg(trailing.top, trailing.bottom)
drawZone(equilibriumLevel, last_bar_index, 0.525*trailing.top + 0.475*trailing.bottom, 0.525*trailing.bottom + 0.475*trailing.top, 'Equilibrium', equilibriumZoneColorInput, label.style_label_left)
drawZone(trailing.bottom, math.round(0.5*(trailing.barIndex + last_bar_index)), 0.95*trailing.bottom + 0.05*trailing.top, trailing.bottom, 'Discount', discountZoneColor, label.style_label_up)
parsedOpen = showTrendInput ? open : na
candleColor = internalTrend.bias == BULLISH ? swingBullishColor : swingBearishColor
plotcandle(parsedOpen,high,low,close,color = candleColor, wickcolor = candleColor, bordercolor = candleColor)
if showHighLowSwingsInput or showPremiumDiscountZonesInput
updateTrailingExtremes()
if showHighLowSwingsInput
drawHighLowSwings()
if showPremiumDiscountZonesInput
drawPremiumDiscountZones()
if showFairValueGapsInput
deleteFairValueGaps()
getCurrentStructure(swingsLengthInput,false)
getCurrentStructure(5,false,true)
if showEqualHighsLowsInput
getCurrentStructure(equalHighsLowsLengthInput,true)
if showInternalsInput or showInternalOrderBlocksInput or showTrendInput
displayStructure(true)
if showStructureInput or showSwingOrderBlocksInput or showHighLowSwingsInput
displayStructure()
if showInternalOrderBlocksInput
deleteOrderBlocks(true)
if showSwingOrderBlocksInput
deleteOrderBlocks()
if showFairValueGapsInput
drawFairValueGaps()
if barstate.islastconfirmedhistory or barstate.islast
if showInternalOrderBlocksInput
drawOrderBlocks(true)
if showSwingOrderBlocksInput
drawOrderBlocks()
lastBarIndex := currentBarIndex
currentBarIndex := bar_index
newBar = currentBarIndex != lastBarIndex
if barstate.islastconfirmedhistory or (barstate.isrealtime and newBar)
if showDailyLevelsInput and not higherTimeframe('D')
drawLevels('D',timeframe.isdaily,dailyLevelsStyleInput,dailyLevelsColorInput)
if showWeeklyLevelsInput and not higherTimeframe('W')
drawLevels('W',timeframe.isweekly,weeklyLevelsStyleInput,weeklyLevelsColorInput)
if showMonthlyLevelsInput and not higherTimeframe('M')
drawLevels('M',timeframe.ismonthly,monthlyLevelsStyleInput,monthlyLevelsColorInput)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = barmerge.lookahead_off) : close
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop , 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? math.min(nz(xATRTrailingStop ), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? math.max(nz(xATRTrailingStop ), src - nLoss) : iff_2
pos = 0
iff_3 = src > nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? -1 : nz(pos , 0)
pos := src < nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
//---------------------------------------------------------------------------------------------------------------------}
//ALERTS
//---------------------------------------------------------------------------------------------------------------------{
alertcondition(currentAlerts.internalBullishBOS, 'Internal Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.internalBullishCHoCH, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.internalBearishBOS, 'Internal Bearish BOS', 'Internal Bearish BOS formed')
alertcondition(currentAlerts.internalBearishCHoCH, 'Internal Bearish CHoCH', 'Internal Bearish CHoCH formed')
alertcondition(currentAlerts.swingBullishBOS, 'Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.swingBullishCHoCH, 'Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.swingBearishBOS, 'Bearish BOS', 'Bearish BOS formed')
alertcondition(currentAlerts.swingBearishCHoCH, 'Bearish CHoCH', 'Bearish CHoCH formed')
alertcondition(currentAlerts.internalBullishOrderBlock, 'Bullish Internal OB Breakout', 'Price broke bullish internal OB')
alertcondition(currentAlerts.internalBearishOrderBlock, 'Bearish Internal OB Breakout', 'Price broke bearish internal OB')
alertcondition(currentAlerts.swingBullishOrderBlock, 'Bullish Swing OB Breakout', 'Price broke bullish swing OB')
alertcondition(currentAlerts.swingBearishOrderBlock, 'Bearish Swing OB Breakout', 'Price broke bearish swing OB')
alertcondition(currentAlerts.equalHighs, 'Equal Highs', 'Equal highs detected')
alertcondition(currentAlerts.equalLows, 'Equal Lows', 'Equal lows detected')
alertcondition(currentAlerts.bullishFairValueGap, 'Bullish FVG', 'Bullish FVG formed')
alertcondition(currentAlerts.bearishFairValueGap, 'Bearish FVG', 'Bearish FVG formed')
alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')
plotshape(buy, title = 'Buy', text = 'Buy', style = shape.labelup, location = location.belowbar, color = color.new(color.green, 0), textcolor = color.new(color.white, 0), size = size.tiny)
plotshape(sell, title = 'Sell', text = 'Sell', style = shape.labeldown, location = location.abovebar, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), size = size.tiny)
//--------------------------------------------------------------------------------------
// EMA ADDITIONS (Editable)
//--------------------------------------------------------------------------------------
ema5Len = input.int(5, "5 EMA Length", minval = 1)
ema9Len = input.int(9, "9 EMA Length", minval = 1)
ema5 = ta.ema(src, ema5Len)
ema9 = ta.ema(src, ema9Len)
plot(ema5, "EMA 5", color = color.red, linewidth = 2)
plot(ema9, "EMA 9", color = color.blue, linewidth = 2)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
Naveen Prabhu with EMA//@version=6
indicator('Naveen Prabhu with EMA', overlay = true, max_labels_count = 500, max_lines_count = 500, max_boxes_count = 500)
a = input(2, title = 'Key Vaule. \'This changes the sensitivity\'')
c = input(5, title = 'ATR Period')
h = input(false, title = 'Signals from Heikin Ashi Candles')
BULLISH_LEG = 1
BEARISH_LEG = 0
BULLISH = +1
BEARISH = -1
GREEN = #089981
RED = #F23645
BLUE = #2157f3
GRAY = #878b94
MONO_BULLISH = #b2b5be
MONO_BEARISH = #5d606b
HISTORICAL = 'Historical'
PRESENT = 'Present'
COLORED = 'Colored'
MONOCHROME = 'Monochrome'
ALL = 'All'
BOS = 'BOS'
CHOCH = 'CHoCH'
TINY = size.tiny
SMALL = size.small
NORMAL = size.normal
ATR = 'Atr'
RANGE = 'Cumulative Mean Range'
CLOSE = 'Close'
HIGHLOW = 'High/Low'
SOLID = '⎯⎯⎯'
DASHED = '----'
DOTTED = '····'
SMART_GROUP = 'Smart Money Concepts'
INTERNAL_GROUP = 'Real Time Internal Structure'
SWING_GROUP = 'Real Time Swing Structure'
BLOCKS_GROUP = 'Order Blocks'
EQUAL_GROUP = 'EQH/EQL'
GAPS_GROUP = 'Fair Value Gaps'
LEVELS_GROUP = 'Highs & Lows MTF'
ZONES_GROUP = 'Premium & Discount Zones'
modeTooltip = 'Allows to display historical Structure or only the recent ones'
styleTooltip = 'Indicator color theme'
showTrendTooltip = 'Display additional candles with a color reflecting the current trend detected by structure'
showInternalsTooltip = 'Display internal market structure'
internalFilterConfluenceTooltip = 'Filter non significant internal structure breakouts'
showStructureTooltip = 'Display swing market Structure'
showSwingsTooltip = 'Display swing point as labels on the chart'
showHighLowSwingsTooltip = 'Highlight most recent strong and weak high/low points on the chart'
showInternalOrderBlocksTooltip = 'Display internal order blocks on the chart\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt is recommended to use the cumulative mean range method when a low amount of data is available'
orderBlockMitigationTooltip = 'Select what values to use for order block mitigation'
showEqualHighsLowsTooltip = 'Display equal highs and equal lows on the chart'
equalHighsLowsLengthTooltip = 'Number of bars used to confirm equal highs and equal lows'
equalHighsLowsThresholdTooltip = 'Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows\n\nLower values will return fewer but more pertinent results'
showFairValueGapsTooltip = 'Display fair values gaps on the chart'
fairValueGapsThresholdTooltip = 'Filter out non significant fair value gaps'
fairValueGapsTimeframeTooltip = 'Fair value gaps timeframe'
fairValueGapsExtendTooltip = 'Determine how many bars to extend the Fair Value Gap boxes on chart'
showPremiumDiscountZonesTooltip = 'Display premium, discount, and equilibrium zones on chart'
modeInput = input.string( HISTORICAL, 'Mode', group = SMART_GROUP, tooltip = modeTooltip, options = )
styleInput = input.string( COLORED, 'Style', group = SMART_GROUP, tooltip = styleTooltip,options = )
showTrendInput = input( false, 'Color Candles', group = SMART_GROUP, tooltip = showTrendTooltip)
showInternalsInput = input( false, 'Show Internal Structure', group = INTERNAL_GROUP, tooltip = showInternalsTooltip)
showInternalBullInput = input.string( ALL, 'Bullish Structure', group = INTERNAL_GROUP, inline = 'ibull', options = )
internalBullColorInput = input( GREEN, '', group = INTERNAL_GROUP, inline = 'ibull')
showInternalBearInput = input.string( ALL, 'Bearish Structure' , group = INTERNAL_GROUP, inline = 'ibear', options = )
internalBearColorInput = input( RED, '', group = INTERNAL_GROUP, inline = 'ibear')
internalFilterConfluenceInput = input( false, 'Confluence Filter', group = INTERNAL_GROUP, tooltip = internalFilterConfluenceTooltip)
internalStructureSize = input.string( TINY, 'Internal Label Size', group = INTERNAL_GROUP, options = )
showStructureInput = input( false, 'Show Swing Structure', group = SWING_GROUP, tooltip = showStructureTooltip)
showSwingBullInput = input.string( ALL, 'Bullish Structure', group = SWING_GROUP, inline = 'bull', options = )
swingBullColorInput = input( GREEN, '', group = SWING_GROUP, inline = 'bull')
showSwingBearInput = input.string( ALL, 'Bearish Structure', group = SWING_GROUP, inline = 'bear', options = )
swingBearColorInput = input( RED, '', group = SWING_GROUP, inline = 'bear')
swingStructureSize = input.string( SMALL, 'Swing Label Size', group = SWING_GROUP, options = )
showSwingsInput = input( false, 'Show Swings Points', group = SWING_GROUP, tooltip = showSwingsTooltip,inline = 'swings')
swingsLengthInput = input.int( 50, '', group = SWING_GROUP, minval = 10, inline = 'swings')
showHighLowSwingsInput = input( false, 'Show Strong/Weak High/Low',group = SWING_GROUP, tooltip = showHighLowSwingsTooltip)
showInternalOrderBlocksInput = input( true, 'Internal Order Blocks' , group = BLOCKS_GROUP, tooltip = showInternalOrderBlocksTooltip, inline = 'iob')
internalOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'iob')
showSwingOrderBlocksInput = input( true, 'Swing Order Blocks', group = BLOCKS_GROUP, tooltip = showSwingOrderBlocksTooltip, inline = 'ob')
swingOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'ob')
orderBlockFilterInput = input.string( 'Atr', 'Order Block Filter', group = BLOCKS_GROUP, tooltip = orderBlockFilterTooltip, options = )
orderBlockMitigationInput = input.string( HIGHLOW, 'Order Block Mitigation', group = BLOCKS_GROUP, tooltip = orderBlockMitigationTooltip, options = )
internalBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Internal Bullish OB', group = BLOCKS_GROUP)
internalBearishOrderBlockColor = input.color(color.new(#f77c80, 80), 'Internal Bearish OB', group = BLOCKS_GROUP)
swingBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Bullish OB', group = BLOCKS_GROUP)
swingBearishOrderBlockColor = input.color(color.new(#b22833, 80), 'Bearish OB', group = BLOCKS_GROUP)
showEqualHighsLowsInput = input( false, 'Equal High/Low', group = EQUAL_GROUP, tooltip = showEqualHighsLowsTooltip)
equalHighsLowsLengthInput = input.int( 3, 'Bars Confirmation', group = EQUAL_GROUP, tooltip = equalHighsLowsLengthTooltip, minval = 1)
equalHighsLowsThresholdInput = input.float( 0.1, 'Threshold', group = EQUAL_GROUP, tooltip = equalHighsLowsThresholdTooltip, minval = 0, maxval = 0.5, step = 0.1)
equalHighsLowsSizeInput = input.string( TINY, 'Label Size', group = EQUAL_GROUP, options = )
showFairValueGapsInput = input( false, 'Fair Value Gaps', group = GAPS_GROUP, tooltip = showFairValueGapsTooltip)
fairValueGapsThresholdInput = input( true, 'Auto Threshold', group = GAPS_GROUP, tooltip = fairValueGapsThresholdTooltip)
fairValueGapsTimeframeInput = input.timeframe('', 'Timeframe', group = GAPS_GROUP, tooltip = fairValueGapsTimeframeTooltip)
fairValueGapsBullColorInput = input.color(color.new(#00ff68, 70), 'Bullish FVG' , group = GAPS_GROUP)
fairValueGapsBearColorInput = input.color(color.new(#ff0008, 70), 'Bearish FVG' , group = GAPS_GROUP)
fairValueGapsExtendInput = input.int( 1, 'Extend FVG', group = GAPS_GROUP, tooltip = fairValueGapsExtendTooltip, minval = 0)
showDailyLevelsInput = input( false, 'Daily', group = LEVELS_GROUP, inline = 'daily')
dailyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'daily', options = )
dailyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'daily')
showWeeklyLevelsInput = input( false, 'Weekly', group = LEVELS_GROUP, inline = 'weekly')
weeklyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'weekly', options = )
weeklyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'weekly')
showMonthlyLevelsInput = input( false, 'Monthly', group = LEVELS_GROUP, inline = 'monthly')
monthlyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'monthly', options = )
monthlyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'monthly')
showPremiumDiscountZonesInput = input( false, 'Premium/Discount Zones', group = ZONES_GROUP , tooltip = showPremiumDiscountZonesTooltip)
premiumZoneColorInput = input.color( RED, 'Premium Zone', group = ZONES_GROUP)
equilibriumZoneColorInput = input.color( GRAY, 'Equilibrium Zone', group = ZONES_GROUP)
discountZoneColorInput = input.color( GREEN, 'Discount Zone', group = ZONES_GROUP)
type alerts
bool internalBullishBOS = false
bool internalBearishBOS = false
bool internalBullishCHoCH = false
bool internalBearishCHoCH = false
bool swingBullishBOS = false
bool swingBearishBOS = false
bool swingBullishCHoCH = false
bool swingBearishCHoCH = false
bool internalBullishOrderBlock = false
bool internalBearishOrderBlock = false
bool swingBullishOrderBlock = false
bool swingBearishOrderBlock = false
bool equalHighs = false
bool equalLows = false
bool bullishFairValueGap = false
bool bearishFairValueGap = false
type trailingExtremes
float top
float bottom
int barTime
int barIndex
int lastTopTime
int lastBottomTime
type fairValueGap
float top
float bottom
int bias
box topBox
box bottomBox
type trend
int bias
type equalDisplay
line l_ine = na
label l_abel = na
type pivot
float currentLevel
float lastLevel
bool crossed
int barTime = time
int barIndex = bar_index
type orderBlock
float barHigh
float barLow
int barTime
int bias
// @variable current swing pivot high
var pivot swingHigh = pivot.new(na,na,false)
// @variable current swing pivot low
var pivot swingLow = pivot.new(na,na,false)
// @variable current internal pivot high
var pivot internalHigh = pivot.new(na,na,false)
// @variable current internal pivot low
var pivot internalLow = pivot.new(na,na,false)
// @variable current equal high pivot
var pivot equalHigh = pivot.new(na,na,false)
// @variable current equal low pivot
var pivot equalLow = pivot.new(na,na,false)
// @variable swing trend bias
var trend swingTrend = trend.new(0)
// @variable internal trend bias
var trend internalTrend = trend.new(0)
// @variable equal high display
var equalDisplay equalHighDisplay = equalDisplay.new()
// @variable equal low display
var equalDisplay equalLowDisplay = equalDisplay.new()
// @variable storage for fairValueGap UDTs
var array fairValueGaps = array.new()
// @variable storage for parsed highs
var array parsedHighs = array.new()
// @variable storage for parsed lows
var array parsedLows = array.new()
// @variable storage for raw highs
var array highs = array.new()
// @variable storage for raw lows
var array lows = array.new()
// @variable storage for bar time values
var array times = array.new()
// @variable last trailing swing high and low
var trailingExtremes trailing = trailingExtremes.new()
// @variable storage for orderBlock UDTs (swing order blocks)
var array swingOrderBlocks = array.new()
// @variable storage for orderBlock UDTs (internal order blocks)
var array internalOrderBlocks = array.new()
// @variable storage for swing order blocks boxes
var array swingOrderBlocksBoxes = array.new()
// @variable storage for internal order blocks boxes
var array internalOrderBlocksBoxes = array.new()
// @variable color for swing bullish structures
var swingBullishColor = styleInput == MONOCHROME ? MONO_BULLISH : swingBullColorInput
// @variable color for swing bearish structures
var swingBearishColor = styleInput == MONOCHROME ? MONO_BEARISH : swingBearColorInput
// @variable color for bullish fair value gaps
var fairValueGapBullishColor = styleInput == MONOCHROME ? color.new(MONO_BULLISH,70) : fairValueGapsBullColorInput
// @variable color for bearish fair value gaps
var fairValueGapBearishColor = styleInput == MONOCHROME ? color.new(MONO_BEARISH,70) : fairValueGapsBearColorInput
// @variable color for premium zone
var premiumZoneColor = styleInput == MONOCHROME ? MONO_BEARISH : premiumZoneColorInput
// @variable color for discount zone
var discountZoneColor = styleInput == MONOCHROME ? MONO_BULLISH : discountZoneColorInput
// @variable bar index on current script iteration
varip int currentBarIndex = bar_index
// @variable bar index on last script iteration
varip int lastBarIndex = bar_index
// @variable alerts in current bar
alerts currentAlerts = alerts.new()
// @variable time at start of chart
var initialTime = time
// we create the needed boxes for displaying order blocks at the first execution
if barstate.isfirst
if showSwingOrderBlocksInput
for index = 1 to swingOrderBlocksSizeInput
swingOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
if showInternalOrderBlocksInput
for index = 1 to internalOrderBlocksSizeInput
internalOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
// @variable source to use in bearish order blocks mitigation
bearishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : high
// @variable source to use in bullish order blocks mitigation
bullishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : low
// @variable default volatility measure
atrMeasure = ta.atr(200)
// @variable parsed volatility measure by user settings
volatilityMeasure = orderBlockFilterInput == ATR ? atrMeasure : ta.cum(ta.tr)/bar_index
// @variable true if current bar is a high volatility bar
highVolatilityBar = (high - low) >= (2 * volatilityMeasure)
// @variable parsed high
parsedHigh = highVolatilityBar ? low : high
// @variable parsed low
parsedLow = highVolatilityBar ? high : low
// we store current values into the arrays at each bar
parsedHighs.push(parsedHigh)
parsedLows.push(parsedLow)
highs.push(high)
lows.push(low)
times.push(time)
leg(int size) =>
var leg = 0
newLegHigh = high > ta.highest( size)
newLegLow = low < ta.lowest( size)
if newLegHigh
leg := BEARISH_LEG
else if newLegLow
leg := BULLISH_LEG
leg
startOfNewLeg(int leg) => ta.change(leg) != 0
startOfBearishLeg(int leg) => ta.change(leg) == -1
startOfBullishLeg(int leg) => ta.change(leg) == +1
drawLabel(int labelTime, float labelPrice, string tag, color labelColor, string labelStyle) =>
var label l_abel = na
if modeInput == PRESENT
l_abel.delete()
l_abel := label.new(chart.point.new(labelTime,na,labelPrice),tag,xloc.bar_time,color=color(na),textcolor=labelColor,style = labelStyle,size = size.small)
drawEqualHighLow(pivot p_ivot, float level, int size, bool equalHigh) =>
equalDisplay e_qualDisplay = equalHigh ? equalHighDisplay : equalLowDisplay
string tag = 'EQL'
color equalColor = swingBullishColor
string labelStyle = label.style_label_up
if equalHigh
tag := 'EQH'
equalColor := swingBearishColor
labelStyle := label.style_label_down
if modeInput == PRESENT
line.delete( e_qualDisplay.l_ine)
label.delete( e_qualDisplay.l_abel)
e_qualDisplay.l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time ,na,level), xloc = xloc.bar_time, color = equalColor, style = line.style_dotted)
labelPosition = math.round(0.5*(p_ivot.barIndex + bar_index - size))
e_qualDisplay.l_abel := label.new(chart.point.new(na,labelPosition,level), tag, xloc.bar_index, color = color(na), textcolor = equalColor, style = labelStyle, size = equalHighsLowsSizeInput)
getCurrentStructure(int size,bool equalHighLow = false, bool internal = false) =>
currentLeg = leg(size)
newPivot = startOfNewLeg(currentLeg)
pivotLow = startOfBullishLeg(currentLeg)
pivotHigh = startOfBearishLeg(currentLeg)
if newPivot
if pivotLow
pivot p_ivot = equalHighLow ? equalLow : internal ? internalLow : swingLow
if equalHighLow and math.abs(p_ivot.currentLevel - low ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot, low , size, false)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := low
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.bottom := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastBottomTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel < p_ivot.lastLevel ? 'LL' : 'HL', swingBullishColor, label.style_label_up)
else
pivot p_ivot = equalHighLow ? equalHigh : internal ? internalHigh : swingHigh
if equalHighLow and math.abs(p_ivot.currentLevel - high ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot,high ,size,true)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := high
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.top := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastTopTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel > p_ivot.lastLevel ? 'HH' : 'LH', swingBearishColor, label.style_label_down)
drawStructure(pivot p_ivot, string tag, color structureColor, string lineStyle, string labelStyle, string labelSize) =>
var line l_ine = line.new(na,na,na,na,xloc = xloc.bar_time)
var label l_abel = label.new(na,na)
if modeInput == PRESENT
l_ine.delete()
l_abel.delete()
l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time,na,p_ivot.currentLevel), xloc.bar_time, color=structureColor, style=lineStyle)
l_abel := label.new(chart.point.new(na,math.round(0.5*(p_ivot.barIndex+bar_index)),p_ivot.currentLevel), tag, xloc.bar_index, color=color(na), textcolor=structureColor, style=labelStyle, size = labelSize)
deleteOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
for in orderBlocks
bool crossedOderBlock = false
if bearishOrderBlockMitigationSource > eachOrderBlock.barHigh and eachOrderBlock.bias == BEARISH
crossedOderBlock := true
if internal
currentAlerts.internalBearishOrderBlock := true
else
currentAlerts.swingBearishOrderBlock := true
else if bullishOrderBlockMitigationSource < eachOrderBlock.barLow and eachOrderBlock.bias == BULLISH
crossedOderBlock := true
if internal
currentAlerts.internalBullishOrderBlock := true
else
currentAlerts.swingBullishOrderBlock := true
if crossedOderBlock
orderBlocks.remove(index)
storeOrdeBlock(pivot p_ivot,bool internal = false,int bias) =>
if (not internal and showSwingOrderBlocksInput) or (internal and showInternalOrderBlocksInput)
array a_rray = na
int parsedIndex = na
if bias == BEARISH
a_rray := parsedHighs.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.max())
else
a_rray := parsedLows.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.min())
orderBlock o_rderBlock = orderBlock.new(parsedHighs.get(parsedIndex), parsedLows.get(parsedIndex), times.get(parsedIndex),bias)
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
if orderBlocks.size() >= 100
orderBlocks.pop()
orderBlocks.unshift(o_rderBlock)
drawOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
orderBlocksSize = orderBlocks.size()
if orderBlocksSize > 0
maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput
array parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize))
array b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes
for in parsedOrdeBlocks
orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor)
box b_ox = b_oxes.get(index)
b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow))
b_ox.set_border_color( internal ? na : orderBlockColor)
b_ox.set_bgcolor( orderBlockColor)
displayStructure(bool internal = false) =>
var bullishBar = true
var bearishBar = true
if internalFilterConfluenceInput
bullishBar := high - math.max(close, open) > math.min(close, open - low)
bearishBar := high - math.max(close, open) < math.min(close, open - low)
pivot p_ivot = internal ? internalHigh : swingHigh
trend t_rend = internal ? internalTrend : swingTrend
lineStyle = internal ? line.style_dashed : line.style_solid
labelSize = internal ? internalStructureSize : swingStructureSize
extraCondition = internal ? internalHigh.currentLevel != swingHigh.currentLevel and bullishBar : true
bullishColor = styleInput == MONOCHROME ? MONO_BULLISH : internal ? internalBullColorInput : swingBullColorInput
if ta.crossover(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BEARISH ? CHOCH : BOS
if internal
currentAlerts.internalBullishCHoCH := tag == CHOCH
currentAlerts.internalBullishBOS := tag == BOS
else
currentAlerts.swingBullishCHoCH := tag == CHOCH
currentAlerts.swingBullishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BULLISH
displayCondition = internal ? showInternalsInput and (showInternalBullInput == ALL or (showInternalBullInput == BOS and tag != CHOCH) or (showInternalBullInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBullInput == ALL or (showSwingBullInput == BOS and tag != CHOCH) or (showSwingBullInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bullishColor,lineStyle,label.style_label_down,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BULLISH)
p_ivot := internal ? internalLow : swingLow
extraCondition := internal ? internalLow.currentLevel != swingLow.currentLevel and bearishBar : true
bearishColor = styleInput == MONOCHROME ? MONO_BEARISH : internal ? internalBearColorInput : swingBearColorInput
if ta.crossunder(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BULLISH ? CHOCH : BOS
if internal
currentAlerts.internalBearishCHoCH := tag == CHOCH
currentAlerts.internalBearishBOS := tag == BOS
else
currentAlerts.swingBearishCHoCH := tag == CHOCH
currentAlerts.swingBearishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BEARISH
displayCondition = internal ? showInternalsInput and (showInternalBearInput == ALL or (showInternalBearInput == BOS and tag != CHOCH) or (showInternalBearInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBearInput == ALL or (showSwingBearInput == BOS and tag != CHOCH) or (showSwingBearInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bearishColor,lineStyle,label.style_label_up,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BEARISH)
fairValueGapBox(leftTime,rightTime,topPrice,bottomPrice,boxColor) => box.new(chart.point.new(leftTime,na,topPrice),chart.point.new(rightTime + fairValueGapsExtendInput * (time-time ),na,bottomPrice), xloc=xloc.bar_time, border_color = boxColor, bgcolor = boxColor)
deleteFairValueGaps() =>
for in fairValueGaps
if (low < eachFairValueGap.bottom and eachFairValueGap.bias == BULLISH) or (high > eachFairValueGap.top and eachFairValueGap.bias == BEARISH)
eachFairValueGap.topBox.delete()
eachFairValueGap.bottomBox.delete()
fairValueGaps.remove(index)
// @function draw fair value gaps
// @returns fairValueGap ID
drawFairValueGaps() =>
= request.security(syminfo.tickerid, fairValueGapsTimeframeInput, [close , open , time , high , low , time , high , low ],lookahead = barmerge.lookahead_on)
barDeltaPercent = (lastClose - lastOpen) / (lastOpen * 100)
newTimeframe = timeframe.change(fairValueGapsTimeframeInput)
threshold = fairValueGapsThresholdInput ? ta.cum(math.abs(newTimeframe ? barDeltaPercent : 0)) / bar_index * 2 : 0
bullishFairValueGap = currentLow > last2High and lastClose > last2High and barDeltaPercent > threshold and newTimeframe
bearishFairValueGap = currentHigh < last2Low and lastClose < last2Low and -barDeltaPercent > threshold and newTimeframe
if bullishFairValueGap
currentAlerts.bullishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentLow,last2High,BULLISH,fairValueGapBox(lastTime,currentTime,currentLow,math.avg(currentLow,last2High),fairValueGapBullishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentLow,last2High),last2High,fairValueGapBullishColor)))
if bearishFairValueGap
currentAlerts.bearishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentHigh,last2Low,BEARISH,fairValueGapBox(lastTime,currentTime,currentHigh,math.avg(currentHigh,last2Low),fairValueGapBearishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentHigh,last2Low),last2Low,fairValueGapBearishColor)))
getStyle(string style) =>
switch style
SOLID => line.style_solid
DASHED => line.style_dashed
DOTTED => line.style_dotted
drawLevels(string timeframe, bool sameTimeframe, string style, color levelColor) =>
= request.security(syminfo.tickerid, timeframe, [high , low , time , time],lookahead = barmerge.lookahead_on)
float parsedTop = sameTimeframe ? high : topLevel
float parsedBottom = sameTimeframe ? low : bottomLevel
int parsedLeftTime = sameTimeframe ? time : leftTime
int parsedRightTime = sameTimeframe ? time : rightTime
int parsedTopTime = time
int parsedBottomTime = time
if not sameTimeframe
int leftIndex = times.binary_search_rightmost(parsedLeftTime)
int rightIndex = times.binary_search_rightmost(parsedRightTime)
array timeArray = times.slice(leftIndex,rightIndex)
array topArray = highs.slice(leftIndex,rightIndex)
array bottomArray = lows.slice(leftIndex,rightIndex)
parsedTopTime := timeArray.size() > 0 ? timeArray.get(topArray.indexof(topArray.max())) : initialTime
parsedBottomTime := timeArray.size() > 0 ? timeArray.get(bottomArray.indexof(bottomArray.min())) : initialTime
var line topLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var line bottomLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var label topLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}H',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
var label bottomLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}L',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
topLine.set_first_point( chart.point.new(parsedTopTime,na,parsedTop))
topLine.set_second_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
topLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
bottomLine.set_first_point( chart.point.new(parsedBottomTime,na,parsedBottom))
bottomLine.set_second_point(chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
bottomLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
higherTimeframe(string timeframe) => timeframe.in_seconds() > timeframe.in_seconds(timeframe)
updateTrailingExtremes() =>
trailing.top := math.max(high,trailing.top)
trailing.lastTopTime := trailing.top == high ? time : trailing.lastTopTime
trailing.bottom := math.min(low,trailing.bottom)
trailing.lastBottomTime := trailing.bottom == low ? time : trailing.lastBottomTime
drawHighLowSwings() =>
var line topLine = line.new(na, na, na, na, color = swingBearishColor, xloc = xloc.bar_time)
var line bottomLine = line.new(na, na, na, na, color = swingBullishColor, xloc = xloc.bar_time)
var label topLabel = label.new(na, na, color=color(na), textcolor = swingBearishColor, xloc = xloc.bar_time, style = label.style_label_down, size = size.tiny)
var label bottomLabel = label.new(na, na, color=color(na), textcolor = swingBullishColor, xloc = xloc.bar_time, style = label.style_label_up, size = size.tiny)
rightTimeBar = last_bar_time + 20 * (time - time )
topLine.set_first_point( chart.point.new(trailing.lastTopTime, na, trailing.top))
topLine.set_second_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_text( swingTrend.bias == BEARISH ? 'Strong High' : 'Weak High')
bottomLine.set_first_point( chart.point.new(trailing.lastBottomTime, na, trailing.bottom))
bottomLine.set_second_point(chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_point( chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_text( swingTrend.bias == BULLISH ? 'Strong Low' : 'Weak Low')
drawZone(float labelLevel, int labelIndex, float top, float bottom, string tag, color zoneColor, string style) =>
var label l_abel = label.new(na,na,text = tag, color=color(na),textcolor = zoneColor, style = style, size = size.small)
var box b_ox = box.new(na,na,na,na,bgcolor = color.new(zoneColor,80),border_color = color(na), xloc = xloc.bar_time)
b_ox.set_top_left_point( chart.point.new(trailing.barTime,na,top))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,bottom))
l_abel.set_point( chart.point.new(na,labelIndex,labelLevel))
// @function draw premium/discount zones
// @returns void
drawPremiumDiscountZones() =>
drawZone(trailing.top, math.round(0.5*(trailing.barIndex + last_bar_index)), trailing.top, 0.95*trailing.top + 0.05*trailing.bottom, 'Premium', premiumZoneColor, label.style_label_down)
equilibriumLevel = math.avg(trailing.top, trailing.bottom)
drawZone(equilibriumLevel, last_bar_index, 0.525*trailing.top + 0.475*trailing.bottom, 0.525*trailing.bottom + 0.475*trailing.top, 'Equilibrium', equilibriumZoneColorInput, label.style_label_left)
drawZone(trailing.bottom, math.round(0.5*(trailing.barIndex + last_bar_index)), 0.95*trailing.bottom + 0.05*trailing.top, trailing.bottom, 'Discount', discountZoneColor, label.style_label_up)
parsedOpen = showTrendInput ? open : na
candleColor = internalTrend.bias == BULLISH ? swingBullishColor : swingBearishColor
plotcandle(parsedOpen,high,low,close,color = candleColor, wickcolor = candleColor, bordercolor = candleColor)
if showHighLowSwingsInput or showPremiumDiscountZonesInput
updateTrailingExtremes()
if showHighLowSwingsInput
drawHighLowSwings()
if showPremiumDiscountZonesInput
drawPremiumDiscountZones()
if showFairValueGapsInput
deleteFairValueGaps()
getCurrentStructure(swingsLengthInput,false)
getCurrentStructure(5,false,true)
if showEqualHighsLowsInput
getCurrentStructure(equalHighsLowsLengthInput,true)
if showInternalsInput or showInternalOrderBlocksInput or showTrendInput
displayStructure(true)
if showStructureInput or showSwingOrderBlocksInput or showHighLowSwingsInput
displayStructure()
if showInternalOrderBlocksInput
deleteOrderBlocks(true)
if showSwingOrderBlocksInput
deleteOrderBlocks()
if showFairValueGapsInput
drawFairValueGaps()
if barstate.islastconfirmedhistory or barstate.islast
if showInternalOrderBlocksInput
drawOrderBlocks(true)
if showSwingOrderBlocksInput
drawOrderBlocks()
lastBarIndex := currentBarIndex
currentBarIndex := bar_index
newBar = currentBarIndex != lastBarIndex
if barstate.islastconfirmedhistory or (barstate.isrealtime and newBar)
if showDailyLevelsInput and not higherTimeframe('D')
drawLevels('D',timeframe.isdaily,dailyLevelsStyleInput,dailyLevelsColorInput)
if showWeeklyLevelsInput and not higherTimeframe('W')
drawLevels('W',timeframe.isweekly,weeklyLevelsStyleInput,weeklyLevelsColorInput)
if showMonthlyLevelsInput and not higherTimeframe('M')
drawLevels('M',timeframe.ismonthly,monthlyLevelsStyleInput,monthlyLevelsColorInput)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = barmerge.lookahead_off) : close
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop , 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? math.min(nz(xATRTrailingStop ), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? math.max(nz(xATRTrailingStop ), src - nLoss) : iff_2
pos = 0
iff_3 = src > nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? -1 : nz(pos , 0)
pos := src < nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
//---------------------------------------------------------------------------------------------------------------------}
//ALERTS
//---------------------------------------------------------------------------------------------------------------------{
alertcondition(currentAlerts.internalBullishBOS, 'Internal Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.internalBullishCHoCH, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.internalBearishBOS, 'Internal Bearish BOS', 'Internal Bearish BOS formed')
alertcondition(currentAlerts.internalBearishCHoCH, 'Internal Bearish CHoCH', 'Internal Bearish CHoCH formed')
alertcondition(currentAlerts.swingBullishBOS, 'Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.swingBullishCHoCH, 'Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.swingBearishBOS, 'Bearish BOS', 'Bearish BOS formed')
alertcondition(currentAlerts.swingBearishCHoCH, 'Bearish CHoCH', 'Bearish CHoCH formed')
alertcondition(currentAlerts.internalBullishOrderBlock, 'Bullish Internal OB Breakout', 'Price broke bullish internal OB')
alertcondition(currentAlerts.internalBearishOrderBlock, 'Bearish Internal OB Breakout', 'Price broke bearish internal OB')
alertcondition(currentAlerts.swingBullishOrderBlock, 'Bullish Swing OB Breakout', 'Price broke bullish swing OB')
alertcondition(currentAlerts.swingBearishOrderBlock, 'Bearish Swing OB Breakout', 'Price broke bearish swing OB')
alertcondition(currentAlerts.equalHighs, 'Equal Highs', 'Equal highs detected')
alertcondition(currentAlerts.equalLows, 'Equal Lows', 'Equal lows detected')
alertcondition(currentAlerts.bullishFairValueGap, 'Bullish FVG', 'Bullish FVG formed')
alertcondition(currentAlerts.bearishFairValueGap, 'Bearish FVG', 'Bearish FVG formed')
alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')
plotshape(buy, title = 'Buy', text = 'Buy', style = shape.labelup, location = location.belowbar, color = color.new(color.green, 0), textcolor = color.new(color.white, 0), size = size.tiny)
plotshape(sell, title = 'Sell', text = 'Sell', style = shape.labeldown, location = location.abovebar, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), size = size.tiny)
//--------------------------------------------------------------------------------------
// EMA ADDITIONS (Editable)
//--------------------------------------------------------------------------------------
ema5Len = input.int(5, "5 EMA Length", minval = 1)
ema9Len = input.int(9, "9 EMA Length", minval = 1)
ema5 = ta.ema(src, ema5Len)
ema9 = ta.ema(src, ema9Len)
plot(ema5, "EMA 5", color = color.red, linewidth = 2)
plot(ema9, "EMA 9", color = color.blue, linewidth = 2)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
Naveen Prabhu with EMA//@version=6
indicator('Naveen Prabhu with EMA', overlay = true, max_labels_count = 500, max_lines_count = 500, max_boxes_count = 500)
a = input(2, title = 'Key Vaule. \'This changes the sensitivity\'')
c = input(5, title = 'ATR Period')
h = input(false, title = 'Signals from Heikin Ashi Candles')
BULLISH_LEG = 1
BEARISH_LEG = 0
BULLISH = +1
BEARISH = -1
GREEN = #089981
RED = #F23645
BLUE = #2157f3
GRAY = #878b94
MONO_BULLISH = #b2b5be
MONO_BEARISH = #5d606b
HISTORICAL = 'Historical'
PRESENT = 'Present'
COLORED = 'Colored'
MONOCHROME = 'Monochrome'
ALL = 'All'
BOS = 'BOS'
CHOCH = 'CHoCH'
TINY = size.tiny
SMALL = size.small
NORMAL = size.normal
ATR = 'Atr'
RANGE = 'Cumulative Mean Range'
CLOSE = 'Close'
HIGHLOW = 'High/Low'
SOLID = '⎯⎯⎯'
DASHED = '----'
DOTTED = '····'
SMART_GROUP = 'Smart Money Concepts'
INTERNAL_GROUP = 'Real Time Internal Structure'
SWING_GROUP = 'Real Time Swing Structure'
BLOCKS_GROUP = 'Order Blocks'
EQUAL_GROUP = 'EQH/EQL'
GAPS_GROUP = 'Fair Value Gaps'
LEVELS_GROUP = 'Highs & Lows MTF'
ZONES_GROUP = 'Premium & Discount Zones'
modeTooltip = 'Allows to display historical Structure or only the recent ones'
styleTooltip = 'Indicator color theme'
showTrendTooltip = 'Display additional candles with a color reflecting the current trend detected by structure'
showInternalsTooltip = 'Display internal market structure'
internalFilterConfluenceTooltip = 'Filter non significant internal structure breakouts'
showStructureTooltip = 'Display swing market Structure'
showSwingsTooltip = 'Display swing point as labels on the chart'
showHighLowSwingsTooltip = 'Highlight most recent strong and weak high/low points on the chart'
showInternalOrderBlocksTooltip = 'Display internal order blocks on the chart\n\nNumber of internal order blocks to display on the chart'
showSwingOrderBlocksTooltip = 'Display swing order blocks on the chart\n\nNumber of internal swing blocks to display on the chart'
orderBlockFilterTooltip = 'Method used to filter out volatile order blocks \n\nIt is recommended to use the cumulative mean range method when a low amount of data is available'
orderBlockMitigationTooltip = 'Select what values to use for order block mitigation'
showEqualHighsLowsTooltip = 'Display equal highs and equal lows on the chart'
equalHighsLowsLengthTooltip = 'Number of bars used to confirm equal highs and equal lows'
equalHighsLowsThresholdTooltip = 'Sensitivity threshold in a range (0, 1) used for the detection of equal highs & lows\n\nLower values will return fewer but more pertinent results'
showFairValueGapsTooltip = 'Display fair values gaps on the chart'
fairValueGapsThresholdTooltip = 'Filter out non significant fair value gaps'
fairValueGapsTimeframeTooltip = 'Fair value gaps timeframe'
fairValueGapsExtendTooltip = 'Determine how many bars to extend the Fair Value Gap boxes on chart'
showPremiumDiscountZonesTooltip = 'Display premium, discount, and equilibrium zones on chart'
modeInput = input.string( HISTORICAL, 'Mode', group = SMART_GROUP, tooltip = modeTooltip, options = )
styleInput = input.string( COLORED, 'Style', group = SMART_GROUP, tooltip = styleTooltip,options = )
showTrendInput = input( false, 'Color Candles', group = SMART_GROUP, tooltip = showTrendTooltip)
showInternalsInput = input( false, 'Show Internal Structure', group = INTERNAL_GROUP, tooltip = showInternalsTooltip)
showInternalBullInput = input.string( ALL, 'Bullish Structure', group = INTERNAL_GROUP, inline = 'ibull', options = )
internalBullColorInput = input( GREEN, '', group = INTERNAL_GROUP, inline = 'ibull')
showInternalBearInput = input.string( ALL, 'Bearish Structure' , group = INTERNAL_GROUP, inline = 'ibear', options = )
internalBearColorInput = input( RED, '', group = INTERNAL_GROUP, inline = 'ibear')
internalFilterConfluenceInput = input( false, 'Confluence Filter', group = INTERNAL_GROUP, tooltip = internalFilterConfluenceTooltip)
internalStructureSize = input.string( TINY, 'Internal Label Size', group = INTERNAL_GROUP, options = )
showStructureInput = input( false, 'Show Swing Structure', group = SWING_GROUP, tooltip = showStructureTooltip)
showSwingBullInput = input.string( ALL, 'Bullish Structure', group = SWING_GROUP, inline = 'bull', options = )
swingBullColorInput = input( GREEN, '', group = SWING_GROUP, inline = 'bull')
showSwingBearInput = input.string( ALL, 'Bearish Structure', group = SWING_GROUP, inline = 'bear', options = )
swingBearColorInput = input( RED, '', group = SWING_GROUP, inline = 'bear')
swingStructureSize = input.string( SMALL, 'Swing Label Size', group = SWING_GROUP, options = )
showSwingsInput = input( false, 'Show Swings Points', group = SWING_GROUP, tooltip = showSwingsTooltip,inline = 'swings')
swingsLengthInput = input.int( 50, '', group = SWING_GROUP, minval = 10, inline = 'swings')
showHighLowSwingsInput = input( false, 'Show Strong/Weak High/Low',group = SWING_GROUP, tooltip = showHighLowSwingsTooltip)
showInternalOrderBlocksInput = input( true, 'Internal Order Blocks' , group = BLOCKS_GROUP, tooltip = showInternalOrderBlocksTooltip, inline = 'iob')
internalOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'iob')
showSwingOrderBlocksInput = input( true, 'Swing Order Blocks', group = BLOCKS_GROUP, tooltip = showSwingOrderBlocksTooltip, inline = 'ob')
swingOrderBlocksSizeInput = input.int( 5, '', group = BLOCKS_GROUP, minval = 1, maxval = 20, inline = 'ob')
orderBlockFilterInput = input.string( 'Atr', 'Order Block Filter', group = BLOCKS_GROUP, tooltip = orderBlockFilterTooltip, options = )
orderBlockMitigationInput = input.string( HIGHLOW, 'Order Block Mitigation', group = BLOCKS_GROUP, tooltip = orderBlockMitigationTooltip, options = )
internalBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Internal Bullish OB', group = BLOCKS_GROUP)
internalBearishOrderBlockColor = input.color(color.new(#f77c80, 80), 'Internal Bearish OB', group = BLOCKS_GROUP)
swingBullishOrderBlockColor = input.color(color.new(GREEN, 80), 'Bullish OB', group = BLOCKS_GROUP)
swingBearishOrderBlockColor = input.color(color.new(#b22833, 80), 'Bearish OB', group = BLOCKS_GROUP)
showEqualHighsLowsInput = input( false, 'Equal High/Low', group = EQUAL_GROUP, tooltip = showEqualHighsLowsTooltip)
equalHighsLowsLengthInput = input.int( 3, 'Bars Confirmation', group = EQUAL_GROUP, tooltip = equalHighsLowsLengthTooltip, minval = 1)
equalHighsLowsThresholdInput = input.float( 0.1, 'Threshold', group = EQUAL_GROUP, tooltip = equalHighsLowsThresholdTooltip, minval = 0, maxval = 0.5, step = 0.1)
equalHighsLowsSizeInput = input.string( TINY, 'Label Size', group = EQUAL_GROUP, options = )
showFairValueGapsInput = input( false, 'Fair Value Gaps', group = GAPS_GROUP, tooltip = showFairValueGapsTooltip)
fairValueGapsThresholdInput = input( true, 'Auto Threshold', group = GAPS_GROUP, tooltip = fairValueGapsThresholdTooltip)
fairValueGapsTimeframeInput = input.timeframe('', 'Timeframe', group = GAPS_GROUP, tooltip = fairValueGapsTimeframeTooltip)
fairValueGapsBullColorInput = input.color(color.new(#00ff68, 70), 'Bullish FVG' , group = GAPS_GROUP)
fairValueGapsBearColorInput = input.color(color.new(#ff0008, 70), 'Bearish FVG' , group = GAPS_GROUP)
fairValueGapsExtendInput = input.int( 1, 'Extend FVG', group = GAPS_GROUP, tooltip = fairValueGapsExtendTooltip, minval = 0)
showDailyLevelsInput = input( false, 'Daily', group = LEVELS_GROUP, inline = 'daily')
dailyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'daily', options = )
dailyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'daily')
showWeeklyLevelsInput = input( false, 'Weekly', group = LEVELS_GROUP, inline = 'weekly')
weeklyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'weekly', options = )
weeklyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'weekly')
showMonthlyLevelsInput = input( false, 'Monthly', group = LEVELS_GROUP, inline = 'monthly')
monthlyLevelsStyleInput = input.string( SOLID, '', group = LEVELS_GROUP, inline = 'monthly', options = )
monthlyLevelsColorInput = input( BLUE, '', group = LEVELS_GROUP, inline = 'monthly')
showPremiumDiscountZonesInput = input( false, 'Premium/Discount Zones', group = ZONES_GROUP , tooltip = showPremiumDiscountZonesTooltip)
premiumZoneColorInput = input.color( RED, 'Premium Zone', group = ZONES_GROUP)
equilibriumZoneColorInput = input.color( GRAY, 'Equilibrium Zone', group = ZONES_GROUP)
discountZoneColorInput = input.color( GREEN, 'Discount Zone', group = ZONES_GROUP)
type alerts
bool internalBullishBOS = false
bool internalBearishBOS = false
bool internalBullishCHoCH = false
bool internalBearishCHoCH = false
bool swingBullishBOS = false
bool swingBearishBOS = false
bool swingBullishCHoCH = false
bool swingBearishCHoCH = false
bool internalBullishOrderBlock = false
bool internalBearishOrderBlock = false
bool swingBullishOrderBlock = false
bool swingBearishOrderBlock = false
bool equalHighs = false
bool equalLows = false
bool bullishFairValueGap = false
bool bearishFairValueGap = false
type trailingExtremes
float top
float bottom
int barTime
int barIndex
int lastTopTime
int lastBottomTime
type fairValueGap
float top
float bottom
int bias
box topBox
box bottomBox
type trend
int bias
type equalDisplay
line l_ine = na
label l_abel = na
type pivot
float currentLevel
float lastLevel
bool crossed
int barTime = time
int barIndex = bar_index
type orderBlock
float barHigh
float barLow
int barTime
int bias
// @variable current swing pivot high
var pivot swingHigh = pivot.new(na,na,false)
// @variable current swing pivot low
var pivot swingLow = pivot.new(na,na,false)
// @variable current internal pivot high
var pivot internalHigh = pivot.new(na,na,false)
// @variable current internal pivot low
var pivot internalLow = pivot.new(na,na,false)
// @variable current equal high pivot
var pivot equalHigh = pivot.new(na,na,false)
// @variable current equal low pivot
var pivot equalLow = pivot.new(na,na,false)
// @variable swing trend bias
var trend swingTrend = trend.new(0)
// @variable internal trend bias
var trend internalTrend = trend.new(0)
// @variable equal high display
var equalDisplay equalHighDisplay = equalDisplay.new()
// @variable equal low display
var equalDisplay equalLowDisplay = equalDisplay.new()
// @variable storage for fairValueGap UDTs
var array fairValueGaps = array.new()
// @variable storage for parsed highs
var array parsedHighs = array.new()
// @variable storage for parsed lows
var array parsedLows = array.new()
// @variable storage for raw highs
var array highs = array.new()
// @variable storage for raw lows
var array lows = array.new()
// @variable storage for bar time values
var array times = array.new()
// @variable last trailing swing high and low
var trailingExtremes trailing = trailingExtremes.new()
// @variable storage for orderBlock UDTs (swing order blocks)
var array swingOrderBlocks = array.new()
// @variable storage for orderBlock UDTs (internal order blocks)
var array internalOrderBlocks = array.new()
// @variable storage for swing order blocks boxes
var array swingOrderBlocksBoxes = array.new()
// @variable storage for internal order blocks boxes
var array internalOrderBlocksBoxes = array.new()
// @variable color for swing bullish structures
var swingBullishColor = styleInput == MONOCHROME ? MONO_BULLISH : swingBullColorInput
// @variable color for swing bearish structures
var swingBearishColor = styleInput == MONOCHROME ? MONO_BEARISH : swingBearColorInput
// @variable color for bullish fair value gaps
var fairValueGapBullishColor = styleInput == MONOCHROME ? color.new(MONO_BULLISH,70) : fairValueGapsBullColorInput
// @variable color for bearish fair value gaps
var fairValueGapBearishColor = styleInput == MONOCHROME ? color.new(MONO_BEARISH,70) : fairValueGapsBearColorInput
// @variable color for premium zone
var premiumZoneColor = styleInput == MONOCHROME ? MONO_BEARISH : premiumZoneColorInput
// @variable color for discount zone
var discountZoneColor = styleInput == MONOCHROME ? MONO_BULLISH : discountZoneColorInput
// @variable bar index on current script iteration
varip int currentBarIndex = bar_index
// @variable bar index on last script iteration
varip int lastBarIndex = bar_index
// @variable alerts in current bar
alerts currentAlerts = alerts.new()
// @variable time at start of chart
var initialTime = time
// we create the needed boxes for displaying order blocks at the first execution
if barstate.isfirst
if showSwingOrderBlocksInput
for index = 1 to swingOrderBlocksSizeInput
swingOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
if showInternalOrderBlocksInput
for index = 1 to internalOrderBlocksSizeInput
internalOrderBlocksBoxes.push(box.new(na,na,na,na,xloc = xloc.bar_time,extend = extend.right))
// @variable source to use in bearish order blocks mitigation
bearishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : high
// @variable source to use in bullish order blocks mitigation
bullishOrderBlockMitigationSource = orderBlockMitigationInput == CLOSE ? close : low
// @variable default volatility measure
atrMeasure = ta.atr(200)
// @variable parsed volatility measure by user settings
volatilityMeasure = orderBlockFilterInput == ATR ? atrMeasure : ta.cum(ta.tr)/bar_index
// @variable true if current bar is a high volatility bar
highVolatilityBar = (high - low) >= (2 * volatilityMeasure)
// @variable parsed high
parsedHigh = highVolatilityBar ? low : high
// @variable parsed low
parsedLow = highVolatilityBar ? high : low
// we store current values into the arrays at each bar
parsedHighs.push(parsedHigh)
parsedLows.push(parsedLow)
highs.push(high)
lows.push(low)
times.push(time)
leg(int size) =>
var leg = 0
newLegHigh = high > ta.highest( size)
newLegLow = low < ta.lowest( size)
if newLegHigh
leg := BEARISH_LEG
else if newLegLow
leg := BULLISH_LEG
leg
startOfNewLeg(int leg) => ta.change(leg) != 0
startOfBearishLeg(int leg) => ta.change(leg) == -1
startOfBullishLeg(int leg) => ta.change(leg) == +1
drawLabel(int labelTime, float labelPrice, string tag, color labelColor, string labelStyle) =>
var label l_abel = na
if modeInput == PRESENT
l_abel.delete()
l_abel := label.new(chart.point.new(labelTime,na,labelPrice),tag,xloc.bar_time,color=color(na),textcolor=labelColor,style = labelStyle,size = size.small)
drawEqualHighLow(pivot p_ivot, float level, int size, bool equalHigh) =>
equalDisplay e_qualDisplay = equalHigh ? equalHighDisplay : equalLowDisplay
string tag = 'EQL'
color equalColor = swingBullishColor
string labelStyle = label.style_label_up
if equalHigh
tag := 'EQH'
equalColor := swingBearishColor
labelStyle := label.style_label_down
if modeInput == PRESENT
line.delete( e_qualDisplay.l_ine)
label.delete( e_qualDisplay.l_abel)
e_qualDisplay.l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time ,na,level), xloc = xloc.bar_time, color = equalColor, style = line.style_dotted)
labelPosition = math.round(0.5*(p_ivot.barIndex + bar_index - size))
e_qualDisplay.l_abel := label.new(chart.point.new(na,labelPosition,level), tag, xloc.bar_index, color = color(na), textcolor = equalColor, style = labelStyle, size = equalHighsLowsSizeInput)
getCurrentStructure(int size,bool equalHighLow = false, bool internal = false) =>
currentLeg = leg(size)
newPivot = startOfNewLeg(currentLeg)
pivotLow = startOfBullishLeg(currentLeg)
pivotHigh = startOfBearishLeg(currentLeg)
if newPivot
if pivotLow
pivot p_ivot = equalHighLow ? equalLow : internal ? internalLow : swingLow
if equalHighLow and math.abs(p_ivot.currentLevel - low ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot, low , size, false)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := low
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.bottom := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastBottomTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel < p_ivot.lastLevel ? 'LL' : 'HL', swingBullishColor, label.style_label_up)
else
pivot p_ivot = equalHighLow ? equalHigh : internal ? internalHigh : swingHigh
if equalHighLow and math.abs(p_ivot.currentLevel - high ) < equalHighsLowsThresholdInput * atrMeasure
drawEqualHighLow(p_ivot,high ,size,true)
p_ivot.lastLevel := p_ivot.currentLevel
p_ivot.currentLevel := high
p_ivot.crossed := false
p_ivot.barTime := time
p_ivot.barIndex := bar_index
if not equalHighLow and not internal
trailing.top := p_ivot.currentLevel
trailing.barTime := p_ivot.barTime
trailing.barIndex := p_ivot.barIndex
trailing.lastTopTime := p_ivot.barTime
if showSwingsInput and not internal and not equalHighLow
drawLabel(time , p_ivot.currentLevel, p_ivot.currentLevel > p_ivot.lastLevel ? 'HH' : 'LH', swingBearishColor, label.style_label_down)
drawStructure(pivot p_ivot, string tag, color structureColor, string lineStyle, string labelStyle, string labelSize) =>
var line l_ine = line.new(na,na,na,na,xloc = xloc.bar_time)
var label l_abel = label.new(na,na)
if modeInput == PRESENT
l_ine.delete()
l_abel.delete()
l_ine := line.new(chart.point.new(p_ivot.barTime,na,p_ivot.currentLevel), chart.point.new(time,na,p_ivot.currentLevel), xloc.bar_time, color=structureColor, style=lineStyle)
l_abel := label.new(chart.point.new(na,math.round(0.5*(p_ivot.barIndex+bar_index)),p_ivot.currentLevel), tag, xloc.bar_index, color=color(na), textcolor=structureColor, style=labelStyle, size = labelSize)
deleteOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
for in orderBlocks
bool crossedOderBlock = false
if bearishOrderBlockMitigationSource > eachOrderBlock.barHigh and eachOrderBlock.bias == BEARISH
crossedOderBlock := true
if internal
currentAlerts.internalBearishOrderBlock := true
else
currentAlerts.swingBearishOrderBlock := true
else if bullishOrderBlockMitigationSource < eachOrderBlock.barLow and eachOrderBlock.bias == BULLISH
crossedOderBlock := true
if internal
currentAlerts.internalBullishOrderBlock := true
else
currentAlerts.swingBullishOrderBlock := true
if crossedOderBlock
orderBlocks.remove(index)
storeOrdeBlock(pivot p_ivot,bool internal = false,int bias) =>
if (not internal and showSwingOrderBlocksInput) or (internal and showInternalOrderBlocksInput)
array a_rray = na
int parsedIndex = na
if bias == BEARISH
a_rray := parsedHighs.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.max())
else
a_rray := parsedLows.slice(p_ivot.barIndex,bar_index)
parsedIndex := p_ivot.barIndex + a_rray.indexof(a_rray.min())
orderBlock o_rderBlock = orderBlock.new(parsedHighs.get(parsedIndex), parsedLows.get(parsedIndex), times.get(parsedIndex),bias)
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
if orderBlocks.size() >= 100
orderBlocks.pop()
orderBlocks.unshift(o_rderBlock)
drawOrderBlocks(bool internal = false) =>
array orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks
orderBlocksSize = orderBlocks.size()
if orderBlocksSize > 0
maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput
array parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize))
array b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes
for in parsedOrdeBlocks
orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor)
box b_ox = b_oxes.get(index)
b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow))
b_ox.set_border_color( internal ? na : orderBlockColor)
b_ox.set_bgcolor( orderBlockColor)
displayStructure(bool internal = false) =>
var bullishBar = true
var bearishBar = true
if internalFilterConfluenceInput
bullishBar := high - math.max(close, open) > math.min(close, open - low)
bearishBar := high - math.max(close, open) < math.min(close, open - low)
pivot p_ivot = internal ? internalHigh : swingHigh
trend t_rend = internal ? internalTrend : swingTrend
lineStyle = internal ? line.style_dashed : line.style_solid
labelSize = internal ? internalStructureSize : swingStructureSize
extraCondition = internal ? internalHigh.currentLevel != swingHigh.currentLevel and bullishBar : true
bullishColor = styleInput == MONOCHROME ? MONO_BULLISH : internal ? internalBullColorInput : swingBullColorInput
if ta.crossover(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BEARISH ? CHOCH : BOS
if internal
currentAlerts.internalBullishCHoCH := tag == CHOCH
currentAlerts.internalBullishBOS := tag == BOS
else
currentAlerts.swingBullishCHoCH := tag == CHOCH
currentAlerts.swingBullishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BULLISH
displayCondition = internal ? showInternalsInput and (showInternalBullInput == ALL or (showInternalBullInput == BOS and tag != CHOCH) or (showInternalBullInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBullInput == ALL or (showSwingBullInput == BOS and tag != CHOCH) or (showSwingBullInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bullishColor,lineStyle,label.style_label_down,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BULLISH)
p_ivot := internal ? internalLow : swingLow
extraCondition := internal ? internalLow.currentLevel != swingLow.currentLevel and bearishBar : true
bearishColor = styleInput == MONOCHROME ? MONO_BEARISH : internal ? internalBearColorInput : swingBearColorInput
if ta.crossunder(close,p_ivot.currentLevel) and not p_ivot.crossed and extraCondition
string tag = t_rend.bias == BULLISH ? CHOCH : BOS
if internal
currentAlerts.internalBearishCHoCH := tag == CHOCH
currentAlerts.internalBearishBOS := tag == BOS
else
currentAlerts.swingBearishCHoCH := tag == CHOCH
currentAlerts.swingBearishBOS := tag == BOS
p_ivot.crossed := true
t_rend.bias := BEARISH
displayCondition = internal ? showInternalsInput and (showInternalBearInput == ALL or (showInternalBearInput == BOS and tag != CHOCH) or (showInternalBearInput == CHOCH and tag == CHOCH)) : showStructureInput and (showSwingBearInput == ALL or (showSwingBearInput == BOS and tag != CHOCH) or (showSwingBearInput == CHOCH and tag == CHOCH))
if displayCondition
drawStructure(p_ivot,tag,bearishColor,lineStyle,label.style_label_up,labelSize)
if (internal and showInternalOrderBlocksInput) or (not internal and showSwingOrderBlocksInput)
storeOrdeBlock(p_ivot,internal,BEARISH)
fairValueGapBox(leftTime,rightTime,topPrice,bottomPrice,boxColor) => box.new(chart.point.new(leftTime,na,topPrice),chart.point.new(rightTime + fairValueGapsExtendInput * (time-time ),na,bottomPrice), xloc=xloc.bar_time, border_color = boxColor, bgcolor = boxColor)
deleteFairValueGaps() =>
for in fairValueGaps
if (low < eachFairValueGap.bottom and eachFairValueGap.bias == BULLISH) or (high > eachFairValueGap.top and eachFairValueGap.bias == BEARISH)
eachFairValueGap.topBox.delete()
eachFairValueGap.bottomBox.delete()
fairValueGaps.remove(index)
// @function draw fair value gaps
// @returns fairValueGap ID
drawFairValueGaps() =>
= request.security(syminfo.tickerid, fairValueGapsTimeframeInput, [close , open , time , high , low , time , high , low ],lookahead = barmerge.lookahead_on)
barDeltaPercent = (lastClose - lastOpen) / (lastOpen * 100)
newTimeframe = timeframe.change(fairValueGapsTimeframeInput)
threshold = fairValueGapsThresholdInput ? ta.cum(math.abs(newTimeframe ? barDeltaPercent : 0)) / bar_index * 2 : 0
bullishFairValueGap = currentLow > last2High and lastClose > last2High and barDeltaPercent > threshold and newTimeframe
bearishFairValueGap = currentHigh < last2Low and lastClose < last2Low and -barDeltaPercent > threshold and newTimeframe
if bullishFairValueGap
currentAlerts.bullishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentLow,last2High,BULLISH,fairValueGapBox(lastTime,currentTime,currentLow,math.avg(currentLow,last2High),fairValueGapBullishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentLow,last2High),last2High,fairValueGapBullishColor)))
if bearishFairValueGap
currentAlerts.bearishFairValueGap := true
fairValueGaps.unshift(fairValueGap.new(currentHigh,last2Low,BEARISH,fairValueGapBox(lastTime,currentTime,currentHigh,math.avg(currentHigh,last2Low),fairValueGapBearishColor),fairValueGapBox(lastTime,currentTime,math.avg(currentHigh,last2Low),last2Low,fairValueGapBearishColor)))
getStyle(string style) =>
switch style
SOLID => line.style_solid
DASHED => line.style_dashed
DOTTED => line.style_dotted
drawLevels(string timeframe, bool sameTimeframe, string style, color levelColor) =>
= request.security(syminfo.tickerid, timeframe, [high , low , time , time],lookahead = barmerge.lookahead_on)
float parsedTop = sameTimeframe ? high : topLevel
float parsedBottom = sameTimeframe ? low : bottomLevel
int parsedLeftTime = sameTimeframe ? time : leftTime
int parsedRightTime = sameTimeframe ? time : rightTime
int parsedTopTime = time
int parsedBottomTime = time
if not sameTimeframe
int leftIndex = times.binary_search_rightmost(parsedLeftTime)
int rightIndex = times.binary_search_rightmost(parsedRightTime)
array timeArray = times.slice(leftIndex,rightIndex)
array topArray = highs.slice(leftIndex,rightIndex)
array bottomArray = lows.slice(leftIndex,rightIndex)
parsedTopTime := timeArray.size() > 0 ? timeArray.get(topArray.indexof(topArray.max())) : initialTime
parsedBottomTime := timeArray.size() > 0 ? timeArray.get(bottomArray.indexof(bottomArray.min())) : initialTime
var line topLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var line bottomLine = line.new(na, na, na, na, xloc = xloc.bar_time, color = levelColor, style = getStyle(style))
var label topLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}H',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
var label bottomLabel = label.new(na, na, xloc = xloc.bar_time, text = str.format('P{0}L',timeframe), color=color(na), textcolor = levelColor, size = size.small, style = label.style_label_left)
topLine.set_first_point( chart.point.new(parsedTopTime,na,parsedTop))
topLine.set_second_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
topLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedTop))
bottomLine.set_first_point( chart.point.new(parsedBottomTime,na,parsedBottom))
bottomLine.set_second_point(chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
bottomLabel.set_point( chart.point.new(last_bar_time + 20 * (time-time ),na,parsedBottom))
higherTimeframe(string timeframe) => timeframe.in_seconds() > timeframe.in_seconds(timeframe)
updateTrailingExtremes() =>
trailing.top := math.max(high,trailing.top)
trailing.lastTopTime := trailing.top == high ? time : trailing.lastTopTime
trailing.bottom := math.min(low,trailing.bottom)
trailing.lastBottomTime := trailing.bottom == low ? time : trailing.lastBottomTime
drawHighLowSwings() =>
var line topLine = line.new(na, na, na, na, color = swingBearishColor, xloc = xloc.bar_time)
var line bottomLine = line.new(na, na, na, na, color = swingBullishColor, xloc = xloc.bar_time)
var label topLabel = label.new(na, na, color=color(na), textcolor = swingBearishColor, xloc = xloc.bar_time, style = label.style_label_down, size = size.tiny)
var label bottomLabel = label.new(na, na, color=color(na), textcolor = swingBullishColor, xloc = xloc.bar_time, style = label.style_label_up, size = size.tiny)
rightTimeBar = last_bar_time + 20 * (time - time )
topLine.set_first_point( chart.point.new(trailing.lastTopTime, na, trailing.top))
topLine.set_second_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_point( chart.point.new(rightTimeBar, na, trailing.top))
topLabel.set_text( swingTrend.bias == BEARISH ? 'Strong High' : 'Weak High')
bottomLine.set_first_point( chart.point.new(trailing.lastBottomTime, na, trailing.bottom))
bottomLine.set_second_point(chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_point( chart.point.new(rightTimeBar, na, trailing.bottom))
bottomLabel.set_text( swingTrend.bias == BULLISH ? 'Strong Low' : 'Weak Low')
drawZone(float labelLevel, int labelIndex, float top, float bottom, string tag, color zoneColor, string style) =>
var label l_abel = label.new(na,na,text = tag, color=color(na),textcolor = zoneColor, style = style, size = size.small)
var box b_ox = box.new(na,na,na,na,bgcolor = color.new(zoneColor,80),border_color = color(na), xloc = xloc.bar_time)
b_ox.set_top_left_point( chart.point.new(trailing.barTime,na,top))
b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,bottom))
l_abel.set_point( chart.point.new(na,labelIndex,labelLevel))
// @function draw premium/discount zones
// @returns void
drawPremiumDiscountZones() =>
drawZone(trailing.top, math.round(0.5*(trailing.barIndex + last_bar_index)), trailing.top, 0.95*trailing.top + 0.05*trailing.bottom, 'Premium', premiumZoneColor, label.style_label_down)
equilibriumLevel = math.avg(trailing.top, trailing.bottom)
drawZone(equilibriumLevel, last_bar_index, 0.525*trailing.top + 0.475*trailing.bottom, 0.525*trailing.bottom + 0.475*trailing.top, 'Equilibrium', equilibriumZoneColorInput, label.style_label_left)
drawZone(trailing.bottom, math.round(0.5*(trailing.barIndex + last_bar_index)), 0.95*trailing.bottom + 0.05*trailing.top, trailing.bottom, 'Discount', discountZoneColor, label.style_label_up)
parsedOpen = showTrendInput ? open : na
candleColor = internalTrend.bias == BULLISH ? swingBullishColor : swingBearishColor
plotcandle(parsedOpen,high,low,close,color = candleColor, wickcolor = candleColor, bordercolor = candleColor)
if showHighLowSwingsInput or showPremiumDiscountZonesInput
updateTrailingExtremes()
if showHighLowSwingsInput
drawHighLowSwings()
if showPremiumDiscountZonesInput
drawPremiumDiscountZones()
if showFairValueGapsInput
deleteFairValueGaps()
getCurrentStructure(swingsLengthInput,false)
getCurrentStructure(5,false,true)
if showEqualHighsLowsInput
getCurrentStructure(equalHighsLowsLengthInput,true)
if showInternalsInput or showInternalOrderBlocksInput or showTrendInput
displayStructure(true)
if showStructureInput or showSwingOrderBlocksInput or showHighLowSwingsInput
displayStructure()
if showInternalOrderBlocksInput
deleteOrderBlocks(true)
if showSwingOrderBlocksInput
deleteOrderBlocks()
if showFairValueGapsInput
drawFairValueGaps()
if barstate.islastconfirmedhistory or barstate.islast
if showInternalOrderBlocksInput
drawOrderBlocks(true)
if showSwingOrderBlocksInput
drawOrderBlocks()
lastBarIndex := currentBarIndex
currentBarIndex := bar_index
newBar = currentBarIndex != lastBarIndex
if barstate.islastconfirmedhistory or (barstate.isrealtime and newBar)
if showDailyLevelsInput and not higherTimeframe('D')
drawLevels('D',timeframe.isdaily,dailyLevelsStyleInput,dailyLevelsColorInput)
if showWeeklyLevelsInput and not higherTimeframe('W')
drawLevels('W',timeframe.isweekly,weeklyLevelsStyleInput,weeklyLevelsColorInput)
if showMonthlyLevelsInput and not higherTimeframe('M')
drawLevels('M',timeframe.ismonthly,monthlyLevelsStyleInput,monthlyLevelsColorInput)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = barmerge.lookahead_off) : close
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop , 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? math.min(nz(xATRTrailingStop ), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? math.max(nz(xATRTrailingStop ), src - nLoss) : iff_2
pos = 0
iff_3 = src > nz(xATRTrailingStop , 0) and src < nz(xATRTrailingStop , 0) ? -1 : nz(pos , 0)
pos := src < nz(xATRTrailingStop , 0) and src > nz(xATRTrailingStop , 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
//---------------------------------------------------------------------------------------------------------------------}
//ALERTS
//---------------------------------------------------------------------------------------------------------------------{
alertcondition(currentAlerts.internalBullishBOS, 'Internal Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.internalBullishCHoCH, 'Internal Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.internalBearishBOS, 'Internal Bearish BOS', 'Internal Bearish BOS formed')
alertcondition(currentAlerts.internalBearishCHoCH, 'Internal Bearish CHoCH', 'Internal Bearish CHoCH formed')
alertcondition(currentAlerts.swingBullishBOS, 'Bullish BOS', 'Internal Bullish BOS formed')
alertcondition(currentAlerts.swingBullishCHoCH, 'Bullish CHoCH', 'Internal Bullish CHoCH formed')
alertcondition(currentAlerts.swingBearishBOS, 'Bearish BOS', 'Bearish BOS formed')
alertcondition(currentAlerts.swingBearishCHoCH, 'Bearish CHoCH', 'Bearish CHoCH formed')
alertcondition(currentAlerts.internalBullishOrderBlock, 'Bullish Internal OB Breakout', 'Price broke bullish internal OB')
alertcondition(currentAlerts.internalBearishOrderBlock, 'Bearish Internal OB Breakout', 'Price broke bearish internal OB')
alertcondition(currentAlerts.swingBullishOrderBlock, 'Bullish Swing OB Breakout', 'Price broke bullish swing OB')
alertcondition(currentAlerts.swingBearishOrderBlock, 'Bearish Swing OB Breakout', 'Price broke bearish swing OB')
alertcondition(currentAlerts.equalHighs, 'Equal Highs', 'Equal highs detected')
alertcondition(currentAlerts.equalLows, 'Equal Lows', 'Equal lows detected')
alertcondition(currentAlerts.bullishFairValueGap, 'Bullish FVG', 'Bullish FVG formed')
alertcondition(currentAlerts.bearishFairValueGap, 'Bearish FVG', 'Bearish FVG formed')
alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')
plotshape(buy, title = 'Buy', text = 'Buy', style = shape.labelup, location = location.belowbar, color = color.new(color.green, 0), textcolor = color.new(color.white, 0), size = size.tiny)
plotshape(sell, title = 'Sell', text = 'Sell', style = shape.labeldown, location = location.abovebar, color = color.new(color.red, 0), textcolor = color.new(color.white, 0), size = size.tiny)
//--------------------------------------------------------------------------------------
// EMA ADDITIONS (Editable)
//--------------------------------------------------------------------------------------
ema5Len = input.int(5, "5 EMA Length", minval = 1)
ema9Len = input.int(9, "9 EMA Length", minval = 1)
ema5 = ta.ema(src, ema5Len)
ema9 = ta.ema(src, ema9Len)
plot(ema5, "EMA 5", color = color.red, linewidth = 2)
plot(ema9, "EMA 9", color = color.blue, linewidth = 2)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
RAFA's SMC Killer LITEWhat is the SMC Killer?
The Smart Money Concepts (SMC) Killer is a trading indicator that identifies high-probability entry points using three proven strategies:
Break of Structure (BOS) - Trades when price breaks key support/resistance levels
Fair Value Gap (FVG) - Enters when price fills gaps in the market
Order Blocks (OB) - Entry from institutional order clusters (optional display)
This indicator automatically:
✅ Calculates correct entry, take-profit, and stop-loss levels for your asset
✅ Tracks win/loss statistics in real-time
✅ Works on 30+ different futures contracts
✅ Adapts tick size and point value automatically
Asset Selection
Supported Assets
The indicator supports all major futures contracts:
Equity Futures:
ES (E-mini S&P 500)
NQ (E-mini NASDAQ 100)
YM (Mini Dow Jones)
NKD (Nikkei 225)
EMD (E-mini Midcap 400)
RTY (Russell 2000)
Currency Futures:
6A (Australian Dollar)
6B (British Pound)
6C (Canadian Dollar)
6E (Euro FX)
6J (Japanese Yen)
6S (Swiss Franc)
6N (New Zealand Dollar)
Agricultural Futures:
HE (Lean Hogs)
LE (Live Cattle)
GF (Feeder Cattle)
ZC (Corn)
ZW (Wheat)
ZS (Soybeans)
ZM (Soybean Meal)
ZL (Soybean Oil)
Energy Futures:
CL (Crude Oil)
QM (Mini Crude Oil)
NG (Natural Gas)
QG (E-mini Natural Gas)
HO (Heating Oil)
RB (RBOB Gasoline)
Metal Futures:
GC (Gold)
SI (Silver)
HG (Copper)
PL (Platinum)
PA (Palladium)
QI (E-mini Silver)
QO (E-mini Gold)
Micro Futures:
MES (Micro E-mini S&P 500)
MYM (Micro E-mini Dow Jones)
MNQ (Micro E-mini NASDAQ)
M2K (Micro Russell 2000)
MGC (E-Micro Gold)
M6A (E-Micro AUD/USD)
M6E (E-Micro EUR/USD)
MCL (Micro Crude Oil)
How to Select Your Asset
Open the indicator settings (click ⚙️)
Go to ASSET SELECT section
Select Asset Category (e.g., "Metal Futures")
Enter Select Asset Symbol (e.g., "GC" for Gold)
Click OK
The indicator will automatically load the correct:
✅ Tick size
✅ Point value
✅ Risk/reward calculations
Settings Configuration
ASSET SELECT Group
Asset Category: Choose from 6 categories
Select Asset Symbol: Enter symbol (ES, GC, CL, etc.)
STRUCTURE Group
Show Swing Structure: Display swing highs/lows
Swing Length: Bars used for pivot detection (default: 5)
Build Sweep: Show sweep formations (default: ON)
What it does: Identifies the market trend and key turning points
Teal/Green bars = Uptrend
Orange/Red bars = Downtrend
FVG Group
Enable FVG Entry: Use Fair Value Gap strategy
FVG Threshold: Sensitivity filter (default: 0)
What it does: Detects gaps in price action that indicate imbalance
Lower threshold = More signals
Higher threshold = Fewer, high-quality signals
RISK Group
Show Bracket: Display entry/TP/SL lines
Units/Contracts: Number of contracts to trade (default: 6)
Stop Loss ($): Risk amount per trade (default: $250)
Target ($): Profit target per trade (default: $1,000)
Example: If you select ES with $250 stop loss:
The indicator calculates: 250 ÷ (6 contracts × $50 per point) = 0.83 points
Your stop loss line appears 0.83 points below entry
TABLE Group
Show Statistics: Display results table
Position: Table location (default: top_right)
Year: Start tracking from this year
Month: Start tracking from this month
Day: Start tracking from this day
Trading Signals
BUY Signal 🟢
When you see a green "BUY" label below a candle:
Price is breaking higher (Break of Structure)
OR price is filling a gap (Fair Value Gap)
The indicator plots three lines:
Green line = Entry price
Lime/bright green line = Take Profit level
Red line = Stop Loss level
Action: Consider entering a LONG position at market or entry price
SELL Signal 🔴
When you see a red "SELL" label above a candle:
Price is breaking lower (Break of Structure)
OR price is filling a gap (Fair Value Gap)
The indicator plots three lines:
Red line = Entry price
Magenta/pink line = Take Profit level
Orange line = Stop Loss level
Action: Consider entering a SHORT position at market or entry price
Signal Confirmation
✅ Wait for confirmation - Only trade signals on confirmed (closed) bars
✅ Check the trend - Look at candle colors (green uptrend, orange downtrend)
✅ Risk/reward ratio - TP should be at least 2x your SL risk
Risk Management
Position Sizing Example
Trading Gold (GC) with ES Settings:
Units: 6 contracts
Stop Loss: $250
Target: $1,000
Tick Size: 0.1 (automatic for GC)
Point Value: $100 per point (automatic for GC)
Risk per trade: $250
Reward per trade: $1,000
Risk/Reward Ratio: 1:4 (Excellent!)
Stop Loss Strategy
Always place your stop loss below/above the entry lines
The red/orange line shows exactly where to place SL
Never move your stop loss against the trade (unless scaling)
Use hard stops - set them immediately upon entry
Take Profit Strategy
Take profits at the lime/magenta line (TP level)
Consider taking partial profits at 50% of target
Let remaining 50% run to full target
Use trailing stops if price moves in your favor
Risk Per Trade
Formula: (Stop Loss $) ÷ (Units × Point Value)
Example for ES:
Stop Loss: $250
Units: 6
Point Value: $50
Risk per point: 250 ÷ (6 × 50) = 0.83 points
Reading the Chart
Visual Elements
Candle Colors:
🟩 Green/Teal = Uptrend (higher highs and higher lows)
🟥 Orange/Red = Downtrend (lower highs and lower lows)
Signal Labels:
BUY (Green) = Long entry opportunity
SELL (Red) = Short entry opportunity
Bracket Lines:
Entry Line (Solid) = Your entry price
TP Line (Bright color) = Take profit target
SL Line (Red/Orange) = Stop loss level
Success Markers:
✓ (Green checkmark) = Trade hit TP (WIN)
✗ (Red X) = Trade hit SL (LOSS)
Statistics Table
What Each Column Means
📊 ← Current asset being traded
├── Total: Total signals generated (buys + sells)
├── Buy: Number of buy signals
├── Sell: Number of sell signals
├── Win ✓: Trades that hit take profit
├── Loss ✗: Trades that hit stop loss
├── W%: Win rate percentage (wins ÷ total trades)
└── Asset Info: Tick size and point value
Example Reading
📊 ES
Total: 15
Buy: 8
Sell: 7
Win ✓: 10
Loss ✗: 5
W%: 66.7%
Asset Info: Tick: 0.25 | PV: $50
This means:
15 total signals since tracking started
10 wins, 5 losses
66.7% win rate (Professional level!)
Trading ES with 0.25 tick and $50 point value
Trading Examples
Example 1: Gold (GC) Long Trade
Setup:
Asset: Metal Futures → GC
Stop Loss: $150
Target: $600
Units: 2 contracts
What happens:
You see a BUY label on a green candle
Entry line at 2050.0
TP line at 2050.6 (0.6 points higher = $600 profit)
SL line at 2049.85 (0.15 points lower = $150 loss)
Risk/Reward: 1:4 ✅
Trade Result:
Price moves to 2050.6 → Label shows ✓ = WIN
Table updates: Wins increases by 1, Win% increases
Example 2: Crude Oil (CL) Short Trade
Setup:
Asset: Energy Futures → CL
Stop Loss: $500
Target: $2,000
Units: 1 contract
What happens:
You see a SELL label on a red candle
Entry line at 78.50
TP line at 77.50 (1.00 lower = $1,000 profit)
SL line at 79.00 (0.50 higher = $500 loss)
Risk/Reward: 1:2 ✅
Trade Result:
Price drops to 77.50 → Label shows ✓ = WIN
Table updates: Wins increases by 1, Win% increases
Example 3: E-mini S&P (ES) Day Trading
Setup:
Asset: Equity Futures → ES
Stop Loss: $250
Target: $1,000
Units: 6 contracts
Swap Length: 5 (default)
Enable FVG: ON
Morning Session:
See BUY at 5860.25 (swing break)
Hit TP at 5861.08 = WIN ✓
Table shows: Total 1, Buy 1, Win 1, W% 100%
See SELL at 5861.50 (FVG entry)
Hit SL at 5860.67 = LOSS ✗
Table shows: Total 2, Sell 1, Win 1, L% 50%
By end of day: 4 wins, 1 loss, 80% win rate
Troubleshooting
Issue 1: No signals appearing
Solution:
Check if both Show Bracket is ON
Check if Enable FVG Entry is ON
Try changing Swing Length (lower = more signals)
Ensure you're on a 1-hour or higher timeframe
Check chart has enough data (scroll left to see history)
Issue 2: Signals appear but no entry lines
Solution:
Confirm Show Bracket is toggled ON
Check Stop Loss ()andTarget() and Target (
)andTarget() are reasonable amounts
Ensure your Units value is not 0
Try refreshing the chart
Issue 3: Asset not recognized
Solution:
Check spelling of symbol (ES, not E-S)
Verify asset is in the supported list
Check you're in the correct category
Try closing and reopening the chart
Issue 4: Wrong stop loss/target levels
Solution:
Verify correct asset is selected
Check Units setting matches your position size
Verify Stop Loss ($) and Target ($) amounts
Look at Asset Info in table to confirm tick size
Manually calculate: SL $ ÷ (Units × Point Value) = Points
Issue 5: Statistics table not showing
Solution:
Toggle Show Statistics OFF then back ON
Try changing Table Position
Refresh the chart
Check that Show Table is enabled in settings
Issue 6: Indicator acting "heavy" or laggy
Solution:
Turn off Show Swing Structure if not needed
Turn off Show Bracket if reviewing historical trades
Reduce chart's data window (don't load entire years)
Refresh the chart
Pro Tips 🚀
Tip 1: Start with Micro Futures
Micro contracts (MES, MNQ, MCL) have lower cost
Perfect for learning the strategy
Same quality signals, smaller risk
Tip 2: Trade During Peak Hours
Equity Futures: 9:30-16:00 ET (Regular session)
Energy: 18:00-16:00 CT (After hours active)
Metals: 18:00-17:00 CT (Most liquid)
Currencies: 5:00 PM - 4:00 PM ET (24-5 market)
Tip 3: Combine Timeframes
Look for entry on 1-hour chart
Confirm on 15-minute chart
Execute on 5-minute breakout
More confluence = higher probability
Tip 4: Track Your Trades
Keep notes on WIN/LOSS trades
Identify patterns in your losses
Adjust settings based on performance
Use Win% table to monitor improvement
Tip 5: Risk Management First
Never risk more than 2% of account per trade
Respect your stop loss (don't move it)
Take profits when levels are hit
Be patient for high-probability setups
Tip 6: Adjust for Market Conditions
Trending markets: Increase Swing Length (6-8)
Choppy markets: Decrease Swing Length (2-4)
Low volatility: Reduce Stop Loss $
High volatility: Increase Target $
Quick Reference Card
────────────────────────────────────────────────────
SMC KILLER QUICK START ─────────────────────────────────────────────────────
│ 1. Select Asset Category & Symbol
│ 2. Set Units (contracts)
│ 3. Set Stop Loss ($) - your max risk
│ 4. Set Target ($) - your profit goal
│ 5. Wait for BUY (green) or SELL (red) signal
│ 6. Place entry at the entry line
│ 7. Place stop at the red/orange line
│ 8. Place take-profit at the lime/magenta line
│ 9. Close trade when line closes (✓ or ✗)
│ 10. Review statistics and adjust next trade
└─────────────────────────────────────────────────────
BUY Signal = Break Higher OR Fill Gap = LONG
SELL Signal = Break Lower OR Fill Gap = SHORT
Green candles = Uptrend
Orange candles = Downtrend
✓ = Win (took profit)
✗ = Loss (hit stop)
Support & Updates
Check settings are correct for your asset
Ensure adequate chart data is loaded
Test on demo account first
Start with smallest position size
Track performance over 20+ trades
NeuraEdge Pro v1- Auto-OptimizedNeuraEdge Pro is an advanced, self-optimizing trading system that combines Smart Money Concepts (SMC), ICT principles, and adaptive neural networks to identify high-probability trade setups. The indicator automatically learns from its signal history and optimizes parameters in real-time to maintain your target win rate.
Key Features:
✅ Auto-optimization based on historical performance
✅ Neural adaptive system that learns market conditions
✅ ICT session filtering (London, New York, Asian)
✅ Smart Money Concepts integration
✅ Multi-timeframe support (Scalping to Swing trading)
✅ Built-in risk management system
📊 How It Works
NeuraEdge Pro identifies institutional order blocks, fair value gaps, and liquidity zones using advanced price action analysis. The system then filters these setups through multiple confluence factors including:
Market structure alignment
Volume confirmation
Neural network prediction
Session timing (ICT concepts)
Momentum indicators
RSI divergences
The higher you set the confluence number to (max 5) the more accurate but less signal quantity preferred on higher time frame from 1 HR and above.
The unique auto-optimization engine tracks signal performance and automatically adjusts internal parameters to improve accuracy over time.
⚙️ Recommended Settings by Trading Style
🔥 Scalping (1m - 5m charts)
Trading Mode:
✅ Scalp Mode
❌ Intraday Mode
❌ Swing Mode
✅ ICT Concepts
✅ Neural Adaptive
Risk Management:
Risk % per Trade: 0.5-1.0%
Risk:Reward Ratio: 2:1
ATR-Based Stop Loss: ON
ATR Multiplier: 1.3
Min SL Points: 15-20
Advanced Settings:
Analysis Lookback: 40
Order Block Strength: 4-5
Base FVG Size: 0.8-1.0
Base Volume Threshold: 1.8
Base Confluence Score: 4
📈 Intraday (15m - 1h charts)
Trading Mode:
❌ Scalp Mode
✅ Intraday Mode
❌ Swing Mode
✅ ICT Concepts
✅ Neural Adaptive
Risk Management:
Risk % per Trade: 1.0-1.5%
Risk:Reward Ratio: 2.5:1
ATR-Based Stop Loss: ON
ATR Multiplier: 1.5
Min SL Points: 25-30
Advanced Settings:
Analysis Lookback: 50
Order Block Strength: 4
Base FVG Size: 0.9
Base Volume Threshold: 1.6
Base Confluence Score: 4
📊 Swing Trading (4h - Daily charts)
Trading Mode:
❌ Scalp Mode
❌ Intraday Mode
✅ Swing Mode
✅ ICT Concepts
✅ Neural Adaptive
Risk Management:
Risk % per Trade: 1.5-2.0%
Risk:Reward Ratio: 3:1
ATR-Based Stop Loss: ON
ATR Multiplier: 1.8
Min SL Points: 40-50
Advanced Settings:
Analysis Lookback: 75
Order Block Strength: 3-4
Base FVG Size: 1.0-1.2
Base Volume Threshold: 1.5
Base Confluence Score: 3-4
🤖 Auto-Optimization Settings
Recommended for all timeframes:
Enable Auto-Optimization: ON
Optimization Lookback: 100 trades
Target Win Rate: 60%
💡 The system needs at least 10-15 signals to begin optimization. Initial signals use base settings, then the system adapts automatically.
🔮 Predictive Analysis
Keep these balanced for optimal results:
Enable Predictive Mode: ON
Price Action Weight: 0.4
Volume Weight: 0.3
Momentum Weight: 0.3
These weights determine how much each factor influences setup scoring.
📱 Signal Interpretation
BUY Signals (Green Labels)
Price has reached a bullish order block or FVG
Multiple confluence factors aligned
Neural network confirms bullish bias
Entry price shown on label
Green dashed line = Take Profit target
Red dashed line = Stop Loss
SELL Signals (Red Labels)
Price has reached a bearish order block or FVG
Multiple confluence factors aligned
Neural network confirms bearish bias
Entry price shown on label
Green dashed line = Take Profit target
Red dashed line = Stop Loss
📊 Dashboard Explained
Top Section:
Mode - Active trading mode and timeframe
Trend - Current market structure (Bullish/Bearish/Range)
Vol - Volume ratio (higher = stronger moves)
ATR - Current volatility measurement
Auto-Optimize Section:
Win Rate - Historical performance (updates after signals)
FVG/Vol/Conf - Current optimized parameters with arrows:
↑ = System increased selectivity (fewer signals)
↓ = System decreased selectivity (more signals)
= = No change from base settings
Ready OBs - Number of high-probability setups currently available
⚠️ Important Trading Rules
Wait for signal labels - Don't trade order blocks/FVGs without confirmation
Respect the stop loss - Always displayed as red dashed line
Use proper position sizing - Based on your Risk % setting
Trade during recommended sessions - When ICT Concepts enabled
Let auto-optimization work - Give it 15-20 signals before judging
One signal at a time - System prevents new signals for 5 bars after entry
🎯 Best Practices
✅ DO:
Use on liquid, trending markets (Forex majors, indices, crypto majors)
Enable only ONE trading mode matching your timeframe
Keep ICT Concepts enabled for session filtering
Trust the auto-optimization after 15+ signals
Set alerts for BUY/SELL signals
❌ DON'T:
Enable multiple trading modes simultaneously
Override stop losses manually
Trade during low liquidity hours without ICT filtering
Expect perfection - manage risk appropriately
Judge performance before 20+ signals
🔔 Alert Setup
The indicator includes 4 alert types:
Buy Signal - Long entry opportunity
Sell Signal - Short entry opportunity
Sell-Side Sweep - Liquidity grabbed above
Buy-Side Sweep - Liquidity grabbed below
Set up alerts via TradingView's alert menu for real-time notifications.
📈 Performance Tracking
The dashboard shows real-time performance metrics:
Win Rate % - Percentage of profitable signals
Parameter adjustments - How the system is adapting
Neural Score - AI confidence (0-1 scale)
ICT Session Status - Whether optimal trading hours are active
💡 Pro Tips
Start conservative - Use recommended settings for your timeframe
Give it time - Auto-optimization needs 20-30 signals for best results
Higher timeframes = higher quality - Fewer but better signals
Volume matters - Strongest signals occur on volume spikes
Structure alignment - Best trades align with overall trend
⚙️ Technical Requirements
Minimum Timeframe: 1 minute
Maximum Timeframe: Monthly
Best Timeframes: 5m, 15m, 1h, 4h
Asset Classes: Forex, Crypto, Indices, Stocks
Account Type: Any (works with all TradingView plans)
📞 Support & Updates
This indicator is actively maintained and updated based on user feedback. Future updates will include additional features and optimizations.
Disclaimer: Trading involves substantial risk. This indicator is a tool to assist analysis, not a guarantee of profits. Always use proper risk management and never risk more than you can afford to lose. Past performance does not guarantee future results.
Consolidation Tracker🧭 Consolidation Tracker — Visualize Market Reversals in Real Time
The Consolidation Tracker is a minimalist yet powerful tool designed to map the anatomy of market reversals and trend transitions. It highlights the structural evolution of price through four key phases, helping traders anticipate shifts with clarity and confidence.
🔄 The Four Stages of a Market Reversal:
Failure to Displace — Price fails to break beyond recent highs or lows, signaling potential exhaustion of the current trend.
Consolidation (CAMP) — A range-bound phase where price compresses between a dynamic high and low. These zones are shaded gray, representing indecision and balance.
Engulfing (ENGULF) — A decisive candle closes beyond the CAMP high or low, suggesting a directional shift. These are highlighted in orange.
Fair Value Gap (FVG) — A three-candle pattern forms a price imbalance. If this FVG also engulfs the CAMP range, it confirms the reversal and resets the CAMP. Bullish FVGs are shaded green, bearish FVGs in red.
🔁 From Reversal to Trend:
Once a reversal is confirmed via an FVG, the market often transitions into a trend cycle characterized by:
Displacement — Strong directional movement away from the prior range.
Fair Value Gaps — Continuation imbalances that offer high-probability entries on retracements.
🧠 How It Works:
The indicator dynamically tracks CAMP highs and lows, updating only when a candle engulfs the range or a valid FVG forms.
FVGs are detected when a three-candle sequence creates a gap between candle 2 and 0, and the middle candle (candle 1) breaks the CAMP boundary.
CAMP levels are plotted as horizontal lines, while background colors narrate the evolving structure in real time.
This tool is ideal for traders who value market structure, price efficiency, and narrative clarity. Whether you're anticipating reversals or riding trends, the Consolidation Tracker offers a clean, actionable lens into price behavior.
IFVG [#]ICT Concepts by shulktrades
Beginner Concept
IFVG — Inverse Fair Value Gap
Description:
The IFVG indicator identifies and displays Inverse Fair Value Gaps (IFVGs) — price imbalances that have been traded through and closed, representing a complete rebalancing of a prior Fair Value Gap (FVG).
It is designed for traders studying ICT-based market structure and algorithmic delivery concepts, offering a consistent, precise way to visualize these “flipped” gaps directly on their charts.
This indicator does not generate trading signals, alerts, or entries. It serves as a visual confluence and analytical tool, helping traders recognize when a fair value gap has been invalidated and transformed into an IFVG.
How It Works (Conceptually)
Gap Detection
The script tracks consecutive candle structures to identify FVGs — three-candle formations where a price void exists between the first and third candles.
Inverse Confirmation
When price fully closes through a detected FVG (meaning both gap boundaries have been traded and settled), the imbalance is flagged as neutralized, and the script converts it into an Inverse Fair Value Gap (IFVG).
Box Drawing Logic
Each IFVG is displayed as a visual box drawn from the displacement range of the candle that confirmed the closure.
Boxes extend either to the current bar or a user-defined candle limit, providing flexibility for how long historical IFVGs remain visible.
This ensures chart clarity while maintaining accurate visual context of algorithmic rebalancing.
Unique Implementation Features
The IFVG indicator differs from typical open-source FVG tools through its structural logic and visualization method:
Higher-Timeframe Candle Tracking
It can reference higher-timeframe (HTF) candle data to display IFVGs originating from larger structures (for example, showing H1 or H4 inverse gaps on a lower timeframe).
This alignment with HTF context gives traders a broader view of algorithmic delivery behavior.
Specific Timeframe Tracking (Future Integration)
The underlying framework supports selectable timeframe inputs for future updates, allowing users to define which candle data to track for IFVG formation — ensuring full adaptability across multiple timeframe models.
Dynamic End Conditions
Unlike static or persistent zone indicators, each IFVG box can end at the current time or after a custom candle limit.
This avoids overcrowding the chart while maintaining accurate historical context.
Accurate Visual Rendering
The drawing logic ensures that every IFVG box is aligned precisely to candle bodies and wicks, scaling correctly across all chart resolutions.
This eliminates overlap, offset, or visual drift common in generic FVG/IFVG implementations.
How to Use It
Apply the indicator to visualize confirmed Inverse Fair Value Gaps on your chart.
Use the highlighted zones as contextual confluence, not entry triggers.
Adjust settings for box duration and visibility according to your preferred analysis depth.
Integrate with other ICT-based concepts such as liquidity sweeps, order blocks, and displacement analysis for deeper structural insight.
Originality and Purpose
The IFVG indicator is original in its:
Strict focus on confirmed, traded-through FVGs only.
Use of HTF candle tracking for broader algorithmic context.
Dynamic end-of-zone control, determined by user preference or real-time progression.
Accurate visual construction of zones directly tied to candle confirmation logic.
These design choices make it distinct from generic FVG/IFVG indicators and justify its closed-source status, as its logic, rendering precision, and adaptive framework go beyond simple stylistic replication of public scripts.
Important Notes
For educational and analytical use only.
Does not issue alerts, entries, or trade recommendations.
Best suited for traders familiar with ICT delivery and structure concepts.
Always apply personal risk management and confirm bias independently.
Binary Options 1 Minute Signals [TradingFinder] 1 Min Strategy🔵 Introduction
At first sight, price movement in binary options appears random, but behind every move lies a clear logic of liquidity and market imbalance. The market is always driven by the hunt for liquidity and the continuous rebalancing that takes place around Fair Value Gaps (FVGs) and Order Blocks (OBs). These zones are where institutional activity is concentrated and where Smart Money creates the most significant reactions.
When price approaches a key liquidity zone, it often performs a Liquidity Sweep to capture orders resting around previous highs or lows. This move usually presents itself as a False Breakout. Price briefly breaks a level to trigger stop losses and collect liquidity, then quickly reverses direction. Understanding this false breakout behavior is essential for identifying high probability reversals in binary options trading.
After the liquidity sweep, price typically retraces into a Fair Value Gap or Order Block, where the market seeks balance and new orders are introduced. This interaction between liquidity, imbalance, and institutional order flow forms the core logic of every Smart Money trading model.
By focusing on Liquidity Sweeps, False Breakouts, and the structure of FVGs and OBs, traders can read the true intention behind price movements. What seems like random volatility becomes a structured cycle of liquidity collection and reaction, offering clear opportunities for precision-based binary entries.
Bullish Setup :
Bearish Setup :
🔵 How to Use
This indicator works within the Smart Money framework and focuses on the connection between Liquidity Sweep, False Breakout, Fair Value Gap (FVG) and Order Block (OB).
It is created to help traders identify the moment when the market finishes collecting liquidity and begins to show signs of reversal.
The indicator studies how price behaves around zones where liquidity is concentrated, such as previous highs and lows or areas with visible inefficiency. When a clear reaction forms and a valid candle pattern confirms the shift in direction, the indicator generates a signal that represents the activity of Smart Money.
This tool does not respond to random volatility or noise. It waits for structure, liquidity and confirmation to align together before providing an entry. As a result, every signal has a logical base related to institutional order flow rather than ordinary price fluctuations. This approach allows traders to focus only on the movements that reflect true liquidity behavior.
🟣 Long Setup
A bullish setup takes place when the market moves downward and reaches a sell-side liquidity zone located below previous swing lows. In this area, price performs a Liquidity Sweep by moving under key levels to trigger stop losses and capture liquidity from trapped sellers.
This movement usually appears as a False Breakout because the market breaks below a level for a short moment and then quickly moves back inside the range.
Around this zone, a bullish Order Block or Fair Value Gap (FVG) often exists, showing where institutional demand is active.
When the indicator detects the presence of liquidity collection together with a valid bullish confirmation candle near an OB or FVG, it creates a Call signal.
This marks the moment when Smart Money is shifting from selling pressure to accumulation, and a strong bullish move often follows. For binary entries, the best opportunity usually comes immediately after the confirmation candle closes.
The reaction tends to happen quickly because the liquidity grab has completed and new institutional buying pressure is entering the market. This type of setup often provides a clean and precise entry with a high probability of success.
🟣 Short Setup
A bearish setup happens when the market rises and enters a buy-side liquidity area above previous highs. Here, the market performs a Liquidity Sweep to trigger stop losses placed above those highs and to absorb liquidity from trapped buyers.
This pattern forms what traders recognize as a False Breakout because the price only breaks the level temporarily before reversing in the opposite direction. A bearish Order Block or Fair Value Gap (FVG) often appears around this zone, showing where institutional selling interest exists.
Once the liquidity sweep completes and a bearish confirmation candle closes, the indicator produces a Put signal that reflects the shift from buying to selling pressure by Smart Money.
This moment often leads to a fast downward reaction as the market rebalances and fills the nearby inefficiency.
The most effective entry for binary trading is right after the confirmation candle closes, when the false breakout and liquidity collection are both completed. The price usually reacts sharply as the market transitions from liquidity hunting to a new directional move. This setup represents a structured view of how liquidity drives market cycles and how Smart Money creates precise reversals through controlled imbalance and reaction.
🔵 Settings
Time Frame : Defines the timeframe used for analysis. If left blank, the indicator automatically uses the chart’s current timeframe.
Swing Period : Determines how many candles are used to identify structural turning points such as swing highs and swing lows. Higher values increase accuracy but reduce the number of signals.
Signal Type : Specifies the type of signal generated by the indicator. The option All shows every signal, Main Signal displays only the primary one, and Alternative Signal produces a secondary signal that appears one candle after the main signal for additional confirmation.
Candle Pattern : Enables candle pattern logic for reversal confirmation. When active, the indicator issues a signal only when a valid candle formation confirms the market reaction.
Candle LookBack Check : Verifies that the last few candles move in the opposite direction of the signal to be generated. This condition acts as a confirmation filter, ensuring that the signal appears only after a clear counter-move in price.
Last Candle Direction : Considers the direction of the most recent candle in the analysis. It helps determine whether the final candle moves with or against the current trend.
Last Candle Shadow Ratio : Sets the ratio between the last candle’s wick and body to refine confirmation accuracy. Higher values require longer wicks, indicating stronger rejection and a more reliable reversal pattern.
🔵 Conclusion
Trading with Smart Money logic means understanding how liquidity moves through the market.
Each Liquidity Sweep, False Breakout, Fair Value Gap (FVG) and Order Block (OB) reflects the process of collecting and redistributing orders.
This indicator captures that sequence and turns it into precise, structured signals for binary entries. When liquidity is absorbed and a candle confirmation appears, the market reveals its true direction.
At that moment, traders can act with confidence, following institutional flow instead of reacting to random price moves.
Success with this system comes from patience, confirmation, and a clear reading of liquidity behavior, the core principles behind every Smart Money reversal.
IRONBULL FX Venom [TradeFinder] SMC NY Session 2025Setup📌 IRONBULL FX VENOM TRADER
Overview:
The IRONBULL FX VENOM TRADER is a premium Smart Money Concepts (SMC)-based indicator built for institutional-style trading in the New York session. Powered by advanced order block refinement, fair value gap (FVG) detection, and session-based logic, this tool helps traders identify high-probability trading zones and mitigate market noise.
🔧 Key Features:
Order Block Refinement Engine
Integrates with advanced refining logic to filter institutional demand/supply zones, with both Defensive and Aggressive refinement modes.
Fair Value Gap (FVG) Filtering
Detects and highlights FVGs with dynamic filtering options, from Very Aggressive to Very Defensive levels.
Mitigation Levels Control
Allows users to select Proximal, 50%, or Distal levels for precise reaction zones within both OBs and FVGs.
CISD Detection
Captures key short-term displacement shifts, showing potential reversal or continuation signals with optional visual cues.
NY Session Logic
Includes built-in logic to align trades with the New York Opening Range (08:00–09:30 EST) and NY Trading Hours (09:30–17:00 EST). Key session highs/lows are tracked and labeled automatically.
Visual Clarity
Fully customizable color schemes for demand/supply OBs, FVGs, and CISD levels, with lightweight rendering for real-time performance.
🧠 Ideal For:
SMC/ICT-based traders
New York session scalpers and intraday traders
Traders seeking clean institutional zone mapping
Anyone needing visual confirmation of OB + FVG confluence
⚙️ How to Use:
Enable the indicator on a chart (preferably with NY session timezone).
Adjust refinement, FVG filters, and display settings based on your strategy.
Use the OB and FVG zones as key confluence areas for entries/exits.
Watch for CISD labels and session breakouts for high-confidence setups.
Disclaimer: This tool is for educational purposes and not financial advice. Always test in a demo environment before live trading.
Smart Risk - Three Institutional Models📘 Smart Risk – Three Institutional Entry Models
A precision-engineered institutional framework that blends liquidity, structure, and multi-time-frame confirmation.
🧠 Concept Overview
The Smart Risk indicator models how institutional traders and algorithms engineer entries around liquidity, imbalance, and structural shifts .
It unifies t hree distinct institutional entry models —each built around core Smart Money Concepts (SMC)—and enhances them with a Multi-Time-Frame Confluence (MTF) engine for directional alignment.
This tool doesn’t simply merge indicators.
It connects l iquidity sweeps, order-block reactions, breaker validation, and fair-value-gap mitigation into one cohesive trading logic—filtering every setup through trend, structure, and volume confirmation.
⚙️ How It Works
Setup #1 – Liquidity Sweep + Order Block Revisit + FVG Mitigation
Identifies engineered stop-hunts where price sweeps external liquidity and returns to a prior Order Block or Fair Value Gap (FVG).
Signals reversal-style entries with high probability of mean-reversion or mitigation.
Setup #2 – Supply/Demand + Mitigation / Breaker / FVG Continuation
Captures continuation trades inside trending structure.
When trend bias (via moving-average context) aligns with breaker or mitigation blocks, signals confirm institutional continuation sequences.
Setup #3 – Sweep + Classic FVG Reaction
Tracks clean displacement gaps following a liquidity sweep—ideal for scalpers and intraday reversals where imbalances act as magnets for price.
Each setup can be independently enabled or disabled from the panel.
A built-in signal-cooldown prevents repetitive triggers on the same leg.
🕒 Multi-Time-Frame Confluence
The new MTF module aligns lower-time-frame precision entries with higher-time-frame market structure.
When enabled, each setup only validates if the HTF trend confirms the same directional bias as the LTF pattern—e.g. a 5-minute bullish FVG signal requires a bullish 1-hour structure.
This ensures institutional logic respects global liquidity flow and avoids counter-trend traps.
MTF Controls:
• ✅ Enable MTF Confluence toggle
• ⏱️ Lower Time-Frame (LTF) selector (default 5 min)
• ⏱️ Higher Time-Frame (HTF) selector (default 1 hour)
• 🔄 Automatic SMA-based HTF trend detection
🎨 Visualization & Dashboard
• Order Block / Supply–Demand Zones — highlight institutional footprints
• Fair Value Gaps (FVGs) — reveal displacement inefficiencies
• Liquidity Sweeps (X / $) — mark engineered stops
• BOS & CHoCH — confirm structure continuation or reversal
• Compact Dashboard — live “Armed” state for each setup and MTF bias
Color-coded background cues emphasize active trade phases without clutter.
🧩 Core Algorithm Highlights
• Dynamic swing and pivot structure detection
• Breaker / Mitigation / Volume confirmation filters
• Fair-Value-Gap logic with directional alignment
• Cooldown control for signal throttling
• Multi-Time-Frame bias filter for contextual precision
⸻
📈 How to Use
1. Apply indicator to any asset or timeframe.
2. Select which institutional setups you want active.
3. Optionally enable MTF Confluence (5 min → 1 hr recommended).
4. Wait for BOS/CHoCH confirmation + zone alignment before entry.
5. Use OB and FVG zones for entry/exit planning with risk management.
⸻
💡 Originality Statement
This script introduces a multi-layered institutional logic engine that merges liquidity, mitigation, and imbalance behavior into a unified framework—augmented with time-frame synchronization and signal-cooldown management.
All logic, calculations, and visualization structure were built from scratch for this model.
It is not a mash-up of existing public indicators and offers measurable analytical value through MTF-aware trade validation.
⸻
⚠️ Disclaimer
This tool is intended for educational and analytical purposes only.
It does not provide financial advice or guaranteed trading outcomes.
Always back-test, validate setups, and apply proper risk management.
FVGC - SignalsFVGC — Signals (by Capital Complex)
Part of the FVGC Suite.
Purpose-built for Nasdaq-100 futures (NQ/MNQ), this companion to “FVGC — Visual Overlay” turns the overlay’s structure into tightly-gated entry signals—focusing on the first qualified engulf after a valid FVG tap inside your trading windows. The rules and defaults have been shaped by years of systematic backtesting (no performance claims).
## What it does
FVGC — Signals listens for a specific sequence and only then prints a trade signal:
* Retrace→ Tap→ Engulf: The ultimate continuation model, FVGC by Capital Complex.
* Opposing-FVG safety: As per the FVGC model by Capital Complex, optimal setups avoid opposing restrictions such as opposing FVGs, this is all coded into your entries.
* Distance-aware engulf: Engulfing candle restrictions based on data backed optimizations, timeframe and volatility aware.
* Fail-to-Close integrity: Require minimal interaction with rejection FVG.
* Structured drawings: TP/SL/BE are optimally sized on setup conditions, with point distances labelled for quick assessment.
Everything updates in real-time and only prints after the full sequence is satisfied, so you see one clean, first-engulf signal per opportunity (or one-and-done per gap if you choose).
## Why traders use it
* Clarity at the moment of commitment: Signals only fire after strict models are met.
* Designed for NQ: Defaults reflect NY RTH behavior and typical NQ volatility patterns.
* Noise control: Auto distance caps and fail-to-close filters help avoid low-quality chases.
* Pairs perfectly with Overlay: Use Visual Overlay for context (sessions, HTF FVG lines, news footprints) and Signals for the entry trigger.
## Key features & options
* Timezone-aware sessions: Three trading windows.
Models:
* FVGC with BOS.
* FVGC with IFVG.
Filters:
* Engulf distance cap (auto optimized for 30s/1m/2m) with volatility overide.
* Opp-FVG 50% override (allow inside if close passes the opposing gap’s midpoint).
* Fail-to-Close(inside and/or past midpoint).
* Trade management visuals: Optimal TP/SL/BE lines and right-side points labels.
* Entry limits: Allow multiple entries per same FVG or **one-and-done**.
* Day “intensity” shading: Grades the 09:30–09:35 points range to hint at expected intraday pace during 09:30–11:30.
## How to use
1. Load FVGC — Signals on 30 sec.
2. Set your Timezone and enable the Trading Window(s) you use (default 09:30–11:30 NY).
3. Choose Models (BOS / IFVG) and enable Filters (distance cap, open override, Opp-FVG 50%, Fail-to-Close) as desired.
4. (Optional) Toggle TP/SL/BE drawings and “wait for close” for conservative rendering.
5. Use alongside FVGC — Visual Overlay so the structural context and the entry triggers remain in sync.
## Notes
* Signals are calculated without lookahead; non-standard chart types are not supported for signal generation.
* This is an entry-signals and visualization tool, not an execution strategy. Risk sizing, commissions, slippage, and order handling remain the user’s responsibility.
* Years of backtesting informed defaults and guardrails; past results do not guarantee future performance.
## Credits & suite
**Capital Complex — FVGC Suite**
© TheHiddenMarkets (code components).
CPT - CRT Sessions🧭 CPT - CRT Sessions V3
Automated Killzones, CRT Ranges, FVGs, and Market Structure Anchors — built for precision intraday analysis.
🔹 Overview
CPT - CRT Sessions V3 is an advanced all-in-one price action indicator designed to simplify your intraday charting and speed up trade preparation.
It automatically plots key session killzones, Central Range Times (CRT), Fair Value Gaps (FVGs), and market structure anchors such as NDOG, NWOG, and PDH/PDL, allowing traders to identify premium and discount zones at a glance.
⚙️ Core Features
🕒 CRT Ranges (Central Range Time)
Automatically plots 1HR CRT (for futures) and 4HR CRT (for forex) sessions.
Includes color-coded high/low lines for instant visual reference.
Configurable hours (UTC-4 default) and adjustable forward projection.
📦 Killzones
Automatically draws Asian, London, and New York (AM, Lunch, PM) session boxes.
Each killzone features:
Adjustable start/end times
Independent color and transparency controls
Session labeling inside boxes
Uses the classic ICT-style session structure (Asia: 20:00–23:59 UTC-4 by default).
⚡ Fair Value Gaps (FVGs)
Detects both bullish and bearish FVGs automatically.
Displays each gap with:
Midpoint line
Label inside the box (e.g., “1HR FVG”, “4HR FVG”)
Auto-remove logic once price mitigates the gap.
Works on all timeframes.
🔰 Market Anchors
PDH / PDL — Previous Day High & Low
NDOG / NWOG — New Day & New Week Opening Gaps
Automatically drawn and color-coded for visual clarity.
🎨 Customization
Adjustable line styles, widths, and label sizes
Individual transparency sliders for each session box
Optional 24-hour display filtering
Fully timezone-aware (default: UTC-4, matching Exchange time)
💡 Ideal For
Traders following ICT, Smart Money Concepts, or Session Liquidity Models
Scalpers and intraday traders looking to automate manual markups
Multi-timeframe confluence mapping (FVGs + Killzones + CRTs)
🧠 Notes
This tool is for chart analysis only — not an entry or exit signal.
Always perform your own confluence checks before trading.
ICT Institutional Order Flow (Riz)This indicator implements Inner Circle Trader (ICT) institutional order flow concepts to identify high-probability entry points where smart money is actively participating in the market. It combines volume analysis, market structure, and price action patterns to detect institutional accumulation and distribution zones.
Core Concepts & Methodology
1. Institutional Order Blocks Detection
Order blocks represent the last opposing candle before a strong directional move, indicating institutional accumulation (bullish) or distribution (bearish) zones.
How it works:
⦁ Identifies the final bearish candle before bullish expansion (accumulation)
⦁ Identifies the final bullish candle before bearish expansion (distribution)
⦁ Validates with volume spike (2x average) to confirm institutional participation
⦁ Requires minimum 0.5% price displacement to filter weak moves
⦁ Tracks these zones as future support/resistance levels
2. Fair Value Gap (FVG) Analysis
FVGs are price inefficiencies created by aggressive institutional orders that leave gaps in price action.
Detection method:
⦁ Bullish FVG: When current low > high from 2 bars ago
⦁ Bearish FVG: When current high < low from 2 bars ago
⦁ Minimum gap size filter (0.1% default) eliminates noise
⦁ Monitors gap fills with volume for entry signals
⦁ Gaps act as magnets drawing price back for "rebalancing"
3. Liquidity Hunt Detection
Institutions often trigger retail stop losses before reversing direction, creating liquidity for their positions.
Algorithm:
⦁ Calculates rolling 20-period highs/lows as liquidity pools
⦁ Detects wicks beyond these levels (0.1% sensitivity)
⦁ Identifies rejection back inside range (liquidity grab)
⦁ Volume spike confirmation ensures institutional involvement
⦁ These reversals often mark significant turning points
4. Volume Profile Integration
Analyzes volume distribution across price levels to identify institutional interest zones.
Components:
⦁ Point of Control (POC): Price level with highest volume (institutional consensus)
⦁ Value Area: 70% of volume range (institutional comfort zone)
⦁ Uses 50-bar lookback to build volume histogram
⦁ 20 price levels for granular distribution analysis
5. Market Structure Analysis
Determines overall trend bias using pivot points and swing analysis.
Process:
⦁ Identifies swing highs/lows using 3-bar pivots
⦁ Bullish structure: Price above last swing high
⦁ Bearish structure: Price below last swing high
⦁ Filters signals to trade with institutional direction
Signal Generation Logic
BUY signals trigger when ANY condition is met:
1. Order Block Formation: Bearish-to-bullish transition + volume spike + strong move
2. Liquidity Grab Reversal: Sweep below lows + recovery + volume spike
3. FVG Fill: Price fills bullish gap with institutional volume (within 3 bars)
4. Order Block Respect: Price bounces from previous bullish OB + volume
SELL signals trigger when ANY condition is met:
1. Order Block Formation: Bullish-to-bearish transition + volume spike + strong move
2. Liquidity Grab Reversal: Sweep above highs + rejection + volume spike
3. FVG Fill: Price fills bearish gap with institutional volume (within 3 bars)
4. Order Block Respect: Price rejects from previous bearish OB + volume
Additional filters:
⦁ Signals align with market structure (no counter-trend trades)
⦁ No new signals while position is active
⦁ All signals require volume confirmation (institutional fingerprint)
Trading Style Auto-Configuration
The indicator features intelligent preset configurations for different trading styles:
Scalping Mode (1-5 min charts):
⦁ Volume multiplier: 1.5x (more signals)
⦁ Tighter parameters for quick trades
⦁ Risk:Reward 1.5:1, ATR multiplier 1.0
Day Trading Mode (15-30 min charts):
⦁ Volume multiplier: 1.7x (balanced)
⦁ Medium sensitivity settings
⦁ Risk:Reward 2:1, ATR multiplier 1.5
Swing Trading Mode (1H-4H charts):
⦁ Volume multiplier: 2.0x (quality focus)
⦁ Conservative parameters
⦁ Risk:Reward 3:1, ATR multiplier 2.0
Custom Mode:
⦁ Full manual control of all parameters
Visual Components
⦁ Order Blocks: Colored rectangles (green=bullish, red=bearish)
⦁ Fair Value Gaps: Orange boxes showing imbalances
⦁ Liquidity Levels: Dashed blue lines at key highs/lows
⦁ Volume Spikes: Yellow background highlighting
⦁ POC Line: Orange line showing highest volume price
⦁ Value Area: Blue shaded zone of 70% volume
⦁ Buy/Sell Signals: Triangle markers with text labels
⦁ Stop Loss/Take Profit: Dotted lines (red/green)
Information Panel
Real-time dashboard displaying:
⦁ Current trading mode
⦁ Volume ratio (current vs average)
⦁ Market structure (bullish/bearish)
⦁ Active order blocks count
⦁ Position status
⦁ Configuration details
How to Use
Step 1: Select Trading Style
Choose your style in settings - all parameters auto-adjust
Step 2: Timeframe Selection
⦁ Scalping: 1-5 minute charts
⦁ Day Trading: 15-30 minute charts
⦁ Swing: 1H-4H charts
Step 3: Signal Interpretation
⦁ Wait for BUY/SELL markers
⦁ Check volume ratio >2 for strong signals
⦁ Verify market structure alignment
⦁ Note automatic SL/TP levels
Step 4: Risk Management
⦁ Default 2:1 risk:reward (adjustable)
⦁ Stop loss: 1.5x ATR from entry
⦁ Position sizing based on stop distance
Best Practices
1. Higher probability setups occur when multiple conditions align
2. Volume confirmation is crucial - avoid signals without volume spikes
3. Trade with structure - longs in bullish, shorts in bearish structure
4. Monitor POC - acts as dynamic support/resistance
5. Confluence zones where OBs, FVGs, and liquidity levels overlap are strongest
Important Notes
⦁ Not a standalone system - combine with your analysis
⦁ Works best in trending markets with clear structure
⦁ Adjust settings based on instrument volatility
⦁ Backtest thoroughly on your specific markets
⦁ Past performance doesn't guarantee future results
Alerts Available
⦁ ICT Buy Signal
⦁ ICT Sell Signal
⦁ Volume Spike Detection
⦁ Liquidity Grab Detection
This indicator provides a systematic approach to ICT concepts, helping traders identify where institutions are entering positions through volume analysis and key price action patterns. The auto-configuration feature ensures optimal settings for your trading style without manual adjustment.
Disclaimer
This tool is for educational and research purposes only. It is not financial advice, nor does it guarantee profitability. All trading involves risk, and users should test thoroughly before applying live.
Blitz Model
The Blitz indicator is a comprehensive market structure analysis tool designed specifically for the 4-hour timeframe. It identifies and visualizes key market movements including sweeps, fair value gaps (FVGs), and session-based liquidity levels.
1) Key Features :
A) Market Structure Analysis :
i) Sweep Detection: Identifies bullish and bearish sweeps of previous highs/lows.
ii) Double Purge Recognition: Detects when both bullish and bearish sweeps occur on the same candle.
iii) Fair Value Gap (FVG) Visualization: Displays imbalance zones with customizable box colors.
iV) Session-Based Analysis: Tracks Asian and London session highs/lows.
B) Multi-Timeframe Confirmations :
i) Layer 2 Validation System: Incorporates H1 and M15 timeframe confirmations.
ii) H1 Sweep Confirmations: Validates 4H signals with hourly sweep patterns.
iii) M15 Analysis: Includes both sweep and FVG confirmations from 15-minute timeframe.
C) Key Level Integration :
i) Daily 0.5 Level: Plots the midpoint of previous day's range with customizable styling.
ii) Session Liquidity: Identifies sweeps of Asian and London session extremes.
ii) FVG Interaction: Detects when sweeps occur near fair value gaps.
D) Customization Options :
i) Label Styling: Full control over label size, style, and colors for all signal types.
ii) Double Purge Customization: Separate styling options for double purge signals.
iii) Line Customization: Adjustable daily 0.5 line appearance (style, color, width).
iv) Display Controls: Toggle visibility for FVGs, labels, and confirmation history.
2) Technical Specifications
A) Timeframe Requirements :
i) Primary Timeframe: 4H only (indicator will show error on other timeframes).
ii) Multi-Timeframe Data: Analyzes H1 and M15 for confirmations.
iii) Session Times: Configurable start/end times.
B) Signal Validation Criteria :
Sweeps are validated when they occur at one or more of the following conditions:
i) FVG Zones: Price interaction with identified fair value gaps.
ii) Daily Midpoint: Proximity to the 50% level of previous day's range.
iii) Session Levels: Sweeps of Asian (19:00-01:00 NY) or London (02:00-05:00 NY) extremes.
C) Layer 2 Confirmation System :
i) H1 Confirmations (H1S): Sweep patterns on 1-hour charts within the 4H candle formation.
ii) M15 Sweep (M15S): 15-minute sweep confirmations.
iii) M15 FVG (M15F): 15-minute fair value gap formations.
3) Usage Guidelines :
A) Setup Instructions :
i) Apply to 4-hour charts only.
ii) Configure session times based on your analysis preferences.
iii) Customize label appearance and colors to match your chart theme.
iv) Enable/disable features based on your trading style.
B) Signal Interpretation :
i) Green Labels: Bullish sweeps with validation criteria met.
ii) Red Labels: Bearish sweeps with validation criteria met.
iii) Purple Labels: Double purge scenarios (both directions swept).
iv) Checkmark (✓): Indicates Layer 2 multi-timeframe confirmation present.
v) For double purge interpretations :
- Low & High means recent purge (just previous candle)
- Low & High means medium term purge (8H prior)
- Low & High means longer term purge (12H + prior)
4) Compatibility :
Max Objects: Supports up to 500 boxes and labels simultaneously.
5) Support & Updates :
This indicator represents educational concepts in market structure analysis. Users should thoroughly test and understand all signals before considering any practical application.
Disclaimer :
Always practice proper risk management. This is for educational purposes only and is not a financial advice.
BanShen MACD Ultimate Multi Signal System[SpeculationLab]🧠 How This Script Works (Detailed Logic Breakdown)
This script is a closed-source, fully self-developed modular trading system centered around MACD divergence detection. It also includes auxiliary modules such as:
Vegas Tunnel trend filtering
Dynamic ATR-based stop placement
Engulfing candlestick pattern detection
RSI/OBV divergence modules
Fair Value Gap (FVG) recognition
A smart signal panel that consolidates all signals in real time
These components work together through a signal resonance framework, helping traders identify high-confluence, high-probability entry opportunities.
🔍 Why MACD Divergence Is the Core (Real-World Strategy Basis)
This system is based on a real-world trading strategy I’ve personally used and refined over time.
Through discretionary trading and backtesting, I discovered that divergence between price action and the MACD histogram — especially when certain structural conditions are met — produces a very high win rate.
Key observations include:
MACD peaks/troughs that are clean and well-shaped (defined pivot structure)
Large vertical differences between two MACD histogram extremes
Price making a higher high or lower low, while MACD does the opposite
Two or more divergences appearing consecutively, which creates a powerful reversal signal
These setups have proven extremely reliable in my experience. This script automates the detection of these conditions using strict logic filters.
🔷 1. MACD Divergence Engine (Core Module)
At its core, this script implements a multi-layered MACD divergence detection system, capable of identifying both **regular** and **consecutive** bullish/bearish divergences.
Key components of the logic:
- **Pivot-Based Peak Detection:**
Peaks and troughs in the MACD histogram are located using left/right lookback lengths.
These define valid turning points by requiring the center bar to be the highest (or lowest) compared to its neighbors.
- **Peak Size Thresholding:**
The height of the histogram peaks is compared to the standard deviation of MACD values.
Only peaks above a configurable multiplier (e.g., 0.1× stdev) are considered significant, filtering out noise.
- **Peak Ratio Filtering:**
For divergence to be valid, the size ratio between two histogram peaks must exceed a minimum threshold.
This prevents "flat" divergences with no meaningful MACD movement from triggering false signals.
- **Noise Suppression:**
A customizable threshold filters out weak histogram fluctuations between divergence points.
- **Price Action Confirmation:**
The divergence is only confirmed when the price forms a new high or low (depending on the type), and the MACD forms an opposing structure.
- **Consecutive Divergence Detection:**
For high-conviction setups, the script detects sequences of two or more divergences in the same direction.
These use stricter filters and flag rare but powerful market turning points.
Signals are plotted using plotshape() with visual differentiation between regular and consecutive setups. You can enable/disable each type individually.
⏰ Note: Histogram colors are styled similarly to TradingView’s built-in MACD for visual familiarity. However, this script is built entirely from scratch and does not reuse any internal TV code.
---
🔷 2. Trend Filtering via Vegas Tunnel
The **Vegas Tunnel** module plots 5 configurable EMAs (default: 12, 144, 169, 576, 676) to evaluate trend direction.
The trend is considered **bullish** when short EMAs (144/169) are positioned above long EMAs (576/676), and the price is interacting with the short EMA tunnel.
Conversely, a bearish condition is detected when the opposite is true.
A visual triangle marker highlights trend zones, and users can hide/show individual EMAs.
---
🔷 3. ATR-Based Dynamic Stop Loss
This module plots dynamic stop levels above and below the current price based on ATR.
Default setting uses 13-period ATR, and users can customize the multiplier or disable the plot.
It serves as a visual guide for risk management in live trades.
---
🔷 4. Engulfing Pattern Recognition
Candlestick-based signal detection:
- **Bullish Engulfing** occurs when a candle closes above the prior high, and the prior bar is bearish.
- **Bearish Engulfing** when a candle closes below the prior low, and the prior bar is bullish.
Users can modify the logic to use open/close levels for looser or stricter detection.
These patterns are highlighted using plotshape markers and optionally included in the signal table.
---
🔷 5. RSI and OBV Divergence Modules
These modules follow similar logic to the MACD engine:
- Use pivotlow() / pivothigh() to detect swing points.
- Confirm divergence only when price moves in one direction while RSI or OBV moves in the opposite direction.
- Require a minimum distance (in bars) between the two pivots.
- Require a certain ratio between two indicator values and their corresponding prices.
You can only enable **one of MACD/RSI/OBV divergences at a time** to avoid visual overlap, as they share the same subplot.
---
🔷 6. FVG (Fair Value Gap) Auto Detection
This module detects large single-direction price moves where price leaves a visible gap between candle 3 bars ago and 1 bar ago.
- **Bullish FVG**: high < low
- **Bearish FVG**: low > high
ATR-based filters are applied to eliminate minor gaps.
Each gap is drawn as a box and optionally extended, with a central line marking the midpoint (CE - Consequent Encroachment) level.
Traders often look for price to return to this level as an entry signal.
---
🔷 7. Smart Signal Table
All active signals (MACD, Vegas, RSI, OBV, Engulfing) are collected into a **real-time table** that displays current market bias.
- Each module reports whether it is currently giving a bullish (🟢) or bearish (🔴) condition.
- Helps users assess signal alignment (confluence).
- The table is updated every bar and appears in the bottom-right corner.
---
🔷 8. Watermark & Branding
The watermark displays the script name and author at the top-right, and can be toggled via settings.
📌 Not a Mashup — Structured System, Not a Stack of Indicators
⚠️ This is not a random mashup of unrelated indicators.
Every module in this system was intentionally designed to support the core MACD divergence logic by filtering, validating, or amplifying its signals.
Here's how the system achieves signal confluence and structure:
Vegas Tunnel acts as a macro trend filter, helping users determine whether to favor long or short trades.
For example, bullish MACD divergence is more reliable when confirmed by an uptrend in the Vegas EMAs. This prevents users from trading against momentum.
Engulfing Patterns serve as entry-level price action confirmation.
When a bullish engulfing candle appears near a MACD bullish divergence — and trend conditions from Vegas are aligned — the confluence increases dramatically.
This is especially powerful when multiple modules confirm in the same direction on the right side of the chart.
RSI and OBV Divergence modules offer redundant but independent momentum views.
Users may enable them selectively to validate MACD signals, or to use them as standalone alternatives when MACD is flat or noisy.
FVG Zones provide context for entries or targets.
For instance, a MACD bullish divergence forming near a bullish FVG gap increases the odds of reversal.
Price often "fills" these imbalances, which aligns well with reversal setups.
The Smart Signal Table aggregates signals from all modules and provides a visual, real-time overview of the current market bias.
This allows traders to act only when multiple signals are aligned — for example, when MACD is bullish, trend is up, and a bullish engulfing just printed.
Together, this framework creates a coherent decision-making system, where each tool has a defined role: trend filtering, signal confirmation, risk management, or entry detection.
🧩 It is modular in architecture, but not modular in purpose.
This system was not built by stacking indicators, but by integrating logic across modules to support a high-conviction MACD-based strategy.
🧬 Originality Statement
This script is entirely original, developed from scratch without using external libraries or public script code. The logic is fully custom, especially the consecutive divergence detection system and signal integration.
⚠️ Disclaimer
This script is for educational and informational purposes only and does not constitute financial advice. Trade at your own risk.
---
📘 中文简要说明:
这是一个完全原创、闭源的交易系统,核心逻辑为 MACD 柱状图背离信号的识别,配合多模块共振判断,构建出一个高胜率的多信号共振策略。
本指标模块化结构清晰,主要包括:
- MACD 背离识别(支持连续背离)
- Vegas EMA 隧道趋势过滤
- RSI / OBV 背离模块
- 吞没形态识别
- FVG 平衡区间自动标注
- ATR 动态止损提示
- 智能信号面板(整合所有信号并可视化)
所有模块均可单独开启/关闭,适配顺势、逆势或多周期的交易风格。
本脚本为个人实战策略的程序化实现,逻辑完全由零开发,未使用任何公用代码。适合希望提高交易胜率和信号精准度的用户使用。
免责声明:本指标仅用于技术分析学习与参考,不构成任何投资建议。请您独立判断,自行承担交易风险。






















