PureBytes Links
Trading Reference Links
|
One trick when using PositionSize and PositionScore to pass extra data
to the CBT is to squeeze multiple values into the available bits. Here
are some functions to pass a price array and the stock Industry into
the CBT. These functions could be extended to pass more than 2 values
if necessary. Not 100% sure, but I think there are 128 bits to work with.
function ExtraFloatEncode(price, industry)
{
return (10000 * price * 256) + industry;
}
function ExtraFloatGetEncodedPrice(f)
{
return Int(f / 256) / 10000;
}
function ExtraFloatGetEncodedIndustry(f)
{
return Int(f & 255);
}
-Steve
--- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@xxx> wrote:
>
> Setting PosSize to 0 has the same effect as setting Price to -1. They
> both cancel the signal.
>
> Setting the liquidity as the PositionScore might be problematic when
> there are multiple signals for the bar. I seem to recall something
> along the lines of AB ignoring signals beyond twice the number of max
> positions permitted by the strategy, sorted by PositionScore.
>
> Mike
>
> --- In amibroker@xxxxxxxxxxxxxxx, "Steve Davis" <_sdavis@> wrote:
> >
> > Couple of things you can do here. First, to cancel a signal, set the
> > sig.Price = -1. Secondly, avoid SetForeign inside the CBT signal
> loop.
> > Execution will be too slow. Instead, you should compute the
> liquidity
> > array outside the CBT and pass it to the CBT in either the
> PositionSize
> > array or the PositionScore array. Here is an example passing your
> > liquidity array in the PositionSize array.
> >
> > function RestrictTrades(bo)
> > {
> > for (i = 0; i < BarCount; i++)
> > {
> > for (sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal
> (i))
> > {
> > if (sig.IsEntry())
> > {
> > liquidity = sig.PosSize;
> > if (Liquidity < bo.Equity)
> > sig.Price = -1; // Cancel this trade because the limit
> price
> > will not be reached
> > else
> > sig.PosSize = -100; // or whatever position size you want
> > }
> > } // signal loop
> > bo.ProcessTradeSignals(i);
> > } // bar loop
> > }
> >
> >
> > PositionSize = MA(C,5)*MA(V,5)*50;
> > Buy = ...
> >
> > SetOption("UseCustomBacktestProc", true);
> > if (Status("action") == actionPortfolio )
> > {
> > bo = GetBacktesterObject();
> > bo.PreProcess();
> > RestrictTrades(bo);
> > bo.PostProcess();
> > }
> >
> >
> > --- In amibroker@xxxxxxxxxxxxxxx, "zozuzoza" <zozuka@> wrote:
> > >
> > > 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@ 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/
|