Title: Re: [amibroker] Re: Optimizing with Include and fputs shifts loop mysteriously
You can get multiple executions when the code is also displayed in an indicator, tooltip, commentary, etc. Or when you run the Optimization or Backtest from the Formula menu (this includes an extra syntax check).
try adding code to make it run exclusively where you want it to run, like:
If( Status("Action") == 5 ) // or 4 for Backtest
{
...code
}
Using the new "ActionEx" you can narrow it down even more and exclude the Syntax check.
best regards,
herman
Saturday, December 13, 2008, 9:42:32 PM, you wrote:
> Thanks, that workaround will certainly work for this simple example.
> But my actual system is much more complex. I only pasted a crossover
> system to debug the essence of the problem.
> So it seems that I have to reassign values in the main body of the AFL
> due to possible multiple preprocessing. If it's always off by 1, in a
> linear fashion, then it's not such a big deal. But I am worried about
> it being off by some other value on a case by case basis.
> I guess including traces with every optimization will help me spot the
> patterns and adjust accordingly.
> --- In amibroker@xxxxxxxxxxxxxxx, "Steve Davis" <_sdavis@xxx> wrote:
>> You have no control over how frequently AmiBroker executes your AFL.
>> This is not a bug. As a workaround, you could adjust the value of
>> FastMALength like this:
>> if (FastMALength == 5)
>> FastMALength = 1;
>> else
>> FastMALength++;
>> --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@> wrote:
>> >
>> > Thanks for the detective work Steve and Tony.
>> >
>> > I tried running the trace version below and sometimes AB executes the
>> > code up to four times before the start of the optimize loop. Very
>> strange.
>> >
>> > Any ideas on how to code around this behaviour? Is this a known bug,
>> > or am I implementing #include incorrectly?
>> >
>> > I can't see what I am doing wrong, given the very basic code I posted.
>> > Even if the include file is being preprocessed, I don't understand why
>> > it is happening 1 to 4 times with values from previous runs.
>> >
>> >
>> > --- In amibroker@xxxxxxxxxxxxxxx, "Steve Davis" <_sdavis@> wrote:
>> > >
>> > > Hmmmm. Looks like Tony is right. I tried running this with some
>> > > traces. AmiBroker executes your code twice prior to the start of the
>> > > optimize loop. If you try the code below, you will see this trace:
>> > >
>> > > a=1, FastMALength=5, actionEx=actionExEditVerifyFormula
>> > > a=5, FastMALength=1, actionEx=actionExOptimizeSetup
>> > > a=1, FastMALength=5, actionEx=actionExOptimizeBacktest
>> > > a=2, FastMALength=1, actionEx=actionExOptimizeBacktest
>> > > a=3, FastMALength=2, actionEx=actionExOptimizeBacktest
>> > > a=4, FastMALength=3, actionEx=actionExOptimizeBacktest
>> > > a=5, FastMALength=4, actionEx=actionExOptimizeBacktest
>> > >
>> > > You can see the actionExOptimizeSetup pass is writing 5 to the file.
>> > > Each optimize pass is picking up the value written by the previous
>> pass.
>> > >
>> > > Here is the modified code:
>> > >
>> > > a = Optimize( "a", 1, 1, 5, 1 );
>> > >
>> > > #pragma nocache
>> > > #include "c:\TestAFL.afl";
>> > >
>> > > fh = fopen( "c:\\TestAFL.afl", "w");
>> > > fputs("FastMALength = ", fh);
>> > > fputs(NumToStr(a, 1.0, 0 ),fh);
>> > > fclose( fh );
>> > >
>> > > actionExNum = Status("ActionEx");
>> > > if (actionExNum == actionExEditVerifyFormula) actionExName =
>> > > "actionExEditVerifyFormula";
>> > > else if (actionExNum == actionExOptimizeSetup) actionExName =
>> > > "actionExOptimizeSetup ";
>> > > else if (actionExNum == actionExOptimizeBacktest) actionExName =
>> > > "actionExOptimizeBacktest ";
>> > > else if (actionExNum == actionExOptimizePortfolio) actionExName =
>> > > "actionExOptimizePortfolio";
>> > > _Trace("a="+a + ", FastMALength="+FastMALength + ",
>> > > actionEx="+actionExName);
>> > >
>> > > SlowMALength = 20;
>> > >
>> > > FastMA = MA( C, FastMALength );
>> > > SlowMA = MA( C, SlowMALength );
>> > > Buy = Cross( FastMA, SlowMA );
>> > > Sell = Cross( SlowMA, FastMA );
>> > >
>> > >
>> > > --- In amibroker@xxxxxxxxxxxxxxx, "ozzyapeman" <zoopfree@> wrote:
>> > > >
>> > > > Yes. But I am not sure how that creates the problem I am seeing.
>> > > > Because when TestAFL.afl is processed, say for a =1, it simply
>> results
>> > > > in the following statement first being placed into memory:
>> > > >
>> > > > FastMALength = 1;
>> > > >
>> > > > then the main AFL is processed, and this should result in the
>> > > > crossover trade being processed with the above variable
> assignment.
>> > > > But instead of the above variable assignment, it instead is:
>> > > >
>> > > > FastMALength = 5;
>> > > >
>> > > > How and why does it skip from 1 to 5?
>> > > >
>> > > >
>> > > > --- In amibroker@xxxxxxxxxxxxxxx, "Tony Grimes" <Tonez.Email@>
>> wrote:
>> > > > >
>> > > > > *#include is a preprocessor command. The included file, in
>> this case
>> > > > > TestAFL.afl, will be processed before your trade system 2 afl is
>> > > > processed.*
>> > > > >
>> > > > > On Sat, Dec 13, 2008 at 5:59 PM, ozzyapeman <zoopfree@> wrote:
>> > > > >
>> > > > > > Hello, hoping someone can help with this issue. When I
> use an
>> > > > optimize
>> > > > > > statement with #include and fputs, the optimization variable
>> keeps
>> > > > getting
>> > > > > > shifted.
>> > > > > >
>> > > > > > For example, please consider the two basic MA crossover
> systems
>> > > > below. They
>> > > > > > should both give identical results whether one does a backtest
>> > or an
>> > > > > > optimization. The backtests do appear identical. However, the
>> > > Include
>> > > > > > version gives wonky results in optimization. Instead of 'a'
>> > > > starting at
>> > > > > > value 1. It starts at 5 but says in the optimization
> report that
>> > > > it is 1. I
>> > > > > > know it's probably something simple that I am overlooking, but
>> > > > can't seem to
>> > > > > > figure this one out:
>> > > > > >
>> > > > > >
>> > > > > >
>> > > >
>> > >
>> >
> //------------------------------------------------------------------------
>> > > > > > // TRADE SYSTEM #1: SIMPLE CROSS BASIC
>> > > > > >
>> > > >
>> > >
>> >
> //------------------------------------------------------------------------
>> > > > > >
>> > > > > > FastMALength = Optimize("FastMALength", 1, 1, 5,
>> > 1);
>> > > > > >
>> > > > > > SlowMALength = 20;
>> > > > > >
>> > > > > > FastMA = MA( *C*, FastMALength );
>> > > > > > SlowMA = MA( *C*, SlowMALength );
>> > > > > > *Buy* = Cross( FastMA, SlowMA );
>> > > > > > *Sell* = Cross( SlowMA, FastMA );
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > > > >
>> > > >
>> > >
>> >
> //------------------------------------------------------------------------
>> > > > > > // TRADE SYSTEM #2: SIMPLE CROSS USING INCLUDE AND FPUTS
>> > > > > >
>> > > >
>> > >
>> >
> //------------------------------------------------------------------------
>> > > > > >
>> > > > > > a = Optimize( "a", 1, 1, 5, 1 );
>> > > > > >
>> > > > > > *#pragma* nocache
>> > > > > > *#include* "c:\\TestAFL.afl";
>> > > > > >
>> > > > > > fh = fopen( "c:\\TestAFL.afl", "w");
>> > > > > > fputs("FastMALength = ", fh);
>> > > > > > fputs(NumToStr(a, 1.0, 0 ),fh);
>> > > > > > fclose( fh );
>> > > > > >
>> > > > > > SlowMALength = 20;
>> > > > > >
>> > > > > > FastMA = MA( *C*, FastMALength );
>> > > > > > SlowMA = MA( *C*, SlowMALength );
>> > > > > > *Buy* = Cross( FastMA, SlowMA );
>> > > > > > *Sell* = Cross( SlowMA, FastMA );
>> > > > > >
>> > > > > >
>> > > > >
>> > > >
>> > >
>> >
> ------------------------------------
> **** IMPORTANT ****
> This group is for the discussion between users only.
> This is *NOT* technical support channel.
> *********************
> TO GET TECHNICAL 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/
__._,_.___
**** IMPORTANT ****
This group is for the discussion between users only.
This is *NOT* technical support channel.
*********************
TO GET TECHNICAL 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
*********************************
__,_._,___
|