Hi,

You can access ATR, and any other operation you want, from within the custom 
backtester. If you have a recent copy you can use static arrays, otherwise 
create a dynamic variable on the fly.

Have a look at the following thread:

http://finance.groups.yahoo.com/group/amibroker/message/146164

Similarly, Signal.PosSize will hold whatever you put in it. Reread the 
documentation for SetPositionSize:

http://www.amibroker.com/guide/afl/afl_view.php?id=272

If you want shares, then use spsShares. The value will appear as -2000 - the 
number of shares specified (e.g. 100 shares is -2100).

Mike

--- In [email protected], "rise_t575" <ris...@...> wrote:
>
> Hello,
> 
> I'm *slightly* frustrated here, as I am trying to implement correct Percent 
> Volatility Position Sizing into AB (let alone Percent Risk Position Sizing 
> which should be even harder to code if implimented correctly & in a 
> non-specific, general way).
> 
> The formula for the example of Volatility Position Sizing in the AB manual is 
> wrong as this is rather some undefined mixture of a) Percent Volatility 
> Position Sizing and b) a volatility stop (as Van himself has confirmed). 
> Volatility PS is completely separate from stops; in fact, one of its best 
> uses is in systems without any hard stops.
> 
> I'm trying to code correct implementations of some basic position sizing 
> algorithms like Percent Volatility, Percent Risk (= Fixed Fractional), etc 
> with a nice & easy "Parameter" GUI as I intend to put them into AB's code 
> library for the benefit of newer users like myself.
> 
> Some of these seem to be harder to implement on AB (at least for a novice) 
> than I initially thought, as there are no "out-of-the-box" variables/object 
> properties like Position.Risk.Open, Group.Risk.Open, System.Risk.Open (= 
> Portfolio Heat), Long.Risk.Open, Short.Risk.Open, etc.
> 
> As well, I think it's slightly strange & unneccesarily cumbersome that 
> sig.PosSize doesn't define the position size as *units* (= shares, contracts, 
> etc), as this is the basic definition of "position size", and gives the user 
> the greatest flexibility. If one wants percentages, dollar amounts or 
> whatever, one can calculate this from the units in some separate lines of 
> code.
> 
> What adds to the confusion is the fact that the different examples in AB's 
> manuals switch between PositionSize and SetPositionSize in rather random 
> fashion (I guess the latter is the newer one).
> 
> Don't get me wrong, I really like AB as it has many advantages and appreciate 
> Tomasz' work, but that position sizing & risk managment thing can be 
> implemented more logically, more flexible, and thus easier for the user.
> 
> I've been using AB just for a couple of months now, so I am no AFL wizz - but 
> you shouldn't have to be one for some basic position sizing algorithms.
> 
> Ok - enough of my little rant - here's my code. I don't know if I did it 
> completely wrong or just slightly wrong.
> 
> As it seems like I cannot use ATRs in the custom backtester, I've used the 
> AddToComposite function (if anyone has a simpler & faster solution, I am all 
> for it).
> But when I run a backtest, the backtester seems to check the composite array 
> for signals (?), which looks rather strange, takes rather long, and makes AB 
> crash after 2 runs.
> 
> Any help is appreciated (any improvements to AB in this regard as well), and 
> - as I said - I'll put it into the code library for the benefit of all when 
> I'm done.
> 
> Thanks in advance!
> 
> 
> // Money Manager: Percent Volatility
> 
> _SECTION_BEGIN( "Money Manager: Percent Volatility" );
> systemMMVolatilityPercent = Param( "Percent", 2, 0.1, 10, 0.1 );
> systemMMVolatilityATR = Param( "ATR Period", 20, 1, 250, 1 );
> _SECTION_END();
> 
> AddToComposite(ATR(systemMMVolatilityATR), "~atr_"+Name(), "1", 
> atcFlagDefaults|atcFlagEnableInBacktest);
> 
> SetCustomBacktestProc("");
> 
> if ( Status( "action" ) == actionPortfolio )
> {
>     bo = GetBacktesterObject();
>     bo.PreProcess();
> 
>     for ( bar = 0; bar < BarCount; bar++ )
>     {
>               CurrentEquity = bo.Equity;
> 
>         for ( sig = bo.GetFirstSignal( bar ); sig; sig = bo.GetNextSignal( 
> bar ) )
>         {
>                       if(sig.IsEntry())
>                       {
>                               MMatr = Foreign("~atr_"+sig.Symbol, "1");
>                               units = CurrentEquity * ( 
> systemMMVolatilityPercent / 100 ) / MMatr[bar];
>                               sig.PosSize = sig.Price * units;
>                       }
>         }
>         bo.ProcessTradeSignals( bar );
>     }
>     bo.PostProcess();
> }
>


Reply via email to