Indicator · Pine Script v5 · On the chart

Smart Money Concept [TradingFinder] Major Minor OB + FVG (SMC)

by alvinng214· code credited to TFlab

This SMC indicator plots major and minor order blocks along with fair value gaps on the price chart.

View on GitHub

GitHub stars2on the repository
Pine versionv5runs as is
Lines of code1,600
Settings40inputs
LicenceNone statedfile: MPL-2.0
Last update2 months ago5 Aug 2026

Add It to Your TradingView Chart

  1. 1Copy the scriptPress Copy script above, or the copy button on the code below.
  2. 2Open the Pine EditorOpen a TradingView chart and choose Pine Editor at the bottom of the screen.
  3. 3Paste over the templateCreate a new indicator, select all of the template text and paste. Press Save and give it a name.
  4. 4Add it to the chartPress Add to chart, then adjust the settings with the gear icon next to its name.

Source Code

1,600 lines of Pine Script v5 from S1_Silver_Bullet/Smart Money Concept [TradingFinder] Major Minor OB + FVG (SMC).txt, published under MPL-2.0 (file header). Keep the author's credit and licence lines when you reuse it.

Smart Money Concept [TradingFinder] Major Minor OB + FVG (SMC).txt
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TFlab
//@version=5
indicator("Smart Money Concept [TradingFinder] Major Minor OB + FVG (SMC)" ,'SMC TFlab', overlay = true, max_bars_back = 5000, max_boxes_count = 500,max_labels_count = 500, max_lines_count = 500 )

//import Libraries
    //import Order Block Refiner
import TFlab/OrderBlockRefiner_TradingFinder/2 as Refiner
    //import Order Block Drawing  Library
import TFlab/OrderBlockDrawing_TradingFinder/1 as Drawing
    //import FVG  Library
import TFlab/FVGDetectorLibrary/1 as FVG
    //import Liquidity Library
import TFlab/LiquidityFinderLibrary/1 as Liq
    //import Alert Sender Library
import TFlab/AlertSenderLibrary_TradingFinder/1 as Alert
    //import Tradingview Technical Analysis Library
import TradingView/ta/7


//Input

    //Pivot Period of Order Blocks Detector
PP = input.int(5, 'Pivot Period of Order Blocks Detector' , group = 'Logic Parameter' , minval = 1)
OBVaP = input.int(500, 'Order Block Validity Period (Bar)' , group = 'Logic Parameter' , maxval = 4998 , minval = 10,
 tooltip = 'You can set the validity period of each Order Block based on the number of candles that have passed since the origin of the Order Block.')
    //Display Order Blocks

ShowDmainCh = input.bool(true, 'Demand Main Zone, "ChoCh" Origin.', 
 'Using this button, you can control whether the' + 
 '"Demand Main Order Blocks" originating to "ChoCh" are displayed.' , group = 'Order Blocks Display', inline = 'OB 1')

ColorDmainCh = input.color(color.rgb(60, 176, 68, 65) , '' , group = 'Order Blocks Display', inline = 'OB 1')


ShowDsubCh  = input.bool(true, 'Demand Sub Zone, "ChoCh" Origin..', 
 'Using this button, you can control whether the' + 
 '"Demand Sub Order Blocks" originating to "ChoCh" are displayed.' , group ='Order Blocks Display', inline = 'OB 2')

ColorDsubCh = input.color(color.rgb(123, 180, 227, 65) , '' , group = 'Order Blocks Display', inline = 'OB 2')


ShowDBoS    = input.bool(true, 'Demand All Zone, "BoS" Origin.......', 
 'Using this button, you can control whether the' + 
 '"Demand Order Blocks" originating to "BoS" are displayed.' , group ='Order Blocks Display', inline = 'OB 3')

ColorDBoS = input.color(color.rgb(153, 237, 195, 75) , '' , group = 'Order Blocks Display', inline = 'OB 3')


ShowSmainCh = input.bool(true, 'Supply Main Zone, "ChoCh" Origin...', 
 'Using this button, you can control whether the' + 
 '"Supply Main Order Blocks" originating to "ChoCh" are displayed.' , group ='Order Blocks Display', inline = 'OB 4')

ColorSmainCh = input.color(color.rgb(191, 10, 48 , 75) , '' , group = 'Order Blocks Display', inline = 'OB 4')


ShowSsubCh  = input.bool(true, 'Supply Sub Zone, "ChoCh" Origin....', 
 'Using this button, you can control whether the' + 
 '"Supply Sub Order Blocks" originating to "ChoCh" are displayed.' , group ='Order Blocks Display', inline = 'OB 5')

ColorSsubCh = input.color(color.rgb(243, 189, 74, 75) , '' , group = 'Order Blocks Display', inline = 'OB 5')


ShowSBoS    = input.bool(true, 'Supply All Zone,  "BoS"  Origin.........', 
 'Using this button, you can control whether the' + 
 '"Supply Order Blocks" originating to "BoS" are displayed.' , group ='Order Blocks Display', inline = 'OB 6')

ColorSBoS = input.color(color.rgb(255, 105, 97, 85) , '' , group = 'Order Blocks Display', inline = 'OB 6')

    //Refinement Order Blocks, display and Method

RefineDmainCh = input.bool(true, 'Refine Demand Main', 
 'If you want this "Demand Main Order Block, ChoCh Origin" to be refined to display a optimal range,' +
 'you should select "On" and if you want to see the original' +
 'range of the block order, you should select "Off".' + 
 '\nAlso, if you are a risk taker, you can choose the "Aggressive" Refine method,' + 
 'and if you are risk averse, you can choose the "Defensive" Refine method.'
 , group ='Order Blocks Refinement ', inline = 'Refine 1')

RefineMeDmainCh = input.string('Defensive', '', ['Defensive', 'Aggressive'] , 
 group = 'Order Blocks Refinement ' , inline = 'Refine 1')

RefineDsubCh  = input.bool(true, 'Refine Demand Sub.',
 'If you want this "Demand Sub Order Block, ChoCh Origin" to be refined to display a optimal range,' +
 'you should select "On" and if you want to see the original' +
 'range of the block order, you should select "Off".' + 
 '\nAlso, if you are a risk taker, you can choose the "Aggressive" Refine method,' + 
 'and if you are risk averse, you can choose the "Defensive" Refine method.' 
 , group ='Order Blocks Refinement ', inline = 'Refine 2')

RefineMeDsubCh  = input.string('Defensive', '', ['Defensive', 'Aggressive'] , 
 group = 'Order Blocks Refinement ', inline = 'Refine 2')

RefineDBoS    = input.bool(true, 'Refine Demand BoS.', 
 'If you want this "Demand Order Block, BoS Origin" to be refined to display a optimal range,' +
 'you should select "On" and if you want to see the original' +
 'range of the block order, you should select "Off".' + '\n' +
 '\nAlso, if you are a risk taker, you can choose the "Aggressive" Refine method,' + 
 'and if you are risk averse, you can choose the "Defensive" Refine method.'
 , group ='Order Blocks Refinement ', inline = 'Refine 3')

RefineMeDBoS    =  input.string('Defensive', '', ['Defensive', 'Aggressive'] , 
 group = 'Order Blocks Refinement ', inline = 'Refine 3')

RefineSmainCh = input.bool(true, 'Refine Supply Main..', 
 'If you want this "Supply Main Order Block, ChoCh Origin" to be refined to display a optimal range,' +
 'you should select "On" and if you want to see the original' +
 'range of the block order, you should select "Off".' + 
 '\nAlso, if you are a risk taker, you can choose the "Aggressive" Refine method,' + 
 'and if you are risk averse, you can choose the "Defensive" Refine method.' 
 , group ='Order Blocks Refinement ', inline = 'Refine 4')

RefineMeSmainCh = input.string('Defensive', '', ['Defensive', 'Aggressive'] , 
 group = 'Order Blocks Refinement ', inline = 'Refine 4')

RefineSsubCh  = input.bool(true, 'Refine Supply Sub...', 
 'If you want this "Supply Sub Order Block, ChoCh Origin" to be refined to display a optimal range,' +
 'you should select "On" and if you want to see the original' +
 'range of the block order, you should select "Off".' + 
 '\nAlso, if you are a risk taker, you can choose the "Aggressive" Refine method,' + 
 'and if you are risk averse, you can choose the "Defensive" Refine method.' 
 , group ='Order Blocks Refinement ', inline = 'Refine 5')

RefineMeSsubCh  =  input.string('Defensive', '', ['Defensive', 'Aggressive'] , 
 group = 'Order Blocks Refinement ', inline = 'Refine 5')

RefineSBoS    = input.bool(true, 'Refine Supply BoS...', 
 'If you want this "Supply Order Block, BoS Origin" to be refined to display a optimal range,' +
 'you should select "On" and if you want to see the original' +
 'range of the block order, you should select "Off".' + '\n' +
 '\nAlso, if you are a risk taker, you can choose the "Aggressive" Refine method,' + 
 'and if you are risk averse, you can choose the "Defensive" Refine method.' 
 , group ='Order Blocks Refinement ', inline = 'Refine 6')

RefineMeSBoS    =  input.string('Defensive', '', ['Defensive', 'Aggressive'] , 
 group = 'Order Blocks Refinement ', inline = 'Refine 6')


    //FVG

PShowDeFVG = input.bool(true, ' Show Demand FVG', group = 'FVG')
PShowSuFVG = input.bool(true, ' Show Supply FVG', group = 'FVG')
PFVGFilter = input.bool(true, 'FVG Filter ............',  group = 'FVG' , inline = 'FVG Filter')
PFVGFilterType = input.string('Very Defensive', '', 
 ['Very Aggressive' , 'Aggressive' , 'Defensive' , 'Very Defensive'], group = 'FVG', inline = 'FVG Filter' ,
 tooltip = 'If it is "On", this filter will filter "FVGs" based on the width of the Zone.'  + 
 'From "Very Aggressive" to "Very Defensive" the width of the "FVG" decreases.')


    //Liquidity

ShowSHLL = input.bool(true , 'Show Statics High Liquidity Line',group = 'Liquidity')
ShowSLLL = input.bool(true , 'Show Statics Low Liquidity Line',group = 'Liquidity')
ShowDHLL = input.bool(true , 'Show Dynamics High Liquidity Line',group = 'Liquidity')
ShowDLLL = input.bool(true , 'Show Dynamics Low Liquidity Line',group = 'Liquidity')

