Thanks again, Mike (and Tomasz, Graham). Got it working now, and integrated all suggestions.
--- In [email protected], "Mike" <sfclimb...@...> 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 [email protected], "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: [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 > > > > > >
