[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

Ok,

I finally figured out a way to do this using manual intervention via  
the parameters.  I make a special speed-up parameter.  Initially the  
AFL runs the normal way with no speed ups.  Because every variable  
becomes undefined after every AFL pass, I have to shadow every  
parameter with a static variable.  Then when I toggle to speed-up  
mode, I only force a refresh of all once-per-bar indicators when a  
parameter is out of sync with it's shadow static version i.e., it  
changed.

Not perfect, but it does work.  I'm still interested if there is an  
easier way.

Dennis

The AFL:

Paramschanged=0;

_SECTION_BEGIN("Test Environment");
firstflag = ParamToggle("High Speed","ON,OFF",1); // manually turn  
off to speed up
//
//if(ParamToggle("SetBarsRequired(Max)","OFF,ON",0)){SetBarsRequired 
(100000,0);} // turns fast AFL off
//
Daytrade= ParamToggle("Daytrade?","No|Yes",1);
if(firstflag){StaticVarSet("Daytrade",Daytrade); Paramschanged=1;}
if(Daytrade!=StaticVarGet("Daytrade")){StaticVarSet 
("Daytrade",Daytrade); Paramschanged=1;}
//
plotEquity = ParamToggle("Plot Equity?","No|Yes",0);
if(firstflag){StaticVarSet("plotEquity",plotEquity ); Paramschanged=1;}
if(plotEquity !=StaticVarGet("plotEquity")){StaticVarSet 
("plotEquity",plotEquity ); Paramschanged=1;}
//
TradeBeg = 100*Param("|    All Trading Begins HHMM", 930, 930, 1559,  
5); /* select trading start time with parameter window */
TradeEnd = 100*Param("|    All Trading Ends HHMM", 1550, 930, 1559,  
5); /* select trading end time with parameter window */
TradeEnd2 = 100*Param("|    New Trading Ends HHMM", 1550, 930, 1559,  
5); /* select trading end time with parameter window */
Params1 = _PARAM_VALUES(); // some params can be lumped together
if(firstflag){StaticVarSetText("params1",_PARAM_VALUES());  
Paramschanged=1;}
if(StaticVarGetText("params1") != _PARAM_VALUES()){StaticVarSetText 
("params1",_PARAM_VALUES());ParamsChanged=1;}
_SECTION_END();
//
//do a bunch of processing
//
if(ParamsChanged){Say("yes");Paramschanged=0;}



On May 12, 2007, at 7:54 PM, Dennis Brown wrote:

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



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/