SPP = input.int(8 , 'Statics Period Pivot',group = 'Liquidity') // Statics Period Pivot
DPP = input.int(3 , 'Dynamics Period Pivot',group = 'Liquidity') // Dynamics Period Pivot

SLLS = input.float(0.30 , 'Statics Liquidity Line Sensitivity', 
 maxval = 0.4 ,minval = 0.0, step = 0.01,group = 'Liquidity') // Statics Liquidity Line Sensitivity
DLLS = input.float(1.00 , 'Dynamics Liquidity Line Sensitivity',
 maxval = 1.95 ,minval = 0.4, step = 0.01,group = 'Liquidity') // Dynamics Liquidity Line Sensitivity


    //Alert
AlertName = input.string('Smart Money Concept [TradingFinder]', 'Alerts Name', group = 'Alert')

Alert_DMM = input.string('On' , 'Alert Demand Main Mitigation' , ['On', 'Off'], 'If you turn on the Alert Demand Main ChoCh Origin Mitigation,' + 
 'you can receive alerts and notifications after setting the "Alert".' , group = 'Alert')
MessageBull_DMM = input.text_area('Long Position in Demand Main Zone ChoCh Origin.', 'Long Signal Message' ,group = 'Alert')

Alert_DSM = input.string('On' , 'Alert Demand Sub Mitigation' , ['On', 'Off'], 'If you turn on the Alert Demand Sub ChoCh Origin Mitigation,' +
 'you can receive alerts and notifications after setting the "Alert".' , group = 'Alert')
MessageBull_DSM = input.text_area('Long Position in Demand Sub Zone ChoCh Origin.', 'Long Signal Message' ,group = 'Alert')

Alert_DAM = input.string('On' , 'Alert Demand BoS Mitigation' , ['On', 'Off'], 'If you turn on the Alert Demand All BoS Origin Mitigation,' +
 'you can receive alerts and notifications after setting the "Alert".' , group = 'Alert')
MessageBull_DAM = input.text_area('Long Position in Demand Zone BoS Origin.', 'Long Signal Message' ,group = 'Alert')

Alert_SMM = input.string('On' , 'Alert Supply Main Mitigation', ['On', 'Off'], 'If you turn on the Alert Supply Main ChoCh Origin Mitigation,' +
 'you can receive alerts and notifications after setting the "Alert".' , group = 'Alert')
MessageBear_SMM = input.text_area('Short Position in Supply Main Zone ChoCh Origin.','Short Signal Message' , group = 'Alert')

Alert_SSM = input.string('On' , 'Alert Supply Sub Mitigation' , ['On', 'Off'], 'If you turn on the Alert Supply Sub ChoCh Origin Mitigation,' +
 'you can receive alerts and notifications after setting the "Alert".' , group = 'Alert')
MessageBear_SSM = input.text_area('Short Position in Supply Sub Zone ChoCh Origin.','Short Signal Message' , group = 'Alert')

Alert_SAM = input.string('On' , 'Alert Supply BoS Mitigation' , ['On', 'Off'], 'If you turn on the Alert Supply All BoS Origin Mitigation,' +
 'you can receive alerts and notifications after setting the "Alert".' , group = 'Alert')
MessageBear_SAM = input.text_area('Short Position in Supply Zone BoS Origin.','Short Signal Message' , group = 'Alert')


Frequncy = input.string('Once Per Bar' , 'Message Frequency' , ['All', 'Once Per Bar' , 'Per Bar Close'], 'The triggering frequency. Possible values are: All'+ 
 ' (all function calls trigger the alert), Once Per Bar (the first function call during the bar triggers the alert), ' +  
 ' Per Bar Close (the function call triggers the alert only when it occurs during the last script iteration of the real-time bar,' +  
 ' when it closes). The default is alert.freq_once_per_bar.)', group = 'Alert')
UTC = input.string('UTC' , 'Show Alert time by Time Zone', group = 'Alert')
MoreInfo = input.string('On', 'Display More Info', ['On', 'Off'], group = 'Alert')



    //Lines

        //Bos Lines
            //Major Line
                //Bullish
