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

Re: [amibroker] Re: Referencing a point in time



PureBytes Links

Trading Reference Links

Hello,

You can use if with arrays, but you need to index them

dn = DateNum();

for( i = 1; i < BarCount; i++ )
{
 if( dn[ i ] != dn[ i - 1 ] ) // the dn[ i -1 ] is "previous bar"
...
...
}

Also note that Sum accepts variable periods so you don't neet to code
all those if-s at all!

So instead convoluted solutions like that:

> 
> dn = DateNum();
> StartDay = dn != Ref (dn, -1);
> 
> if (Ref (StartDay, 0))
>     OpeningVolume = 0;
> else
> ;
> 
> if (Ref (StartDay, -29))
>     OpeningVolume = Sum (V,29);
> else

use *SINGLE* line:

OpeningVolume = Sum( V, BarsSince( StartDay ) );


Best regards,
Tomasz Janeczko
amibroker.com
----- Original Message ----- 
From: "gp_sydney" <gp.investment@xxxxxxxxx>
To: <amibroker@xxxxxxxxxxxxxxx>
Sent: Thursday, December 13, 2007 12:45 AM
Subject: [amibroker] Re: Referencing a point in time


> One problem you have there is that you can't use "if" with arrays.
> Even for a programmer, array mathematics can take a little getting
> used to. Despite what it might sound like, the Ref function isn't
> referencing a particular value of an array, but rather returning
> another array offset in time (bars) by the reference offset. The
> statement "if (Ref(...))" should give an error.
> 
> So what you want is VolumeOK to always be False during the first 30
> bars of a day, then after that during the same day to be True only if
> the sum of the first 30 bars' volume is greater than the average daily
> volume of the last 30 days time 0.25?
> 
> Should that average daily volume include the current day, even though
> it's not complete yet? Assuming not (else it would drag the average
> down unless adjusted back to a per-day value), then VolumeOK will be
> constant for the rest of the day, since neither OpeningVolume nor the
> 30-day volume average will change during the rest of the day.
> 
> With minute bars, I'm not sure of the easiest way to do daily average
> calculations, but assuming for the sake of demonstration that there
> are a fixed number of minute bars per day, which I'll call MINPERDAY
> (but you'd need to use the actual figure in the code), then I think
> you could do something like this:
> 
> dn = DateNum();
> StartDay = dn != Ref (dn,-1);
> VolAvg30 = ValueWhen(StartDay, Sum(Ref(V,-1),30*MINPERDAY)/30);
> bss = BarsSince(StartDay);
> v30 = Sum(V,30);
> OpenVol = IIf(bss==29, v30, IIf(bss>29, Ref(v30,29-bss), 0));
> VolOk = OpenVol > VolAvg30*0.25;
> 
> Note that I haven't checked any of this, and wouldn't be at all
> surprised if it has problems, but it at least conveys the idea. There
> may be a better way to get a 30-day average using minute bars, you
> might need to check if BarsSince returns zero or one on the StartDay
> bar (ie. whether BarsSince starts at zero for the StartDay bar or
> one), and there might be a bit of fiddling with exact figures to get
> it right (eg. should it be bss==30 or 29, bss>29 or bss>30, and the
> usual out-by-one issues that typically occur in this sort of programming).
> 
> Hope this helps.
> 
> Regards,
> GP
> 
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "hrokling" <henning@xxx> wrote:
>>
>> Thanks for that, GP. I should explain that I'm trying to build my 
>> first system here :)
>> 
>> Using 1-minute bars, I'm trying to calculate the volume for the first 
>> 30 minutes. Using the DateNum function as a starting point, this is 
>> what it looks like so far:
>> 
>> dn = DateNum();
>> StartDay = dn != Ref (dn, -1);
>> 
>> if (Ref (StartDay, 0))
>>     OpeningVolume = 0;
>> else
>> ;
>> 
>> if (Ref (StartDay, -29))
>>     OpeningVolume = Sum (V,29);
>> else
>> ;
>> 
>> VolumeOK = IIf (OpeningVolume > (AvgVol30Days * 0.25)), 1, 0);
>> 
>> This use of if-else looks very crude to me, but I'm not familiar 
>> enough with AFL to make something elegant (and haven't really 
>> programmed for 10-15 years - a bit rusty). But I want to set the 
>> OpeningVolume to 0 until I have the OpeningVolume (after 30 minutes), 
>> at which point I'm comparing it to the average daily volume. Will 
>> this work?
>> 
>> 
>> --- In amibroker@xxxxxxxxxxxxxxx, "gp_sydney" <gp.investment@> 
>> wrote:
>> >
>> > You could first create a start-of-day signal array by checking for 
>> the
>> > date not being equal to the date of the previous bar. That would be
>> > something like this:
>> > 
>> > dn = DateNum();
>> > StartDay = dn != Ref(dn, -1);
>> > 
>> > That should give a one at the first bar of each new day.
>> > 
>> > Once you have that, you could sum the volume a few ways, depending 
>> on
>> > exactly where you want the resulting numbers to be. Say you want 
>> them
>> > just on the last bar of those periods, then you could use something 
>> like:
>> > 
>> > volSum = IIf(Ref(StartDay,-25), Sum(V, 25), 0);
>> > 
>> > That says when the first bar of the day was 25 bars ago, store the
>> > value of the 25-bar sum of volume, otherwise store zero. So the 
>> volSum
>> > array would end up full of zeroes except for the 25th bar of each 
>> day
>> > which would have the sum of the previous 25 bars' volume.
>> > 
>> > I don't have intra-day data so can't check this, but I think it 
>> should
>> > work.
>> > 
>> > Regards,
>> > GP
>>
> 
> 
> 
> 
> Please note that this group is for discussion between users only.
> 
> To get 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
> 
> 
> 
> 
>


Please note that this group is for discussion between users only.

To get 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/