| 
 Hi - You might try using SetBarsRequired at 
the end of your code to limit how far the backtester looks back, have never 
tried it so I don't know if it would work or not. Perhaps the easiest way would 
be to trim the signals you don't want, e.g. 
  
Buy = whatever; 
Buy = IIF( DateNum < Status( "RangeFromDate" ), 
0, Buy ); 
  
Steve 
  ----- Original Message -----  
  
  
  Sent: Thursday, September 04, 2008 5:43 
  PM 
  Subject: [amibroker] Backtester does not 
  respect date range! 
  
  This is a weird problem.  It has become apparent to me 
  that the backtester is not adhering to the specified date range. 
  For 
  example, I have a simple Forex test system that Buys on the first bar, and 
  sells when there is 100 pips profit, or 5 days have elapsed (loss). Then it 
  re-enters the trade on the next available bar. So there should be a Buy at the 
  very first bar.  But when I backtest  on a date range like 6/21/2007 
  - 7/21/2007, the first Buy occurs on 6/26/2007, instead of 6/21.  
  
  It was very basic AFL and I could not find any flaw in logic. So 
  someone advised me to install Debug View and add trace statements. 
  
  What I found is that the backtest engine is going all the way back to 
  the begining of my actual database (April 1998) and applying the AFL, but only 
  showing me results post 6/21/2007. The "phantom" Buys and Sells that occur 
  prior to 6/21/2007 makes the backtester think it is already in a trade when it 
  officially starts on 6/21. And it's only when the "phantom" Sell occurs on 
  6/26 that it shows the first official Buy on that date in the backtester trade 
  report.
  How could this be?
  Any help much 
  appreciated.
  Below is the code with all the backtester settings. Please 
  ignore the trace statements. They are only for debugging. As you can see, the 
  code is very basic, (for testing purposes only):
 
 
  /////////////////////////////////////////////////////////////////////////////////////// //    
                  
                  
              
   //                         
  SIMPLE TEST SYSTEM:  // //   BUY AT FIRST BAR, THEN SELL AT 
  100 PIPS PROFIT OR AFTER 7200 ONE-MINUTE BARS (5 DAYS). //   
  RE-ENTER ON THE NEXT BAR AFTER A 
  SELL. // //////////////////////////////////////////////////////////////////////////////////////
  // 
  ----------------------------------------------------------------------- // 
  Variables // 
  -----------------------------------------------------------------------
  Profit              
  = 
  0.0100; bars                
  = 7200; maxContractsPerPair = 
  1; maxPairsTraded      = 
  1;                                                
   Slippage            
  = 0.0002;
 
  // 
  ----------------------------------------------------------------------- // 
  BackTester Settings // 
  -----------------------------------------------------------------------
  tradeDelay    
  = 1;
  SetBarsRequired(10000, 
  10000);                    
  // Ensures that the charts include all bars AND NOT just 
  those on screen SetOption("AccountMargin", 
  100);                  
  // Account margin, 100 = no 
  margin SetOption("ActivateStopsImmediately", 
  False);     // Intraday stops 
  ? SetOption("AllowPositionShrinking", 
  False);        // Take 
  partial trades if equity available ? SetOption("AllowSameBarExit", 
  True);              
  // Allow same bar exit for profit stops ?  
   SetOption("CommissionAmount", 
  4.00);              // Commission amount SetOption("CommissionMode", 
  3);                   
  // 3 = $ per 
  share/contract SetOption("FuturesMode", 
  1);                      
  // = use MarginDeposit and PointValue in 
  calculations SetOption("InitialEquity", 
  100000);               
  // Initial equity 
  $ SetOption("InterestRate",0);                      
  // Set interest rate earned for free cash, zero to 
  evaluate system SetOption("MaxOpenPositions", maxPairsTraded * 
  maxContractsPerPair); SetOption("MinPosValue", 
  0);                      
  // Min position value to make trade worthwhile, 0 = no 
  limit SetOption("MinShares", 
  1);                        
  // Min number 
  shares SetOption("PriceBoundChecking", False 
  );           // Price to stay in bar range 
  ? SetOption("ReverseSignalForcesExit", 
  False); SetOption("UsePrevBarEquityForPosSizing", True ); // Use last known bar for position sizing 
  ? SetTradeDelays(tradeDelay, tradeDelay, tradeDelay, 
  tradeDelay); SetPositionSize(1, spsShares);
  if (maxContractsPerPair 
  > 1)   SetBacktestMode(backtestRegularRawMulti);
  // In AmiBroker, make sure that Symbol Information is properly 
  set up for each pair, esp. currency field. // Also, under AmiBroker main 
  menu, make sure to set Tools --> Preferences --> 
  Currencies    for each pair
  RoundLotSize = 
  1; MarginDeposit = 2000; PointValue = 100000;
  // 
  ----------------------------------------------------------------------- // 
  Trading System Formula // 
  -----------------------------------------------------------------------
  BuyPrice 
  = Open + Slippage;      ShortPrice = Open - 
  Slippage; SellPrice = Open - Slippage; CoverPrice = Open + 
  Slippage;
 
  // Set up some variables to give us 
  info on current position wasLong = reachedProfitLevel = buySignal = 
  sellSignal = barToExitLong = 0;
  // Set up variables 
  for our entry values, as our stops will test against the initial entry 
  prices valueAtBuy = Null; profitLevel = Null;
  // Number of open contracts longContractCount  = 
  0;
  // Debugging arrays dateArray = 
  DateNum(); timeArray = TimeNum();
  for (i = 0; i < 
  (BarCount-TradeDelay); i++) {   // Remember if 
  a position is currently open, so we do not re-enter in the same direction on 
  the same bar   wasLong  =  longContractCount > 
  0;  
    // Check for conditions to exit a 
  long trade   if (longContractCount > 0)   
  {     reachedProfitLevel = C[i] > 
  profitLevel;
      if 
  (reachedProfitLevel)     
  {         _TRACE("bar=" + i + " " + 
  StrFormat("%06.0f",dateArray[i]) + " " + StrFormat("%06.0f",timeArray[i]) + " 
  reached long ProfitLevel");         
  sellSignal[i] = 3; // 3 = profit : this behavior emulates 
  the Equity(1) 
  functionality         
  longContractCount = 0;     }
      // Sell at loss     else if ( i == 
  barToExitLong)     {       
  _TRACE("bar=" + i + " " + StrFormat("%06.0f",dateArray[i]) + " " + 
  StrFormat("%06.0f",timeArray[i]) + " reached 
  barToExitLong");       sellSignal[i] = 2; // 2 = max loss : this behavior emulates the Equity(1) 
  functionality       longContractCount = 
  0;     }    }      // Long entry   if ( NOT wasLong )   
  {     _TRACE("bar=" + i + " " + 
  StrFormat("%06.0f",dateArray[i]) + " " + StrFormat("%06.0f",timeArray[i]) + " 
  not was long");     buySignal[i] = 1;     
  longContractCount = 1;     valueAtBuy = 
  BuyPrice[i+tradeDelay];     profitLevel = valueAtBuy + 
  Profit;     barToExitLong = i + bars; // 
  5 days later   } }
  // This logic 
  is needed to workaround strange undocumented backtester behavior when the 
  sell/cover arrays are non-boolean. Sell  = sellSignal != 
  0; Buy   = buySignal;
 
 
 
    
__._,_.___
  
Please note that this group is for discussion between users only. 
 
To get 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 
  
     
    
 
      
   
__,_._,___
 |