MajorBuBoSLine_Show       = input.string('Off'  ,'Show Major Bullish BoS Lines', ['On', 'Off'] , group = 'Major Bullish "BoS" Lines')
MajorBuBoSLine_Style    = input.string(line.style_dashed ,'Style Major Bullish BoS Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted]  , group = 'Major Bullish "BoS" Lines')
MajorBuBoSLine_Color    = input.color(color.black ,'Color Major Bullish BoS Lines'  , group = 'Major Bullish "BoS" Lines')


                //Bearish
MajorBeBoSLine_Show       = input.string('Off'  ,'Show Major Bearish BoS Lines', ['On', 'Off'] , group = 'Major Bearish "BoS" Lines')
MajorBeBoSLine_Style    = input.string(line.style_dashed ,'Style Major Bearish BoS Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted]  , group = 'Major Bearish "BoS" Lines')
MajorBeBoSLine_Color    = input.color(color.black ,'Color Major Bearish BoS Lines'  , group = 'Major Bearish "BoS" Lines')


            //Minor
                //Bullish
MinorBuBoSLine_Show       = input.string('Off'  ,'Show Minor Bullish BoS  Lines', ['On', 'Off'] , group = 'Minor Bullish "BoS"  Lines')
MinorBuBoSLine_Style    = input.string(line.style_dotted ,'Style Minor Bullish BoS  Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted]  , group = 'Minor Bullish "BoS"  Lines')
MinorBuBoSLine_Color    = input.color(color.black ,'Color Minor Bullish BoS  Lines' , group = 'Minor Bullish "BoS"  Lines' )


                //Bearish
MinorBeBoSLine_Show       = input.string('Off'  ,'Show Minor Bearish BoS Lines', ['On', 'Off'] , group = 'Minor Bearish "BoS" Lines' )
MinorBeBoSLine_Style    = input.string(line.style_dotted ,'Style inor Bearish BoS Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted] , group = 'Minor Bearish "BoS" Lines')
MinorBeBoSLine_Color    = input.color(color.black ,'Color inor Bearish BoS Lines' , group = 'Minor Bearish "BoS" Lines')

        //ChoCh Lines
            //Major Line
                //Bullish
MajorBuChoChLine_Show     = input.string('Off'  ,'Show Major Bullish ChoCh Lines', ['On', 'Off'] , group = 'Major Bullish "ChoCh" Lines')
MajorBuChoChLine_Style    = input.string(line.style_dashed ,'Style Major Bullish ChoCh Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted] , group = 'Major Bullish "ChoCh" Lines')
MajorBuChoChLine_Color    = input.color(color.black ,'Color Major Bullish ChoCh Lines' , group = 'Major Bullish "ChoCh" Lines')

                //Bearish
MajorBeChoChLine_Show     = input.string('Off'  ,'Show Major Bearish ChoCh Lines', ['On', 'Off'] , group = 'Major Bearish "ChoCh" Lines')
MajorBeChoChLine_Style    = input.string(line.style_dashed ,'Style Major Bearish ChoCh Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted]  , group = 'Major Bearish "ChoCh" Lines')
MajorBeChoChLine_Color    = input.color(color.black ,'Color Major Bearish ChoCh Lines'  , group = 'Major Bearish "ChoCh" Lines')

            //Minor
                //Bullish
MinorBuChoChLine_Show     = input.string('Off'  ,'Show Minor Bullish ChoCh Lines', ['On', 'Off'] , group = 'Minor Bullish "ChoCh" Lines')
MinorBuChoChLine_Style    = input.string(line.style_dotted ,'Style Minor Bullish ChoCh Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted] , group = 'Minor Bullish "ChoCh" Lines')
MinorBuChoChLine_Color    = input.color(color.black ,'Color Minor Bullish ChoCh Lines' , group = 'Minor Bullish "ChoCh" Lines')

                //Bearish           
MinorBeChoChLine_Show     = input.string('Off'  ,'Show Minor Bearish ChoCh Lines', ['On', 'Off'] , group = 'Minor Bearish "ChoCh" Lines')
MinorBeChoChLine_Style    = input.string(line.style_dotted ,'Style Minor Bearish ChoCh Lines', 
 [line.style_solid, line.style_dashed, line.style_dotted]  , group = 'Minor Bearish "ChoCh" Lines')
MinorBeChoChLine_Color    = input.color(color.black ,'Color Minor Bearish ChoCh Lines'  , group = 'Minor Bearish "ChoCh" Lines')

        //Support & Resistance Lines
            //Major Line
                //Support
LastMajorSupportLine_Show    = input.string('Off' ,'Show Last Major Support Line', ['On', 'Off'], group = 'Last Major Support Line' )
LastMajorSupportLine_Style    = input.string(line.style_solid ,'Style Last Major Support Line', 
 [line.style_solid, line.style_dashed, line.style_dotted] , group = 'Last Major Support Line')
LastMajorSupportLine_Color    = input.color(color.black ,'Color Last Major Support Line' , group = 'Last Major Support Line')
                //Resistance
LastMajorResistanceLine_Show = input.string('Off' ,'Show Last Major Resistance Line', ['On', 'Off'] , group = 'Last Major Resistance Line')
LastMajorResistanceLine_Style    = input.string(line.style_solid ,'Style Last Major Resistance Line', 
 [line.style_solid, line.style_dashed, line.style_dotted] , group = 'Last Major Resistance Line')
LastMajorResistanceLine_Color    = input.color(color.black ,'Color Last Major Resistance Line' , group = 'Last Major Resistance Line')

            //Minor Line
                //Support
LastMinorSupportLine_Show    = input.string('Off' ,'Show Last Minor Support Line', ['On', 'Off'] , group = 'Last Minor Support Line')
LastMinorSupportLine_Style    = input.string(line.style_dashed ,'Style Last Minor Support Line', 
 [line.style_solid, line.style_dashed, line.style_dotted] , group = 'Last Minor Support Line')
LastMinorSupportLine_Color    = input.color(color.black ,'Color Last Minor Support Line', group = 'Last Minor Support Line')

                //Resistance
LastMinorResistanceLine_Show = input.string('Off' ,'Show Last Minor Resistance Line', ['On', 'Off'] , group = 'Last Minor Resistance Line')
LastMinorResistanceLine_Style    = input.string(line.style_dashed ,'Style Last Minor Resistance Line', 
 [line.style_solid, line.style_dashed, line.style_dotted]  , group = 'Last Minor Resistance Line')
LastMinorResistanceLine_Color    = input.color(color.black ,'Color Last Minor Resistance Line'  , group = 'Last Minor Resistance Line')

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//Variables

    //ZigZag Data
Open = open
High = high
Low = low
Close = close 
Bar_Index = bar_index
ATR =ta.atr(55)
var ArrayType = array.new_string()
var ArrayValue = array.new_float()
var ArrayIndex =  array.new_int()
var ArrayTypeAdv  = array.new_string()
var ArrayValueAdv = array.new_float()
var ArrayIndexAdv =  array.new_int()  
var line ZZLine = na
var line Sline = na 
var line Rline = na 
var label Label  = na
PASS = 0
HighPivot = ta.pivothigh(PP,PP)
LowPivot = ta.pivotlow(PP,PP)
HighValue = ta.valuewhen(HighPivot ,High[PP], 0)
LowValue = ta.valuewhen(LowPivot ,Low[PP], 0)
HighIndex = ta.valuewhen(HighPivot ,Bar_Index[PP], 0)
LowIndex = ta.valuewhen(LowPivot ,Bar_Index[PP], 0)
Correct_HighPivot = 0.0
Correct_LowPivot =  0.0

    //Major Levels
var float Major_HighLevel = na
var float Major_LowLevel  = na

var int Major_HighIndex = na
var int Major_LowIndex = na

var string Major_HighType= na
var string Major_LowType = na

    //Minor Levels
var float Minor_HighLevel = na
var float Minor_LowLevel  = na

var int Minor_HighIndex   = na
var int Minor_LowIndex    = na

var string Minor_HighType = na
var string Minor_LowType  = na

var int LockDetecteM_MinorLvL = 0

    //
var bool Lock0 = true
var bool Lock1 = true

// Detecte Major & Minor Pivot
// Order Blocks Data
    //Major
var int LastMHH = 0
var int Last02MHH = 0
var int LastMLH = 0

var int LastMLL = 0
var int Last02MLL = 0
var int LastMHL = 0
    //Minor
var int LastmHH = 0
var int Last02mHH = 0
var int LastmLH = 0

var int LastmLL = 0
var int Last02mLL = 0
var int LastmHL = 0

/////////////////////////////
// Last Pivot First Point////
/////////////////////////////
var string LastPivotType = na
var int LastPivotIndex = 0

var string LastPivotType02 = na
var int LastPivotIndex02 = 0

    //Major 01
var float MajorHighValue01 = na
var int   MajorHighIndex01 = na
var string MajorHighType01 = ''

var float MajorLowValue01  = na
var int   MajorLowIndex01 =  na
var string MajorLowType01 =  ''

    //Minor 01
var float MinorHighValue01 = na
var int   MinorHighIndex01 = na
var string MinorHighType01 = ''

var float MinorLowValue01  = na
var int   MinorLowIndex01  = na
var string MinorLowType01 =  ''

/////////////////////////////////////
//One to the Last Pivot First Point//
/////////////////////////////////////
    //Major 02
var float MajorHighValue02 = na
var int   MajorHighIndex02 = na
var string MajorHighType02 = ''

var float MajorLowValue02  = na
var int   MajorLowIndex02 =  na
var string MajorLowType02 =  ''

    //Minor 02
var float MinorHighValue02 = na
var int   MinorHighIndex02 = na
var string MinorHighType02 = ''

var float MinorLowValue02  = na
var int   MinorLowIndex02  = na
var string MinorLowType02 =  ''

    //Major 02 Change Type Pivot
var float MajorHighValue02Ch = na
var int   MajorHighIndex02Ch = na
var string MajorHighType02Ch = ''

var float MajorLowValue02Ch  = na
var int   MajorLowIndex02Ch =  na
var string MajorLowType02Ch =  ''

    //Lines Data
var line MajorLine_ChoChBull   = na
var label MajorLabel_ChoChBull = na

var line MajorLine_ChoChBear   = na
var label MajorLabel_ChoChBear = na

var line MajorLine_BoSBull     = na
var label MajorLabel_BoSBull   = na

var line MajorLine_BoSBear     = na
var label MajorLabel_BoSBear   = na

var line MinorLine_ChoChBull   = na
var label MinorLabel_ChoChBull = na

var line MinorLine_ChoChBear   = na
var label MinorLabel_ChoChBear = na

var line MinorLine_BoSBull     = na
var label MinorLabel_BoSBull   = na

var line MinorLine_BoSBear     = na
var label MinorLabel_BoSBear   = na

    // BoS & ChoCh Data
        //Major
var bool Bullish_Major_ChoCh = false
var bool Bullish_Major_BoS = false

var bool Bearish_Major_ChoCh = false
var bool Bearish_Major_BoS = false

var BoS_MajorType  = array.new_string()
var BoS_MajorIndex = array.new_int()

var ChoCh_MajorType  = array.new_string()
var ChoCh_MajorIndex = array.new_int()

var int LockBreak_M = 0 

        //Minor
var bool Bullish_Minor_ChoCh = false
var bool Bullish_Minor_BoS = false

var bool Bearish_Minor_ChoCh = false
var bool Bearish_Minor_BoS = false

var BoS_MinorType  = array.new_string()
var BoS_MinorIndex = array.new_int()

var ChoCh_MinorType  = array.new_string()
var ChoCh_MinorIndex = array.new_int()

var int LockBreak_m = 0 


    //Support & Resistance Line

        //Major
var line Support_LineMajor = na 
var line Resistance_LineMajor = na 
        //Minor
var line Support_LineMinor = na
var line Resistance_LineMinor = na

    //Trend Data

var string ExternalTrend = 'No Trend'
var string InternalTrend = 'No Trend'

    //Order Blocks Data

        //Bullish Major ChoCh Main
var bool  BuMChMain_Trigger = false
var int   BuMChMain_Index     = 0

        //Bullish Major ChoCh Sub
var bool  BuMChSub_Trigger = false
var int   BuMChSub_Index     = 0

        //Bullish Major BoS
var bool  BuMBoS_Trigger = false
var int   BuMBoS_Index     = 0

        //Bearish Major ChoCh Main
var bool  BeMChMain_Trigger = false
var int   BeMChMain_Index     = 0

        //Bearish Major ChoCh Sub
var bool  BeMChSub_Trigger = false
var int   BeMChSub_Index     = 0

        //Bearish Major BoS
var bool  BeMBoS_Trigger = false
var int   BeMBoS_Index     = 0

    //Correction OB
        //Bullish Major ChoCh 

var float ChBuLowest = 0.0
var float ChBuLowestSub = 0.0

var int CorrectBuIndex = 0
var int CorrectBuIndexSub = 0

        //Bullish Major BoS

var float BoSBuLowest = 0.0
var float BoSBuLowest02 = 0.0

var int CorrectBuBoSIndex = 0
var int CorrectBuBoSIndex02 = 0

        //Bearish Major ChoCh 

var float ChBeHighest = 0.0
var float ChBeHighestSub = 0.0

var int CorrectBeIndex = 0
var int CorrectBeIndexSub = 0

        //Bearish Major BoS 

var float BoSBeHighest = 0.0
var float BoSBeHighest02 = 0.0

var int CorrectBeBoSIndex = 0
var int CorrectBeBoSIndex02 = 0


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////Calculation/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    //{Zig Zag}
if HighPivot  and  LowPivot
    if ArrayType.size() == 0
        PASS := 1
    else if ArrayType.size() >= 1
        if ((ArrayType.get(ArrayType.size() - 1)) == "L" or
             (ArrayType.get(ArrayType.size() - 1)) == "LL")
            if LowPivot < ArrayValue.get(ArrayType.size() - 1)
                array.remove(ArrayType,ArrayType.size() - 1)
                array.remove(ArrayValue,ArrayValue.size() - 1)
                array.remove(ArrayIndex,ArrayIndex.size() - 1) 
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                array.push(ArrayValue, LowValue)
                array.push(ArrayIndex, LowIndex)
                Correct_LowPivot :=  LowValue
            else 
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H" ) ///////////////////////////////Here
                array.push(ArrayValue, HighValue)
                array.push(ArrayIndex, HighIndex)
            Correct_HighPivot := HighValue  
        else if (ArrayType.get(ArrayType.size() - 1)) == "H" or 
             (ArrayType.get(ArrayType.size() - 1)) == "HH"
            if HighPivot > ArrayValue.get(ArrayType.size() - 1)
                array.remove(ArrayType,ArrayType.size() - 1)
                array.remove(ArrayValue,ArrayValue.size() - 1)
                array.remove(ArrayIndex,ArrayIndex.size() - 1)
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H")///////////////////////////////Here
                array.push(ArrayValue, HighValue)
                array.push(ArrayIndex, HighIndex)
                Correct_HighPivot := HighValue  
            else 
                array.push(ArrayType,ArrayType.size()>2?  ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                array.push(ArrayValue, LowValue)
                array.push(ArrayIndex, LowIndex)
            Correct_LowPivot :=  LowValue    
        else if (ArrayType.get(ArrayType.size() - 1)) == "LH"
            if HighPivot < ArrayValue.get(ArrayType.size() - 1)
                array.push(ArrayType,ArrayType.size()>2?  ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                array.push(ArrayValue, LowValue)
                array.push(ArrayIndex, LowIndex)
                Correct_LowPivot :=  LowValue 
            else if HighPivot > ArrayValue.get(ArrayType.size() - 1)
                if close < ArrayValue.get(ArrayType.size() - 1)
                    array.remove(ArrayType,ArrayType.size() - 1)
                    array.remove(ArrayValue,ArrayValue.size() - 1)
                    array.remove(ArrayIndex,ArrayIndex.size() - 1)
                    array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H")///////////////////////////////Here
                    array.push(ArrayValue, HighValue)
                    array.push(ArrayIndex, HighIndex)
                    Correct_HighPivot := HighValue  
                else if close > ArrayValue.get(ArrayType.size() - 1)
                    array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                    array.push(ArrayValue, LowValue)
                    array.push(ArrayIndex, LowIndex)
                    Correct_LowPivot :=  LowValue
        else if (ArrayType.get(ArrayType.size() - 1)) == "HL"
            if LowPivot > ArrayValue.get(ArrayType.size() - 1)
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H" ) ///////////////////////////////Here
                array.push(ArrayValue, HighValue)
                array.push(ArrayIndex, HighIndex)
                Correct_HighPivot := HighValue                       
            else if LowPivot < ArrayValue.get(ArrayType.size() - 1)
                if close > ArrayValue.get(ArrayType.size() - 1)
                    array.remove(ArrayType,ArrayType.size() - 1)
                    array.remove(ArrayValue,ArrayValue.size() - 1)
                    array.remove(ArrayIndex,ArrayIndex.size() - 1) 
                    array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                    array.push(ArrayValue, LowValue)
                    array.push(ArrayIndex, LowIndex)
                    Correct_LowPivot :=  LowValue
                else if close < ArrayValue.get(ArrayType.size() - 1)
                    array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H")///////////////////////////////Here
                    array.push(ArrayValue, HighValue)
                    array.push(ArrayIndex, HighIndex)
                    Correct_HighPivot := HighValue                         
else if  HighPivot 
    if ArrayType.size() == 0
        array.insert(ArrayType, 0, "H")
        array.insert(ArrayValue, 0, HighValue)
        array.insert(ArrayIndex, 0, HighIndex)
        Correct_HighPivot := HighValue
    else if ArrayType.size() >= 1
        if ((ArrayType.get(ArrayType.size() - 1)) == "L" or
             (ArrayType.get(ArrayType.size() - 1)) == "HL" or
             (ArrayType.get(ArrayType.size() - 1)) == "LL")
            if HighPivot > ArrayValue.get(ArrayType.size() - 1)
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H" ) ///////////////////////////////Here
                array.push(ArrayValue, HighValue)
                array.push(ArrayIndex, HighIndex)
                Correct_HighPivot := HighValue
            else if  HighPivot < ArrayValue.get(ArrayType.size() - 1)
                array.remove(ArrayType,ArrayType.size() - 1)
                array.remove(ArrayValue,ArrayValue.size() - 1)
                array.remove(ArrayIndex,ArrayIndex.size() - 1) 
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                array.push(ArrayValue, LowValue)
                array.push(ArrayIndex, LowIndex)
                Correct_LowPivot :=  LowValue                         
        else if (ArrayType.get(ArrayType.size() - 1)) == "H" or 
             (ArrayType.get(ArrayType.size() - 1)) == "HH" or 
             (ArrayType.get(ArrayType.size() - 1)) == "LH"
            if (ArrayValue.get(ArrayValue.size() - 1)) < HighValue
                array.remove(ArrayType,ArrayType.size() - 1)
                array.remove(ArrayValue,ArrayValue.size() - 1)
                array.remove(ArrayIndex,ArrayIndex.size() - 1)
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H")///////////////////////////////Here
                array.push(ArrayValue, HighValue)
                array.push(ArrayIndex, HighIndex)
                Correct_HighPivot := HighValue               
else if LowPivot 
    if ArrayType.size() == 0
        array.insert(ArrayType, 0, "L")
        array.insert(ArrayValue, 0, LowValue)
        array.insert(ArrayIndex, 0, LowIndex)
        Correct_LowPivot :=  LowValue
    else if ArrayType.size() >= 1
        if (ArrayType.get(ArrayType.size() - 1)) == "H" or 
             (ArrayType.get(ArrayType.size() - 1)) == "HH" or 
             (ArrayType.get(ArrayType.size() - 1)) == "LH"
            if LowPivot < ArrayValue.get(ArrayType.size() - 1)
                array.push(ArrayType,ArrayType.size()>2?  ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                array.push(ArrayValue, LowValue)
                array.push(ArrayIndex, LowIndex)
                Correct_LowPivot :=  LowValue
            else if LowPivot > ArrayValue.get(ArrayType.size() - 1)
                array.remove(ArrayType,ArrayType.size() - 1)
                array.remove(ArrayValue,ArrayValue.size() - 1)
                array.remove(ArrayIndex,ArrayIndex.size() - 1)
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < HighValue ? "HH" : "LH" : "H")///////////////////////////////Here
                array.push(ArrayValue, HighValue)
                array.push(ArrayIndex, HighIndex)
                Correct_HighPivot := HighValue                        
        else if (ArrayType.get(ArrayType.size() - 1)) == "L" or 
             (ArrayType.get(ArrayType.size() - 1)) == "HL" or 
             (ArrayType.get(ArrayType.size() - 1)) == "LL"
            if (ArrayValue.get(ArrayValue.size() - 1)) > LowValue
                array.remove(ArrayType,ArrayType.size() - 1)
                array.remove(ArrayValue,ArrayValue.size() - 1)
                array.remove(ArrayIndex,ArrayIndex.size() - 1) 
                array.push(ArrayType,ArrayType.size()>2? ArrayValue.get(ArrayType.size() - 2) < LowValue ? "HL" : "LL" : "L")///////////////////////////////Here
                array.push(ArrayValue, LowValue)
                array.push(ArrayIndex, LowIndex)
                Correct_LowPivot :=  LowValue

    //{Zig Zag Advance}

        //first Major & Minor Detector
if ArrayType.size() ==  2
    if ArrayType.get(0) == 'H'
        Major_HighLevel := ArrayValue.get(0)
        Major_LowLevel  := ArrayValue.get(1)
        Major_HighIndex := ArrayIndex.get(0)
        Major_LowIndex  := ArrayIndex.get(1)
        Major_HighType := ArrayType.get(0)
        Major_LowType  := ArrayType.get(1)
    else if ArrayType.get(0) == 'L'
        Major_HighLevel := ArrayValue.get(1)
        Major_LowLevel  := ArrayValue.get(0) 
        Major_HighIndex := ArrayIndex.get(1)
        Major_LowIndex  := ArrayIndex.get(0)
        Major_HighType := ArrayType.get(1)
        Major_LowType  := ArrayType.get(0)

        //Making Copies of Arrays


if  ArrayValue.size() == 1
    if Lock0
        array.insert(ArrayTypeAdv ,0 ,'M' +  ArrayType.get(0))
        array.insert(ArrayValueAdv,0 ,ArrayValue.get(0))
        array.insert(ArrayIndexAdv,0 ,ArrayIndex.get(0))   
        Lock0 := false

if  ArrayValue.size() == 2
    if Lock1
        array.insert(ArrayTypeAdv ,1 ,'M' +  ArrayType.get(1))
        array.insert(ArrayValueAdv,1 ,ArrayValue.get(1))
        array.insert(ArrayIndexAdv,1 ,ArrayIndex.get(1))   
        Lock1 := false

if ArrayValue.size() > 1
    if ArrayValue.get(ArrayValue.size()-1)[1] != ArrayValue.get(ArrayValue.size()-1)
        if str.substring(ArrayType.get(ArrayType.size()-1)[1], str.length(ArrayType.get(ArrayType.size()-1))-1) != 
             str.substring(ArrayType.get(ArrayType.size()-1), str.length(ArrayType.get(ArrayType.size()-1))-1)
            array.push(ArrayTypeAdv ,'m' +  ArrayType.get(ArrayType.size()   - 1))
            array.push(ArrayValueAdv, ArrayValue.get(ArrayValue.size() - 1))
            array.push(ArrayIndexAdv, ArrayIndex.get(ArrayIndex.size() - 1))
        else if str.substring(ArrayType.get(ArrayType.size()-1)[1], str.length(ArrayType.get(ArrayType.size()-1))-1) == 
             str.substring(ArrayType.get(ArrayType.size()-1), str.length(ArrayType.get(ArrayType.size()-1))-1)
            array.remove(ArrayValueAdv, ArrayValueAdv.size() - 1)
            array.remove(ArrayIndexAdv, ArrayIndexAdv.size() - 1)
            array.push(ArrayValueAdv, ArrayValue.get(ArrayValue.size() - 1))
            array.push(ArrayIndexAdv, ArrayIndex.get(ArrayIndex.size() - 1))

        //All Major & Minor Pivot Detector 

if ArrayValueAdv.size() > 1
            //High Major Detector
    if close > Major_HighLevel
        if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mL'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('ML')
            Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHL'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M' + ArrayType.get(ArrayType.size() - 1))      
            Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) 
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLL'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M'  + ArrayType.get(ArrayType.size() - 1)) 
            Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLH' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHH' or 
             ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'MLH' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'MHH' 
            if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mHL'
                ArrayTypeAdv.remove(ArrayTypeAdv.size() - 2)
                ArrayTypeAdv.insert(ArrayValueAdv.size() - 2 , 'M' + ArrayType.get(ArrayType.size() - 2))      
                Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mLL'
                ArrayTypeAdv.remove(ArrayTypeAdv.size() - 2)
                ArrayTypeAdv.insert(ArrayValueAdv.size() - 2 , 'M' + ArrayType.get(ArrayType.size() - 2))
                Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if  ArrayValueAdv.get(ArrayValueAdv.size() - 1) > Major_HighLevel
        if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mH'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('MH')
            Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLH'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M' + ArrayType.get(ArrayType.size() - 1))  
            Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)     
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHH' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'MHH'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M' + ArrayType.get(ArrayType.size() - 1))
            Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)

            //Low Major Detector
    if close < Major_LowLevel
        if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mH'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('MH')
            Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLH'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M' +  ArrayType.get(ArrayType.size() - 1))      
            Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHH'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M' + ArrayType.get(ArrayType.size() - 1))
            Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHL' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLL' or 
             ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'MHL' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'MLL'
            if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mLH'
                ArrayTypeAdv.remove(ArrayTypeAdv.size() - 2)
                ArrayTypeAdv.insert(ArrayValueAdv.size() - 2 , 'M' + ArrayType.get(ArrayType.size() - 2))      
                Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mHH'
                ArrayTypeAdv.remove(ArrayTypeAdv.size() - 2)
                ArrayTypeAdv.insert(ArrayValueAdv.size() - 2 , 'M' + ArrayType.get(ArrayType.size() - 2))
                Major_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Major_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Major_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if ArrayValueAdv.get(ArrayValueAdv.size() - 1) < Major_LowLevel
        if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mL'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('ML')
            Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)

        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHL'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M' + ArrayType.get(ArrayType.size() - 1) ) 
            Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLL' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'MLL'
            ArrayTypeAdv.remove(ArrayTypeAdv.size() - 1)
            ArrayTypeAdv.push('M' + ArrayType.get(ArrayType.size() - 1))
            Major_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
            Major_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
            Major_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    //Get Pivot Data
        //Last Pivot Data
