You don't need custom backtester to do such things.
BuyPrice = BuyPrice + Slippage:
SellPrice = SellPrice - Slippage;
CoverPrice = CoverPrice + Slippage:
ShortPrice = ShortPrice - Slippage.

When using ApplyStop make sure to switch "ExitAtStop" argument to false
and it will use prices defined above.

Best regards,
Tomasz Janeczko
amibroker.com
  ----- Original Message ----- 
  From: Aron 
  To: [email protected] 
  Sent: Thursday, March 19, 2009 8:08 AM
  Subject: Re: [amibroker] Re: Simple slippage implemented in CBT generates COM 
error


  Tomasz Janeczko wrote: 
    Hello,

    You need to call ProcessTradeSignals.

    BTW: it is easier to just define custom commission table (AA->Settings 
"Commission table: Define...") 
    that includes slippage than wresting with code.

    Best regards,
    Tomasz Janeczko
    amibroker.com
  Hello Tomasz,

  I would deeply appreciate if you provided an example on how to adjust Exits 
in CBT in order to account for spread and slippage.

  For FX scalping systems backtesting (takeProfit = 2-3 pips. ) , I think it is 
crucial to be able to do this since all depends on spread and slippage (if 
commissions ==0).

  Unfortunately, the code I have come up with is not quite working :

  // EURUSD example
  // price = (bid+ask)/2

  if ( Status( "action" ) == actionPortfolio ) 
  { 
      bo = GetBacktesterObject(); 
      bo.PreProcess(); 

      for ( bar = 0; bar < BarCount; bar++ ) 
      { 
          for ( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( 
bar ) ) 
          { 
              symbol = sig.symbol; 
              hi = Foreign( symbol, "High" ); 
              lo = Foreign( symbol, "Low" ); 

            
              slippage = 0.0001; 
              spread = 2 * 0.0001; 
            

             

              if ( sig.IsExit() ) 
              { 
                  if ( sig.isLong ) // Exit Long 
                  { 
                      TrueExit = sig.price - slippage; 
                     
                      if ( TrueExit >= lo[bar] - 0.5*spread && TrueExit <= 
hi[bar] - 0.5*spread ) // bid pricebound check
                      { 
                          sig.price = TrueExit; 
                         // bo.ExitTrade( BAR, sig.Symbol, sig.Price ); 
                      } 
                      else 
                          sig.price = -1; 



                  } 
                  else // Exit short 
                  { 
                      TrueExit = sig.price + slippage; 

                      if ( TrueExit >= lo[bar] + 0.5*spread && TrueExit <= 
hi[bar] + 0.5*spread ) // ask pricebound check
                      { 
                          sig.price = TrueExit; 
                          //bo.ExitTrade( BAR, sig.Symbol, sig.Price ); 
                      } 
                      else 
                          sig.price = -1; 

                  } 
              } 
          } 

          bo.ProcessTradeSignals( bar ); 

          bo.handlestops( bar ); 
         
      } 

      for ( trade = bo.GetFirstTrade(); trade; trade = bo.GetNextTrade() ) 
      { 
          trade.addcustommetric( "numPips", ( trade.exitprice - 
trade.entryprice ) / trade.ticksize ); 
      } 

      bo.PostProcess(); 
  } 





  

Reply via email to