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" <tagro...@...> 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") );
>



<<image001.jpg>>

<<image002.jpg>>

Reply via email to