if ArrayTypeAdv.size() > 1
    LastPivotType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
    LastPivotIndex := ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
    LastPivotType02 := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
    LastPivotIndex02 := ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        //Major
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'MHH'
        MajorHighValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MajorHighIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MajorHighType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastMHH            :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)

    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'MLH'
        MajorHighValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MajorHighIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MajorHighType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastMLH            :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'MLL'
        MajorLowValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MajorLowIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MajorLowType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastMLL            :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'MHL'
        MajorLowValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MajorLowIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MajorLowType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastMHL            :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
    
        //Minor
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'mHH'
        MinorHighValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MinorHighIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MinorHighType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastmHH            :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'mLH'
        MinorHighValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MinorHighIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MinorHighType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastmLH            :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'mLL'
        MinorLowValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MinorLowIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MinorLowType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastmLL           :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) ==  'mHL'
        MinorLowValue01   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
        MinorLowIndex01   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
        MinorLowType01    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
        LastmHL           :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)

    //One to the Last Pivot Data
if ArrayTypeAdv.size() > 1
        //Major
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MHH'
        MajorHighValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MajorHighIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MajorHighType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MLH'
        MajorHighValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MajorHighIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MajorHighType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MLL'
        MajorLowValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MajorLowIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MajorLowType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MHL'
        MajorLowValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MajorLowIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MajorLowType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    
        //Minor
    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'mHH'
        MinorHighValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MinorHighIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MinorHighType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'mLH'
        MinorHighValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MinorHighIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MinorHighType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'mLL'
        MinorLowValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MinorLowIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MinorLowType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'mHL'
        MinorLowValue02   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
        MinorLowIndex02   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
        MinorLowType02    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

        // Change Pivot Type to Major
    if ArrayTypeAdv.get(ArrayTypeAdv.size()-2) != ArrayTypeAdv.get(ArrayTypeAdv.size()-2)[1] // Change Pivot Type to Major
        //Major
        if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MHH'
            MajorHighValue02Ch   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
            MajorHighIndex02Ch   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
            MajorHighType02Ch    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

        if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MLH'
            MajorHighValue02Ch   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
            MajorHighIndex02Ch   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
            MajorHighType02Ch    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

        if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MLL'
            MajorLowValue02Ch   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
            MajorLowIndex02Ch   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
            MajorLowType02Ch    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

        if  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) ==  'MHL'
            MajorLowValue02Ch   :=  ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
            MajorLowIndex02Ch   :=  ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
            MajorLowType02Ch    :=  ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    // Detecte Minor level

