Thanks Tomasz for your help. I do see the logic on how to code in arrays vs loop. However, your code does not seem to calculate the correct drawdown for the given period. So heads up to other users.
From: [email protected] [mailto:[email protected]] On Behalf Of Tomasz Janeczko Sent: Friday, March 05, 2010 4:38 AM To: [email protected] Subject: Re: [amibroker] Drawdown Calculation Hello, You should better use array functions. dtstart = StrToDateTime(From); dtend = StrToDateTime(To); dt = DateTime(); mask = dtstart >= dt AND dt <= dtend; hh = Highest( IIF( mask, array, 0 ) ); ll = Lowest( IIF( mask, array, 99999 ) ); dd = (ll - hh )/ hh; MaxDD = LastValue( dd ); Best regards, Tomasz Janeczko amibroker.com On 2010-03-05 06:09, ta 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") );
