Looks like you have a few potential problems:

1. You are double (triple, quadruple, etc.) counting whenever you have multiple 
trades for the same symbol.

2. I believe that custom backtest metrics need to be scalers (i.e. single 
value, not an array).

3. No need to delay the printing of trades (i.e. bo.Backtest(1)) since you are 
not adding individual trade metrics.

Mike

--- In [email protected], "chuck_win" <ch...@...> wrote:
>
> Hi, 
> 
> What I am doing is:
> 1). count MA(close, 6) < MA(close, 9) at buy when open gap > %x.
> 2). show the count on optimize results.
> 
> I use static var to store MA flag outside CTB, and read it inside CTB. the 
> code below doesn't work. 
> 
> I don't know if I create a single static var or a static array when I write: 
> StaticVarSet ("MA_" + Name(), MAFlag);
> 
> It could be wrong in other place.
> 
> Any help would be greatly appreciated!
> 
> Charles
> 
> 
> 
> 
> //========================================= optimize
> Perc = Optimize("Perc", 8, 8, 8, 2);
> MALen = Optimize("MALen", 6, 6, 6, 1);
> 
> //========================================= set option
> //SetOption("RequireDeclarations", True ); 
> //must use it for buyprice = ref(close, -1).
> SetOption("PriceBoundChecking", False);
> 
> //================= buy rules
> Buyrule1 = TimeNum() == 93000;
> Buyrule2 = Close >= Ref(Close, -1) * (1 + Perc/100);
> 
> Buyrule = Buyrule1 AND Buyrule2;
> 
> //========================================= set static var to store MA
> //check MA steps
> MAFlag = IIf(MA(Close, MAlen) < MA(Close, MAlen + 3), 1, 0);
> //store MA flag into static var.
> StaticVarSet ("MA_" + Name(), MAFlag);
> 
> //================= sell rules
> Sellrule1 = TimeNum() == 93000;
> Sellrule = Sellrule1;
> 
> //================= trade
> Buy = Buyrule;
> BuyPrice = Ref(Close, -1);
> Sell = Sellrule;
> SellPrice = Close;
> 
> //======================================== custom back tester
> SetCustomBacktestProc( "" );
> 
> if ( Status( "action" ) == actionPortfolio )
> {
>       bo = GetBacktesterObject();
>               //run default back tester
>       bo.Backtest(1);
>               MAup = 0;
> 
>               //loop on all trades of ONE interation at one time.
>       for ( trade = bo.GetFirstTrade( ); trade; trade = bo.GetNextTrade( ) )
>       {
>                       //add up MA flag from static var
>                       MAup = MAup + StaticVarGet("MA_" + trade.symbol);
>                       _TRACE(trade.Symbol + ": " + MAUp);
>       }
> 
>               //add custom column to optimize result
>               bo.AddCustomMetric("MAUP", MAup);
>               bo.listTrades();
> } 
> 
> --- In [email protected], "chuck_win" <chaoy@> wrote:
> >
> > Thanks so much Mike for your help. It works on backtester now. I will try 
> > to make it work on optimize next.
> > 
> > Charles
> > 
> > 
> > 
> > --- In [email protected], "Mike" <sfclimbers@> wrote:
> > >
> > > Charles,
> > > 
> > > You got scared away from the earlier example that I referred you to ( 
> > > http://finance.groups.yahoo.com/group/amibroker/message/146164 ). Yet, 
> > > with a one line change, it would give you exactly what you want.
> > > 
> > > Just change:
> > > 
> > > foreignATR = ATR( 14 );
> > > 
> > > To
> > > 
> > > foreignATR = MA( Close, 6 );
> > > 
> > > Do this and, I believe, you would have exactly what you're asking for. 
> > > You would likely then want to change the names and output strings to 
> > > refer to MA instead of ATR. But, there would be no further change in 
> > > logic other than that one line.
> > > 
> > > Mike
> > > 
> > > --- In [email protected], "chuck_win" <chaoy@> wrote:
> > > >
> > > > Hi Mike,
> > > > 
> > > > I need to run optimize, and have spent a lot of time to add a custom 
> > > > column of MA on optimize result list and no luck so far. 
> > > > 
> > > > Is it possible to find the bar index or bar number of buying and use 
> > > > the number to refer the MA like
> > > > 
> > > > myMA = ref(MA(close, 6), -17);
> > > > 
> > > > Thank you very much!
> > > > 
> > > > Charles
> > > > 
> > > >  
> > > > 
> > > > --- In [email protected], "Mike" <sfclimbers@> wrote:
> > > > >
> > > > > Hi,
> > > > > 
> > > > > There are a couple of problems:
> > > > > 
> > > > > 1. When trying to do an equivalence test, use the equivalence 
> > > > > operator '==' not the assignment operator '='.
> > > > > 
> > > > > 2. buyrule is an array. You cannot use the if statement on an array.
> > > > > 
> > > > > If you just want to see what the value is, then run an exploration:
> > > > > 
> > > > > Filter = buyrule;
> > > > > AddColumn(MA(Close, 6), "MA(6)");
> > > > > 
> > > > > http://www.amibroker.com/guide/h_exploration.html
> > > > > 
> > > > > Otherwise, add a custom metric to your backtest.
> > > > > 
> > > > > Mike
> > > > > 
> > > > > --- In [email protected], "chuck_win" <chaoy@> wrote:
> > > > > >
> > > > > > Hi,
> > > > > > 
> > > > > > I do backtesting, and want to check MA at the time of buying.
> > > > > > 
> > > > > > My code looks like 
> > > > > > 
> > > > > > buyrule = cross(MACD, signal);
> > > > > > buy = buyrule;
> > > > > > buyprice = close;
> > > > > > sellrule = cross(signal, MACD);
> > > > > > sell = sellrule;
> > > > > > sellprice = close;
> > > > > > if (buyrule = true) {
> > > > > >  str = StrFormat("%0.2f", MA(Close,6));
> > > > > >  _TRACE(NumToStr( DateTime(), formatDateTime ) + ", " + str);
> > > > > > 
> > > > > > }
> > > > > > 
> > > > > > I always get the MA at the ending time of last bar instead. 
> > > > > > 
> > > > > > Thanks for any help!
> > > > > > 
> > > > > > Charles
> > > > > >
> > > > >
> > > >
> > >
> >
>


Reply via email to