if ArrayTypeAdv.size() > 2  
    LockDetecteM_MinorLvL := 1
    if str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 1),'m') == 0 and
     str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 2),'m') == 0   and
     str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 3),'M') == 0
        if str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 1),'H') == 2
            Minor_HighLevel := ArrayValueAdv.get(ArrayTypeAdv.size() - 1)
            Minor_LowLevel  := ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
            Minor_HighIndex := ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
            Minor_LowIndex  := ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
            Minor_HighType  := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
            Minor_LowType   := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
        else if str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 1),'L') == 2
            Minor_HighLevel := ArrayValueAdv.get(ArrayTypeAdv.size() - 2)
            Minor_LowLevel  := ArrayValueAdv.get(ArrayTypeAdv.size() - 1) 
            Minor_HighIndex := ArrayIndexAdv.get(ArrayTypeAdv.size() - 2)
            Minor_LowIndex  := ArrayIndexAdv.get(ArrayTypeAdv.size() - 1)
            Minor_HighType  := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
            Minor_LowType   := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
    if LockDetecteM_MinorLvL == 1
        //High Minor Detector
        if close > Minor_HighLevel

            if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHL'     
                Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) 
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLL'
                Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLH' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHH'
                if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mHL'     
                    Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                    Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                    Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
                else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mLL'
                    Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                    Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                    Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
                    

        if  ArrayValueAdv.get(ArrayValueAdv.size() - 1) > Minor_HighLevel

            if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLH' 
                Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) 
                Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)                    
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHH'
                Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
                Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

        //Low Minor Detector
        if close < Minor_LowLevel

            if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLH'     
                Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHH'
                Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHL' or ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLL'
                if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mLH'     
                    Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                    Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                    Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
                else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 2) == 'mHH'
                    Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                    Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                    Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

        if ArrayValueAdv.get(ArrayValueAdv.size() - 1) < Minor_LowLevel
            if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mHL' 
                Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
                Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)
            else if ArrayTypeAdv.get(ArrayTypeAdv.size() - 1) == 'mLL' 
                Minor_LowLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 1)
                Minor_LowIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 1)
                Minor_LowType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 1)
                Minor_HighLevel := ArrayValueAdv.get(ArrayValueAdv.size() - 2)
                Minor_HighIndex := ArrayIndexAdv.get(ArrayIndexAdv.size() - 2)
                Minor_HighType := ArrayTypeAdv.get(ArrayTypeAdv.size() - 2)

    //Reset Minor Levels
    if str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 1),'M') == 0
        LockDetecteM_MinorLvL := 0
        Minor_HighLevel := na
        Minor_LowLevel  := na
        Minor_HighIndex := na
        Minor_LowIndex  := na
        Minor_HighType  := na
        Minor_LowType   := na
        InternalTrend   := 'No Trend'


    //ChoCh and BoS Detector
        //Bos and ChoCh Line
            //Major

if  ta.crossover(close , Major_HighLevel) and  LockBreak_M != Major_HighIndex // Bullish BoS Detector
    if (ExternalTrend == 'No Trend' or ExternalTrend == 'Up Trend')
        Bullish_Major_BoS := true
        BoS_MajorType.push('Bull Major BoS')
        BoS_MajorIndex.push(bar_index)
        LockBreak_M := Major_HighIndex
        ExternalTrend := 'Up Trend'
        if MajorBuBoSLine_Show == 'On'
            MajorLine_BoSBull     := line.new(Major_HighIndex, Major_HighLevel , bar_index , Major_HighLevel , style = MajorBuBoSLine_Style , color = MajorBuBoSLine_Color)
            MajorLabel_BoSBull    := label.new((Major_HighIndex + bar_index) / 2 , Major_HighLevel   , 
             text = 'Major BoS' , color = color.rgb(0,0,0,100), textcolor = color.black ,size = size.normal )
    else if ExternalTrend == 'Down Trend' // Bullish ChoCh Detector
        Bullish_Major_ChoCh := true
        ChoCh_MajorType.push('Bull Major ChoCh')
        ChoCh_MajorIndex.push(bar_index)
        LockBreak_M := Major_HighIndex
        ExternalTrend := 'Up Trend'
        if MajorBuChoChLine_Show == 'On'
            MajorLine_ChoChBull    := line.new(Major_HighIndex, Major_HighLevel , bar_index , Major_HighLevel , style = MajorBuChoChLine_Style , color = MajorBuChoChLine_Color)
            MajorLabel_ChoChBull   := label.new((Major_HighIndex + bar_index) / 2 , Major_HighLevel   , 
             text = 'Major ChoCh' , color = color.rgb(0,0,0,100), textcolor = color.black ,size = size.normal )
else
    Bullish_Major_ChoCh := false
    Bullish_Major_BoS   := false 


if  ta.crossunder(close, Major_LowLevel) and  LockBreak_M!= Major_LowIndex // Bearish BoS Detector
    if ExternalTrend == 'No Trend' or ExternalTrend == 'Down Trend'
        Bearish_Major_BoS := true
        BoS_MajorType.push('Bear Major BoS')
        BoS_MajorIndex.push(bar_index)
        LockBreak_M := Major_LowIndex
        ExternalTrend := 'Down Trend'
        if MajorBeBoSLine_Show == 'On'
            MajorLine_BoSBear     := line.new(Major_LowIndex, Major_LowLevel , bar_index , Major_LowLevel , style = MajorBeBoSLine_Style , color = MajorBeBoSLine_Color)
            MajorLabel_BoSBear    := label.new((Major_LowIndex + bar_index) / 2 , Major_LowLevel   , 
             text = 'Major BoS' , color = color.rgb(0,0,0,100), 
             textcolor = color.black , style = label.style_label_up ,size = size.normal)        
    else if ExternalTrend == 'Up Trend' // Bearish ChoCh Detector
        Bearish_Major_ChoCh := true
        ChoCh_MajorType.push('Bear Major ChoCh')
        ChoCh_MajorIndex.push(bar_index)
        LockBreak_M := Major_LowIndex
        ExternalTrend := 'Down Trend'
        if MajorBeChoChLine_Show == 'On'
            MajorLine_ChoChBear    := line.new(Major_LowIndex, Major_LowLevel , bar_index , Major_LowLevel , style = MajorBeChoChLine_Style , color = MajorBeChoChLine_Color)
            MajorLabel_ChoChBear   := label.new((Major_LowIndex + bar_index) / 2 , Major_LowLevel   , 
             text = 'Major ChoCh' , color = color.rgb(0,0,0,100), textcolor = color.black, style = label.style_label_up ,size = size.normal)
else 
    Bearish_Major_ChoCh := false 
    Bearish_Major_BoS   := false 


            //Minor

if  Minor_HighLevel < close  and  LockBreak_m != Minor_HighIndex // Bullish BoS Detector
    if (InternalTrend == 'No Trend' or InternalTrend == 'Up Trend') 
        Bullish_Minor_BoS   := true
        BoS_MinorType.push('Bull Minor BoS')
        BoS_MinorIndex.push(bar_index)
        LockBreak_m := Minor_HighIndex
        InternalTrend := 'Up Trend'
        if MinorBuBoSLine_Show  == 'On' 
            MinorLine_BoSBull     := line.new(Minor_HighIndex, Minor_HighLevel , bar_index , Minor_HighLevel , style = MinorBuBoSLine_Style , color = MinorBuBoSLine_Color)
            MinorLabel_BoSBull    := label.new((Minor_HighIndex + bar_index) / 2 , Minor_HighLevel   , text = 'Minor BoS' , color = color.rgb(0,0,0,100), textcolor = color.black ,size = size.tiny )        
    else if InternalTrend == 'Down Trend' // Bullish ChoCh Detector
        Bullish_Minor_ChoCh := true
        ChoCh_MinorType.push('Bull Minor ChoCh')
        ChoCh_MinorIndex.push(bar_index)
        LockBreak_m := Minor_HighIndex
        InternalTrend := 'Up Trend'
        if MinorBuChoChLine_Show  == 'On'         
            MinorLine_ChoChBull    := line.new(Minor_HighIndex, Minor_HighLevel , bar_index , Minor_HighLevel , style = MinorBuChoChLine_Style , color = MinorBuChoChLine_Color)
            MinorLabel_ChoChBull   := label.new((Minor_HighIndex + bar_index) / 2 , Minor_HighLevel   , text = 'Minor ChoCh' , color = color.rgb(0,0,0,100), textcolor = color.black ,size = size.tiny )
