Ehlers Deviation Scaled Moving Average

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
Plaats reactie
Eric
Berichten: 2943
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Ehlers Deviation Scaled Moving Average

Bericht door Eric » di jul 10, 2018 9:19 am

In de juli 2018 uitgave van Stocks & Commodities beschijft John Ehlers een adaptieve MA. JanS heeft dit vertaald in een TA-script, hierbij nogmaals de (licht aangepaste) code.

Code: Selecteer alles

{- Filename: Ehlers DSMA -}

// Een moving-avarage die snel reageert op de prijs deviatie
// naar een idee van Dhr. John F. Ehlers, gepubliceerd in Stocks&Commodities July 2018
// vertaling: jstas.com
// versie 1.00
// fouten voorbehouden ;)

Function  DeviationMA(Serie:TSeries;Periode:Integer):Tseries;
Var
i,Tllr : Integer;
a1,b1,c1,c2,c3,RMS1 : Double;
Zeros, Filt, RMS, ScaledFilt, Alpha1 : Tseries;

Begin
Filt := FillSeries(CreateSeries(BarCount),1);
RMS  := FillSeries(CreateSeries(BarCount),0);
ScaledFilt := CreateSeries(BarCount);
Alpha1     := CreateSeries(BarCount);
Zeros      := CreateSeries(BarCount);
Result     := FillSeries(CreateSeries(BarCount),1);

If barCount>1 Then
 Begin
  a1 := Exp((Sqrt(2)*Pi*-1.0)/(Periode/2.0));
  b1 := 2 * a1 *Cos( Sqrt(2) * 180 / (Periode/2));
  c2 := b1;
  c3 := (-1.0*a1) * a1;
  c1 := 1 -c2 -c3;
 End;

For i := 2 to BarCount-1 Do
 Begin
 Zeros[i] := Serie[i] - Serie[i-2];
 End;

For i := 3 to Barcount-1 Do
 Begin
   Filt[i] := c1*(Zeros[i]+Zeros[i-1])/2 + c2*Filt[i-1] +c3*Filt[i-2];
 End;

 For i := Periode to BarCount-1 Do
  Begin
    RMS1 := 0;
    Tllr := 0;
    For Tllr := 0 To Periode-1 Do
     Begin
       RMS1 := RMS1 + Filt[i-Tllr]*Filt[i-Tllr];
       Tllr := Tllr+1;
     End;
   RMS[i] := Sqrt(RMS1/Periode);
  End;

For i := 1 To BarCount-1 Do
 Begin
  If (RMS[i] <>0) Then
   Begin
    ScaledFilt[i] := Filt[i]/RMS[i];
   End;
 End;
 
For i := 1 To BarCount-1 Do
 Begin
  Alpha1[i] := Abs(ScaledFilt[i])*5/Periode;
 End;

For i := 2 To BarCount-1 Do
 Begin
  If IsValid(Result[i-1]) Then
  Result[i] := (Alpha1[i]*Serie[i]) + (1-Alpha1[i])* (Result[i-1]);
 End;

End;
//********************
Var
Periode : Integer;

Begin
  Periode := CreateParameterInteger('Periode',1,999,40, False);

  with Indicator do
  begin
    NewBand := False;
    RequiredBars := Periode;
    ScaleRange := srCommon;
  end;

  With CreateLine(DeviationMA(Close,Periode)) Do
  Begin
    Color := clYellow;
  End;
End.

---
Eric

Janus
Berichten: 1224
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Ehlers Deviation Scaled Moving Average

Bericht door Janus » di jul 10, 2018 10:00 am

Bedankt voor de aanpassing Eric, ik heb ook even de standaarddeviatie berekening vervangen door de ingebouwde functie van ta-script, die werkt sneller.
.

Code: Selecteer alles

{- Filename: Ehlers DSMA -}

// Een moving-avarage die snel reageert op de prijs deviatie
// naar een idee van Dhr. John F. Ehlers, 
// gepubliceerd in Stocks&Commodities July 2018
// vertaling: jstas.com
// versie 1.01  10-07-2018
// fouten voorbehouden ;)

