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

[amibroker] Extra data arrays in CBT, WAS: Referencing the backtested portfolio equity ...



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/