else 
    Bullish_Minor_ChoCh := false
    Bullish_Minor_BoS   := false


if  Minor_LowLevel > close and  LockBreak_m!= Minor_LowIndex // Bearish BoS Detector
    if InternalTrend == 'No Trend' or InternalTrend == 'Down Trend'
        Bearish_Minor_BoS   := true
        BoS_MinorType.push('Bear Minor BoS')
        BoS_MinorIndex.push(bar_index)
        LockBreak_m := Minor_LowIndex
        InternalTrend := 'Down Trend'
        if MinorBeBoSLine_Show  == 'On' 
            MinorLine_BoSBear     := line.new(Minor_LowIndex, Minor_LowLevel , bar_index , Minor_LowLevel , style = MinorBeBoSLine_Style , color = MinorBeBoSLine_Color)
            MinorLabel_BoSBear    := label.new((Minor_LowIndex + bar_index) / 2 , Minor_LowLevel   , text = 'Minor BoS' , color = color.rgb(0,0,0,100), 
             textcolor = color.black , style = label.style_label_up ,size = size.tiny) 
    else if InternalTrend == 'Up Trend' // Bearish ChoCh Detector
        Bearish_Minor_ChoCh := true
        ChoCh_MinorType.push('Bear Minor ChoCh')
        ChoCh_MinorIndex.push(bar_index)
        LockBreak_m := Minor_LowIndex
        InternalTrend := 'Down Trend'
        if MinorBeChoChLine_Show  == 'On' 
            MinorLine_ChoChBear    := line.new(Minor_LowIndex, Minor_LowLevel , bar_index , Minor_LowLevel , style = MinorBeChoChLine_Style , color = MinorBeChoChLine_Color)
            MinorLabel_ChoChBear   := label.new((Minor_LowIndex + bar_index) / 2 , Minor_LowLevel   , text = 'Minor ChoCh' , color = color.rgb(0,0,0,100), 
             textcolor = color.black, style = label.style_label_up ,size = size.tiny)
else
    Bearish_Minor_ChoCh := false
    Bearish_Minor_BoS   := false
    

    //Support and Resistance Line

    //Drawing Major Resistance Line
if Major_HighIndex != Major_HighIndex[1] and LastMajorResistanceLine_Show == 'On'
    Resistance_LineMajor := line.new(Major_HighIndex,Major_HighLevel , Major_HighIndex + 1 , Major_HighLevel , style = LastMajorResistanceLine_Style ,color = LastMajorResistanceLine_Color)
    line.delete(Resistance_LineMajor[1])

if Major_HighIndex == Major_HighIndex[1] and high < Major_HighLevel
    line.set_x2(Resistance_LineMajor, bar_index + 1 )
else if Major_HighIndex == Major_HighIndex[1] and high > Major_HighLevel
    line.delete(Resistance_LineMajor)

//Drawing Major Support Line
if Major_LowIndex != Major_LowIndex[1] and LastMajorSupportLine_Show == 'On'
    Support_LineMajor := line.new(Major_LowIndex,Major_LowLevel , Major_LowIndex + 1 , Major_LowLevel, style = LastMajorSupportLine_Style ,color = LastMajorSupportLine_Color)
    line.delete(Support_LineMajor[1])

if Major_LowIndex == Major_LowIndex[1] and low > Major_LowLevel
    line.set_x2(Support_LineMajor, bar_index + 1 )
else if Major_LowIndex == Major_LowIndex[1] and low < Major_LowLevel
    line.delete(Support_LineMajor)


//Drawing Minor Resistance Line
if Minor_HighIndex != Minor_HighIndex[1] and LastMinorResistanceLine_Show == 'On'
    Resistance_LineMinor := line.new(Minor_HighIndex,Minor_HighLevel , Minor_HighIndex + 1 , Minor_HighLevel , style = LastMinorResistanceLine_Style, color = LastMinorResistanceLine_Color )
    line.delete(Resistance_LineMinor[1])

if Minor_HighIndex == Minor_HighIndex[1] and high < Minor_HighLevel
    line.set_x2(Resistance_LineMinor, bar_index + 1 )
else if Minor_HighIndex == Minor_HighIndex[1] and high > Minor_HighLevel
    line.delete(Resistance_LineMinor)
else if ArrayTypeAdv.size() > 0
    if str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 1),'M') == 0
        line.delete(Resistance_LineMinor)


//Drawing Minor Support Line
if Minor_LowIndex != Minor_LowIndex[1] and LastMinorSupportLine_Show == 'On'
    Support_LineMinor := line.new(Minor_LowIndex,Minor_LowLevel , Minor_LowIndex + 1 , Minor_LowLevel , style = LastMinorSupportLine_Style, color = LastMinorSupportLine_Color)
    line.delete(Support_LineMinor[1])

if Minor_LowIndex == Minor_LowIndex[1] and low > Minor_LowLevel
    line.set_x2(Support_LineMinor, bar_index + 1 )
else if (Minor_LowIndex == Minor_LowIndex[1] and low < Minor_LowLevel)
    line.delete(Support_LineMinor)
else if ArrayTypeAdv.size() > 0
    if str.pos(ArrayTypeAdv.get(ArrayTypeAdv.size() - 1),'M') == 0
        line.delete(Support_LineMinor)


//Order Block Data
    //Demand Major Main and Sub Order Blocks Data , ChoCh Origin

if ArrayIndexAdv.size() > 4 
    ChBuLowest := ta.lowest(bar_index - LastMLL)
    for i = 0 to bar_index - LastMLL
        if low[i] > ChBuLowest
            CorrectBuIndex :=  CorrectBuIndex + 1
        else     
            CorrectBuIndex := 0 

    ChBuLowest := ta.lowest(bar_index - LastPivotIndex02)
    for i = 0 to bar_index - LastPivotIndex02
        if low[i] > ChBuLowest
            CorrectBuIndexSub :=  CorrectBuIndexSub + 1
        else     
            CorrectBuIndexSub := 0

if Bullish_Major_ChoCh and ArrayIndexAdv.size() > 2
    Last02MLL := LastMLL[1]
    if LastPivotType == 'MLL' and low[bar_index - LastMLL] <= ChBuLowest
        if LastPivotType == LastPivotType[1] 
            BuMChMain_Trigger := true
            BuMChMain_Index     := LastMLL

        else if LastPivotType != LastPivotType[1] //Change Last Pivot from mLL to MLL
            if low[bar_index - Last02MLL] < low[bar_index - LastMLL]
                BuMChMain_Trigger := true
                BuMChMain_Index     := Last02MLL               
                BuMChSub_Trigger := true
                BuMChSub_Index     := LastMLL
                
            else if low[bar_index - Last02MLL] > low[bar_index - LastMLL]
                BuMChMain_Trigger := true
                BuMChMain_Index     := LastMLL
              
    else if LastPivotType == 'MLL' and low[bar_index - LastMLL] > ChBuLowest
        if LastPivotType == LastPivotType[1] 
            BuMChMain_Trigger := true
            BuMChMain_Index     := LastMLL+ CorrectBuIndex

        else if LastPivotType != LastPivotType[1] //Change Last Pivot from mLL to MLL
            BuMChMain_Trigger  := true
            BuMChMain_Index     := LastMLL+ CorrectBuIndex
            if LastMHL > LastMLL + CorrectBuIndex
                BuMChSub_Trigger := true
                BuMChSub_Index     := LastMLL

    else if LastPivotType == 'MHL' and low[bar_index - LastMLL] <= ChBuLowest
        BuMChMain_Trigger := true
        BuMChMain_Index     := LastMLL
        BuMChSub_Trigger := true
        BuMChSub_Index     := LastMHL
    
    else if LastPivotType == 'MHL' and low[bar_index - LastMLL] > ChBuLowest
        BuMChMain_Trigger := true
        BuMChMain_Index     := LastMLL + CorrectBuIndex

        if LastMHL > LastMLL + CorrectBuIndex
            BuMChSub_Trigger := true
            BuMChSub_Index     := LastMHL
 
    else if LastPivotType == 'mHH' or LastPivotType == 'mLH'  or LastPivotType == 'MLH'  or LastPivotType == 'MHH' 
        if low[bar_index - LastMLL] <= ChBuLowest
            if LastPivotIndex02 == LastMLL
                BuMChMain_Trigger := true
                BuMChMain_Index     := LastMLL
    
            else if LastPivotIndex02 > LastMLL
                BuMChMain_Trigger := true
                BuMChMain_Index     := LastMLL
                if low[bar_index - LastPivotIndex02] <= ChBuLowestSub
                    BuMChSub_Trigger := true
                    BuMChSub_Index     := LastPivotIndex02  
                else if   low[bar_index - LastPivotIndex02] > ChBuLowestSub       
                    BuMChSub_Trigger := true
                    BuMChSub_Index     := LastPivotIndex02 +  CorrectBuIndexSub       
            else if LastPivotIndex02 < LastMLL
                BuMChMain_Trigger := true
                BuMChMain_Index     := LastMLL

        else if  low[bar_index - LastMLL] > ChBuLowest
            BuMChMain_Trigger   := true
            BuMChMain_Index     := LastMLL  + CorrectBuIndex
else
    BuMChMain_Trigger := false
    BuMChSub_Trigger  := false


    //Demand Major Order Blocks Data ,BoS Origin

if ArrayIndexAdv.size() > 10 
    BoSBuLowest := ta.lowest(bar_index - LastPivotIndex)
    for i = 0 to bar_index - LastPivotIndex
        if low[i] > BoSBuLowest
            CorrectBuBoSIndex :=  CorrectBuBoSIndex + 1
        else     
            CorrectBuBoSIndex := 0 

if ArrayIndexAdv.size() > 10
    BoSBuLowest02 := ta.lowest(bar_index - LastPivotIndex02)
    for i = 0 to bar_index - LastPivotIndex02
        if low[i] > BoSBuLowest02
            CorrectBuBoSIndex02 :=  CorrectBuBoSIndex02 + 1
        else     
            CorrectBuBoSIndex02 := 0 


