Spencer's Moving Average/ Interpolator/ smoother

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
Plaats reactie
AlbertH
Berichten: 185
Lid geworden op: di apr 27, 2010 12:47 pm
Locatie: Oegstgeest

Spencer's Moving Average/ Interpolator/ smoother

Bericht door AlbertH »

Hallo Forum leden,

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                                                }
{------------------------------------------------------------------------------}
Bijlagen
Spencer's 21 point Moving Average versus SMA(21)
Spencer's 21 point Moving Average versus SMA(21)
Plaats reactie