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

Re: [EquisMetaStock Group] Simple Moving Average using first bar of each week



PureBytes Links

Trading Reference Links

Thanks Roy-
I did some exploration tests and my "8 period exponential moving 
average using daily data with PREV" function took about 50 times 
longer to calculate than a simple "C > O" (Explorate options set to 
load 50 periods for both tests).

I have not been able to figure out how to calculate an exponential 
moving average without a self-referencing formula - I don't see how 
cum can help me.  The method I've devised uses the following 3 
formulas (.FIRSTDAYOFWEEK, .8PERIODWEEKLYEMA.T 
and .8PERIODWEEKLYEMA).  I have pasted them below with the rather 
tedious documentation that I write to myself.

If anyone knows how to replace my formulas so that I can avoid using 
PREV, any help would be appreciated.

With Regards-
Sam

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

{
.FIRSTDAYOFWEEK

NOTE: NEED TO SELECT START DATE THAT IS 2 NON-HOLIDAY DAYS PRIOR TO 
THE NEXT WEEK FOR .8PERIODWEEKLYEMA TO WORK

Setting Cum(1) = 2 flags the last bar of the first week assuming I 
have chosen a start date per NOTE above.  Needed because 
8PERIODWEEKLYEMA uses ValueWhen( 1, FIRSTDAYOFWEEK , PREV ) which is 
N/A on FIRSTDAYOFWEEK if PREV is N/A (i.e, I need to assign a value 
to the bar prior to the first real FIRSTDAYOFWEEK (i.e. Cum(1)=2 is 
not a real FIRSTDAYOFWEEK) so that on the first real ValueWhen( 1, 
FIRSTDAYOFWEEK , PREV ),PREV will have a valid Close value to use
}

FIRSTDAYOFWEEK:= 

Cum(1)=2
OR 
DayOfWeek()<Ref(DayOfWeek(),-1)
;

FIRSTDAYOFWEEK

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

{
.8PERIODWEEKLYEMA.T

Start date must be 2 trading days before the first day of the 
following week for this formula to work properly
}

FIRSTDAYOFWEEK:= Fml( ".FIRSTDAYOFWEEK" )
;

If(
    FIRSTDAYOFWEEK AND PREV = 0   {this should 
    be when Cum(1)=2}
{then},
    C
{else},
    ValueWhen( 1, FIRSTDAYOFWEEK , PREV ) * ( 1 - ( 2 / ( 8 + 1 ))) + 
    C * ( 2 / ( 8 + 1 ))   {the formula MetaStock uses to 
        calculate an 8 period exponential moving average}
)

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

{
.8PERIODWEEKLYEMA
}


FIRSTDAYOFWEEK:= Fml( ".FIRSTDAYOFWEEK" )
;

8PERIODWEEKLYEMA.T:= Fml( ".8PERIODWEEKLYEMA.T" )
;

8PERIODWEEKLYEMA:= 
    8PERIODWEEKLYEMA.T * ValueWhen( 8 , FIRSTDAYOFWEEK, 1 )   {Set
        data array to N/A for first 7 weeks}
;

8PERIODWEEKLYEMA

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


--- In equismetastock@xxxxxxxxxxxxxxx, "Roy Larsen" <rlarsen@xxxx> 
wrote:
> Sam
> 
> For weekly values on daily charts I think you should stay away from 
the PREV based code. The
> difference in accuracy is minimal but the processing overheads are 
significant. I'm still hoping to
> come up with a method that doesn't need to Cum() all weekly data 
but for now I still believe that's
> the best way to go.
> 
> Roy
> 
> ----- Original Message ----- 
> From: "sabboushi2000" <Yahoo@xxxx>
> To: <equismetastock@xxxxxxxxxxxxxxx>
> Sent: Monday, February 09, 2004 5:37 AM
> Subject: Re: [EquisMetaStock Group] Simple Moving Average using 
first bar of each week
> 
> 
> > Thanks Roy - I appreciate your assistance.
> >
> > I don't understand the basis behind how the LastValue ( J + PREV -
> > PREV ) converts J into a constant (or exactly what that means to
> > MS).
> > Although this certainly works as you've outlined, I cannot get it 
to
> > work for my specific case:
> >
> > EMAPERIODS:= Fml(".EMAPERIODS");   {where EMAPERIODS is a constant
> > (8)}
> >
> > J:= LastValue( EMAPERIODS + PREV - PREV );
> >
> > Mov( C , J , E )
> >
> > Error message:   This variable or expression must contain only
> > constant data.
> >
> > Any ideas why your trick won't work for my case?
> >
> > With Regards-
> > Sam
> >
> >
> > --- In equismetastock@xxxxxxxxxxxxxxx, "Roy Larsen" <rlarsen@xxxx>
> > wrote:
> > > Here are three versions of a weekly Monday CLOSE SMA. The first
> > formula is less accurate than the
> > > other two because of the errors introduced by cumulating the 
data
> > for every Monday on the chart then
> > > subtracting the unwanted Monday data. The advantage of this 
code is
> > that it does not require PREV.
> > >
> > > The second and third formulas are more accurate because there 
is no
> > fractional component in the 'J'
> > > variable cumulations. This variable calculates the look-back
> > periods (in bars, not weeks) for Sum()
> > > or Mov(). In both formulas the 'J' variable is converted to 
operate
> > legitimately as a constant in
> > > either the Sum() or Mov() functions.
> > >
> > > The last line of the third formula can be broken down as 
follows.
> > >
> > > Mov(   {moving average of}
> > >  K*M,  {data array includes only the CLOSE when Monday is true}
> > >   LastValue(J+PREV-PREV),   {'J' periods in the form of a 
constant
> > as required by Mov()}
> > >    S)  {simple moving average}
> > >     *J/D;  {multiply MA by look-back periods and divide result 
by
> > weeks}
> > >
> > > It is clear from the makeup of this last line that moving 
between
> > different periodises on the one
> > > chart is rarely a matter of making simple changes. As you've
> > already discovered the data array needs
> > > to created, the sampling of that data needs to be managed, and 
the
> > number of look-back periods also
> > > need to adjusted to allow for holidays. The basic functions just
> > can't cut it.
> > >
> > > Roy
> > >
> > >   {Monday Close SMA 1}
> > >   {for use on daily charts}
> > > D:=Input("Periods in Weeks",1,100,10);
> > > M:=DayOfWeek()<=ValueWhen(2,1,DayOfWeek());
> > > K:=ValueWhen(1,M,C);
> > > G:=Cum(M*K);
> > > X:=(G-ValueWhen(D+1,M,G))/D;
> > > X;
> > >
> > >   {Monday Close SMA 2}
> > >   {for use on daily charts}
> > > D:=Input("Periods in Weeks",1,100,10);
> > > M:=DayOfWeek()<=ValueWhen(2,1,DayOfWeek());
> > > J:=Cum(1)-ValueWhen(D+1,M,Cum(1));
> > > K:=ValueWhen(1,M,C);
> > > Sum(K*M,LastValue(J+PREV-PREV))/D;
> > >
> > >   {Monday Close SMA 3}
> > >   {for use on daily charts}
> > > D:=Input("Periods in Weeks",1,100,10);
> > > M:=DayOfWeek()<=ValueWhen(2,1,DayOfWeek());
> > > J:=Cum(1)-ValueWhen(D+1,M,Cum(1));
> > > K:=ValueWhen(1,M,C);
> > > Mov(K*M,LastValue(J+PREV-PREV),S)*J/D;
> > >
> > >
> > > ----- Original Message ----- 
> > > From: "sabboushi2000" <Yahoo@xxxx>
> > > To: <equismetastock@xxxxxxxxxxxxxxx>
> > > Sent: Friday, February 06, 2004 2:53 AM
> > > Subject: [EquisMetaStock Group] Simple Moving Average using 
first
> > bar of each week
> > >
> > >
> > > > Hi-
> > > >
> > > > Am trying to use EOD daily data to create a Moving Average 
for the
> > > > previous 3 weeks - by using the Close of the first bar of each
> > > > week AND by using the MOV function.
> > > >
> > > > Example:  Today is Wednesday.  I want a simple 3 day moving
> > average
> > > > using the following data:
> > > >
> > > >
> > > >
> > > >     2/17 Wednesday
> > > >     2/16
> > > >     2/15 Monday  Close: 10
> > > >
> > > >     2/12 Friday
> > > >     2/11
> > > >     2/10
> > > >     2/9  Tuesday Close: 15
> > > >     2/8  Monday Holiday
> > > >
> > > >     2/5  Friday
> > > >     2/4
> > > >     2/3
> > > >     2/2
> > > >     2/1  Monday  Close: 20
> > > >
> > > > The result I am looking for in this example would be (10 + 15 
+
> > > > 20) / 3 = 15
> > > >
> > > > (2/9 Tuesday was first trading day of that week since Monday 
was a
> > > > trading Holiday)
> > > >
> > > >
> > > > NOTE: I know I can create a formula to create this moving 
average
> > > > without using the MOV function, but I don't really want to 
create
> > a
> > > > simple moving average using 3 data points - I just used this 
as a
> > > > simple example for discussion purposes.
> > > >
> > > > I've tried using valuewhen to identify the first close value I
> > want
> > > > MS8.01 EOD to use, wishing that the formula would "increment" 
to
> > each
> > > > previous bar that met the condition - but no such luck.  The
> > formula
> > > > I tried:
> > > >      Mov(ValueWhen(1,FIRSTDAYOFWEEK, C) ,3 ,S )
> > > > where FIRSTDAYOFWEEK is a custom indicator that is true on the
> > first
> > > > trading day of each week.  My problem would be solved if MS
> > > > incremented the "1" in my formula to 2 and 3 to get the data
> > points I
> > > > want it to use - but of course I'm being naive...
> > > >
> > > > Any geniuses out there that can think outside my box?
> > > >
> > > > With Regards-
> > > > Sam
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Yahoo! Groups Links
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> >
> >
> >
> >
> >
> > Yahoo! Groups Links
> >
> >
> >
> >
> >
> >



 
Yahoo! Groups Links

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

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

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