[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Drawdown Calculation


  • Date: Fri, 05 Mar 2010 08:46:26 -0000
  • From: "Mike" <sfclimbers@xxxxxxxxx>
  • Subject: [amibroker] Re: Drawdown Calculation

PureBytes Links

Trading Reference Links



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


__._,_.___


**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.

TO GET TECHNICAL SUPPORT send an e-mail directly to
SUPPORT {at} amibroker.com

TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)

For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/





Your email settings: Individual Email|Traditional
Change settings via the Web (Yahoo! ID required)
Change settings via email: Switch delivery to Daily Digest | Switch to Fully Featured
Visit Your Group | Yahoo! Groups Terms of Use | Unsubscribe

__,_._,___