# How to take the inflection points on ZIG-ZAG indicator  [SOLVED]

Questions about MultiCharts and user contributed studies.
lois77
Posts: 23
Joined: 05 Aug 2012
Has thanked: 7 times

### How to take the inflection points on ZIG-ZAG indicator

Hi,

I would like some help from MS support, if possible, on how to take the inflection points of ZIG-ZAG indicator.
I need to code the last 3 inflection points in order to detect higher highs, lower highs, lower lows and higher lows.
I can't really figure out how to do it. It seems more complex than I thought.

Kind regards.

Henry MultiСharts
Posts: 9064
Joined: 25 Aug 2011
Has thanked: 1256 times
Been thanked: 2911 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Hello lois77,

Coordinates for the last inflection point are kept in variables var2, var3, var1 in the following condition in the study code:

Code: Select all

` if var6 then begin         var8 = TL_New( var2, var3, var1, var2[1], var3[1],var1[1] ) ;`

var1 = Price
var2 = Date
var3 = Time
These users thanked the author Henry MultiСharts for the post:
lois77

lois77
Posts: 23
Joined: 05 Aug 2012
Has thanked: 7 times

### Re: How to take the inflection points on ZIG-ZAG indicator  [SOLVED]

Hi Henry,

Many thanks for the explanation.
I guess I need to code an array and store all the inflection points in order to reference the last three whenever I need them.

Again, thank you very much.

Kind regards.

lois77
Posts: 23
Joined: 05 Aug 2012
Has thanked: 7 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Hi Henry.

After trying everything, I really couldn't make it.
I don't know how to take only the inflection points. The best I could do was to replicate the zigzag trend lines in an indicator but with intermediate points in some cases between the inflection points. In these cases, it doesn't work correctly.

Kind regards.

lois77
Posts: 23
Joined: 05 Aug 2012
Has thanked: 7 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Hi again.

Now I replicated the zigzag trend lines in an indicator only after the occurrence of the turning points, but I don't know why this code doesn't work when I try to use it as a function (without the plot code), and that is how I need it to work in order to implement a strategy on automated trading.
I picked the zigzag and modified it as following:

Code: Select all

`inputs:    Price( Close ),    RetracePnts( 34 ),    LineColor( Yellow ),    LineWidth( 1 ) ;variables:    var0( 0 ),    var1( Price ),                                            var2( Date ),                                            var3( Time ),                                            var4( 0 ),                                                            var5( false ),    var6( false ),    var7( false ),    var8( 0 ) ;                                                                               var0 = SwingHigh( 1, Price, 1, 2 ) ;if var0  <> -1 then    begin      condition1 = var4 <= 0 and var0 >= var1 + RetracePnts ;      if condition1 then                                               begin            var5 = true ;            var6 = true ;            var4 = 1 ;         end       else       begin          condition1 = var4 = 1 and var0 >= var1 ;         if condition1 then                                                   begin            var5 = true ;            var7 = true ;         end;      end ;   end else    begin   var0 = SwingLow( 1, Price, 1, 2 ) ;   if var0 <> -1 then       begin         condition1 = var4 >= 0 and var0 <= var1 - RetracePnts ;         if condition1 then                                                  begin            var5 = true ;            var6 = true ;            var4 = -1 ;         end          else          begin             condition1 = var4 = -1 and var0 <= var1 ;            if condition1 then                                                            begin               var5 = true;               var7 = true ;            end ;         end;      end ;   end ;if var5 then                                             begin   var1 = var0 ;   var2 = Date[1] ;   var3 = Time[1] ;   var5 = false ;   end ;if var6 then                                     begin   {var8 = TL_New( var2, var3, var1, var2[1], var3[1],     var1[1] ) ;}   value1 = Close[Findbar(var2[1], var3[1])] ;   plot1[Findbar(var2[1], var3[1])](value1) ;   {TL_SetExtLeft( var8, false ) ;   TL_SetExtRight( var8, false ) ;}   TL_SetSize( var8, LineWidth ) ;   TL_SetColor( var8, LineColor ) ;   var6 = false ;   {end else if var7 then                                            begin   TL_SetEnd( var8, var2, var3, var1 ) ;   var7 = false ;}   end ;`

