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 -----
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 amibroker@xxxxxxxxxxxxxxx, Graham
<kavemanperth@xxx> 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@xxx: > > 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
amibroker@xxxxxxxxxxxxxxx, "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:
amibroker@xxxxxxxxxxxxxxx > >> 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
amibroker@xxxxxxxxxxxxxxx, "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 >
__._,_.___
**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.
TO GET TECHNICAL SUPPORT send an e-mail directly to
SUPPORT {at} amibroker.com
TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
__,_._,___
|