if Bullish_Major_BoS and ArrayIndexAdv.size() > 2 

    if (LastPivotType == 'MHL' or LastPivotType == 'mHL' or 
         LastPivotType == 'MLL' or LastPivotType == 'mLL') and low[bar_index - LastPivotIndex] <= BoSBuLowest

        BuMBoS_Trigger := true
        BuMBoS_Index   := LastPivotIndex 

    if (LastPivotType == 'MHL' or LastPivotType == 'mHL' or 
         LastPivotType == 'MLL' or LastPivotType == 'mLL') and low[bar_index - LastPivotIndex] > BoSBuLowest

        BuMBoS_Trigger := true
        BuMBoS_Index   := LastPivotIndex + CorrectBuBoSIndex    

    if (LastPivotType == 'mHH' or LastPivotType == 'mLH' or 
     LastPivotType == 'MHH' or LastPivotType == 'MLH') and low[bar_index - LastPivotIndex02] <= BoSBuLowest02

        BuMBoS_Trigger := true
        BuMBoS_Index   := LastPivotIndex02

    if (LastPivotType == 'mHH' or LastPivotType == 'mLH' or 
     LastPivotType == 'MHH' or LastPivotType == 'MLH') and low[bar_index - LastPivotIndex02] > BoSBuLowest02

        BuMBoS_Trigger := true
        BuMBoS_Index   := LastPivotIndex02 + CorrectBuBoSIndex02

else
    BuMBoS_Trigger := false


    //Supply Major Main and Sub Order Blocks Data , ChoCh Origin

if ArrayIndexAdv.size() > 4 
    ChBeHighest := ta.highest(bar_index - LastMHH)
    for i = 0 to bar_index - LastMHH
        if high[i] < ChBeHighest
            CorrectBeIndex :=  CorrectBeIndex + 1
        else     
            CorrectBeIndex := 0 

    ChBeHighestSub := ta.highest(bar_index - LastPivotIndex02)
    for i = 0 to bar_index - LastPivotIndex02
        if high[i] < ChBeHighestSub
            CorrectBeIndexSub :=  CorrectBeIndexSub + 1
        else     
            CorrectBeIndexSub := 0 


if Bearish_Major_ChoCh and ArrayIndexAdv.size() > 2
    Last02MHH := LastMHH[1]
    if LastPivotType == 'MHH' and high[bar_index - LastMHH] >= ChBeHighest
        if LastPivotType == LastPivotType[1]
            BeMChMain_Trigger :=  true
            BeMChMain_Index   :=  LastMHH

        else if LastPivotType != LastPivotType[1] //Change Last Pivot from MHH to MHH
            if high[bar_index - Last02MHH] > high[bar_index - LastMHH]
                BeMChMain_Trigger := true
                BeMChMain_Index   := Last02MHH
                BeMChSub_Trigger  := true
                BeMChSub_Index    := LastMHH

            else if high[bar_index - Last02MHH] < high[bar_index - LastMHH]
                BeMChMain_Trigger :=  true
                BeMChMain_Index   :=  LastMHH

    else if LastPivotType == 'MHH' and high[bar_index - LastMHH] < ChBeHighest
        if LastPivotType == LastPivotType[1] 
            BeMChMain_Trigger :=  true
            BeMChMain_Index   :=  LastMHH + CorrectBeIndex

        else if LastPivotType != LastPivotType[1] //Change Last Pivot from MHH to MHH
            BeMChMain_Trigger :=  true
            BeMChMain_Index   :=  LastMHH + CorrectBeIndex
            if  LastMLH > LastMHH + CorrectBuIndex
                BeMChSub_Trigger  := true
                BeMChSub_Index    := LastMHH


    else if LastPivotType == 'MLH' and  high[bar_index - LastMHH] >= ChBeHighest
        
        BeMChMain_Trigger :=  true
        BeMChMain_Index   :=  LastMHH
        BeMChSub_Trigger  :=  true
        BeMChSub_Index    :=  LastMLH

    else if LastPivotType == 'MLH' and high[bar_index - LastMHH] < ChBeHighest
        BeMChMain_Trigger :=  true
        BeMChMain_Index   :=  LastMHH + CorrectBeIndex

        if LastMLH > LastMHH + CorrectBeIndex
            BeMChSub_Trigger  := true
            BeMChSub_Index    := LastMLH

    else if LastPivotType == 'mLL' or LastPivotType == 'mHL' or LastPivotType == 'MHL' or  LastPivotType == 'MLL'
        if high[bar_index - LastMHH] >= ChBeHighest
            if LastPivotIndex02 == LastMHH
                BeMChMain_Trigger :=  true
                BeMChMain_Index   :=  LastMHH
    
            else if LastPivotIndex02 > LastMHH
                BeMChMain_Trigger  :=  true
                BeMChMain_Index   :=  LastMHH
                if high[bar_index -  LastPivotIndex02] >= ChBeHighestSub
                    BeMChSub_Trigger  := true
                    BeMChSub_Index    := LastPivotIndex02
                else if high[bar_index - LastPivotIndex02] < ChBeHighestSub
                    BeMChSub_Trigger  := true
                    BeMChSub_Index    := LastPivotIndex02 + CorrectBeIndexSub            

            else if LastPivotIndex02 < LastMHH
                BeMChMain_Trigger :=  true
                BeMChMain_Index   :=  LastMHH
        else if high[bar_index - LastMHH] < ChBeHighest
            BeMChMain_Trigger :=  true
            BeMChMain_Index   :=  LastMHH + CorrectBeIndex
else 
    BeMChMain_Trigger :=  false
    BeMChSub_Trigger  :=  false


    //Supply Major Order Blocks Data , BoS Origin

if ArrayIndexAdv.size() > 10 
    BoSBeHighest = ta.highest(bar_index - LastPivotIndex)
    for i = 0 to bar_index - LastPivotIndex
        if high[i] < BoSBeHighest
            CorrectBeBoSIndex :=  CorrectBeBoSIndex + 1
        else     
            CorrectBeBoSIndex := 0 

if ArrayIndexAdv.size() > 10 
    BoSBeHighest02 = ta.highest(bar_index - LastPivotIndex02)
    for i = 0 to bar_index - LastPivotIndex02
        if high[i] < BoSBeHighest02
            CorrectBeBoSIndex02 :=  CorrectBeBoSIndex02 + 1
        else     
            CorrectBeBoSIndex02 := 0 

if Bearish_Major_BoS and ArrayIndexAdv.size() > 2  

    if (LastPivotType == 'mLH' or LastPivotType == 'mHH' or 
         LastPivotType == 'MLH' or LastPivotType == 'MHH') and high[bar_index - LastPivotIndex] >= BoSBeHighest
        BeMBoS_Trigger := true
        BeMBoS_Index    := LastPivotIndex
    
    if (LastPivotType == 'mLH' or LastPivotType == 'mHH' or 
         LastPivotType == 'MLH' or LastPivotType == 'MHH') and high[bar_index - LastPivotIndex] < BoSBeHighest
        BeMBoS_Trigger := true
        BeMBoS_Index     := LastPivotIndex + CorrectBeBoSIndex

    if (LastPivotType == 'mLL' or LastPivotType == 'mHL' or 
     LastPivotType == 'MLL' or LastPivotType == 'MHL') and high[bar_index - LastPivotIndex02] >= BoSBeHighest02
        BeMBoS_Trigger := true
        BeMBoS_Index     := LastPivotIndex02

    if (LastPivotType == 'mLL' or LastPivotType == 'mHL' or 
     LastPivotType == 'MLL' or LastPivotType == 'MHL') and high[bar_index - LastPivotIndex02] < BoSBeHighest02
        BeMBoS_Trigger := true
        BeMBoS_Index     := LastPivotIndex02 + CorrectBeBoSIndex02

else 
    BeMBoS_Trigger := false


////////////////////////////////////////////////////
///////////////Order Block Refinement///////////////
////////////////////////////////////////////////////

    //Demand
        //Demand Main Zone, ChoCh Origin
[BuMChMain_Xd1, BuMChMain_Xd2, BuMChMain_Yd12, BuMChMain_Xp1, BuMChMain_Xp2, BuMChMain_Yp12] = 
 Refiner.OBRefiner('Demand', RefineDmainCh ? 'On' : 'Off', RefineMeDmainCh ,BuMChMain_Trigger,  BuMChMain_Index)
        //Demand Sub Zone, ChoCh Origin
[BuMChSub_Xd1 , BuMChSub_Xd2 ,  BuMChSub_Yd12, BuMChSub_Xp1 , BuMChSub_Xp2 , BuMChSub_Yp12] = 
 Refiner.OBRefiner('Demand', RefineDsubCh ? 'On' : 'Off', RefineMeDsubCh ,BuMChSub_Trigger,  BuMChSub_Index)
        //Demand All Zone, BoS Origin
[BuMBoS_Xd1, BuMBoS_Xd2, BuMBoS_Yd12, BuMBoS_Xp1, BuMBoS_Xp2, BuMBoS_Yp12] = 
 Refiner.OBRefiner('Demand', RefineDBoS ? 'On' : 'Off', RefineMeDBoS,BuMBoS_Trigger, BuMBoS_Index)

    //Supply
        //Supply Main Zone, ChoCh Origin    
[BeMChMain_Xd1, BeMChMain_Xd2, BeMChMain_Yd12, BeMChMain_Xp1, BeMChMain_Xp2, BeMChMain_Yp12] = 
 Refiner.OBRefiner('Supply', RefineSmainCh ? 'On' : 'Off', RefineMeSmainCh ,BeMChMain_Trigger,  BeMChMain_Index)
        //Supply Sub Zone, ChoCh Origin
[BeMChSub_Xd1 , BeMChSub_Xd2 ,  BeMChSub_Yd12, BeMChSub_Xp1 , BeMChSub_Xp2 , BeMChSub_Yp12] = 
 Refiner.OBRefiner('Supply', RefineSsubCh ? 'On' : 'Off', RefineMeSsubCh ,BeMChSub_Trigger,  BeMChSub_Index)
        //Supply All Zone, BoS Origin
[BeMBoS_Xd1, BeMBoS_Xd2, BeMBoS_Yd12, BeMBoS_Xp1, BeMBoS_Xp2, BeMBoS_Yp12] = 
 Refiner.OBRefiner('Supply', RefineSBoS ? 'On' : 'Off', RefineMeSBoS,BeMBoS_Trigger, BeMBoS_Index)


