I haven't run the test to verify, but your assertion of Start picking up the previous Close sounds very fishy to me. More likely that particular trading day was not a high and thus had no impact on the result.
Mike --- In [email protected], "ta" <tagro...@...> wrote: > > Thanks a million it seem to work as intended. I do see the logic. As for > your comment on Start and End being error prone if they fall on a > non-trading date, I changed the start date to 12/31/2000 which is a non > trading date and it correctly picked up the close from 12/29/2000. However, > your point seems to be correct regarding the End date. If I change the end > date from 12/31/2008 to 01/01/2009 it return 0 for drawdown. > > > > From: [email protected] [mailto:[email protected]] On Behalf > Of Mike > Sent: Friday, March 05, 2010 12:46 AM > To: [email protected] > Subject: [amibroker] Re: Drawdown Calculation > > > > > > Hi, > > > > Your calculations for Start and End are error prone in that they do not > handle the case where the given dates are not trading dates. > > > > However, building on what you've got, you can do something like the > following. Ideally you would also add code to verify that Start and End are > less than BarCount. > > > > /* > * Return positive scaler value representing the largest percentage drawdown > * within the given array between the given dates, inclusive. > * > * e.g. Largest drawdown of 10 down to 3 would be returned as 70 indicating > 70%. > */ > function MaxDDFromTo( Array, From, To ) > { > Indices = BarIndex(); > Start = LastValue( ValueWhen( DateTime() == StrToDateTime( From ), > Indices ) ); > End = LastValue( ValueWhen( DateTime() == StrToDateTime( To ), Indices ) > ); > InRange = Indices >= Start AND Indices <= End; > > CurVal = IIF( InRange, Array, 0 ); > MaxVal = Highest( CurVal ); > CurDD = IIF( InRange AND CurVal < MaxVal, 100 * ( MaxVal - CurVal ) / > MaxVal, 0 ); > MaxDD = Highest( CurDD ); > > return LastValue( MaxDD ); > } > > _TRACE("from: " + "12/29/2000" + " To: " + "12/31/2009" + " MaxDD: " + > MaxDDFromTo(C, "12/29/2000", "12/31/2009") ); > > > > Mike > > > --- In [email protected], "ta" <tagroups@> wrote: > > > > I have written the following function to calculate the drawdown between > two > > dates. Does anybody know how eliminate the loop or make it run faster? TIA > > > > > > > > function MaxDDFromTo(Array, From, To) > > { > > Last = LastValue(BarIndex()); > > Start = LastValue(ValueWhen(DateTime() == StrToDateTime(From), > > BarIndex())); > > End = LastValue(ValueWhen(DateTime() == StrToDateTime(To), BarIndex())); > > > > Price = Array; > > MaxPrice = DD = MaxD = Bars = 0; > > for( i = Start; i < End; i++ ) > > { > > Bars = Bars + 1; > > MaxPrice = Max(MaxPrice, HHV( Price, Bars )); > > DD = 100 * ( Price[i] - MaxPrice ) / MaxPrice; > > MaxD = Min(MaxD, LLV( DD, Bars )); > > } > > return MaxD; > > } > > > > _TRACE("from: " + "12/29/2000" + " To: " + "12/31/2009" + " MaxDD: " + > > MaxDDFromTo(C, "12/29/2000", "12/31/2009") ); > > >
