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") );
> >
>


Reply via email to