Function  DeviationMA(Serie:TSeries;Periode:Integer):Tseries;
Var
i : Integer;
a1,b1,c1,c2,c3 : Double;
Zeros, Filt, RMS, ScaledFilt, Alpha1 : Tseries;

Begin
Filt       := FillSeries(CreateSeries(BarCount),1);
RMS        := CreateSeries(BarCount);
ScaledFilt := CreateSeries(BarCount);
Alpha1     := CreateSeries(BarCount);
Zeros      := CreateSeries(BarCount);
Result     := FillSeries(CreateSeries(BarCount),1);

If barCount>1 Then
 Begin
  a1 := Exp((Sqrt(2)*Pi*-1.0)/(Periode/2.0));
  b1 := 2 * a1 *Cos( Sqrt(2) * 180 / (Periode/2.0));
  c2 := b1;
  c3 := (-1.0*a1) * a1;
  c1 := 1 -c2 -c3;
 End;

For i := 2 to BarCount-1 Do
 Begin
 Zeros[i] := Serie[i] - Serie[i-2];
 End;

For i := 3 to Barcount-1 Do
 Begin
   Filt[i] := c1*(Zeros[i]+Zeros[i-1])/2 + c2*Filt[i-1] +c3*Filt[i-2];
 End;

RMS := StdDev(Filt,Periode);
 
For i := 1 To BarCount-1 Do
 Begin
  If IsValid(RMS[i]) And IsValid(Filt[i]) And (RMS[i] <>0) Then
   Begin
    ScaledFilt[i] := Filt[i]/RMS[i];
   End;
 End;
 
For i := 1 To BarCount-1 Do
 Begin
  Alpha1[i] := Abs(ScaledFilt[i])*5/Periode;
 End;

For i := 2 To BarCount-1 Do
 Begin
  If IsValid(Result[i-1]) Then
  Result[i] := (Alpha1[i]*Serie[i]) + (1-Alpha1[i])* (Result[i-1]);
 End;

End;
//********************
Var
Periode : Integer;

Begin
  Periode := CreateParameterInteger('Periode',1,999,40, False);

  with Indicator do
  begin
    NewBand := False;
    RequiredBars := Periode;
    ScaleRange := srCommon;
  end;

  With CreateLine(DeviationMA(Close,Periode)) Do
  Begin
    Color := clBlue;
  End;
End.
.
Vriendelijke groet,
JanS ;)

vincent
Berichten: 202
Lid geworden op: di jan 04, 2011 12:20 pm

Re: Ehlers Deviation Scaled Moving Average

Bericht door vincent » di jul 10, 2018 4:29 pm

@Eric of JanS, hoe groot is de kans dat er signaalwerking/optimalisatie aan gehangen kan worden?

Dat zou zowel bij kruising koers/MA-lijn kunnen of signaalwerking bij swtich van richting van de MA-lijn tussen stijgend en dalend.... Persoonlijk denk ik dat signaal bij switch tussen stijgend en dalend (en weer terug) minder valse signalen geeft en heeft derhalve mijn persoonlijke voorkeur (maar sta natuurlijk open voor andere inzichten).

Eric
Berichten: 2943
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Ehlers Deviation Scaled Moving Average

Bericht door Eric » di jul 10, 2018 8:31 pm

Op wonderbaarlijke wijze zie ik geen verschil tussen signalen bij kruising of richtingsverandering. Dat had ik eerlijk gezegd niet verwacht.

Code: Selecteer alles

{- Filename: Ehlers DSMA -}

// Een moving-avarage die snel reageert op de prijs deviatie
// naar een idee van Dhr. John F. Ehlers,
// gepubliceerd in Stocks&Commodities July 2018
// vertaling: jstas.com
// versie 1.01  10-07-2018
// fouten voorbehouden ;)

Function  DeviationMA(Serie:TSeries;Periode:Integer):Tseries;
Var
i : Integer;
a1,b1,c1,c2,c3 : Double;
Zeros, Filt, RMS, ScaledFilt, Alpha1 : Tseries;

Begin
Filt       := FillSeries(CreateSeries(BarCount),1);
RMS        := CreateSeries(BarCount);
ScaledFilt := CreateSeries(BarCount);
Alpha1     := CreateSeries(BarCount);
Zeros      := CreateSeries(BarCount);
Result     := FillSeries(CreateSeries(BarCount),1);

