[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Finding the last true value in an array...



PureBytes Links

Trading Reference Links

Glad you found it useful.  FWIW, in my experience teaching seminars on
AFL and another array language called Trade that is used by the
FastTrack, group, you are on the right track modeling with loops
first.  That seems to help make the transition to the full use of
array logic.

Take the following with a grain of salt, but in my experience, say
that you have 100 calculation problems, 90 or so can eventually be
solved with arrays. 1-2 may lend themselves to AMA2.  And, 2-3 can
make use of Variable Period Functions in AFL.  (BTW, it's worth
checking that page in the Help file).  The remaining 5-6 will probably
need looping.  One can never have enough performance, and Tomasz has
provided some good tools.

-- Bruce R

--- In amibroker@xxxxxxxxxxxxxxx, "sidhartha70" <sidhartha70@xxx> wrote:
>
> 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 amibroker@xxxxxxxxxxxxxxx, "bruce1r" <brucer@> 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 amibroker@xxxxxxxxxxxxxxx, "sidhartha70" <sidhartha70@> wrote:
> > >
> > > Thanks Ed. I'll take a look at this idea.
> > > 
> > > --- In amibroker@xxxxxxxxxxxxxxx, "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: amibroker@xxxxxxxxxxxxxxx 
> > > >   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 amibroker@xxxxxxxxxxxxxxx, "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: amibroker@xxxxxxxxxxxxxxx 
> > > >   > 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 amibroker@xxxxxxxxxxxxxxx, "sidhartha70" <sidhartha70@>
> > > wrote:
> > > >   > >
> > > >   > > Nope, I've tried it Bill...
> > > >   > > 
> > > >   > > I get an Error 5, Argument #3 has incorrect type on the
> > > ValuneWhen()
> > > >   > > line...
> > > >   > > 
> > > >   > > 
> > > >   > > 
> > > >   > > --- In amibroker@xxxxxxxxxxxxxxx, "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: amibroker@xxxxxxxxxxxxxxx 
> > > >   > > > 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 amibroker@xxxxxxxxxxxxxxx, "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: amibroker@xxxxxxxxxxxxxxx 
> > > >   > > > > 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 amibroker@xxxxxxxxxxxxxxx, "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 amibroker@xxxxxxxxxxxxxxx, "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 amibroker@xxxxxxxxxxxxxxx, 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
> > > >   >
> > > >
> > >
> >
>



------------------------------------

**** 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

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/