All wrong. Wrong loop ending condition, using trade (closed trade list) instead 
of signal list.
Correct code is below.
Again: if you don't know what you are coding it is STRONGLY encouraged to use
COMMISSION table instead. Just set custom commission table to implement 
slippage.
It is way easier and more straightforward than any other method. I completelly 
don't understand
the insistency of copy-paste artists on making it hard way while way easier 
method (no coding at all) is available.


Slippage = 0.0002; 

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

    bo.PreProcess(); // Initialize backtester 

    for ( bar = 0; bar < BarCount; bar++ ) 
    { 
      for( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar ) ) 
      { 
           sig.Price = sig.Price + IIf( sig.IsEntry(), Slippage, -Slippage ); 
      } 

      bo.ProcessTradeSignals( bar ); 
    } 

    bo.PostProcess(); // Finalize backtester 
} 


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


  Graham, thanks for that example.

  I modified the example to try to solve my slippage problem. From every way I 
look at it, I now appear to have all the correct controls. Yet it still has no 
effect! Note that I can't use GetPrice on Closed trades, according to the 
reference guide.

  I really hate looking like a coding klutz, but do you, or anyone see what I 
am still doing wrong?!


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

      bo.PreProcess(); // Initialize backtester 

      for ( bar = 0; bar < BarCount-1; bar++ ) 
      { 
          bo.ProcessTradeSignals( bar ); 

          for ( Trade = bo.GetFirstTrade(); Trade; Trade = bo.GetNextTrade() ) 
          { 
              if ( NOT Trade.IsOpen() ) 
              { 
                  if ( Trade.IsLong() ) // Exit Long 
                  { 
                      ExitTrue        = Trade.ExitPrice - Slippage; 
                      Trade.ExitPrice = ExitTrue; 
                  } 

                  else               // Exit Short 
                  { 
                      ExitTrue        = Trade.ExitPrice + Slippage; 
                      Trade.ExitPrice = ExitTrue; 

                  } 
              } 
          } 
      } 

      bo.PostProcess(); // Finalize backtester 
  } 





  --- In [email protected], Graham <kavemanpe...@...> wrote:
  >
  > You have not included all the required control functions and method
  > for getting the signals, here is example from knowledge base, you can
  > see what is missing. This example does a different actual change to
  > the trades, but the whole process is the same.
  > 
  > if( Status("action") == actionPortfolio )
  > {
  > bo = GetBacktesterObject();
  > 
  > bo.PreProcess(); // Initialize backtester
  > <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  > 
  > for(bar=0; bar < BarCount; bar++)
  > //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  > { 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  > bo.ProcessTradeSignals( bar );
  > //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  > 
  > CurEquity = bo.Equity;
  > 
  > for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() )
  > {
  > posval = pos.GetPositionValue();
  > 
  > diff = posval - 0.01 * EachPosPercent * CurEquity;
  > price = pos.GetPrice( bar, "O" );
  > 
  > // rebalance only if difference between desired and
  > // current position value is greater than 0.5% of equity
  > // and greater than price of single share
  > if( diff != 0 AND
  > abs( diff ) > 0.005 * CurEquity AND
  > abs( diff ) > price )
  > {
  > bo.ScaleTrade( bar, pos.Symbol, diff < 0, price, abs( diff ) );
  > }
  > }
  > } //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  > bo.PostProcess(); // Finalize backtester
  > //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  > }
  > 
  > 2009/3/19 ozzyapeman zoopf...@...:
  > > The custom commission table unfortunately doesn't  allow me to do what I
  > > want, which is to slip exits by an amount that varies according to market
  > > time. The example I am pasting here is simplified. I'm trying to model 
based
  > > on what I am seeing in live trades.
  > >
  > > Thanks on ProcessTradeSignals. But I still must be doing something wrong,
  > > because no effect:
  > >
  > >
  > > if ( Status( "action" ) == actionPortfolio )
  > > {
  > >   bo = GetBacktesterObject();
  > >
  > >     for
  > > ( sig = bo.GetFirstSignal(); sig; sig = bo.GetNextSignal() )
  > >      {
  > >
  > >       sig.ProcessTradeSignals();
  > >
  > >         if( sig.IsExit() )
  > >          {
  > >            if ( sig.IsLong() ) // Exit Long
  > >             {
  > >              ExitTrue  = sig.Price - Slippage;
  > >              sig.Price = ExitTrue;
  > >              }
  > >
  > >
  > > else               // Exit Short
  > >              {
  > >              ExitTrue  = sig.Price + Slippage;
  > >              sig.Price = ExitTrue;
  > >              }
  > >           }
  > >        }
  > >   }
  > >
  > >
  > >
  > >
  > > --- In [email protected], "Tomasz Janeczko" groups@ 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
  > >> ----- Original Message -----
  > >> From: ozzyapeman
  > >> To: [email protected]
  > >> Sent: Thursday, March 19, 2009 2:31 AM
  > >> Subject: [amibroker] Re: Simple slippage implemented in CBT generates COM
  > >> error
  > >>
  > >>
  > >> Okay on #1, I realize that the COM error was due to the bit of legacy
  > >> code: SetCustomBacktestProc( "" );
  > >>
  > >> However, the slippage code seems to have no effect whatsoever on the
  > >> backtest trade report.
  > >>
  > >> What might I be doing wrong?
  > >>
  > >>
  > >>
  > >> --- In [email protected], "ozzyapeman" zoopfree@ wrote:
  > >> >
  > >> > Hello, hoping someone can help on this. I am using ApplyStop, which 
does
  > >> > not have a slippage factor. I'm trying to avoid using a BarCount loop 
to
  > >> > implement slippage on exits and instead am trying to modify the signal
  > >> > list of the CBT to implement slippage, before the backtester engine
  > >> > processes the trades.
  > >> >
  > >> > But I am running into two problems, namely:
  > >> >
  > >> >
  > >> > 1. Get error COM method/function 'GetFirstSignal' call failed, on the
  > >> > for loop line, even though that line and prior ones were copied and
  > >> > pasted direct from the reference guide.
  > >> >
  > >> >
  > >> > 2. More of a question at this point: What if my calculation of ExitTrue
  > >> > price is below the Low, or above the High of the bar? Will the
  > >> > backtester engine simply ignore that signal? Or is there some way I can
  > >> > filter out that possibility directly in the code below?
  > >> >
  > >> >
  > >> >
  > >> > In this example, Slippage = 0.0002 elsewhere in my code, backtesting on
  > >> > Forex:
  > >> >
  > >> >
  > >> > SetCustomBacktestProc( "" );
  > >> >
  > >> > if ( Status( "action" ) == actionPortfolio )
  > >> > {
  > >> > bo = GetBacktesterObject();
  > >> >
  > >> > for( sig = bo.GetFirstSignal(); sig; sig = bo.GetNextSignal() )
  > >> > {
  > >> > if( sig.IsExit() )
  > >> > {
  > >> > if ( sig.IsLong() ) // Exit Long
  > >> > {
  > >> > ExitTrue = sig.Price - Slippage;
  > >> > sig.Price = ExitTrue;
  > >> > }
  > >> >
  > >> > else // Exit Short
  > >> > {
  > >> > ExitTrue = sig.Price + Slippage;
  > >> > sig.Price = ExitTrue;
  > >> > }
  > >> >
  > >> > }
  > >> > }
  > >> > }
  > >> >
  > >>
  > >
  > >
  > > 
  > 
  > 
  > 
  > -- 
  > Cheers
  > Graham Kav
  > AFL Writing Service
  > http://www.aflwriting.com
  >



  

Reply via email to