De meeste beleggers gebruiken de standaard Moving averages zoals de "Simple Moving Average (SMA)",
de "Weighted Moving Average (WMA) of de "Exponentiele Moving Average (EMA) voor zijn of haar beleggings beslissingen.
Er zijn echter veel meer moving average methodes beschikbaar met betere/andere eigenschappen dan deze drie.
Zelf gebruik ik deze drie vrijwel nooit. Ik gebruik aangepaste versies die meer "mathematisch, Stochastisch" correct zijn.
Misschien zal ik hier in de toekomst iets over posten.
Recentelijk kwam ik bij het browsen op het internet een Interpolator functie tegen die volgens mij ook interessant is voor de beleggings community.
Deze Interpolator/smoother wordt ook wel de "Spencer's 15 point" en de "Spencer's 21 point" Moving Average genoemd.
Deze functie fits een hogere orde polynoom tussen de punten/bars.
Het voordeel van deze Spencer functies is dat er een gladdere lijn getekend wordt dan de standaard Moving Averages.
Het nadeel is dat de filter lengte vast ligt, namelijk 15 of 21 punten/bars.
Ik heb deze functies aangepast door ze naar de toekomst de verschuiven zodat ze als alternatief gebruikt kunnen worden voor de standaard MA functies.
Voor de volledigheid kunt u deze "shift" aan of uitzetten met een checkbox.
Een voorbeeld screendump heb ik bijgesloten.
Veel plezier ermee,
Albert
Code: Selecteer alles
{------------------------------------------------------------------------------}
{ TA-Script for Alex-Pro & Wallstreet Pro }
{------------------------------------------------------------------------------}
{- Filename: Spencer -}
{------------------------------------------------------------------------------}
{ Description: Spencer's 15 & 21 point Moving Average/Interpolator/smoother }
{------------------------------------------------------------------------------}
{ Global Variables & Constants }
{------------------------------------------------------------------------------}
var
pSelect : integer;
pShift : boolean;
MAS : TSeries;
{------------------------------------------------------------------------------}
{ Functions & Procedures }
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------}
{ Find The Last Valid Index of a Series }
{------------------------------------------------------------------------------}
function LastValidIndex(aSer:TSeries):integer;
var
count: integer;
i:integer;
begin
count:=GetArrayLength(aSer);
if (Count>0) then
begin
result:=0;
for i:=Count-1 downto 0 do
begin
if IsValid(aSer[i]) then
begin
result:=i;
Break;
end;
end;
end;
end;
{------------------------------------------------------------------------------}
{ Spencer's 15 point Moving Average/Interpolator/smoother }
{------------------------------------------------------------------------------}
function MaSpencer15(aSer: TSeries): TSeries;
var
FVI, LVI, i : integer;
begin
FVI := FirstValidIndex(aSer)+7;
LVI := LastValidIndex(aSer)-7;
{---}
if ((LVI-FVI)>15) then
begin
for i:=FVI to LVI do
begin
result[i]:=( -3*aSer[i-7]+
-6*aSer[i-6]+
-5*aSer[i-5]+
+3*aSer[i-4]+
+21*aSer[i-3]+
+46*aSer[i-2]+
+67*aSer[i-1]+
+74*aSer[i]+
+67*aSer[i+1]+
+46*aSer[i+2]+
+21*aSer[i+3]+
+3*aSer[i+4]+
-5*aSer[i+5]+
-6*aSer[i+6]+
-3*aSer[i+7]
) / 320.0;
end;
end;
end;
{------------------------------------------------------------------------------}
{ Spencers 21 point Moving Average/Interpolator/smoother }
{------------------------------------------------------------------------------}
function MaSpencer21(aSer: TSeries): TSeries;
var
FVI, LVI, i : integer;
begin
FVI := FirstValidIndex(aSer)+10;
LVI := LastValidIndex(aSer)-10;
{---}
if ((LVI-FVI)>21) then
begin
for i:=FVI to LVI do
begin
result[i]:=( -1*aSer[i-10]+
-3*aSer[i-9 ]+
-5*aSer[i-8 ]+
-5*aSer[i-7 ]+
-2*aSer[i-6 ]+
+6*aSer[i-5 ]+
+18*aSer[i-4 ]+
+33*aSer[i-3 ]+
+47*aSer[i-2 ]+
+57*aSer[i-1 ]+
+60*aSer[i]+
+57*aSer[i+1 ]+
+47*aSer[i+2 ]+
+33*aSer[i+3 ]+
+18*aSer[i+4 ]+
+6*aSer[i+5 ]+
-2*aSer[i+6 ]+
-5*aSer[i+7 ]+
-5*aSer[i+8 ]+
-3*aSer[i+9 ]+
-1*aSer[i+10]
) / 350.0;
end;
end;
end;
{------------------------------------------------------------------------------}
{ Begin Main }
{------------------------------------------------------------------------------}
begin
{----------------------------------------------------------------------------}
{ Indicator parameters }
{----------------------------------------------------------------------------}
pSelect := CreateParameterSelect('Select Model',
'Spencer 15 Point'#9
'Spencer 21 Point'#9
, 0, true);
pShift:=CreateParameterBoolean('Shift', FALSE, TRUE);
{----------------------------------------------------------------------------}
{ Indicator properties }
{----------------------------------------------------------------------------}
with Indicator do
begin
ShortName := 'SpencerMA';
NewBand := false;
ScaleRange:= srCommon;
end;
{----------------------------------------------------------------------------}
{ Indicator Calculations }
{----------------------------------------------------------------------------}
MAS := CreateSeries(BarCount);
case pSelect of
{---}
0: begin
MAS := MaSpencer15(Close);
if (pShift=TRUE) then MAS := ShiftSeries(MAS,7);
end;
{---}
1: begin
MAS := MaSpencer21(Close);
if (pShift=TRUE) then MAS := ShiftSeries(MAS,10);
end;
{---}
end;
{----------------------------------------------------------------------------}
{ Display Series }
{----------------------------------------------------------------------------}
{--- LineNr=0 , Create MAS Line ---}
with CreateLine(MAS) do
begin
Name := 'Spencer';
Color := RGB(255,128,0);
Width := 1;
end;
{------------------------------------------------------------------------------}
end.
{------------------------------------------------------------------------------}
{ End Main }
{------------------------------------------------------------------------------}