[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,

I still have not figured this out.  I thought perhaps StaticVarSet 
("FirstTime") would do the trick.  However, contrary to the  
documentation, the compiler forces me to specify a value that is set  
every time, not just when the static var is first defined.  I thought  
if I could leave the value blank, then perhaps it would not change  
the value if it was already defined.

I am at a loss.

Dennis



On May 11, 2007, at 11:36 PM, Dennis Brown wrote:

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



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/