# Array Question (probably a dumb one)

Questions about MultiCharts and user contributed studies.
WarEagle
Posts: 36
Joined: 07 Nov 2006
Has thanked: 7 times

### Array Question (probably a dumb one)

Hi All,

here is a snippet of code taken from the trendlines automatic study that comes with MC.

Code: Select all

`begin                          for Value1 = 9 downto 0       begin      arr0[ Value1 + 1 ] = arr0[Value1] ;      arr1[ Value1 + 1 ] = arr1[Value1] ;      arr2[ Value1 + 1 ] = arr2[Value1] ;      end ;                                                                  arr0[0] = Date[SwHiStrength] ;   arr1[0] = Time[SwHiStrength] ;   arr2[0] = High[SwHiStrength] ;                                                                                     for Value2 = 1 to 10       begin      if arr2[Value2] > arr2[0] then          begin         var8 = Value2 ;         Value2 = 11 ;                                                                   print(value2);                                            end ;      end ;   if Value2 = 12 then                                                     begin      if var0 >= 0 then                                          begin         condition1 = var10 and var2 = false ;         if condition1 then                                                                                 `

my question is this - Value2 is set up as a counter to go through the array. Once it finds an appropriate value per the condition Value2 is set to 11 so it will stop counting. the next section starts if Value2=12....how does Value2 ever get to 12?? I have been through all of the code and cant figure this out - I was hoping someone could share some enlightenment on this.

Thanks in advance!

bowlesj3
Posts: 2090
Joined: 21 Jul 2007
Has thanked: 197 times
Been thanked: 416 times

### Re: Array Question (probably a dumb one)

I think that the for loop is likely adding 1 to value2 before it actually tests to see if it is greater than 10. So if it was set to 11 then it will become 12 then the test occurs and it exits the loop so it will not do the next run through. It is pretty easy to test the theory.

If "if SwHiVal[Value2] > SwHiVal[0] then" did not occur, then value2 would be left at value 11 instead. It is not really a good self documenting programming technique. It is better to create a true/false variable the has a name that describes the situation. However based upon the comment it appears that if value2 = 11 on the way out then the next-most recent swhi does not exist because it did the full 10 element search without finding it.

WarEagle
Posts: 36
Joined: 07 Nov 2006
Has thanked: 7 times

### Re: Array Question (probably a dumb one)

Hi bowlesj3 - thanks for your reply. I was thinking along the same lines as you. I do like your idea of testing the values. As I swim deeper in the powerlanguage waters, I am finding the documenting that you mentioned essential. I guess this indicator is not documented since it comes with the MC package. Thanks again.

bowlesj3
Posts: 2090
Joined: 21 Jul 2007
Has thanked: 197 times
Been thanked: 416 times

### Re: Array Question (probably a dumb one)

Useually things are not documented due to programmer habits and programmer rushing due to pressure. Sometimes they think it is smart to hide things in sneaky ways but if they are a programmer who is using their own code for trading this is not overly wise. I was thinking that the test for value1 = 12 should be something like this.

IntraBarPersist LastSwingWasFoundBeforeArraysEnd (false),

Then an if test of
if LastSwingWasFoundBeforeArraysEnd = true then

So the value would be set to false just before the for loop then where the value1 is set to 12 instead the code would execute "LastSwingWasFoundBeforeArraysEnd = true;"

That describes it very clearly. They refer to it as "Self documenting programming".

The programmer needs their thinking cap on , needs to be thinking "long term" and like I said it takes a little longer.

WarEagle
Posts: 36
Joined: 07 Nov 2006
Has thanked: 7 times

### Re: Array Question (probably a dumb one)

Thanks for the clarifican bowlesj3. I am working on your test now. I do see the value of your self-documenting programming. that something that i never really considered. it takes a bit if thought on the front-end but certainly will help in the future! thanks again for the tips. as you can tell i am a bit of a newbie here -

bowlesj3
Posts: 2090
Joined: 21 Jul 2007
Has thanked: 197 times
Been thanked: 416 times

### Re: Array Question (probably a dumb one)

No Problem.

I forgot to mention something that you probably noticed anyway. The meaningful variable name has a capital to separate every word so that they are a little easier/faster to understand while at the same time saving some space.

TJ
Posts: 7151
Joined: 29 Aug 2006
Location: Global Citizen
Has thanked: 988 times
Been thanked: 2041 times

### Re: Array Question (probably a dumb one)

for your perusal...

Code: Select all

