Hmm. I should have read your original post in detail before trying to
reply.
I think that the follwoing will give you what your were really asking
for:
SetCustomBacktestProc("");
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.Backtest();
initialEq = GetOption("initialEquity");
eq = Foreign("~~~Equity", "C");
highEq = Highest(eq);
initialDD = ExRem(eq < initialEq, eq >= initialEq);
duration = IIF(highEq > initialEq, HighestBars(eq),
BarsSince(initialDD) + 1);
longest = LastValue(Highest(duration));
bo.addCustomMetric("Longest DD", longest);
}
--- In [email protected], "sfclimbers" <sfclimb...@...> wrote:
>
> Actually, now that I cheat and look at the solution that Tomasz used
in his Portfolio.afl, (see Equity folder in your Charts tab) you can
replace:
>
> highEq = Highest(eq);
> newHigh = highEq > Ref(highEq, -1);
> duration = BarsSince(newHigh);
>
> with just:
>
> duration = HighestBars(eq);
>
> The difference being that in my original code, you will miss the first
drawdown if your trades take you negative right away.
>
> If you like his charting too, replace the Plot with:
>
> Plot(duration, "DD Duration", colorDarkYellow, styleLine |
styleOwnScale, 0, 10 * LastValue( Highest( duration ) ) );
>
> Mike
>
> --- In [email protected], "sfclimbers" sfclimbers@ wrote:
> >
> >
> > Try somethign like the following. The charting stuff is just for
> > validation. The part you need is in the custom backtester code.
> >
> > Buy = DayOfWeek() == 1;
> > Sell = DayOfWeek() == 5;
> >
> > eq = Foreign("~~~Equity", "C");
> > highEq = Highest(eq);
> > newHigh = highEq > Ref(highEq, -1);
> > duration = BarsSince(newHigh);
> >
> > Plot(eq, "Equity", colorDarkGrey, styleLine);
> > Plot(highEq, "Highest", colorRed);
> > Plot(duration, "DD Duration", colorBlue, styleOwnScale);
> > PlotShapes(shapeSmallCircle * newHigh, colorRed, 0, graph0, 0);
> >
> > SetCustomBacktestProc("");
> >
> > if (Status("action") == actionPortfolio) {
> > bo = GetBacktesterObject();
> > bo.Backtest();
> >
> > eq = Foreign("~~~Equity", "C");
> > highEq = Highest(eq);
> > newHigh = highEq > Ref(highEq, -1);
> > duration = BarsSince(newHigh);
> > longest = LastValue(Highest(duration));
> >
> > bo.addCustomMetric("Longest DD", longest);
> > }
> >
> > Mike
> >
> >
> > --- In [email protected], "wml67" <ywml@> wrote:
> > >
> > > I'm trying to determine the longest drawdown period in the
backtest,
> > here's the code snippet:
> > >
> > > bslh = HighestBars(Foreign("~~~EQUITY", "C")); // # bars since
last
> > high
> > > ldd = Highest(bslh); // longest drawdown to date, array
> > > lbn = LastValue(BarIndex()); // last bar number
> > > longestDD = ldd[lbn]; // longest drawdown in the test period,
value
> > >
> > > This sorta works, except when there's a long flat period preceding
the
> > first trade, because HighestBars() treats such periods as drawdowns
and
> > increases the counter, even though there were NO higher value in the
> > past! Say, my initial equity is 100,000 and the first trade occurs 2
> > months after the start of the backtest period. HighestBars on the
date
> > preceding the first trade will be 60, which will exceed my actual
> > longest drawdown (if I have any luck), and screw up my stats.
> > >
> > > What am I overlooking this time? Many thanks!
> > >
> >
>