If barCount>1 Then
 Begin
  a1 := Exp((Sqrt(2)*Pi*-1.0)/(Periode/2.0));
  b1 := 2 * a1 *Cos( Sqrt(2) * 180 / (Periode/2.0));
  c2 := b1;
  c3 := (-1.0*a1) * a1;
  c1 := 1 -c2 -c3;
 End;

For i := 2 to BarCount-1 Do
 Begin
 Zeros[i] := Serie[i] - Serie[i-2];
 End;

For i := 3 to Barcount-1 Do
 Begin
   Filt[i] := c1*(Zeros[i]+Zeros[i-1])/2 + c2*Filt[i-1] +c3*Filt[i-2];
 End;

RMS := StdDev(Filt,Periode);

For i := 1 To BarCount-1 Do
 Begin
  If IsValid(RMS[i]) And IsValid(Filt[i]) And (RMS[i] <>0) Then
   Begin
    ScaledFilt[i] := Filt[i]/RMS[i];
   End;
 End;

For i := 1 To BarCount-1 Do
 Begin
  Alpha1[i] := Abs(ScaledFilt[i])*5/Periode;
 End;

For i := 2 To BarCount-1 Do
 Begin
  If IsValid(Result[i-1]) Then
  Result[i] := (Alpha1[i]*Serie[i]) + (1-Alpha1[i])* (Result[i-1]);
 End;

End;
//********************
Var
  Periode, nSIgnals : Integer;
  sDSMA: TSeries;