/////////////////////////////////////
///////////////Drawing///////////////
/////////////////////////////////////

        //OUTPUT ==> Alert Trigger
[Alert_DMMM] = Drawing.OBDrawing('Demand', BuMChMain_Trigger ,BuMChMain_Yd12, BuMChMain_Yp12 ,BuMChMain_Xd1 , OBVaP  , ShowDmainCh, ColorDmainCh)
[Alert_DSMM] = Drawing.OBDrawing('Demand', BuMChSub_Trigger  ,BuMChSub_Yd12 , BuMChSub_Yp12  ,BuMChSub_Xd1  , OBVaP  , ShowDsubCh , ColorDsubCh)
[Alert_DAMM] = Drawing.OBDrawing('Demand', BuMBoS_Trigger    , BuMBoS_Yd12  , BuMBoS_Yp12    , BuMBoS_Xd1   , OBVaP  , ShowDBoS   , ColorDBoS )

[Alert_SMMM] = Drawing.OBDrawing('Supply', BeMChMain_Trigger ,BeMChMain_Yd12, BeMChMain_Yp12 ,BeMChMain_Xd1, OBVaP   , ShowSmainCh, ColorSmainCh)
[Alert_SSMM] = Drawing.OBDrawing('Supply', BeMChSub_Trigger  ,BeMChSub_Yd12 , BeMChSub_Yp12  ,BeMChSub_Xd1 , OBVaP   , ShowSsubCh , ColorSsubCh)
[Alert_SAMM] = Drawing.OBDrawing('Supply', BeMBoS_Trigger    , BeMBoS_Yd12  , BeMBoS_Yp12    ,BeMBoS_Xd1   , OBVaP   , ShowSBoS   , ColorSBoS )
 
/////////////////////////////////
///////////////FVG///////////////
/////////////////////////////////

FVG.FVGDetector(PFVGFilter ? 'On' : 'Off' , PFVGFilterType, PShowDeFVG, PShowSuFVG)


///////////////////////////////////////
///////////////Liquidity///////////////
///////////////////////////////////////

Liq.LLF(SPP,DPP,SLLS,DLLS,ShowSHLL,ShowSLLL,ShowDHLL,ShowDLLL)

///////////////////////////////////
///////////////Alert///////////////
///////////////////////////////////

Alert.AlertSender(Alert_DMMM  , Alert_DMM, AlertName, 'Bullish', 'Order Block Signal', 'Full' ,Frequncy, UTC, MoreInfo, MessageBull_DMM, open, high, low, close,0,0,0, BuMChMain_Yd12 , BuMChMain_Yp12)
Alert.AlertSender(Alert_DSMM  , Alert_DSM, AlertName, 'Bullish', 'Order Block Signal', 'Full' ,Frequncy, UTC, MoreInfo, MessageBull_DSM, open, high, low, close,0,0,0, BuMChSub_Yd12  , BuMChSub_Yp12)
Alert.AlertSender(Alert_DAMM  , Alert_DAM, AlertName, 'Bullish', 'Order Block Signal', 'Full' ,Frequncy, UTC, MoreInfo, MessageBull_DAM, open, high, low, close,0,0,0, BuMBoS_Yd12    , BuMBoS_Yp12)

Alert.AlertSender(Alert_SMMM  , Alert_SMM, AlertName, 'Bearish', 'Order Block Signal', 'Full' ,Frequncy, UTC, MoreInfo, MessageBear_SMM, open, high, low, close,0,0,0, BeMChMain_Yd12 , BeMChMain_Yp12)
Alert.AlertSender(Alert_SSMM  , Alert_SSM, AlertName, 'Bearish', 'Order Block Signal', 'Full' ,Frequncy, UTC, MoreInfo, MessageBear_SSM, open, high, low, close,0,0,0, BeMChSub_Yd12  , BeMChSub_Yp12)
Alert.AlertSender(Alert_SAMM  , Alert_SAM, AlertName, 'Bearish', 'Order Block Signal', 'Full' ,Frequncy, UTC, MoreInfo, MessageBear_SAM, open, high, low, close,0,0,0, BeMBoS_Yd12    , BeMBoS_Yp12)

Overview

Smart Money Concept [TradingFinder] Major Minor OB + FVG (SMC) identifies demand and supply zones originating from ChoCh and BoS patterns, with separate main, sub, and all-zone categories. Users can toggle visibility and customize colors for each type. Refinement options allow defensive adjustments to blocks, while FVG detection includes filtering for very defensive gaps. The script draws boxes, labels, and lines directly on the price chart to highlight smart money concepts for potential trade entries.

Details

Published by

alvinng214 on GitHub

Code credit

TFlab, as written in the script's header

Type

Indicator, Pine Script v5

Draws

On the price chart

Category

SMC / ICT / price action, Support & resistance

Markets

Any symbol

Timeframes

Any timeframe

Risk Notes

No repainting, lookahead or stacked entries were found in its code or README. That says nothing about how well it works: test it first.

Settings

The inputs you can change from the gear icon on the chart. Defaults are the author's.

SettingTypeDefaultVariable
Pivot Period of Order Blocks Detectorint5PP
Order Block Validity Period (Bar)int500OBVaP
Demand Main Zone, "ChoCh" Origin.booltrueShowDmainCh
ColorDmainChcolorcolor.rgb(60, 176, 68, 65)ColorDmainCh
Demand Sub Zone, "ChoCh" Origin..booltrueShowDsubCh
ColorDsubChcolorcolor.rgb(123, 180, 227, 65)ColorDsubCh
Demand All Zone, "BoS" Origin.......booltrueShowDBoS
ColorDBoScolorcolor.rgb(153, 237, 195, 75)ColorDBoS
Supply Main Zone, "ChoCh" Origin...booltrueShowSmainCh
ColorSmainChcolorcolor.rgb(191, 10, 48 , 75)ColorSmainCh
Supply Sub Zone, "ChoCh" Origin....booltrueShowSsubCh
ColorSsubChcolorcolor.rgb(243, 189, 74, 75)ColorSsubCh
Show all 40 settings
SettingTypeDefaultVariable
Supply All Zone, "BoS" Origin.........booltrueShowSBoS
ColorSBoScolorcolor.rgb(255, 105, 97, 85)ColorSBoS
Refine Demand MainbooltrueRefineDmainCh
RefineMeDmainChstringDefensiveRefineMeDmainCh
Refine Demand Sub.booltrueRefineDsubCh
RefineMeDsubChstringDefensiveRefineMeDsubCh
Refine Demand BoS.booltrueRefineDBoS
RefineMeDBoSstringDefensiveRefineMeDBoS
Refine Supply Main..booltrueRefineSmainCh
RefineMeSmainChstringDefensiveRefineMeSmainCh
Refine Supply Sub...booltrueRefineSsubCh
RefineMeSsubChstringDefensiveRefineMeSsubCh
Refine Supply BoS...booltrueRefineSBoS
RefineMeSBoSstringDefensiveRefineMeSBoS
Show Demand FVGbooltruePShowDeFVG
Show Supply FVGbooltruePShowSuFVG
FVG Filter ............booltruePFVGFilter
PFVGFilterTypestringVery DefensivePFVGFilterType
Show Statics High Liquidity LinebooltrueShowSHLL
Show Statics Low Liquidity LinebooltrueShowSLLL
Show Dynamics High Liquidity LinebooltrueShowDHLL
Show Dynamics Low Liquidity LinebooltrueShowDLLL
Statics Period Pivotint8SPP
Dynamics Period Pivotint3DPP
Statics Liquidity Line Sensitivityfloat0.30SLLS
Dynamics Liquidity Line Sensitivityfloat1.00DLLS
Alerts NamestringSmart Money Concept [TradingFinder]AlertName
Alert Demand Main MitigationstringOnAlert_DMM
Third-party code. ForexR did not write, test or endorse this script, and the summary above was generated automatically from its code and README. Indicators describe the past, and a strategy's backtest can look better than live trading, especially when a script repaints. Check it in the Strategy Tester and on a demo account before you rely on it.

Similar Pine Scripts

ICT Equal Highs and Lows

by ArunKBhaskar
575 stars

This overlay indicator finds pivot highs and lows on the price chart and compares the last two highs and the last two lows. When the percentage difference between a pair is below the Equal HL threshold, it treats them as equal levels and draws a box. Left and

Indicator v5 SMC / ICT / price actionSupport & resistance
Updated 1 year ago · MPL-2.0 GitHub repository of ICT Equal Highs and Lows

DE-tracker

by Allen1212
303 stars

This indicator plots labels on the TradingView price chart to mark ARK Invest's buy and sell trades for the DE stock. Buy transactions appear in green with X1 or X2 multipliers showing the number of ARK ETFs involved on the same day; sells appear in red. The m

Indicator v4 Support & resistanceSMC / ICT / price action
Updated 2 years ago · None stated GitHub repository of DE-tracker

This Pine Script indicator plots a ZigZag on the price chart. It identifies reversal points when price moves more than a set percentage from the last pivot. The script calculates forecasts using zigzag data and labels detected geometric patterns including harm

Indicator v4 TrendSupport & resistance

Golden Bullet Strategy

by TradersPost
218 stars

The Golden Bullet Strategy is an overlay signal indicator based on Smart Money Concepts and time-based liquidity models. It identifies liquidity sweeps of a designated reference session range during a specified hunt window. It then confirms Market Structure Sh

Indicator v6 SMC / ICT / price actionSessions & time
Updated 3 months ago · None stated GitHub repository of Golden Bullet Strategy

Open Source Fractal

by cantolab
183 stars

This indicator implements the Fractal Model concept to plot market structure shifts, liquidity sweeps, and Change in State of Delivery (CISD) levels. It overlays custom higher-timeframe candle previews, open prices, and time markers directly on the price chart

Indicator v6 SMC / ICT / price actionSupport & resistance
Updated 2 months ago · MIT GitHub repository of Open Source Fractal

Swing Failure Signals

by Ganador1
154 stars

This indicator calculates pivot highs and pivot lows to detect liquidity sweeps and Swing Failure Patterns. It identifies when price breaks past recent key swing highs or lows within a configurable historical window, then looks for a quick reversal or change i

Indicator v6 SMC / ICT / price actionSupport & resistance
Updated 2 months ago · Apache-2.0 GitHub repository of Swing Failure Signals

More indicators

Trade Your Charts With a Regulated Broker

Compare brokers that connect to TradingView, with spreads, minimum deposits and leverage side by side.

Compare brokers