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") );
--- In amibroker@xxxxxxxxxxxxxxx, "ta" <tagroups@xxx>
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") );
>