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 [email protected], "Steve Davis" <_sda...@...> 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 [email protected], "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 [email protected], "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 [email protected], "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 [email protected], "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  );
> > > > > >  
> > > > > >
> > > > >
> > > >
> > >
> >
>


Reply via email to