I posted an image to see the replication of the zigzag in an indicator.
Some help would be nice on how to code this in a useful function.

Kind regards.
Attachments
Zigzag replication
MultiCharts1.png (48.7 KiB) Viewed 2006 times

SP
Posts: 453
Joined: 06 Feb 2006
Has thanked: 36 times
Been thanked: 283 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Function for ZigZag, you only need to change the RetracePct to RetracePoints for your needs.

_ZigZagV1

Code: Select all

`{  Function: _ZigZagV1    Customized based on the the built-in ZigZag % indicator.    Returns the price of the most recent ZigZag high or low.    Also plots ( using trend lines ) the ZigZag itself ( which would match the  ZigZag % indicator ) as well as the most recent ZigZag price.    You should refer to the built-in ZigZag % indicator to understand how to  set most of the inputs.   Newly added inputs are documented below.    }  inputs:      Price( Numeric ),      RetracePct( Numeric ),      ZigZagLineColor( Numeric ),        //  Color of ZigZag indicator    ZigZagPriceColor( Numeric ),       //  Color of most recent high/low ZigZag price returned by this function    LineWidth( Numeric ),     oReversingBar( NumericRef ),      //  The bar at which the most recent ZigZag high/low occurred    PlotTrendLine( TrueFalseSimple ),   //  Plot the ZigZag indicator using trend lines    PlotZigZagPrice( TrueFalseSimple ) ;//  Plot the ZigZag price using trend lines   variables:      NewSwingPrice( 0 ),      SwingPrice( Price ),      SwingDate( Date ),      SwingTime( Time ),      SwingBar( 0 ),    TLDir( 0 ),      RetraceFctrUp( 1 + RetracePct * .01 ),      RetraceFctrDn( 1 - RetracePct * .01 ),      SaveSwing( false ),      AddTL( false ),      UpdateTL( false ),      TLRef( 0 ),     HoldZigZag( 0 ),    ZigZagTLID( 0 ) ;   //  Most of this logic and code is identical to the built-in ZigZag % indicator. //  Comments show where changes have been made. NewSwingPrice = SwingHigh( 1, Price, 1, 2 ) ;  if NewSwingPrice  <> -1 then      begin     if TLDir <= 0 and NewSwingPrice >= SwingPrice * RetraceFctrUp then         begin        SaveSwing = true ;        AddTL = true ;        TLDir = 1 ;        end      else if TLDir = 1 and NewSwingPrice >= SwingPrice then         begin        SaveSwing = true ;        UpdateTL = true ;        end ;     end   else      begin     NewSwingPrice = SwingLow( 1, Price, 1, 2 ) ;     if NewSwingPrice <> -1 then         begin        if TLDir >= 0 and NewSwingPrice <= SwingPrice * RetraceFctrDn then            begin           SaveSwing = true ;           AddTL = true ;           TLDir = -1 ;           end         else if TLDir = -1 and NewSwingPrice <= SwingPrice then            begin           SaveSwing = true;           UpdateTL = true ;           end ;        end ;     end ;    if SaveSwing then      begin     SwingPrice = NewSwingPrice ;     SwingDate = Date[1] ;     SwingTime = Time[1] ;          //  Add SwingBar to capture the bar the swing occurred on     SwingBar  = CurrentBar - 1 ;          SaveSwing = false ;     end ;    if AddTL then      begin      //  Customized to allow plotting of ZigZag indicator to be turned off    if PlotTrendLine then       TLRef = TL_New( SwingDate, SwingTime, SwingPrice, SwingDate[1],                     SwingTime[1], SwingPrice[1] ) ;          //  Return the historical bar which the ZigZag reversed on     oReversingBar = SwingBar[1] ;        //  Capture and hold the most recent ZigZag price    HoldZigZag = SwingPrice[1] ;        //  Customized to allow plotting of ZigZag indicator to be turned off       if PlotTrendLine then       begin                                                      TL_SetExtLeft( TLRef, false ) ;        TL_SetExtRight( TLRef, false ) ;        TL_SetSize( TLRef, LineWidth ) ;        TL_SetColor( TLRef, ZigZagLineColor ) ;               end ;           AddTL = false ;         end       else if UpdateTL then      begin         //  Customized to allow plotting of ZigZag indicator to be turned off    if PlotTrendLine then          TL_SetEnd( TLRef, SwingDate, SwingTime, SwingPrice ) ;            UpdateTL = false ;         end ;   //  Added this logic to the built-in ZigZag % indicator to return the  //  current ZigZag high/low price ( this can lag the current bar by a wide margin )  //  and to plot the ZigZag price.  //  Return the most recent ZigZag high or low price _ZigZagV1 = HoldZigZag ;  //  Plot the ZigZag price if we have at least 2 ZigZag price values if PlotZigZagPrice and HoldZigZag[1] > 0 then    begin        ZigZagTLID = TL_New( Date[1], Time[1], HoldZigZag[1], Date, Time, HoldZigZag ) ;              Value2 = TL_SetColor( ZigZagTLID, ZigZagPriceColor ) ;    Value2 = TL_SetSize( ZigZagTLID, LineWidth ) ;         end ; `

