[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 or anyone else,

Now I have a chicken and egg problem.  I want to tell if any  
parameter has changed.
My idea was to have two variables --the old value and the new value:

new = ParamToggle("Something","ON|OFF",0); //new is recycled for each  
parameter
IF (new != old) {old = new; paramChanged |= 1;}

However, old is not defined first time it is used, but if I define it  
first, it will always get reset.
I need to be able to only initialize these once:

new = ParamToggle("Something","ON|OFF",0);
IF ( firstTime) {old = new; paramchanged |= 1; } //first time only
ELSE {IF (new != old) {old = new; paramchanged |= 1; }}

But then how do I set the firstTime flag --same problem.
I need to be able to tell that a var is undefined yet:

IF (undefined(firstTime)) {firstTime=0; }

There must be a simple answer, but it does not occur to me right now.
Perhaps I am just getting tired and need to go to bed... LOL

Dennis

On May 11, 2007, at 3:03 PM, Dennis Brown wrote:

> Tomasz,
>
> Thank you for your ATC suggestion.  I have not used ATC before and in
> studying it now, I can see a possible use for it,
> though not for the current problem.  Since I only process one stock
> in my indicator, I do not need to save
> compute intensive arrays with ATC.  Just leaving the results in
> standard arrays will work quite well.
>
> The use I can see for ATC is to solve another problem related to
> computation speed.
>
> For debug purposes I often want to display an indicator in another
> pane with linear scales (my price charts are log).  However, it is too
> much work to recompute the results a second time in another pane.  I
> could however do all the calculations in
> the main pane, then just put the indicator data to display using ATC
> for the other pane to use.  Problem solved.
>
> 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

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