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