For what it's worth, static arrays were introduced to 
  the 32 bit version in 5.24.0 as seen here: http://www.amibroker.com/devlog/wp-content/uploads/2009/03/readme5240.html 
  If the feature is not yet available in the 64 bit version, creating a static 
  variable for every bar of every symbol would probably be overkill. You could 
  instead get greatly improved timings just by creating the ATR arrays once per 
  symbol, as opposed to once per trade. For example; 
  
SetTradeDelays( 0, 0, 0, 0 ); 
PositionSize = -2; 
weekDay = 
  DayOfWeek(); 
  
Buy = weekDay == 
  1; 
BuyPrice = Open; 
Sell = weekDay == 
  5; 
SellPrice = Close; 
SetCustomBacktestProc( 
  "" ); 
  
if ( Status( "action" ) == actionPortfolio ) 
{ 
  
    bo = GetBacktesterObject(); 
  
    bo.Backtest( True ); 
  
    dates = DateTime(); 
  
    bi = BarIndex(); 
  
     for ( trade 
  = bo.GetFirstTrade( ); trade; trade = bo.GetNextTrade( ) ) 
  
    { 
  
        foreignATR = 
  VarGet( trade.Symbol + 
  "ATR" ); 
  
        undefined = 
  IIF( IsNull( foreignATR ), 
  true, false ); 
  
         if ( LastValue( undefined ) ) 
  
        { 
  
            _TRACE( "Constructing ATR(14) for " + 
  trade.Symbol ); 
  
             
  SetForeign( trade.Symbol ) ; 
  
            foreignATR 
  = ATR( 14 ); 
  
            VarSet( trade.Symbol + 
  "ATR", foreignATR ); 
  
            RestorePriceArrays(); 
  
        } 
  
        entryBar = 
  LastValue( ValueWhen( trade.EntryDateTime == 
  dates, bi ) ); 
  
        trade.AddCustomMetric( 
  "Entry ATR", foreignATR[ entryBar] ); 
  
    } 
    bo.ListTrades( 
  ); 
} 
  
  Mike
  
  --- In amibroker@xxxxxxxxxps.com, B S <bs2167@xxx> 
  wrote:
>
> Thanks Tomasz.  One stupid follow up 
  question: my understanding is that StaticVarSet will take only a 
  single number not an array, therefore do i need to create a loop outside the 
  CBT from 0 to BarCount - 1 and create a static variable for every bar as 
  follows?
> 
> StaticVarSet( "MyAtr"+Name( )+BarIndex() , ATR(14) 
  );
> 
> ________________________________
> 
  From: Tomasz Janeczko groups@xxx
> To: 
  amibroker@xxxxxxxxxps.com
> Sent: Wed, January 20, 2010 6:06:41 
  PM
> Subject: Re: [amibroker] CBT - trade.addcustommetric() - 13x 
  slower - bad code/settings?
> 
>   
> Hello,
> 
  
> Foreign is costly. Move your calculations OUTSIDE custom backtest 
  part.
> ATR can easily be calculated outside CBT and passed via Static 
  variable.
> 
> So instead of Foreign use Static variables. Store 
  your ATR into static variables keyed with 
> 
> StaticVarSet( 
  "MyAtr"+Name( ), ATR(14) );
> 
> and inside custom backtester use 
  StaticVarGet( "MyAtr"+trade. Symbol);
> 
> Best regards,
> 
  Tomasz Janeczko
> amibroker.com
> 
> On 2010-01-20 23:39, B 
  S wrote: 
> Hi- 
> >
> >I have run into some major 
  performance problems when trying to add a single simple metric to the backtest 
  results.  I have no doubt that its something I'm doing, I just have no 
  idea what that might be.  I have seen a post or two in the past on how 
  to accomplish what I'm trying to do (as the examples below will 
  replicate), but there was no follow up on the performance of the proposed 
  solutions.  Since there was no further discussion, I'm wondering if the 
  code is fine but my settings (or something else) may be causing the 
  problem.  Below I list what I believe to be all pertinent information - 
  would very much appreciate any help on this.
> >
> >Base 
  system is tested on 5 symbols, 5min data, from 1/1/2000 - 12/31/2006. Quick 
  AFL is checked in the setting and data is padded and aligned.  
  I'm running the 64bit version of AB 5.22.  
> >
> 
  >Performance without calling CBT : 65 secs
> >
> 
  >------------ --------- --------- --------- --------- ---
> 
  >
> >Performance with the code below added: 72 secs (very 
  good)
> >(code is from http://www..amibroke r.org/userkb/ 
  2008/03/16/ amibroker- custom-backteste r-interface- 2/ ) 
> 
  >SetCustomBacktestPr oc("");
> >if (Status("action") == 
  actionPortfolio)
> >{
> > bo = GetBacktesterObject(); 
  // Get backtester object
> > bo.Backtest(True); // Run backtests 
  with no trade listing
> > stat = bo.GetPerformanceStats(0); // 
  Get Stats object for all trades
> > winAvgProfit = 
  stat.GetValue("WinnersAvgProfit");
> > loseAvgLoss = 
  stat.GetValue("LosersAvgLoss");
> > for (trade = 
  bo.GetFirstTrade(); trade; trade = bo.GetNextTrade())
> > { 
  // Loop through all closed trades
> > prof = trade..GetProfit(); 
  // Get trade profit in dollars
> > relProf = 0; // This will be 
  profit/avgProfit as %
> > if (prof > 0) // If a winner (profit 
  > 0)
> > relProf = prof / winAvgProfit * 100; // Profit relative 
  to average
> > else // Else if a loser (profit <= 0)
> > 
  relProf = -prof / loseAvgLoss * 100; // Loss relative to average
> > 
  trade.AddCustomMetric("Rel Avg Profit%", relProf); // Add metric
> 
  > } // End of for loop over all trades
> > bo.ListTrades(); 
  // Generate list of trades
> >}
> >------------ --------- 
  --------- --------- --------- --------- --------- --------- --------- 
  --------- ------
> >Performance with the code below added to record 
  ATR at entry: 854 secsSetCustomBacktestPr oc("");
> 
  >if(Status("action") == actionPortfolio) 
> >{ 
> 
  >bo = GetBacktesterObject(); 
> 
  >bo.Backtest(True);
> >dates = DateTime(); 
> >bi = 
  BarIndex();
> >for(trade = bo.GetFirstTrade( ); trade; trade = 
  bo.GetNextTrade( )) 
> >{
> >SetForeign(trade.Symbol) ; 
  
> >entryBar = LastValue(ValueWhen(trade.EntryDateTim e == 
  dates, bi)); 
> >foreignATR = ATR(14); 
> 
  >trade.AddCustomMetr ic("Entry ATR",foreignATR[ entryBar] ); 
> 
  >RestorePriceArrays(); 
> >}
> >bo.ListTrades( ); 
  
> >}
> >Anyone have any ideas where I may be going 
  wrong?
> > 
> >
>