Example how to use it in a strategy. This strategy enters long when the price touches the most recent high ZigZag price, and goes short when the price touches the most recent low ZigZag price.

Code: Select all

`inputs:       Price( Close ),      RetracePct( 5 ),      ZigZagLineColor( Yellow ),     ZigZagPriceColor( Magenta ),     LineWidth( 1 ),     PlotZigZag( true ),        PlotZigZagPrice( true ),        InvertEntries( false ),  //  Invert the entries from going long to short and vice-versa        PrintDebug( False ) ;    //  issue print statements to log file for debug      variables:    oZigZagBarOffset( 0 ),    ZigZagPrice( 0 ),    OldZigZagPrice( 0 ),    HighLow( 0 ),    MP( 0 ) ;     //  Get the current market position and ZigZag price MP = MarketPosition ; ZigZagPrice = _ZigZagV1( Price, RetracePct, ZigZagLineColor, ZigZagPriceColor, LineWidth, oZigZagBarOffset, PlotZigZag, PlotZigZagPrice ) ;  //  If the ZigZag price has changed since the last bar, capture the prior bar value, //  update whether the current ZigZag price is a high or low versus the prior ZigZag price, //  and exit an open positions. If ZigZagPrice <> ZigZagPrice[1] then    begin        OldZigZagPrice = ZigZagPrice[1] ;        //  Determine if the latest ZigZag is a high or low    if ZigZagPrice > OldZigZagPrice then       HighLow = 1    else       HighLow = -1 ;           //  If we are in a position then exit it.    //  Strategy  Automation allows us to place exit orders     //  for both a long and short and will only issue the    //  appropriate exit order.    if MP <> 0 then       begin              Sell at next bar at market ;       BuyToCover at next bar at market ;              end ;           end ;     //  If we have at least 2 ZigZag prices defined then ... if HighLow <> 0 and OldZigZagPrice[1] > 0 then     begin        //  If the most recent ZigZag price is a high    //  then Buy when the price crosses above it    //  and SellShort when the price crosses below the    //  prior ZigZag, which would be a low    if HighLow > 0 then       begin              if InvertEntries = false then          begin                    Buy at next bar at ZigZagPrice Stop ;          SellShort at next bar at OldZigZagPrice Stop ;                    end                 //  Invert the entries: Switch long to short and stop to limit orders       else          begin                    SellShort at next bar at ZigZagPrice Limit ;          buy at next bar at OldZigZagPrice Limit ;                 end ;                 end           //  If the most recent ZigZag price is a low    //  then SellShort when the price crosses below it    //  and buy when the price crosses above the    //  prior ZigZag, which would be a high           else       begin        If InvertEntries = false then          begin                    SellShort at next bar at ZigZagPrice Stop ;          Buy at next bar at OldZigZagPrice Stop ;                    end       else          begin                    Buy at next bar at ZigZagPrice Limit ;          SellShort at next bar at OldZigZagPrice Limit ;                    end ;              end ;           end ; `
These users thanked the author SP for the post (total 2):

