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

[amibroker] Re: Referencing the backtested portfolio equity in the buy formula



PureBytes Links

Trading Reference Links

Hi,

Do you have an idea why the below code does not work? I would 
appreciate any help as I am stucked. I would like to insert the 
condition into the buy condition
MA(C,5)*MA(V,5)*50>Foreign("~~~EQUITY", "C") i.e. if the equity 
grows, the non liquid stocks will be ignored. Obviously, it does not 
work as above so I wanted to use the following custom backtester 
procedure.

Buy=Cross(RSI(),20);
Sell=Cross(20,RSI());
SetOption("UseCustomBacktestProc", True );
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.PreProcess();
for (bar = 0; bar < BarCount; bar++) {
for (sig = bo.GetFirstSignal(bar); sig; sig =
bo.GetNextSignal(bar)) 
{
if (sig.IsEntry()) 
{
SetForeign(sig.Symbol);
Liquidity = MA(C,5)*MA(V,5)*50;
RestorePriceArrays();
if (Liquidity[bar] < bo.Equity) 
{
sig.PosSize = 0;
}
}
}
bo.ProcessTradeSignals(bar);
}
bo.PostProcess();
}


--- In amibroker@xxxxxxxxxxxxxxx, "zozuzoza" <zozuka@xxx> wrote:
>
> Thank you, Mike. I managed to solve the trace. I inserted the 
> _TRACE(sig.symbol+" PosSize="+sig.PosSize+" Equity="+bo.Equity+" 
> Type="+sig.type+" reason="+sig.reason+" PosScore="+sig.PosScore);
> and it outputted the properties, altough I don't know how to trace 
> trade properties since it is a mid-level interface code but I will 
> play with it a bit more.
> 
> Looking at the trace, I couldn't figure out why your code does not 
> work. It gives the same result whether I paste the code or delete 
it. 
> It doesn't change anything.
> 
> May I ask you to try the code you mentioned below, just add any 
> buy,sell rules. Does it make any difference for you?
> 
> Thank you,
> Zozu
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@> wrote:
> >
> > If you haven't already, you will need to add a call to your AFL 
to 
> > indicate that you want your custom backtester code to run:
> > 
> > SetOption("UseCustomBacktestProc", True );
> > 
> > For the trace statements, simplify your life first, then build 
from 
> > there. Start with a simple _TRACE("Did this work?"); If you are 
> using 
> > one of the more recent versions of AmiBroker, you can see the 
> output 
> > in the Log window (may need to right click in the log to enable 
> > internal/external output - don't remember which).
> > 
> > I seem to recall running into issues when trying some formats in 
my 
> > _TRACE output with DebugView. It might have had to start with a 
> hard 
> > coded string rather than the direct result of StrFormat, but I 
> really 
> > don't remember, so don't quote me on that.
> > 
> > Mike
> > 
> > --- In amibroker@xxxxxxxxxxxxxxx, "zozuzoza" <zozuka@> wrote:
> > >
> > > Thanks, Mike. I copied the code you wrote below and it does not 
> make 
> > > any difference when I insert it or remove it into my system. I 
> also 
> > > wanted to debugview it inserting this line into various places 
in 
> > the 
> > > code and I couldn't get the debugview work.
> > > _TRACE(StrFormat("Buying " + sig.Symbol + ", price = %1.3f", 
> > > sig.Price));
> > > 
> > > What's wrong with the code and why the debugview doesn't get 
the 
> > > stuff.
> > > 
> > > Thanks for you help. I appreciate any comment.
> > > 
> > > --- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@> wrote:
> > > >
> > > > Documentation for custom backtester can be found here:
> > > > http://www.amibroker.com/guide/a_custombacktest.html
> > > > 
> > > > You cannot reference ~~~Equity during the formulation of your 
> > > > Buy/Sell trade rules since the value of ~~~Equity is not 
> > calculated 
> > > > until after the trade rules have been applied (i.e. chicken 
and 
> > egg 
> > > > problem).
> > > > 
> > > > For the scenario you describe, you could probably do your 
> > > calculation 
> > > > and compare it to bo.Equity. In the sample below, bo.Equity 
is 
> the 
> > > > equity of your account on a bar by bar basis. If you don't 
like 
> > the 
> > > > result, set sig.PosSize property to 0 and the trade will be 
> > skipped.
> > > > 
> > > > I don't have AmiBroker on this machine, so I cannot verify 
the 
> > > > following syntax, and cannot attest to its efficiency. But, 
the 
> > > idea 
> > > > would be something along the lines of:
> > > > 
> > > > if (Status("action") == actionPortfolio) {
> > > >   bo = GetBacktesterObject();
> > > >   bo.PreProcess();
> > > > 
> > > >   for (bar = 0; bar < BarCount; bar++) {
> > > >     for (sig = bo.GetFirstSignal(bar); sig; sig = 
> bo.GetNextSignal 
> > > > (bar)) {
> > > >       if (sig.IsEntry()) {
> > > >         SetForeign(sig.Symbol);
> > > >         Liquidity = MA(C,5)*MA(V,5)*50;
> > > >         RestorePriceArrays();
> > > > 
> > > >         if (Liquidity[bar] < bo.Equity) {
> > > >           sig.PosSize = 0;
> > > >         }
> > > >       }
> > > >     }
> > > > 
> > > >     bo.ProcessTradeSignals(bar);
> > > >   }
> > > > 
> > > >   bo.PostProcess();
> > > > } 
> > > > 
> > > > 
> > > > Mike
> > > > 
> > > > --- In amibroker@xxxxxxxxxxxxxxx, "zozuzoza" <zozuka@> wrote:
> > > > >
> > > > > Thanks, Mike. The "Allow position size shrinking" trick 
> > basically 
> > > > > does what I need. Although, I don't understand the 2nd part 
> > about 
> > > > the 
> > > > > custom backtester code. Is there any documentation about 
the 
> > > > advanced 
> > > > > backtest code?
> > > > > 
> > > > > There is one issue I cannot solve. I would like to have in 
> the 
> > > Buy 
> > > > > condition the following.
> > > > > 
> > > > > MA(C,5)*MA(V,5)*50>Foreign("~~~EQUITY", "C")
> > > > > 
> > > > > i.e. if the equity grows, the non liquid stocks will be 
> ignored.
> > > > > 
> > > > > How is it possible code this? The above example does not 
work.
> > > > > 
> > > > > 
> > > > > --- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@> 
wrote:
> > > > > >
> > > > > > Hi,
> > > > > > 
> > > > > > If I understand your scenario correctly. You don't have 
to 
> > > worry 
> > > > > > about it, because AmiBroker will not allow you to place 
an 
> > > order 
> > > > > for 
> > > > > > a value greater than you actually have available in your 
> > > account. 
> > > > > > Just select the "Allow position size shrinking" checkbox 
> from 
> > > the 
> > > > > AA 
> > > > > > settings window, then set your position size based on 
your 
> > > volume 
> > > > > > calculations. AmiBroker will scale down as necessary when 
> your 
> > > > > > calculations exceed your equity.
> > > > > > 
> > > > > > Otherwise, as explained by Graham, if you are backtesting 
> over 
> > > > more 
> > > > > > than a single symbol, then you can access the equity from 
> > > within 
> > > > > > custom backtester code.
> > > > > > 
> > > > > > e.g.
> > > > > > 
> > > > > > SetBacktestMode(backtestRegularRaw);
> > > > > > SetCustomBacktestProc("");
> > > > > > 
> > > > > > if (Status("action") == actionPortfolio) {
> > > > > >   bo = GetBacktesterObject();
> > > > > >   bo.PreProcess();
> > > > > > 
> > > > > >   for (bar = 0; bar < BarCount; bar++) {
> > > > > >     for (sig = bo.GetFirstSignal(bar); sig; sig = 
> > > bo.GetNextSignal
> > > > > > (bar)) {
> > > > > >       ... // Make any adjustment to sig.PosSize that you 
> want 
> > > > using 
> > > > > > bo.Equity in your calculations.
> > > > > >       ... // If you need access to the symbol for Volume, 
> etc. 
> > > > use 
> > > > > > Foreign(sig.Symbol, "V").
> > > > > >     }
> > > > > > 
> > > > > >     bo.ProcessTradeSignals(bar);
> > > > > >   }
> > > > > > 
> > > > > >   bo.PostProcess();
> > > > > > } 
> > > > > > 
> > > > > > Mike
> > > > > > 
> > > > > > --- In amibroker@xxxxxxxxxxxxxxx, "zozuzoza" <zozuka@> 
> wrote:
> > > > > > >
> > > > > > > I tried this but doesn't work.
> > > > > > > PositionSize = Min(Foreign("~~~EQUITY", "C"),MA(C,5)*MA
> > > > (V,5)/50);
> > > > > > > It is a portfolio backtest.
> > > > > > > The question remains. How is it possible for the 
> > positionsize 
> > > > to 
> > > > > > > follow the equity AND also limit the positionsize by 
the 
> > > volume?
> > > > > > > 
> > > > > > > --- In amibroker@xxxxxxxxxxxxxxx, Graham 
<kavemanperth@> 
> > > wrote:
> > > > > > > >
> > > > > > > > For a portfolio backtest the only place is in the 
> > > > > positionsizing 
> > > > > > as
> > > > > > > > that is only used during the portfolio backtest pass
> > > > > > > > If it is a single symbol backtest then you can use 
> > Equity().
> > > > > > > > If you need to determine trade entries or exits based 
> on 
> > > > > portfolio
> > > > > > > > equity value then you need to use the advanced 
backtest 
> > > code 
> > > > to 
> > > > > > > change
> > > > > > > > the trade values.
> > > > > > > > 
> > > > > > > > -- 
> > > > > > > > Cheers
> > > > > > > > Graham Kav
> > > > > > > > AFL Writing Service
> > > > > > > > http://www.aflwriting.com
> > > > > > > > 
> > > > > > > > 
> > > > > > > > 
> > > > > > > > 2008/5/30 zozuzoza <zozuka@>:
> > > > > > > > > Is there any way to reference the portfolio equity
> > > > > > > > > Foreign("~~~EQUITY", "C") in the buy formula itself?
> > > > > > > > >
> > > > > > > > > I guess that the portfolio equity is available 
after 
> > > > running 
> > > > > the
> > > > > > > > > backtest so it cannot be referenced in the buy 
> formula 
> > > > itself.
> > > > > > > > >
> > > > > > > > > I've checked the AddToComposite stuff but it is not 
> > clear 
> > > > how 
> > > > > > it 
> > > > > > > can
> > > > > > > > > be done.
> > > > > > > > >
> > > > > > > > > Is there a simple solution for this? Thank you.
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > ------------------------------------
> > > > > > > > >
> > > > > > > > > Please note that this group is for discussion 
between 
> > > users 
> > > > > > only.
> > > > > > > > >
> > > > > > > > > To get support from AmiBroker please send an e-mail 
> > > > directly 
> > > > > to
> > > > > > > > > SUPPORT {at} amibroker.com
> > > > > > > > >
> > > > > > > > > For NEW RELEASE ANNOUNCEMENTS and other news always 
> > check 
> > > > > > DEVLOG:
> > > > > > > > > http://www.amibroker.com/devlog/
> > > > > > > > >
> > > > > > > > > For other support material please check also:
> > > > > > > > > http://www.amibroker.com/support.html
> > > > > > > > > Yahoo! Groups Links
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>



------------------------------------

**** IMPORTANT ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

*********************
TO GET TECHNICAL SUPPORT from AmiBroker please send an e-mail directly to 
SUPPORT {at} amibroker.com
*********************

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/

For other support material please check also:
http://www.amibroker.com/support.html

*********************************
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/