Yes, Cum is only looking at the 1 values in the array. But, it is
counting from the start of all data (i.e. from barindex 0), whereas the
rows returned by your exploration will be limited to the selected date
range.
As for LastValue, yes, it returns a single value. But, AddColumn is
expecting an array. So, the single value is effectively being treated as
an array for which all elements are set to that value.
Following are 3 options to do what you are asking for; Note that the
output column for Sum is all zeros until the last date since there is
insufficient data to calculate the result until the last bar in the
range. The single value in the Cum and the manual looping cases are
simply being treated as arrays despite being scalers.
In this case, the looping option is the best performing (run each option
through Check and Profile from Tools menu). But, generally that is not
the case and the built in AmiBroker functions are preferred over
looping.
Finally, note that the operator is '&&' not '&'. You might find it
preferable to use the operator 'AND' for better clarity.
Mike
// Using Cum()
m = IIf( Open > 48 && Open < 52, 1, 0 );
inRange = Status( "barinrange" );
number = Cum( m && inRange );
cumResult = LastValue( number );
// Using Sum()
bi = BarIndex();
startIndex = ValueWhen( Status( "firstbarinrange" ), bi );
endIndex = ValueWhen( Status( "lastbarinrange" ), bi );
range = ( endIndex - startIndex + 1 );
sumResult = Sum( m, range );
// Using a manual loop over range
loopResult = 0;
for ( i = 0; i < BarCount; i++ )
{
if ( inRange[i] && Open[i] > 48 && Open[i] < 52 )
{
loopResult++;
}
}
// Output (select range of dates from AA window)
Filter = m == 1;
AddColumn( Open, "Open" );
AddColumn( cumResult, "Cum" );
AddColumn( sumResult, "BarIndex" );
AddColumn( loopResult, "Looping" );
--- In [email protected], "bigitop" <doctormu...@...> wrote:
>
> you mean the price range? if so, yes, this is definitely less than all
> quotes. but i thought Cum(m) would look only at the 1 values in the
"m"
> array.
>
> so how can i make them equal?
>
> i just need to count the number of 1's and 0's in the array "m" which
is
> simply the stocks between 48 and 52 dollars for the time frame
specified
> in the Analysis window. how can i do this with AB?
>
> m = IIf(Open > 48 & Open < 52, 1, 0);
>
> number = Cum(m);
> result = LastValue(number);
>
> Filter = m == 1;
>
> AddColumn(Open, "Open");
> AddColumn(result,"result");
>
> --- In [email protected], "wavemechanic" timesarrow@ wrote:
> >
> > You probably have specified a range that is less than all quotes so
> cum() and open are looking at different amounts of data.
> >
> > Bill
> > ----- Original Message -----
> > From: bigitop
> > To: [email protected]
> > Sent: February 25, 2009 2:15 PM
> > Subject: [amibroker] still struggling with Sum() and Cum()
> >
> >
> >
> > ok, here's my big problem. consider this example:
> >
> > m = IIf(Open > 48 & Open < 52, 1, 0);
> >
> > number = Cum(m);
> > result = LastValue(number);
> >
> > Filter = m == 1;
> >
> > AddColumn(Open, "Open");
> > AddColumn(result,"result");
> >
> > running this code in the Analysis window returns:
> >
> > total rows: 356 rows
> > highest number in "result": 450
> >
> > so, first of all, shouldn't they be the exact same number and
> > secondly, shouldn't "result" be filled with just one value as
> opposed to many values?
> >
> > neither of this is happening. what am i doing wrong?!
> >
>