lois77
Posts: 23
Joined: 05 Aug 2012
Has thanked: 7 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Hi.

SP, thank you very much.
I would like to ask what should be the initial value for "oReversingBar".
I think it is "SwingPrice[1]", but I get error when compiling.

Kind regards.

SP
Posts: 453
Joined: 06 Feb 2006
Has thanked: 36 times
Been thanked: 283 times

### Re: How to take the inflection points on ZIG-ZAG indicator

The o before a var like oReversingBar is the old TS mark for ref values. It should compile
with oReversingBar( NumericRef ) even it is not used in the strategy.

If you need more details of the swings like date,time and price you need to create a function
ZigZag2

Code: Select all

`inputs:      Price( numericseries ),      RetraceMethod( numericsimple ), {1 = percent, 2 = number}     retrace( numericsimple ),      LineColor( numericsimple ),      LineWidth( numericsimple ),      PlotLine( truefalse ),      SwingDate0( numericref ),     SwingTime0( numericref ),     SwingPrice0(numericref ),     SwingDate1( numericref ),     SwingTime1( numericref ),     SwingPrice1(numericref ) ;    variables:      NewSwingPrice( 0 ),      SwingPrice( Price ), { used as a convenient 2-element array }     SwingDate( Date ), { used as a convenient 2-element array }     SwingTime( Time ), { used as a convenient 2-element array }     TLDir( 0 ), { TLDir = -1 implies prev TL dn, +1 implies prev TL up }     RetraceFctrUp( 1 + retrace * .01 ),      RetraceFctrDn( 1 - retrace * .01 ),      SaveSwing( false ),      AddTL( false ),      UpdateTL( false ),      TLRef( 0 ),     ZigZagTrend( 0 ) ;    { Candidate swings are just-confirmed, 3-bar (Str=1), SwingHi's and SwingLo's }    NewSwingPrice = SwingHigh( 1, Price, 1, 2 ) ;  if NewSwingPrice  <> -1 then      begin     if (RetraceMethod = 1 and TLDir <= 0 and NewSwingPrice >= SwingPrice * RetraceFctrUp )         or ( RetraceMethod = 2 and TLDir <= 0 and NewSwingPrice >= SwingPrice + retrace )      then         { prepare to add new up TL }        begin        SaveSwing = true ;        AddTL = true ;        TLDir = 1 ;        end      else if TLDir = 1 and NewSwingPrice >= SwingPrice then         { prepare to update prev up TL }        begin        SaveSwing = true ;        UpdateTL = true ;        end ;     end   else      begin     NewSwingPrice = SwingLow( 1, Price, 1, 2 ) ;     if NewSwingPrice <> -1 then         begin        if (RetraceMethod = 1 and TLDir >= 0 and NewSwingPrice <= SwingPrice * RetraceFctrDn)             or (RetraceMethod = 2 and TLDir >= 0 and NewSwingPrice <= SwingPrice - retrace )        then            { prepare to add new dn TL }           begin           SaveSwing = true ;           AddTL = true ;           TLDir = -1 ;           end         else if TLDir = -1 and NewSwingPrice <= SwingPrice then            { prepare to update prev dn TL }           begin           SaveSwing = true;           UpdateTL = true ;           end ;        end ;     end ;    if SaveSwing then      { save new swing and reset SaveSwing }     begin     SwingPrice = NewSwingPrice ;     SwingDate = Date[1] ;     SwingTime = Time[1] ;     SaveSwing = false ;     end ;    if AddTL then      { add new TL and reset AddTL }     begin     if Plotline then        begin        TLRef = TL_New( SwingDate, SwingTime, SwingPrice, SwingDate[1], SwingTime[1],          SwingPrice[1] ) ;        TL_SetExtLeft( TLRef, false ) ;        TL_SetExtRight( TLRef, false ) ;        TL_SetSize( TLRef, LineWidth ) ;        TL_SetColor( TLRef, LineColor ) ;        SwingDate0 = SwingDate ;        SwingTime0 = SwingTime ;        SwingPrice0 = SwingPrice ;        SwingDate1 = SwingDate[1] ;        SwingTime1 = SwingTime[1] ;        SwingPrice1 = SwingPrice[1] ;        end ;     AddTL = false ;     end   else if UpdateTL then      { update prev TL and reset UpdateTL }     begin     if PlotLine then        begin        TL_SetEnd( TLRef, SwingDate, SwingTime, SwingPrice ) ;        SwingDate0 = SwingDate ;        SwingTime0 = SwingTime ;        SwingPrice0 = SwingPrice ;        end ;     UpdateTL = false ;     end ;  ZigZag2 = 1 ;     `