`{ This indicator:(1) INSERTS DnTL's/UpTL's connecting each new SwingHi/SwingLo with the next most     recent higher/lower SwingHi/SwingLo within the last 10 SwingHi's/SwingLo's; (2) EXTENDS each new TL to the right and SETS it's color and alert type; (3) TRUNCATES a DnTL/UpTL on the right when the next new DnTL/UpTL is drawn (if the     History input is set to "Yes"), or BarsPast bars after it has been breached,     whichever comes first.(4) DELETES a DnTL/UpTL when the next new DnTL/UpTL is drawn, if the History input     is set to "No".NOTE: This indicator may not work well with low-count tick bars, such as 10-tick bars, etc., because the time resolution of the bars may not be high enough for each bar to have a distinct time stamp.}inputs:    SwHiStrength( 4 ),    SwLoStrength( 4 ),    BarsPast( 10 ),    History( "Yes" ),    DnTLColor( Red ),    UpTLColor( Cyan ),    AlertType( "IntraBar" ) ;variables:    DnTLRef( -1 ),    DnTLEndBar( 0 ),    DnTLBreak( false ),    DnTLColorNum( DnTLColor ),    UpTLRef( -1 ),    UpTLEndBar( 0 ),    UpTLBreak( false ),    UpTLColorNum( UpTLColor ),    Index( 0 ),    BarNum( 0 ),    HistoryTF( false ),    AlertTypeCAPS( UpperStr( AlertType ) ) ;arrays:    SwHiDate[10]( 0 ),    SwHiTime[10]( 0 ),    SwHiVal[10]( -1000000 ),    SwLoDate[10]( 0 ),    SwLoTime[10]( 0 ),    SwLoVal[10]( 1000000 ) ;   {========== end of variables ==========}if CurrentBar = 1 then HistoryTF = UpperStr( History ) = "YES" or UpperStr( History ) = "Y" ;{ should also be able to do this via declaration above }BarNum = BarNumber ;if SwingHighBar( 1, High, SwHiStrength, SwHiStrength + 1 ) = SwHiStrength then { ie, if just confirmed SwHi }begin   { push arrays back }   for Value1 = 9 downto 0    begin      SwHiDate[ Value1 + 1 ] = SwHiDate[Value1] ;      SwHiTime[ Value1 + 1 ] = SwHiTime[Value1] ;      SwHiVal[ Value1 + 1 ] = SwHiVal[Value1] ;   end ;   { read in parameters of new SwHi into 0-elements of arrays }   SwHiDate[0] = Date[SwHiStrength] ;   SwHiTime[0] = Time[SwHiStrength] ;   SwHiVal[0] = High[SwHiStrength] ;   { find and save the index of the next-most-recent higher SwHi if it exists }   for Value2 = 1 to 10    begin      if SwHiVal[Value2] > SwHiVal[0] then       begin         Index = Value2 ;         Value2 = 11 ; { short circuit the looping with 11 instead of 10; the 11          will become 12 in the final pass }      end ;   end ;   if Value2 = 12 then { ie, if next-most-recent higher SwHi exists }   begin      if DnTLRef >= 0 then  { ie, if previous DnTL exists }      begin         if HistoryTF and DnTLBreak = false then          { if history reqd and most recent DnTL not already truncated            elsewhere, truncate it now }         begin            TL_SetEnd( DnTLRef, Date, Time, TL_GetValue( DnTLRef, Date, Time ) ) ;            TL_SetExtRight( DnTLRef, false ) ;         end         else          if HistoryTF = false then         { if history not reqd, delete most recent DnTL }         TL_Delete( DnTLRef ) ;      end ;               { draw new DnTL, reset break flag, save endbar, set extents/color/alert }      DnTLRef = TL_New( SwHiDate[Index], SwHiTime[Index], SwHiVal[Index],        SwHiDate[0], SwHiTime[0], SwHiVal[0] ) ;      if DnTLBreak = true then       DnTLBreak = false ;      DnTLEndBar = BarNum - SwHiStrength ;      TL_SetExtLeft( DnTLRef, false ) ;      TL_SetExtRight( DnTLRef, true ) ;      if DnTLColorNum <> 99 then       TL_SetColor( DnTLRef, DnTLColorNum ) ;      if AlertTypeCAPS = "ONCLOSE" then       TL_SetAlert( DnTLRef, 2 )      else          if AlertTypeCAPS = "INTRABAR" then          TL_SetAlert( DnTLRef, 1 )      else         TL_SetAlert( DnTLRef, 0 ) ;   end ;end ;if SwingLowBar( 1, Low, SwLoStrength, SwLoStrength + 1 ) = SwLoStrength then { ie, if just confirmed SwLo }begin   { push arrays back }   for Value1 = 9 downto 0    begin      SwLoDate[Value1+1] = SwLoDate[Value1] ;      SwLoTime[Value1+1] = SwLoTime[Value1] ;      SwLoVal[Value1+1] = SwLoVal[Value1] ;   end ;   { read in parameters of new SwLo into 0-elements of arrays }   SwLoDate[0] = Date[SwLoStrength] ;   SwLoTime[0] = Time[SwLoStrength] ;   SwLoVal[0] = Low[SwLoStrength] ;   { find and save the index of the next-most-recent lower SwLo if it exists }   for Value2 = 1 to 10    begin      if SwLoVal[Value2] < SwLoVal[0] then       begin         Index = Value2 ;         Value2 = 11 ;{ short circuit the looping with 11 instead of 10; the 11          will become 12 in the final pass }      end ;   end ;   if Value2 = 12 then  { ie, if next-most-recent lower SwLo exists }   begin      if UpTLRef >= 0 then { ie, if previous UpTL exists }      begin         if HistoryTF and UpTLBreak = false then          { if history reqd and most recent UpTL not already truncated            elsewhere, truncate it now }         begin            TL_SetEnd( UpTLRef, Date, Time, TL_GetValue( UpTLRef, Date, Time ) ) ;            TL_SetExtRight( UpTLRef, false ) ;         end         else          if HistoryTF = false then         { if history not reqd, delete most recent UpTL }         TL_Delete( UpTLRef ) ;      end ;      { draw new UpTL, reset break flag, save endbar, set extents/color/alert }      UpTLRef = TL_New( SwLoDate[Index], SwLoTime[Index], SwLoVal[Index],        SwLoDate[0], SwLoTime[0], SwLoVal[0] ) ;      if UpTLBreak = true then         UpTLBreak = false ;      UpTLEndBar = BarNum - SwLoStrength ;      TL_SetExtLeft( UpTLRef, false ) ;      TL_SetExtRight( UpTLRef, true ) ;      if UpTLColorNum <> 99 then          TL_SetColor( UpTLRef, UpTLColorNum ) ;      if AlertTypeCAPS = "ONCLOSE" then          TL_SetAlert( UpTLRef, 2 )      else if AlertTypeCAPS = "INTRABAR" then          TL_SetAlert( UpTLRef, 1 )      else         TL_SetAlert( UpTLRef, 0 ) ;   end ;end ;{ if most recent DnTL/UpTL exists AND has not yet been truncated here AND was drawn   at least BarsPast ago AND was breached BarsPast bars ago THEN truncate it here and   set break flag }if DnTLRef >= 0    and DnTLBreak = false   and BarNum > DnTLEndBar + SwHiStrength + BarsPast    and ( Close > TL_GetValue( DnTLRef, Date, Time ) )[BarsPast]then begin   TL_SetEnd( DnTLRef, Date, Time, TL_GetValue( DnTLRef, Date, Time ) ) ;   TL_SetExtRight( DnTLRef, false ) ;   DnTLBreak = true ;end ;if UpTLRef >= 0    and UpTLBreak = false   and BarNum > UpTLEndBar + SwLoStrength + BarsPast    and ( Close < TL_GetValue( UpTLRef, Date, Time ) )[BarsPast]then begin   TL_SetEnd( UpTLRef, Date, Time, TL_GetValue( UpTLRef, Date, Time ) ) ;   TL_SetExtRight( UpTLRef, false ) ;   UpTLBreak = true ;end ;{ ** Copyright (c) 1991-2003 TS Technologies, Inc. All rights reserved. **   ** TS reserves the right to modify or overwrite this analysis technique      with each release. ** }`

