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

[amibroker] Re: Running Median Calculation Starting at Bar 0



PureBytes Links

Trading Reference Links

Sorry, for the fully parameterized solution, replace the line:

Plot(EMA(Close, 20), "EMA", colorGreen);

With

Plot(EMA(Close, Period), "EMA", colorGreen);

Mike

--- In amibroker@xxxxxxxxxxxxxxx, "Mike" <sfclimbers@xxx> wrote:
>
> This won't be the fastest implementation, but I believe that it 
will 
> work. Assuming a period of 20...
> 
> 1. Let P = Period - 1 (e.g. 20 - 1 = 19)
> 2. Make P calls to the AFL Median function using 1..P (e.g. 1..19) 
as 
> the period scaler.
> 3. Store the P-1th value for each result in a dynamic variable of 
the 
> same name. P-1 will be the first zero indexed, non null value for 
> each array. You should end up with:
> 
> M0 = Median(Close, 1)[0];
> M1 = Median(Close, 2)[1];
> ...
> M18 = Median(Close, 19)[18];
> 
> 4. Write a loop to set the first P values to the dynamic variables 
> and calculate a regular EMA for the remainder. Your chart should 
> converge quickly after the first Period bars.
> 
> e.g.
> 
> Period = Param("Period", 20);
> 
> // Calculate dynamic median for initial Period-1 bars, stored as
> // dynamic variables M0, M1, ..., MP where P = Period - 1.
> 
> P = Period - 1;
> 
> for (i = 0; i < P; i++) {
>   M = Median(Close, i + 1);
>   VarSet("M" + i, M[i]);
> }
> 
> // Calculate EMA substituting our dynamic variables for the first
> // Period - 1 values.
> 
> Exponent = 2/(Period + 1);
> 
> for (i = 0; i < BarCount; i++) {
>   if (i < P) {
>     MyEMA[i] = VarGet("M" + i);
>   } else {
>     MyEMA[i] = (Close[i] * Exponent) + (MyEMA[i - 1] * (1 - 
> Exponent));
>   }
> }
> 
> Plot(EMA(Close, 20), "EMA", colorGreen);
> Plot(MyEMA, "MyEMA", colorBlue);
> Plot(Close, "Close", colorRed); 
> 
> Note that there appears to be a bug in AmiBroker (else in my code!) 
> such that Median is not being correctly calculated when there are 
an 
> even number of values. The correct Median value of an even set of 
> numbers is the average of the two middle values. However, AmiBroker 
> appears to be returning the first of the two middle values, 
ignoring 
> the second of the two middle values.
> 
> Alternatively, you could calculate the Median yourself using an 
inner 
> loop to fill a temporary array which you would then pass to a 
sorting 
> function and your own Median implementation. This would have the 
> advantage of operating only on a maximum of Period values (instead 
of 
> all visible values), but would not be in binary code as the built 
in 
> Median is.
> 
> Mike
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "searnp" <searnp@> wrote:
> >
> > Bump
> > 
> > --- In amibroker@xxxxxxxxxxxxxxx, "searnp" <searnp@> wrote:
> > >
> > > Hi Howard, thanks for your reply.
> > > 
> > > I am looking at calculating an exponential moving average, but 
> would
> > > like to have initial values as well (instead of null values).
> > > 
> > > For example:
> > > If I do an EMA(Close, 20), I will get a chart of the 20-day EMA 
of
> > > close with null values for the first 20 bars.
> > > 
> > > So what I am trying to do is create my own EMA function via 
> looping
> > > (similar to pg.114 of the Amibroker User Guide), where the 
running
> > > median would be calculated for (i + 1) < Period. I can do it 
with 
> an
> > > initial simple running average calculation (since I can 
> incorporate
> > > that in the loop for (i + 1) < Period ), but would prefer to 
use 
> the
> > > median in case there are initial spikes.
> > > 
> > > Another question loosely related to this:
> > > When I incorporate a manual bar count via looping (see code 
> below) and
> > > then click on a bar on the chart, the value changes when I 
scroll 
> left
> > > or right or zoom in or out. Why is this?
> > > 
> > > CT[0] = 1;
> > > for( i = 1; i < BarCount; i++ )
> > > {
> > > 	CT[i] = 1 + CT[i-1];
> > > }
> > > 
> > > Plot( CT, _DEFAULT_NAME(), ParamColor( "Color", colorCycle ),
> > > ParamStyle("Style") );
> > > 
> > > 
> > > Thanks.
> > > 
> > > --- In amibroker@xxxxxxxxxxxxxxx, "Howard B" <howardbandy@> 
wrote:
> > > >
> > > > Hi Searnp --
> > > > 
> > > > The User's Guide states:
> > > > AFL Function Reference - MEDIAN  *MEDIAN
> > > > *- calculate median (middle element)
> > > > 
> > > > *Statistical functions
> > > > *(AFL 2.5)
> > > > 
> > > >   *SYNTAX* *Median( array, period ) * *RETURNS* ARRAY  
> *FUNCTION*
> > > The Median
> > > > function - finds median (middle element) value of the *array* 
> over
> > > > *period*elements.
> > > > *EXAMPLE* // list only symbols which volume is greater than
> > > > // median Volume from past 50 days
> > > > *Filter* = *Volume* > Median( *Volume*, 50 );
> > > > AddColumn( *V*, "Volume" );
> > > > Period must be a scalar -- a constant.  When you run this 
code:
> > > > 
> > > > RM = Median(Close, BarIndex() + 1);
> > > > 
> > > > The entire Close array is passed to the Median function at 
one 
> time.
> > >  The
> > > > value of BarIndex changes with each element of the Close 
array. 
> > > Looked at
> > > > simplistically, the afl processor does not know which value of
> > > BarIndex to
> > > > use, so it coughs.
> > > > 
> > > > You will have to write your own function using looping code.
> > > > 
> > > > Before you start, are you certain that you want the median 
> value of an
> > > > expanding list of data values?  Today's value will depend on 
how
> > > much data
> > > > was loaded, which is generally not a good programming or 
systems
> > > idea.  Will
> > > > Median(C,50), or some variation, give you what you need?
> > > > 
> > > > Thanks,
> > > > Howard
> > > > 
> > > > 
> > > > 
> > > > On Mon, Nov 3, 2008 at 11:26 AM, searnp <searnp@> wrote:
> > > > 
> > > > >   I am trying to calculate a running median that starts at 
> bar 0.
> > > > >
> > > > > Code:
> > > > >
> > > > > RM = Median(Close, BarIndex() + 1);
> > > > >
> > > > >
> > > > > Then I get the following error message:
> > > > >
> > > > > Error 5. Argument #2 has incorrect type (the function 
expects
> > > different
> > > > > argument type here)
> > > > >
> > > > >
> > > > > I am using "Barindex() + 1" to get a running count at each 
> bar to
> > > be used
> > > > > in the median's lookback period. Is there a way to 
implement 
> this?
> > > > >
> > > > > Thanks.
> > > > >  
> > > > >
> > > >
> > >
> >
>



------------------------------------

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

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

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

For other support material please check also:
http://www.amibroker.com/support.html

*********************************
Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/amibroker/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:amibroker-digest@xxxxxxxxxxxxxxx 
    mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx

<*> To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/