or you take a look at the attached indicator how to store the last swings into an array and show the point when the direction changed.
Attachments
ZigZag.pla
These users thanked the author SP for the post (total 2):

lois77
Posts: 23
Joined: 05 Aug 2012
Has thanked: 7 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Hi.

Once again, thanks for your help.

Your function _ZigZagV1 was really of my interest as it returns the turning points, so I could code some conditions and apply it on a strategy.
I set up the inputs, changed the Pct to Pnts code, but I couldn't solve the "oReversingBar" issue. My programming level is very basic. I just don't know how to get it working.

Kind regards.

earmarques
Posts: 13
Joined: 07 Dec 2013
Has thanked: 1 time
Been thanked: 1 time

### Re: How to take the inflection points on ZIG-ZAG indicator

Hi everyone!

Somebody knows how can I hide the dynamic TL of this indy?

Great indicator, thanks to StratMan!

MAtricks
Posts: 789
Joined: 09 Apr 2012
Has thanked: 286 times
Been thanked: 279 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Change: PlotZigZag( true ),
to: PlotZigZag( false),

gianluca71
Posts: 15
Joined: 22 Aug 2018
Has thanked: 2 times

### Re: How to take the inflection points on ZIG-ZAG indicator

Hi all,
I need a big help from somebody to assign in different variable the zigzag points.
As you can see from code below, I'd like to assign the last 4 values of zigzag to and current price to 5 different variables.
I tried with the following code, but when I print the values (point_a, point_b, point_c, point_d, point_e) only point_c and point_d are correct.
Thanks a lot in advance, regards

Code: Select all

```inputs: Price( Close ), RetracePnts( 34 ), LineColor( Yellow ), LineWidth( 1 ) ; variables: var0( 0 ), var1( Price ), var2( Date ), var3( Time ), var4( 0 ), var5( false ), var6( false ), var7( false ), var8( 0 ), point_a( 0 ), point_b( 0 ), point_c( 0 ), point_d( 0 ), point_e( 0 ); var0 = SwingHigh( 1, Price, 1, 2 ) ; if var0 <> -1 then begin condition1 = var4 <= 0 and var0 >= var1 + RetracePnts ; if condition1 then begin var5 = true ; var6 = true ; var4 = 1 ; end else begin condition1 = var4 = 1 and var0 >= var1 ; if condition1 then begin var5 = true ; var7 = true ; end; end ; end else begin var0 = SwingLow( 1, Price, 1, 2 ) ; if var0 <> -1 then begin condition1 = var4 >= 0 and var0 <= var1 - RetracePnts ; if condition1 then begin var5 = true ; var6 = true ; var4 = -1 ; end else begin condition1 = var4 = -1 and var0 <= var1 ; if condition1 then begin var5 = true; var7 = true ; end ; end; end ; end ; if var5 then begin var1 = var0 ; var2 = Date[1] ; var3 = Time[1] ; var5 = false ; end ; if var6 then // *********block for plot of zigzag********* begin value1 = Close[Findbar(var2[1], var3[1])] ; plot1[Findbar(var2[1], var3[1])](value1) ; var6 = false ; // *********assignment of last 4 values********* point_a = value1[3] ; point_b = value1[2] ; point_c = value1[1] ; point_d = value1[0] ; point_e = close ; // close of last bar (current price) print(point_b); // output print end ; ```