Ozzy,

Looks like Tomasz beat me to it. So, I'll just add that you can use
dynamic slippage by making use of Foreign. And, you would probably want
to restrict your final values to be within the actual Low to High
ranges.

e.g.

   if ( sig.IsEntry() )
   {
     // Arbirtray example; Add 10% of spread to BuyPrice on entry
     symbolHigh = Foreign( sig.Symbol, "H" );
     symbolLow = Foreign( sig.Symbol, "L" );
     sig.Price = min( symbolHigh[i], sig.Price + ( ( symbolHigh[i] -
symbolLow[i] ) / 10 ) );
   }
   else
   {
     // Arbitrary example; Add fixed value slippage on exit
     sig.Price = max( symbolLow[i], sig.Price - Slippage );
   }


Mike


--- In [email protected], "Tomasz Janeczko" <gro...@...> wrote:
>
> 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 kavemanperth@ 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 zoopfree@:
> > > 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