Bruce, Just want to say thanks for this. I wouldn't have thought of it in a month of Sundays... and had basically resorted to looping.
Great solution. thanks again. --- In [email protected], "bruce1r" <bru...@...> wrote: > > This thread was getting long :) Try this - > > // Lookback interval - example covers > 1 week > window = 8; > // Test with true condition = first of week > Condition = IIf( DayOfWeek() < Ref( DayOfWeek( ), -1 ), 1, 0 ); > bi = BarIndex( ); > > //-- THIS DOES THE WORK --------------------------------------------- > NOTFOUND = -1; > // Get the bar index of first true condition in interval > resultbi = LLV( IIf( Condition, bi, 1e99 ), window ); > // Flag no true condition found > resultbi = IIf( resultbi == 1e99, NOTFOUND, resultbi ); > > // Get the number of bars back > barsback = IIf( resultbi == NOTFOUND, NOTFOUND, bi - resultbi ); > //-------------------------------------------------------------------- > > Filter = 1; > AddColumn( bi, "BARINDEX", 5.0 ); > AddColumn( Condition, "CONDITION", 1.0 ); > AddColumn( window, "WINDOW", 5.0 ); > AddColumn( bi - window + 1, "LOOKBACK TO BAR", 5.0 ); > AddColumn( resultbi, "RESULT BARINDEX", 1.0 ); > AddColumn( barsback, "BARS BACK TO RESULT", 5.0 ); > > > > > --- In [email protected], "sidhartha70" <sidhartha70@> wrote: > > > > Thanks Ed. I'll take a look at this idea. > > > > --- In [email protected], "Edward Pottasch" <empottasch@> > > wrote: > > > > > > hi, > > > > > > you could shift the array. > > > > > > for instance jj1 is an array with 1 and 0 > > > > > > then: > > > > > > // calculate bars since last occurunce of 1 > > > kk1 = BarsSince(jj1); > > > // shift jj by that amount and so remove the last occurrence of 1, > > save result in jj2 > > > jj2 = Ref(jj1,-LastValue(kk1)-1); > > > // now shift jj2 back by that amount and save in jj3 > > > jj3 = Ref(jj2,LastValue(kk1)+1); > > > // now calculate bars since the prior to last occurence of 1 > > > kk2 = BarsSince(jj3); > > > WriteVal(kk1); > > > WriteVal(kk2); > > > > > > > > > rgds, Ed > > > > > > > > > > > > ----- Original Message ----- > > > From: sidhartha70 > > > To: [email protected] > > > Sent: Tuesday, January 13, 2009 3:28 PM > > > Subject: [amibroker] Re: Finding the last true value in an array... > > > > > > > > > Well lets just look at a pretend array... I think that puts it > in its > > > simplest context.... > > > > > > Effectively what I'm trying to do is replicate EXACTLY the > > > functionality of BarsSince() but instead of starting from the most > > > current array element and moving backwards, I want to start a > > > specified number of intervals back and move forward... > > > > > > Obviously when you use BarsSince() it returns an array... in the > same > > > way, I'd like my function to return an array. Looking at this > example, > > > ans assuming that the array before x simply has zeros in it... > > > > > > 0,1,0,0,0,0,0,1,0,0 > > > x.................Now > > > > > > BarsSince(array) would produce (I think), > > > > > > 0,0,1,2,3,4,5,0,1,2 > > > > > > I want a function that will work from x to Now, and return, > > > > > > 0,0,1,2,3,4,5,6,7,8 > > > > > > I can do this with a loop obviously (but I hate loops). This is a > > > problem I've hit before. I'd just love to know if there's an array > > > solution... > > > > > > TIA > > > > > > --- In [email protected], "wavemechanic" <timesarrow@> > wrote: > > > > > > > > Don't have time now to think about it and it would be easier > if you > > > posted the code instead of working with a moving target. > However, off > > > the top of my head you might be able to avoid looping by using brute > > > force. For example, if the range is 5 bars then you could test the > > > 5th bar back with iif(barssince(x) == 5, and if that is negative > then > > > do the same for the 4th bar back, etc. > > > > ----- Original Message ----- > > > > From: sidhartha70 > > > > To: [email protected] > > > > Sent: Tuesday, January 13, 2009 8:04 AM > > > > Subject: [amibroker] Re: Finding the last true value in an > array... > > > > > > > > > > > > SelectedValue() works Bill... Thanks. > > > > > > > > However, the problem I'm having is that I'm using this in AFL > > code and > > > > I want it to complete the historical array if you like, not just > > off a > > > > SelectedValue() but with each value of Sum(x,range) as ir > changes... > > > > which it's looking like is not possible. > > > > > > > > Horribly I might have to use a loop. Errrgg. > > > > > > > > --- In [email protected], "sidhartha70" <sidhartha70@> > > wrote: > > > > > > > > > > Nope, I've tried it Bill... > > > > > > > > > > I get an Error 5, Argument #3 has incorrect type on the > > ValuneWhen() > > > > > line... > > > > > > > > > > > > > > > > > > > > --- In [email protected], "wavemechanic" <timesarrow@> > > > wrote: > > > > > > > > > > > > Have you tried it or are just "not sure"? Works for me and > > > can move > > > > > to any bar and get the "selectedvalue". If in doubt use > > > > > selectedvalue(sum()). > > > > > > ----- Original Message ----- > > > > > > From: sidhartha70 > > > > > > To: [email protected] > > > > > > Sent: Tuesday, January 13, 2009 6:01 AM > > > > > > Subject: [amibroker] Re: Finding the last true value in an > > > array... > > > > > > > > > > > > > > > > > > Actually Bill, not sure this works... since the 3rd > argument in > > > > > > ValueWhen() is required to be a number and not an array. > > > > > > Could use LastValue() to turn it into a number, but of > > > course this > > > > > > only returns the value from the right hand edge of the > chart... > > > > so it > > > > > > wouldn't work historically... which is what I need. > > > > > > > > > > > > Any thoughts...? > > > > > > > > > > > > --- In [email protected], "wavemechanic" <timesarrow@> > > > > wrote: > > > > > > > > > > > > > > How about this? > > > > > > > > > > > > > > x = condition that generates your 1,0 array > > > > > > > y = sum(x, range) > > > > > > > z = valuewhen(x, barindex(), y) > > > > > > > position in array = lastvalue(barindex()) - z + 1 > > > > > > > > > > > > > > Bill > > > > > > > ----- Original Message ----- > > > > > > > From: sidhartha70 > > > > > > > To: [email protected] > > > > > > > Sent: Monday, January 12, 2009 6:33 PM > > > > > > > Subject: [amibroker] Re: Finding the last true value in an > > > > > array... > > > > > > > > > > > > > > > > > > > > > Sorry Barry... my terminology is confusing... > > > > > > > > > > > > > > Lets say I have an array that has only true or false > > > values in > > > > > it... > > > > > > > > > > > > > > Lets say the last 10 value of this array are as follows, > > > from x > > > > > > > intervals ago until now... > > > > > > > > > > > > > > 0,1,0,0,1,0,0,1,0,0 > > > > > > > x.................Now > > > > > > > > > > > > > > Now, obviously, BarsSince(array) will return a value of 2... > > > > > i.e. the > > > > > > > last true value was 2 intervals ago. > > > > > > > > > > > > > > However, the value I'm trying to get is the last value > > > of true > > > > > in the > > > > > > > above x elements of the array... so I want an expression > > > that > > > > > returns > > > > > > > 8 for the above array (i.e. 8 intervals back is the last > > > > value of > > > > > > > true). Any ideas...? > > > > > > > > > > > > > > Hopefully that's clearer now. > > > > > > > > > > > > > > > > > > > > > --- In [email protected], "Barry Scarborough" > > > > <razzbarry@> > > > > > > > wrote: > > > > > > > > > > > > > > > > What are your trying to do? HHV gives the value of the > > > > > highest high > > > > > > > > over the period you enter in x. If you want to find how > > > > far back > > > > > > that > > > > > > > > is you can use > > > > > > > > > > > > > > > > bs = BarsSince(H == HHV(H, 10)); > > > > > > > > // the next line prints the num bars back and the high of > > > > > that bar > > > > > > > > printf(NumToStr(bs, 1.0) + " High " + NumToStr(HHV(H, 10), > > > > > 1.2)); > > > > > > > > > > > > > > > > If you want to find the value of the other things bs bars > > > > > ago then > > > > > > > > you can > > > > > > > > // use the following. This applies to any array > > > > > > > > lastHigh = ref(High, - bs); > > > > > > > > // this is another way to see the results that shows the > > > > > high value > > > > > > > > Plot(lastHigh, "high bars ago", colorBlack); > > > > > > > > Plot(Ref(C, -bs), "close bars ago", colorblue); > > > > > > > > Plot(Ref(MA(C, 10), -bs), "MA(10) value bars ago", > > > > colorGreen); > > > > > > > > // then look at what valuewhen returns > > > > > > > > Plot(ValueWhen(H == HHV(H, 10), H, -1), "ValueWhen", > > > > colorRed); > > > > > > > > > > > > > > > > bsolutely the last thing you want to do is start using > > > loops, > > > > > > such as > > > > > > > > for loops, to extract data from ABs arrays. Your code will > > > > > be much > > > > > > > > cleaner and faster if you use straight AFL. > > > > > > > > > > > > > > > > Your terminology true value is confusing. The value in an > > > > > array is > > > > > > > > the true value. Do you mean what was the value when the > > > > > > condition was > > > > > > > > true? > > > > > > > > > > > > > > > > Barry > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --- In [email protected], "sidhartha70" > > > > <sidhartha70@> > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > Graham, > > > > > > > > > > > > > > > > > > I'm trying to get my head around that code right now... > > > > > but first > > > > > > > > > thing I noticed was that my post was poorly worded. > > > Let me > > > > > > reword it > > > > > > > > > below, and maybe you can tell me if this is what you > > > > > thought I > > > > > > > > meant.... > > > > > > > > > > > > > > > > > > Ok. It's easy to find the first occurrence of a true > > > value > > > > > of an > > > > > > > > > array... that is looking from now backwards x intervals. > > > > > simply > > > > > > > > > HHV(array,x) where x=no of intervals back. > > > > > > > > > > > > > > > > > > However, how can I find the last true value of the array > > > > > looking > > > > > > > > back > > > > > > > > > over x intervals...?? i.e. the first true value starting > > > > from > > > > > > x and > > > > > > > > > looking forward to now. > > > > > > > > > > > > > > > > > > is there an array method without looping...? > > > > > > > > > > > > > > > > > > Many Thanks > > > > > > > > > > > > > > > > > > > > > > > > > > > --- In [email protected], Graham <kavemanperth@> > > > > > wrote: > > > > > > > > > > > > > > > > > > > > try this > > > > > > > > > > array = h; > > > > > > > > > > LastHHVValue = valuewhen( hhvbars(array,x)==0, > > > array ); > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > Cheers > > > > > > > > > > Graham Kav > > > > > > > > > > AFL Writing Service > > > > > > > > > > http://www.aflwriting.com > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 2009/1/13 sidhartha70 <sidhartha70@>: > > > > > > > > > > > Hi All, > > > > > > > > > > > > > > > > > > > > > > Ok. It's easy to find the last true value of an > > > array... > > > > > > simply > > > > > > > > > > > HHV(array,x) where x=no of intervals back. > > > > > > > > > > > > > > > > > > > > > > However, how can I find the last true value of the > > > > array > > > > > > > > looking back > > > > > > > > > > > over x intervals...?? > > > > > > > > > > > > > > > > > > > > > > is there an array method without looping...? > > > > > > > > > > > > > > > > > > > > > > Many Thanks > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------ > > > > > > > > > > > > > > **** IMPORTANT **** > > > > > > > This group is for the discussion between users only. > > > > > > > This is *NOT* technical support channel. > > > > > > > > > > > > > > ********************* > > > > > > > TO GET TECHNICAL SUPPORT from AmiBroker please send an > > > e-mail > > > > > > directly to > > > > > > > SUPPORT {at} amibroker.com > > > > > > > ********************* > > > > > > > > > > > > > > For NEW RELEASE ANNOUNCEMENTS and other news always check > > > > DEVLOG: > > > > > > > http://www.amibroker.com/devlog/ > > > > > > > > > > > > > > For other support material please check also: > > > > > > > http://www.amibroker.com/support.html > > > > > > > > > > > > > > ********************************* > > > > > > > Yahoo! Groups Links > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ---------------------------------------------------------- > > > > > > > > > > > > > > > > > > > > > > > > > > > > No virus found in this incoming message. > > > > > > > Checked by AVG - http://www.avg.com > > > > > > > Version: 8.0.176 / Virus Database: 270.10.6/1889 - > > > Release Date: > > > > > > 1/12/2009 8:18 PM > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------ > > > > > > > > > > > > **** IMPORTANT **** > > > > > > This group is for the discussion between users only. > > > > > > This is *NOT* technical support channel. > > > > > > > > > > > > ********************* > > > > > > TO GET TECHNICAL SUPPORT from AmiBroker please send an e-mail > > > > > directly to > > > > > > SUPPORT {at} amibroker.com > > > > > > ********************* > > > > > > > > > > > > For NEW RELEASE ANNOUNCEMENTS and other news always check > > > DEVLOG: > > > > > > http://www.amibroker.com/devlog/ > > > > > > > > > > > > For other support material please check also: > > > > > > http://www.amibroker.com/support.html > > > > > > > > > > > > ********************************* > > > > > > Yahoo! Groups Links > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ---------------------------------------------------------- > > > > > > > > > > > > > > > > > > > > > > > > No virus found in this incoming message. > > > > > > Checked by AVG - http://www.avg.com > > > > > > Version: 8.0.176 / Virus Database: 270.10.6/1891 - Release > Date: > > > > > 1/13/2009 8:17 AM > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------ > > > > > > > > **** IMPORTANT **** > > > > This group is for the discussion between users only. > > > > This is *NOT* technical support channel. > > > > > > > > ********************* > > > > TO GET TECHNICAL SUPPORT from AmiBroker please send an e-mail > > > directly to > > > > SUPPORT {at} amibroker.com > > > > ********************* > > > > > > > > For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG: > > > > http://www.amibroker.com/devlog/ > > > > > > > > For other support material please check also: > > > > http://www.amibroker.com/support.html > > > > > > > > ********************************* > > > > Yahoo! Groups Links > > > > > > > > > > > > > > > > > > > > > > > > > > > ---------------------------------------------------------- > > > > > > > > > > > > > > > > No virus found in this incoming message. > > > > Checked by AVG - http://www.avg.com > > > > Version: 8.0.176 / Virus Database: 270.10.6/1891 - Release Date: > > > 1/13/2009 8:17 AM > > > > > > > > > >
