Thanks for this additional info.
I just was thinking something like "My very first CBT code and I have to use low level... That's what I call bad luck..." --- In [email protected], Tomasz Janeczko <gro...@...> wrote: > > Hello, > > One more thing to add: as an alternative to going low-level, you could > iterate through open positions list on your own > (GetFirstOpenPos/GetNextOpenPos) get number of shares (Shares property) and > multiply by Close price (trade object has GetPrice(bar, "C") method for > that), then > add to bo.Cash and you get the closing equity value that way, without need to > call UpdateStats > > Best regards, > Tomasz Janeczko > amibroker.com > > On 2010-07-16 19:17, Tomasz Janeczko wrote: > > Hello, > > > > Generally speaking you should be using low-level backtest for that. > > Guessing from your rather short descriptions, I think that you are trying > > to override normal spsPercentOfEquity > > position size processing and use your own. > > > > The example codes for using low-level interface are included at the end of > > this article: > > http://www.amibroker.org/userkb/2008/03/16/amibroker-custom-backtester-interface-2/ > > > > ProcessTradeSignals not only processes signals but also does what > > UpdateStats() is doing therefore > > you should not mix both since exposure will be counted twice. > > > > Using low-level mode avoids that. > > > > Best regards, > > Tomasz Janeczko > > amibroker.com > > > > On 2010-07-16 18:56, rise_t575 wrote: > >> > >> One last question for clarification: > >> > >> 1) On one hand, I have to call bo.ProcessTradeSignals() for updating > >> equity. > >> 2) On the other hand, I have to calculate position sizes *before* calling > >> bo.ProcessTradeSignals(). > >> 3) But for calculating the correct position sizes, my position sizing code > >> has to have access to the updated equity. > >> > >> So using UpdateStats() in this case is *mandatory*, correct? > >> > >> --- In [email protected], Tomasz Janeczko<groups@> wrote: > >>> Hello, > >>> > >>> You can call UpdateStats( bar, 2 ) but please call it once per bar. When > >>> TimeInsideBar = 2 > >>> two things in addition to updating equity happen: > >>> a) interest earnings are added (from free cash) > >>> b) position exposure and portfolio stats are calculated > >>> > >>> You can get incorrect exposure figures if you call UpdateStats( bar, 2 ) > >>> more than once per bar. > >>> > >>> One thing you should think of: be aware that if you are using current > >>> bar closing equity for > >>> position sizing, you are generating possible future data leak. > >>> How is that so? It is easy - assume that your position sizing depends on > >>> current equity, > >>> you can calculate bar's open equity and open position equal to the > >>> difference between > >>> open equity and close equity of the same bar. And you generate single bar > >>> trade. > >>> This way you have the system that has 100% winning trades, because it is > >>> using future leak in > >>> position sizing. > >>> That is the reason AmiBroker DOES NOT use close equity of current bar for > >>> position sizing. > >>> It either uses previous bar close equity or equity value at the open. > >>> > >>> Best regards, > >>> Tomasz Janeczko > >>> amibroker.com > >>> > >>> On 2010-07-16 15:29, rise_t575 wrote: > >>>> I see - thanks. > >>>> > >>>> Actually I would like to use equity calculated from closing prices of > >>>> the current bar (by searching the web, I've found that normally, AB > >>>> calculates equity > >>>> for position sizing with opening prices of the current bar - and not > >>>> being aware of this has caused me some major headaches the last couple > >>>> of days. Is > >>>> this mentioned in the position sizing related sections of the manual? If > >>>> not, this information should be added). Reading the description of > >>>> UpdateStats(), > >>>> it seems like I could achieve this by setting the second (TimInsideBar) > >>>> parameter to "2". When I put "bo.UpdateStats( bar, 2 );" into my code, > >>>> at least the > >>>> position sizes are calculated exactly the way I want them to. > >>>> But there are several warnings about doing this in the method's > >>>> description. Can I unintentionally mess something up by doing this? > >>>> > >>>> Thanks. > >>>> > >>>> --- In [email protected], Tomasz Janeczko<groups@> wrote: > >>>>> Hello, > >>>>> > >>>>> Sorry, the method name is actually UpdateStats() > >>>>> > >>>>> Best regards, > >>>>> Tomasz Janeczko > >>>>> amibroker.com > >>>>> > >>>>> On 2010-07-16 14:06, rise_t575 wrote: > >>>>>> Probably I'm blind, but I cannot find any information about the > >>>>>> mentioned UpdateEquity() function, any searches in the online/offline > >>>>>> manual result > >>>>>> nothing. Could someone provide me with a link? > >>>>>> > >>>>>> Thanks. > >>>>>> > >>>>>> > >>>>>> --- In [email protected], Tomasz Janeczko<groups@> wrote: > >>>>>>> Hello, > >>>>>>> > >>>>>>> The value of bo.Equity is correct. > >>>>>>> > >>>>>>> And your findings are incorrect. > >>>>>>> "Use previous bar equity" works as described in the manual. > >>>>>>> > >>>>>>> You are making mistake in your thinking/debugging. > >>>>>>> Your formula is checking bo.Equity BEFORE calling > >>>>>>> ProcessTradeSignals(). And it is giving you last known > >>>>>>> equity value. That is the reason of your incorrect findings. > >>>>>>> > >>>>>>> If you are using custom backtester interface, there are clearly > >>>>>>> defined points where *you* are in charge > >>>>>>> and when AB is in charge (and can update anything). It will NOT do > >>>>>>> any "magical steps" out of blue right after > >>>>>>> for( bar = 0; bar< BarCount; bar++ ) loop. If you want to update > >>>>>>> equity to the current bar you either > >>>>>>> must call ProcessTradeSignals() (it will update equity and process > >>>>>>> signals) OR... if you want to have > >>>>>>> current bar equity WITHOUT calling ProcessTradeSignals, you have to > >>>>>>> call UpdateEquity( bar, 0 ) function. > >>>>>>> > >>>>>>> The difference that "Use previous bar equity" makes in case of CBT is > >>>>>>> that ***INSIDE*** ProcessTradeSignals() > >>>>>>> it will use either previous bar or current bar equity, depending on > >>>>>>> setting, and it will affect the size > >>>>>>> of position open (if you are using spsPercentOfEquity or otherwise > >>>>>>> depend on available equity) > >>>>>>> > >>>>>>> Recommended reading: > >>>>>>> http://www.amibroker.org/userkb/2008/03/16/amibroker-custom-backtester-interface-2/ > >>>>>>> > >>>>>>> > >>>>>>> Best regards, > >>>>>>> Tomasz Janeczko > >>>>>>> amibroker.com > >>>>>>> > >>>>>>> On 2010-07-15 20:15, rise_t575 wrote: > >>>>>>>> Hi, > >>>>>>>> > >>>>>>>> I've just found out what is happening, but I have not the slightest > >>>>>>>> idea why. > >>>>>>>> > >>>>>>>> The backtester is *always* using previous bar equity for positions > >>>>>>>> sizing, although this setting is *not* ticked, and I haven't > >>>>>>>> included the > >>>>>>>> corresponding SetOption function. > >>>>>>>> > >>>>>>>> In fact, the backtests and the debugging logs are exactly identical > >>>>>>>> when UsePrevBarEquityForPosSizing is True and when it is False. > >>>>>>>> > >>>>>>>> Is this some bug or isn't that setting being used when using CBT for > >>>>>>>> position sizing? > >>>>>>>> > >>>>>>>> Thanks in advance! > >>>>>>>> > >>>>>>>> --- In [email protected], "rise_t575"<rise_t@> wrote: > >>>>>>>>> Hello, > >>>>>>>>> > >>>>>>>>> The following are the (debug) outputs of a tested position sizing > >>>>>>>>> algorithm. > >>>>>>>>> > >>>>>>>>> I've attached a) part of the code , b) the output of the _TRACE() > >>>>>>>>> function from within the CBT code (the TRACE function had been > >>>>>>>>> placed within the > >>>>>>>>> most inner "if{}" code block), and c) the output of the AA Results > >>>>>>>>> window (Detailed Log). > >>>>>>>>> > >>>>>>>>> Note that on the _TRACE() output, the equity on day 2 (21.01.2000) > >>>>>>>>> is still at its intial value (100000), so it hasn't been adjusted > >>>>>>>>> for price changes > >>>>>>>>> of the position taken at the close of day 1 (which did exist). > >>>>>>>>> > >>>>>>>>> Since this equity value is used for calculation of the position > >>>>>>>>> size of subsequent signals, this is a problem. > >>>>>>>>> > >>>>>>>>> On the other hand, the output of the AA Results windows on day 2 is > >>>>>>>>> correct (99823.2) > >>>>>>>>> > >>>>>>>>> And - no - "Use previous bar equity for position sizing" is not > >>>>>>>>> activated. > >>>>>>>>> > >>>>>>>>> Does anyone have an idea why bo.equity delivers incorrect values in > >>>>>>>>> this case? > >>>>>>>>> > >>>>>>>>> Thanks in advance! > >>>>>>>>> > >>>>>>>>> Part of CBT code in question: > >>>>>>>>> > >>>>>>>>> for ( sig = bo.GetFirstSignal( bar ); sig; sig > >>>>>>>>> = bo.GetNextSignal( bar ) ) > >>>>>>>>> { > >>>>>>>>> if ( sig.IsEntry() ) > >>>>>>>>> { > >>>>>>>>> currEquity = bo.Equity; > >>>>>>>>> pointVal = sig.PointValue; > >>>>>>>>> cbtAtr = StaticVarGet( "statAtr" + > >>>>>>>>> sig.Symbol ); > >>>>>>>>> psUnits = int( currEquity * ( > >>>>>>>>> pctVolaRisk / 100 ) / ( cbtAtr[bar] * pointVal ) ); > >>>>>>>>> [_TRACE] > >>>>>>>>> sig.PosSize = ( 2000 + psUnits ) * -1; > >>>>>>>>> } > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> DebugView Output: > >>>>>>>>> [2856] Date: 20.01.2000 Symbol: FDRY Equity: 100000 Cash: 100000 > >>>>>>>>> ATR: 14.383258 Units: 69 > >>>>>>>>> [2856] Date: 21.01.2000 Symbol: PCLN Equity: 100000 Cash: 89818.2 > >>>>>>>>> ATR: 27.671930 Units: 36 > >>>>>>>>> [2856] Date: 21.01.2000 Symbol: TYC Equity: 100000 Cash: 89818.2 > >>>>>>>>> ATR: 14.318740 Units: 69 > >>>>>>>>> [2856] Date: 25.01.2000 Symbol: AKAM Equity: 98382.8 Cash: 59163.1 > >>>>>>>>> ATR: 27.247997 Units: 36 > >>>>>>>>> [2856] Date: 03.02.2000 Symbol: IBM Equity: 97308.7 Cash: 49107.9 > >>>>>>>>> ATR: 4.628230 Units: 210 > >>>>>>>>> [2856] Date: 04.02.2000 Symbol: FDRY Equity: 97846.4 Cash: 42716.2 > >>>>>>>>> ATR: 13.667122 Units: 71 > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> AA Results Output: > >>>>>>>>> 20.01.2000 > >>>>>>>>> Entry signals(score):FDRY=Buy(1), > >>>>>>>>> Exit signals: > >>>>>>>>> Enter Long, FDRY, Price: 147.563, Shares: 69, Commission: 0, > >>>>>>>>> Rank: 1, Equity 100000, Margin Loan: 0, Fx rate: 1 > >>>>>>>>> 1 Open Positions: , FDRY (+69), Equity: 100000, Cash: 89818.2 > >>>>>>>>> > >>>>>>>>> 21.01.2000 > >>>>>>>>> Entry signals(score):PCLN=Buy(1), TYC=Buy(1), > >>>>>>>>> Exit signals: > >>>>>>>>> Enter Long, PCLN, Price: 381, Shares: 36, Commission: 0, Rank: > >>>>>>>>> 1, Equity 100237, Margin Loan: 0, Fx rate: 1 > >>>>>>>>> Enter Long, TYC, Price: 245.493, Shares: 69, Commission: 0, > >>>>>>>>> Rank: 1, Equity 100237, Margin Loan: 0, Fx rate: 1 > >>>>>>>>> 3 Open Positions: , FDRY (+69), , PCLN (+36), , TYC (+69), > >>>>>>>>> Equity: 99823.2, Cash: 59163.1 > >>>>>>>>> > >>>>>>>>> 24.01.2000 > >>>>>>>>> Entry signals(score): > >>>>>>>>> Exit signals: > >>>>>>>>> 3 Open Positions: , FDRY (+69), , PCLN (+36), , TYC (+69), > >>>>>>>>> Equity: 98382.8, Cash: 59163.1 > >>>>>>>>> > >>>>>>>>> 25.01.2000 > >>>>>>>>> Entry signals(score):AKAM=Buy(1), > >>>>>>>>> Exit signals: > >>>>>>>>> Enter Long, AKAM, Price: 279.313, Shares: 36, Commission: 0, > >>>>>>>>> Rank: 1, Equity 98825.1, Margin Loan: 0, Fx rate: 1 > >>>>>>>>> 4 Open Positions: , FDRY (+69), , PCLN (+36), , TYC (+69), , > >>>>>>>>> AKAM (+36), Equity: 98806.8, Cash: 49107.9 > >>>>>>>>> > >>>>>>>> ------------------------------------ > >>>>>>>> > >>>>>>>> **** 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 > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>>>> > >>>>>> > >>>>>> ------------------------------------ > >>>>>> > >>>>>> **** 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 > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>> > >>>> > >>>> ------------------------------------ > >>>> > >>>> **** 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 > >>>> > >>>> > >>>> > >>>> > >> > >> > >> > >> ------------------------------------ > >> > >> **** 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 > >> > >> > >> > >> >
