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

Re: [amibroker] Methods for speeding up AFL code



PureBytes Links

Trading Reference Links

Tomasz,

Now I understand why I have to use the ATC to make this work.  Any  
normal array will become undefined after every AFL pass, so I need a  
static array variable to hold the value from the once per bar pass  
during all the in between passes.  However, since the static array  
variable is not yet available, ATC can act as a static array variable  
filling this need.

This whole concept of every pass of AFL starting over from an  
undefined state for all regular variables was one that escaped me  
until now.  It did not really matter to me until now --when I wanted  
to preserve states across multiple passes.  It is like the whole AFL  
is just a big procedure/function called once per pass.  The static  
variables are to the main AFL like global variables are to a  
procedure/function.  The light bulb!

Thanks,
Dennis

On May 11, 2007, at 1:26 PM, Tomasz Janeczko wrote:

> Hello,
>
> Then my advice is to use AddToComposite for computing intensive task.
>
> lasttimenum = StaticVarGet("lasttimenum"); // if you want it chart- 
> specific you may add GetChartID() prefix/suffix
>
> if( ( Now( 4 ) - lasttimenum ) > 100 )
> {
>   // one minute passed sincce last recalc
>
>   .... // do computing intesive stuff here
>   result = .. .put your result array here
>
>   AddToComposite( result, "~myresult", "x",  
> atcFlagEnableInIndicator | atcDefaults );
> }
>
> // regular part that is executed all the time
> result = Foreign("~myresult", "c" ); // this will retrieve values  
> of computing-intensive part calculated last time
>
>
> Best regards,
> Tomasz Janeczko
> amibroker.com
> ----- Original Message -----
> From: "Dennis Brown" <see3d@xxxxxxxxxxx>
> To: <amibroker@xxxxxxxxxxxxxxx>
> Sent: Friday, May 11, 2007 6:52 PM
> Subject: Re: [amibroker] Methods for speeding up AFL code
>
>
>> Tomasz,
>>
>> Thank you for the helpful suggestions.
>> My replies below are for everyones benefit.
>>
>> You have done a great job in making the AFL fast.
>> Unfortunately, I still need to speed up my stuff more.  I don't need
>> to recompute ALL the historical bar related
>> stuff for every second, just some simple stuff related to the last
>> bars (1 min) real time price until the next bar opens.
>>
>> On May 11, 2007, at 10:30 AM, Tomasz Janeczko wrote:
>>
>>> Hello,
>>>
>>> You really need to take a look at the following and I guess you
>>> will be able to rewrite
>>> your formulas to run 10 times faster.
>>>
>>> 1. Use Tools->preferences->Misc "Display chart timing" to find out
>>> which formula takes
>>> the most time to execute
>>
>> Most of the "generic" AFL runs in <.1 sec with my compute intensive
>> functions turned off
>> With my main function turned on (called 3 times for different Ehlers
>> adaptive moving averages),
>> it goes up by .25 sec per 1000 bars.  I previously rewrote some of
>> this function that I downloaded
>> to speed it up by a factor of 5-10.
>>
>> I have another function that computes a result in 10 different
>> settings to look for the best result.
>> This of course takes a lot of time, and I have to limit the history
>> in the AFL to keep it under a second.
>> This is of course where all the time goes.  Computing things in
>> multiple settings (related to multiple time frames).
>>
>> Once the Total time goes over 1 sec, the UI does not respond well
>> since the quotes come quicker than that.
>>
>>> 2. Use AFL editor "Check" function to find out how many past bars
>>> given formula requires
>>
>> It reports 100,000 because that was put into the SetBarsRequired
>> (SBR) to turn off fast AFL
>> Fast AFL was causing problems with indicator lines not displaying
>> intermittently previously.
>> When I remove the SBR function, everything speeds up by 2x.
>>
>> I tried adding a ParamToggle to switch SBR from 100,000 to 0.
>> However, once the SBR has
>> been set to 100,000, it can not be turned back off from AFL.  I have
>> to recompile to reset it.
>> Is there a way to reset the chart and SBR function while the AFL is
>> running?
>>
>>> 3. To minimize number of charts required:
>>>   a) avoid Cum() function, instead use BarIndex() where possible
>>
>> I do not use this function.
>>
>>>   b) use SetBarsRequired at the end of formula to force smaller
>>> number of bars to be used (may affect some indicator values)
>>
>> Did not make a difference.
>>
>>>   c) use VARIABLES as much as you can. If you need the same
>>> function twice - call it ONCE and assign the result to variable
>>>    and use variable later instead of calling the same function over
>>> and over
>>
>> My normal practice --never calculate the same thing twice.
>>
>>>   d) investigate what you are doing inside loops. When you put very
>>> time consuming stuff inside loop it will take N-times more
>>>  than the same stuff outside loop. Remove array functions from
>>> inside the loops. For max speed loops should operate on array
>>> ELEMENTS only.
>>
>> My normal practice --never calculate something in a loop that can be
>> pre-computed outside the loop.
>>
>> I am a speed demon.
>> I was programming real time machine control applications in machine
>> language before the first microprocessor came out.
>>
>> Thank you for any further help you can suggest.
>>
>> Dennis
>>
>>>
>>>
>>> Best regards,
>>> Tomasz Janeczko
>>> amibroker.com
>>> ----- Original Message -----
>>> From: "Dennis Brown" <see3d@xxxxxxxxxxx>
>>> To: <amibroker@xxxxxxxxxxxxxxx>
>>> Sent: Friday, May 11, 2007 4:18 PM
>>> Subject: [amibroker] Methods for speeding up AFL code
>>>
>>>
>>>> Hello,
>>>>
>>>> I have run out of processing speed on my 2GHz core duo trading
>>>> machine.  I do a lot of indicator computing and have bogged down AB
>>>> to the point where it will no longer respond to the UI functions  
>>>> like
>>>> cross hairs or switching timeframes when I click the buttons --or
>>>> even being able to edit the AFL --and I still want to do 10  
>>>> times as
>>>> much as I am doing now.  The real time processing speed is  
>>>> inhibiting
>>>> my creativity.
>>>>
>>>> So far I have put in a parameter that limits the number of bars  
>>>> that
>>>> my most intensive calculations use.  This helped, but not enough.
>>>>
>>>> My next idea is to only compute some functions that do not change
>>>> often only once per bar complete.
>>>>
>>>> However, I still need to compute everything if I change a  
>>>> parameter,
>>>> or switch stocks.  To do this, I thought I might have to keep a  
>>>> copy
>>>> of every parameter and compare each one to the value when it was  
>>>> last
>>>> computed --and set a "needs updating" flag if any have changed.
>>>>
>>>> Has anyone else used this approach?
>>>> Any hints about what I need to watch out for?
>>>> Is there an easier way?
>>>>
>>>> Thanks,
>>>> Dennis
>>
>>
>>
>> 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
>
>
>



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/