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

Reply via email to