Hello Bruce,
the code you provided does not what I intend to
do - unfortunately!
"sig.possize" only can hold dollar value
(positive numbers) and percent of equity (negative numbers)
Percent of equity (or cash for that matter) can
also mean differing values for shares/contracts being bought due to rounding
if fractional share sizes occur!?
In the example I provide further below, I
backtest an S&P contract.
The system carries positions in $1 / handle lots and rounds to the
nearest 250 lots, representing one S&P 500
contract.
Incidentally, the "risk per lot" used below is
actually an exponential lage of the Average true range multilied by a constant
(say 5).
Lot_size_not_rounded=(heat*bo.cash)/(Risk_per_lot)
Lot_size_rounded=Round(Lot_size_not_rounded/250)
Unit_size=Lot_size_rounded*250
With numbers:
Lot_size_not_rounded=(0.1*1000,000
USD)/3.115*5)=6420.545746
Lot_size_rounded=Round(6420.545746/250)=Round(25.682....)=26
Unit_size=26*250=6500 units to be
bought.
I´m afraid using percentages of cash or
position value [expressed in USD] could result (due to rounding) in slightly
different shares to be bought/sold thus influencing the whole process. I ned
to reproduce the exact share/contract numbers!
I figure going like this is the only chance I
have:
sharesize=
round(((Heat*bo.cash)/(Expon._lag_of_ATR*ATRmultiplier))/250)*250; //
i.e. # of shares/lots like above
sig.possize=sharesize*sig.price;
//
i.e. position value - I must use THAT since it´s needed in EnterTrade that I
must use in low-level format. And I need low-level format
since I intend to include proprietary stops (not
ASpplyStop) in a later stage of development!!
bo.EnterTrade(i, sig.Symbol, True, sig.Price,
sig.PosSize);
I know "sig.possize means" Dollar value here. "sharesize" means unit size
or # of shares. I just hope that AB doens´t round the value of sharesize
somewhere in the backtesting process thereby lossing the exact number of
shares/units I intend to buy!!!!!!
But this may be an issue to discuss with TJ if no one has an idea how to do
this??!!
In case I didn´t explain myself properly, please let me know and I´ll
clarify.
Thanks!
Markus
----- Original Message -----
Sent: Thursday, July 16, 2009 3:46
PM
Subject: [amibroker] Re: Using CBI the
first time
Markus -
OK, here's an example of what I think that you were
after. It is a non-practical demo, but should show some points about
encoding of signal types. In your case, it shows calculating number of
shares directly from % of cash and putting it in the signal object for the
backtester to process. See the comments for details and the AA
results for the effect. BTW, I hope you'll find some other nuggets in
this example also, and find it useful as a framework for exploring some
aspects of the CBT. Some aspects of the CBT just need to be "played"
with to see what is possible. This will teach me to get involved.
:-)
-- BruceR
// Simple
example to do the following -
// 1. Buy on the first
trading day of the month and sell 5 days later
// 2. Setup default to buy
$5000
// 3. Then, in the CBT,
modify the trades on even months to buy s
// shares
equal to 20% of cash.
//
// NOTE - the encodings for PosSize as detailed in
the SetPositionSize() help are -
// values
below -2000 encode share count,
// values
between -2000 AND -1000 encode % of current position (scaling)
// values
between -1000 AND 0 encode % of portfolio Equity
// values
above 0 encode dollar value
Buy = IIf( Month( ) != Ref( Month( ), -1 ), 1, 0 );
Sell = Ref( Buy, -5 );
Short = Cover = 0;
SetPositionSize( 5000, spsValue );
SetOption( "InitialEquity", 100000 );
RoundLotSize = 1;
// MID-LEVEL CBT MODEL
SetOption( "UseCustomBacktestProc",
True
);
if (
Status( "action" ) == actionPortfolio
)
{
bo = GetBacktesterObject(
);
bo.PreProcess( );
mon =
Month(
);
dt = DateTime( );
for ( bar = 0; bar < BarCount; bar++
)
{
for( sig =
bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( bar )
)
{
// On even months, arbitrarily buy shares = 20% of
cash
// On odd months, $5000 will be used from
SetPositionSize above
if ( sig.IsEntry
)
{
if ( Mon[ bar ] %
2 == 0 AND sig.IsEntry
)
{
// Note - int() function effectively rounds
down
shares
= int( bo.cash *
0.20 / sig.Price
);
sig.PosSize
= -2000 -
shares;
}
_TRACE( NumToStr( dt[ bar ], formatDateTime ) +
" , Cash = " + bo.Cash
+
" , Price = " + sig.Price
+
" , PositionSize = " + sig.possize
);
}
}
bo.ProcessTradeSignals(
bar );
}
bo.PostProcess(
);
}
--- In
amibroker@xxxxxxxxxps.com, "bruce1r" <brucer@xxx>
wrote:
>
> Markus -
>
> I don't think that you, and
maybe Mike, are seeing what I'm trying to point out. I referred you to
SetPositionSize() help because it details the encoding of shares in
PosSize in the signal object in the CBT. Specically that is
(-2000-shares).
>
> When you traverse the signal objects
in the CBT, you can do your own calculation of shares from cash or whatever,
and replace the sig.PosSize value before calling the mid or low level
routines to process trades.
>
> Stated simply, you can set the
number of shares yourself directly in the CBT from your own calculation.
>
> If that is what you're after, give me a short time and
I'll whip up an example if you don't see this.
>
> --
Bruce
>
>
> --- In amibroker@xxxxxxxxxps.com,
Markus Witzler funnybiz@ wrote:
> >
> > Hello
Bruce,
> >
> > the reason I must use CBT is that I can´t
use Setpositionsize (...spsshares), since I need to compute adequate
number of shares by referring to actual cash position.
> >
> > "spsShares" doesn´t allow - according to cust. support- for
calling current cash or equity position to compute "spsshares". Thus the
need for using CBT.
> >
> > Normally, everyone seems to
compute sig.possize (and implied number of shares is a result thereof). I
want to compute shares and the position size (in money terms) should be the
implied result - thus the other way around.
> >
> > The
reason for this is that i want to follow along a coding excercise I was
given. And I´m not sure that -if I only specify sig.possize and not
sharesize (i.e. trade.shares)- that AB may screw up (i.e. round up or
down in some cases) when I don´t realize that.
> >
> >
Take for instance into account that AB ALWAYS rounds DOWN if fraction of
shares occur.
> >
> > I, myself, want to have control if
rounding occurs or not and HOw it occurs (up or down). That could sometimes
mean I´m rounding up when AB would round down.
> >
> >
This is not because I´m particularly picky since this issue influences the
outcome of the backtest only slightly. It´s only that I want to accurately
reproduce the results of the excercise I was given.
> >
>
> In actual trading, there shouldn´t be any problem determining
sig.possize in signal list and leave it up to AB to (maybe) rounding up or
down potential fractional shares.
> >
> > If you have any
clue that might help, please fell free to step in.
> >
>
> Thanks for your contribution
> >
> > Markus
>
>
________________________________________________________________
>
> Neu: WEB.DE Doppel-FLAT mit Internet-Flatrate +
Telefon-Flatrate
> > für nur 19,99 Euro/mtl.!*
http://produkte.web.de/go/02/
> >
>