Begin
  Periode := CreateParameterInteger('Periode',1,999,40, False);
  nSignals := CreateParameterSelect('Signalen', 'Op kruising'#9'Op richtingsverandering', 0, false);

  with Indicator do
  begin
    NewBand := False;
    RequiredBars := 2*Periode;
    ScaleRange := srCommon;
  end;

  sDSMA := DeviationMA(Close, Periode);
  if nSignals = 0 then
    Signals := CrossingsToEntrySignals(Crossings(Close, sDSMA))
  else
    Signals := CrossingsToEntrySignals(Crossings(Momentum(sDSMA, 1), FillSeries(CreateSeries(BarCount), 0)));
  
  With CreateLine(sDSMA) Do
  Begin
    Color := clBlue;
  End;
End.
---
Eric

Janus
Berichten: 1224
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Ehlers Deviation Scaled Moving Average

Bericht door Janus » wo jul 11, 2018 12:25 am

@Vincent,
Deze indicator van Ehlers is niet direct -gebouwd- voor koop of verkoop pijltjes.
Deze -MA- probeert je in de strijd te houden zolang de trend loopt, en dan zeer kort op de bal, en wegwezen zodra de trend er niet meer is.
Wanneer je daarmee koop en verkoop pijltjes te voorschijn wil toveren zul je een vertraging in moeten bouwen.
Ik zet hieronder even een stukje code neer waarmee je kan experimenteren, je kan daar optimalisatie op loslaten etc..
Ik ben daar geen voorstander van, maar ieder z'n eigen ding.
Je zal zien dat er na optimalisatie een voorkeur uit zal gaan naar vertraging, maar of je daar nu blij van wordt....
Daar is deze indicator nu eenvoudigweg niet voor ontwikkeld.

Code: Selecteer alles

{- Filename: Ehlers DSMA  probeersel -}

// Een moving-avarage die snel reageert op de prijs deviatie
// naar een idee van Dhr. John F. Ehlers,
// gepubliceerd in Stocks&Commodities July 2018
// vertaling: jstas.com
// afwijkend probeerseltje
// fouten voorbehouden ;)

Function  DeviationMA(Serie:TSeries;Periode:Integer):Tseries;
Var
i : Integer;
a1,b1,c1,c2,c3 : Double;
Zeros, Filt, RMS, ScaledFilt, Alpha1 : Tseries;

Begin
Filt       := FillSeries(CreateSeries(BarCount),1);
RMS        := CreateSeries(BarCount);
ScaledFilt := CreateSeries(BarCount);
Alpha1     := CreateSeries(BarCount);
Zeros      := CreateSeries(BarCount);
Result     := FillSeries(CreateSeries(BarCount),1);

If barCount>1 Then
 Begin
  a1 := Exp((Sqrt(2)*Pi*-1.0)/(Periode/2.0));
  b1 := 2 * a1 *Cos( Sqrt(2) * 180 / (Periode/2.0));
  c2 := b1;
  c3 := (-1.0*a1) * a1;
  c1 := 1 -c2 -c3;
 End;

For i := 2 to BarCount-1 Do
 Begin
 Zeros[i] := Serie[i] - Serie[i-2];
 End;

For i := 3 to Barcount-1 Do
 Begin
   Filt[i] := c1*(Zeros[i]+Zeros[i-1])/2 + c2*Filt[i-1] +c3*Filt[i-2];
 End;

RMS := StdDev(Filt,Periode);

For i := 1 To BarCount-1 Do
 Begin
  If IsValid(RMS[i]) And IsValid(Filt[i]) And (RMS[i] <>0) Then
   Begin
    ScaledFilt[i] := Filt[i]/RMS[i];
   End;
 End;

For i := 1 To BarCount-1 Do
 Begin
  Alpha1[i] := Abs(ScaledFilt[i])*5/Periode;
 End;

For i := 2 To BarCount-1 Do
 Begin
  If IsValid(Result[i-1]) Then
  Result[i] := (Alpha1[i]*Serie[i]) + (1-Alpha1[i])* (Result[i-1]);
 End;

End;
//********************
Var
  Periode, nSIgnals, SerieKze, MAVertraging : Integer;
  sDSMA, KeuzeSerie: TSeries;
  KoersKeuze : String;
Begin

  with Indicator do
  begin
    NewBand := False;
    RequiredBars := 2*Periode;
    ScaleRange := srCommon;
  end;
  
  KoersKeuze := 'Open'#9
                'Hoog'#9
                'Laag'#9
                'Slot'#9
                '(H+L)/2';
  Periode := CreateParameterInteger('Periode',8,999,40, True);
  nSignals := CreateParameterSelect('Signalen', 'Op kruising'#9'Op richtingsverandering', 0, True);
  SerieKze := CreateParameterSelect('Welke koers:',Koerskeuze,3,True);
  MAvertraging := CreateParameterInteger('Vertraging SDMA',1,100,1,True);

  Case SerieKze Of
   0:  KeuzeSerie := Open;
   1:  KeuzeSerie := High;
   2:  KeuzeSerie := Low;
   3:  KeuzeSerie := Close;
   4:  KeuzeSerie := DivideSeriesBy((AddSeries(H,L)),2);
  End;
  

  
  sDSMA := DeviationMA(KeuzeSerie, Periode);
  sDSMA := MA(sDSMA,MAExponential,MAVertraging);
  if nSignals = 0 then
    Signals := CrossingsToEntrySignals(Crossings(KeuzeSerie, sDSMA))
  else
    Signals := CrossingsToEntrySignals(Crossings(Momentum(sDSMA, 1), FillSeries(CreateSeries(BarCount), 0)));
  
  With CreateLine(sDSMA) Do
  Begin
    Color := clBlue;
  End;
End.
.
..
Soms heb ik -geen/zeer weinig tijd- om te traden, maar wil ik tussen de bedrijven door wel proberen de trend bewegingen mee te pakken.
Ik doe dit dan volgens een bestaand systeem via gemiddelden ingesteld op Fibonacci waarden.
Dat is denk ik ook jouw visie, trial.
Via gemiddelden pak je prachtig de trend, maar zodra de zijwaartse fase aanbreekt ...:(
Ik zal je een stukje grafiek laten zien, en wanneer er interesse voor is, wil ik proberen daar de komende weken wat tijd voor vrij te maken, ik moet even zien -hoe ver ik kan gaan- zonder -regels te overtreden- op dat vlak.
Want dit werkt zeer goed voor -handel tussendoor- maar er zijn wel de nodige regels om er de optimale winst uit te halen.
Ik geef even een uur-grafiek weer van de laatste dagen; vrijdag vorige week t/m dinsdag vandaag.
Zes punten had je op deze wijze in de FTI op de AEX zonder de regels te kennen zomaar binnen kunnen harken.
En dat kan zonder de hele dag achter je scherm te zitten.
.
Ik zet de grafiek hieronder even neer, kijkt u zelf even.
Wanneer er echt belangstelling is, wil ik proberen een tipje van de sluier op te lichten de komende weken.
.
Afbeelding
.
Het verhaal zit 'em' in de onder de groene lijn liggende 5 lijnen.
.
Afijn, als er interesse is verneem ik het wel, en wanneer u zelf iets lucratievers hebt : gefeliciteerd!
.
Laatst gewijzigd door Janus op wo jul 11, 2018 12:32 am, 1 keer totaal gewijzigd.
Vriendelijke groet,
JanS ;)

Janus
Berichten: 1224
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Ehlers Deviation Scaled Moving Average

Bericht door Janus » wo jul 11, 2018 12:30 am

@ Eric,
leuk dat je ook het blad Stocks&Commodities leest.
Een mooie variant op bovenstaande vind ik wel de variant die Wealth-lab er aan toevoegt op pagina 51, de % bands.
Wellicht een -probeersel- waard?
.
Vriendelijke groet,
JanS ;)

Eric
Berichten: 2943
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Ehlers Deviation Scaled Moving Average

Bericht door Eric » wo jul 11, 2018 8:56 am

Ik lees hem niet regelmatig eerlijk gezegd, maar kwam al googelend tegen dat de indicator daar in stond.

De Wealthlab implementatie genereert countertrend signalen, door een band om de DSMA te tekenen en de terugkeer in de band te gebruiken als signaal. Dat wordt zoiets:

Code: Selecteer alles

{- Filename: Ehlers DSMA bands -}

// Een moving-avarage die snel reageert op de prijs deviatie
// naar een idee van Dhr. John F. Ehlers,
// gepubliceerd in Stocks&Commodities July 2018
// vertaling: jstas.com
// versie 1.01  10-07-2018
// fouten voorbehouden ;)

Function  DeviationMA(Serie:TSeries;Periode:Integer):Tseries;
Var
i : Integer;
a1,b1,c1,c2,c3 : Double;
Zeros, Filt, RMS, ScaledFilt, Alpha1 : Tseries;

Begin
Filt       := FillSeries(CreateSeries(BarCount),1);
RMS        := CreateSeries(BarCount);
ScaledFilt := CreateSeries(BarCount);
Alpha1     := CreateSeries(BarCount);
Zeros      := CreateSeries(BarCount);
Result     := FillSeries(CreateSeries(BarCount),1);

If barCount>1 Then
 Begin
  a1 := Exp((Sqrt(2)*Pi*-1.0)/(Periode/2.0));
  b1 := 2 * a1 *Cos( Sqrt(2) * 180 / (Periode/2.0));
  c2 := b1;
  c3 := (-1.0*a1) * a1;
  c1 := 1 -c2 -c3;
 End;

For i := 2 to BarCount-1 Do
 Begin
 Zeros[i] := Serie[i] - Serie[i-2];
 End;

For i := 3 to Barcount-1 Do
 Begin
   Filt[i] := c1*(Zeros[i]+Zeros[i-1])/2 + c2*Filt[i-1] +c3*Filt[i-2];
 End;

RMS := StdDev(Filt,Periode);

For i := 1 To BarCount-1 Do
 Begin
  If IsValid(RMS[i]) And IsValid(Filt[i]) And (RMS[i] <>0) Then
   Begin
    ScaledFilt[i] := Filt[i]/RMS[i];
   End;
 End;

For i := 1 To BarCount-1 Do
 Begin
  Alpha1[i] := Abs(ScaledFilt[i])*5/Periode;
 End;

For i := 2 To BarCount-1 Do
 Begin
  If IsValid(Result[i-1]) Then
  Result[i] := (Alpha1[i]*Serie[i]) + (1-Alpha1[i])* (Result[i-1]);
 End;

End;
//********************
Var
  Periode, i: Integer;
  LowerBand, UpperBand: real;
  sDSMA, sLowerBand, sUpperBand: TSeries;
  lcUpper, lcLower: TLineCrossings;
Begin
  Periode := CreateParameterInteger('Period',1,999,40, False);
  UpperBand := CreateParameterReal('Upper band (%)',0,99,5, False);
  LowerBand := CreateParameterReal('Lower band (%)',0,99,3, False);

  with Indicator do
  begin
    NewBand := False;
    RequiredBars := 2*Periode;
    ScaleRange := srCommon;
  end;

  sDSMA := DeviationMA(Close, Periode);
  sUpperBand := MultiplySeriesBy(sDSMA, (100+UpperBand)/100);
  sLowerBand := MultiplySeriesBy(sDSMA, (100-LowerBand)/100);

  lcUpper := Crossings(Close, sUpperBand);
  lcLower := Crossings(Close, sLowerBand);
  for i:=0 to BarCount-1 do
  begin
    if lcUpper[i]=lc2Over1 then Signals[i] := sgEnterShort else
      if lcLower[i]=lc1Over2 then Signals[i] := sgEnterLong;
  end;

  With CreateLine(sDSMA) Do
  Begin
    Name := 'DSMA';
    Color := clBlue;
  End;
  With CreateLine(sUpperBand) Do
  Begin
    Name := 'Upper band';
    Color := clSilver;
    LineContent := lcConstant;
  End;
  With CreateLine(sLowerBand) Do
  Begin
    Name := 'Lower band';
    Color := clSilver;
    LineContent := lcConstant;
  End;
End.
---
Eric

constant
Berichten: 150
Lid geworden op: ma mei 06, 2013 3:50 pm

Re: Ehlers Deviation Scaled Moving Average

Bericht door constant » do jul 12, 2018 10:22 am

JanS, Ik ben zeer geïnteresseerd in de strategie met de Ehlers MA met de 5 lijnen.
Groet, Constant

vincent
Berichten: 202
Lid geworden op: di jan 04, 2011 12:20 pm

Re: Ehlers Deviation Scaled Moving Average

Bericht door vincent » vr jul 13, 2018 8:36 am

Ik sluit mij bij Constant aan, ik ben benieuwd naa de isnteek va die 5 lijnen. Gegroet, Vincent
Ook dank voro de toelichting betreffende gebruik van de DSMA, ik ga eens stoeien of die goed te combineren is met de TAC-DMI (die dan dient voor start signaal) en de DSMA voor tracking

paulkr
Berichten: 372
Lid geworden op: ma jun 25, 2007 1:34 pm
Locatie: Den Bosch

Re: Ehlers Deviation Scaled Moving Average

Bericht door paulkr » zo jul 15, 2018 10:57 am

Hoi Jans,

Mocht je meer over het systeem via gemiddelden icm op Fibonacci waarden mogen delen zonder daarbij regels te overtreden, dan zou ik er graag meer over leren.

Mvg,
Paulkr

Janus
Berichten: 1224
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Ehlers Deviation Scaled Moving Average

Bericht door Janus » ma jul 16, 2018 11:16 pm

Hallo allemaal,
Er zijn een paar dingen door elkaar gaan lopen.
Deze topic die Eric geopend heeft betreft de Deviation Scaled Moving Average van Ehlers.
De grafiek die ik hier boven liet zien met EMA's (Exponential moving average) hoort in deze topic niet thuis.
Een -systeem- met MA's wordt vaak al snel terzijde geschoven, met als argument dat deze te laat reageert.
Toch heeft die vertraging zijn voordeel.
Je moet alleen even weten waar je op moet letten.
Maar dat is allemaal niet in een paar woorden neer te zetten.
Daarom zal ik later dit jaar, na mijn vakantie, een nieuwe topic openen op dit forum met als titel: handelen met MA's
.
Vriendelijke groet,
JanS ;)

constant
Berichten: 150
Lid geworden op: ma mei 06, 2013 3:50 pm

Re: Ehlers Deviation Scaled Moving Average

Bericht door constant » do jul 19, 2018 9:29 am

JanS, Ik zie er naar uit en wens je een super vakantie.

Constant

Plaats reactie