[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Simple slippage implemented in CBT generates COM error



PureBytes Links

Trading Reference Links

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/





Your email settings: Individual Email|Traditional
Change settings via the Web (Yahoo! ID required)
Change settings via email: Switch delivery to Daily Digest | Switch to Fully Featured
Visit Your Group | Yahoo! Groups Terms of Use | Unsubscribe

__,_._,___