PureBytes Links
Trading Reference Links
|
Thanks again, Mike (and Tomasz, Graham).
Got it working now, and integrated all suggestions.
--- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@xxx> wrote:
>
>
> 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 amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@> 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: amibroker@xxxxxxxxxxxxxxx
> > 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@ 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 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/
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/amibroker/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/amibroker/join
(Yahoo! ID required)
<*> To change settings via email:
mailto:amibroker-digest@xxxxxxxxxxxxxxx
mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx
<*> To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|