WarEagle
Posts: 36
Joined: 07 Nov 2006
Has thanked: 7 times

### Re: Array Question (probably a dumb one)

bowlesj3 wrote:No Problem.

The meaningful variable name has a capital to separate every word so that they are a little easier/faster to understand while at the same time saving some space.

heh, you are correct - I did notice that and have adopted that for my own work.

Thanks for the code TJ. That helps a great deal. Pretty clever how they "trick" the loop to add a value on the last pass...

WarEagle
Posts: 36
Joined: 07 Nov 2006
Has thanked: 7 times

### Re: Array Question (probably a dumb one)

Hi guys I am pleased to announce that i finally got my project working the way I intended it. After many long nights and many many <dumb> mistakes its working. I think I can fill a couple of notebooks on the wrong way to do stuff.

Thanks again for your tips and assistance.

TJ
Posts: 7151
Joined: 29 Aug 2006
Location: Global Citizen
Has thanked: 988 times
Been thanked: 2041 times

### Re: Array Question (probably a dumb one)

WarEagle wrote:Hi guys I am pleased to announce that i finally got my project working the way I intended it. After many long nights and many many <dumb> mistakes its working. I think I can fill a couple of notebooks on the wrong way to do stuff.

Thanks again for your tips and assistance.

it is good to know you have it working.

Return to “MultiCharts”