Any time you want to do any trading based on current equity, final logic pretty 
much needs to get moved into custom backtesting code. The reason for this is 
that only custom backtest code has access to current equity on a bar by bar 
basis.

For the scenario you describe, I would suggest trying something like the 
following:

* Write Buy logic as if it was a long only system.
* Write Sell logic as if it was a short only system.
* Use custom backtester code to cancel signals that are on the wrong side of 
the desired direction.

For example, just as we reduced the position size based on relation to MA, you 
can instead completely zero out PosSize of longs when below MA and completely 
zero out PosSize of shorts when above MA.

You may need to call SetOption("SeparateLongShortRank", true) to ensure that 
signals for both directions are preserved going into the backtester. Otherwise, 
stronger ranking signals in one direction could prevent weaker signals in the 
opposite direction from being processed, even though you ultimately only wanted 
to accept the opposite direction signals at that bar.

Keep in mind that none of what I have provided is necessarily the most 
efficient way to do this. But, if it gets you on the road to correct results, 
then you can always refine it later.

Mike

--- In [email protected], "woodshedder_blogspot" 
<woodshedder_blogs...@...> wrote:
>
> Mike, thanks for the CBT code for position-sizing based on the equity curve. 
> That was very helpful. 
> 
> I have a question for you. What if we wanted the system to system to go short 
> once the equity curve goes beneath the moving average?
> 
> What I am trying to accomplish (at this point, more to learn how to code it 
> than for any real promise as a system) is a system that buys the top 10 
> negative ROC5 stocks, and sells them 5 days later. 
> 
> PositionScore=100-(ROC5)
> 
> Then, if the equity curve falls beneath the moving average, 
> Buy=0
> Short=1
> PositionScore=ROC5
> 
> So now the system is shorting instead of buying, and shorting the top ten 
> highest ROC5 stocks.
> 
> Anyway, this may be terrible complicated. I know that when I try to work 
> through it in the CBT, I just walk away scratching my head.
> 
> Thanks for any help or ideas!
> 
> 
> 
> --- In [email protected], "Mike" <sfclimbers@> wrote:
> >
> > 
> > Hi,
> > 
> > You must write custom backtester code to do what you are asking. Your
> > final ~~~Equity is simply an array of the bar by bar values of the
> > backtester's Equity property (verify that Plots overlap). As such, you
> > can build up an equivalent equity array as you iterate through the bars
> > in a custom backtest, calculate a MA using that array, and reduce your
> > postion size accordingly.
> > 
> > I have not done any extensive testing on the following code. But, I
> > believe that it will give you what you are asking for. The logic is
> > simply to refer to the equity of the previous bar compared to the MA of
> > equity for that same bar, and reduce position size of the current bar
> > when the relation is not favorable.
> > 
> > Double check the trades to make sure that the timing is right.
> > 
> > Mike
> > 
> > optimistic = Param("Optimistic", 20, 1, 100, 1);
> > pessimistic = Param("Pessimistic", 10, 1, 100, 1);
> > period = Param("Period", 20, 1, 50, 1);
> > 
> > SetTradeDelays(0, 0, 0, 0);
> > PositionSize = -1 * optimistic;
> > 
> > weekDay = DayOfWeek();
> > 
> > Buy = weekDay == 1;
> > BuyPrice = Open;
> > 
> > Sell = weekDay == 5;
> > SellPrice = Close;
> > 
> > SetCustomBacktestProc("");
> > 
> > if (Status("action") == actionPortfolio) {
> >     bo = GetBacktesterObject();
> >     bo.PreProcess();
> > 
> >     eq[0] = 0;
> > 
> >     for (bar = 0; bar < BarCount; bar++) {
> >        reduceSize = false;
> > 
> >        if (bar > period) {
> >           eqMA = MA(eq, period);
> > 
> >           if (eq[bar - 1] <= eqMA[bar - 1]) {
> >              reduceSize = true;
> >           }
> >        }
> > 
> >        if (reduceSize) {
> >           for (sig = bo.GetFirstSignal(bar); sig; sig =
> > bo.getNextSignal(bar)) {
> >              sig.PosSize = -1 * pessimistic;
> >           }
> >        }
> > 
> >        bo.ProcessTradeSignals(bar);
> >        eq[bar] = bo.Equity;
> >     }
> > 
> >     bo.PostProcess();
> > 
> >     AddToComposite(eq, "~~~EQ", "X", atcFlagDefaults |
> > atcFlagEnableInPortfolio);
> > }
> > 
> > eq = Foreign("~~~EQ", "C");
> > Plot(eq, "EQ", colorGreen, styleLine);
> > Plot(Foreign("~~~Equity", "C"), "Equity", colorBlue, styleLine);
> > Plot(MA(eq, period), "MA20-EQ", colorRed, styleLine);
> > 
> > 
> > --- In [email protected], Wolfgang Hader <faked@> wrote:
> > >
> > > Hi all,
> > >
> > > how can I code some like this in Amibroker
> > > (I know the following code is wrong, but how can I do it correctly in
> > > Amiboker)?
> > >
> > > iif(equity() > ma(equity(),20), positionsize=-20, positionsize=-10);
> > >
> > > Thank you,
> > > BR
> > >
> >
>


Reply via email to