Exponentiële deviatiebanden Apirine

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
Plaats reactie
Janus
Berichten: 1440
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Exponentiële deviatiebanden Apirine

Bericht door Janus »

Apirine,
Nee, ik ben niet de ‘s’ vergeten 😉
Het is de achternaam van Vitali Apirine, u kent hem vast wel van de -slow RSI-.
Heel bekend is de indicator met de naam: Bollinger bands.
In de -Bollinger bands- indicator (Van John Bollinger) worden twee deviatie banden berekend en weergegeven in de grafiek.
Bedoeling ervan is om een trend te herkennen.
Apirini heeft de berekening van de indicator wat aangepast waardoor deze meer gewicht toekent aan het laatste koersverloop.
In het blad ‘Stocks & Commodities’ uitgave Juli-2019 wordt door Vitali Apirine een artikel gewijd aan deze indicator.
Ik heb de daarin weergegeven formule omgezet in TA-script.
Apirine gebruikt in zijn indicator een exponentieel gemiddelde (EMA). Ik heb in het TA-script de mogelijkheid ingebouwd om ook gebruik te kunnen maken van een eenvoudig en een gewogen gemiddelde.
Maar wat volgens mij ook niet mag ontbreken in dit TA-script is de mogelijkheid om gebruik te maken van “Ehlers deviation scaled moving average” te vinden op het TA-script forum onder de link: viewtopic.php?f=2&t=1596&p=11111#p11111
In deze indicator berekent Ehlers een gemiddelde welke beïnvloed wordt door de deviatie berekening.
In dit script is dan nu ook de mogelijkheid ingebouwd om de exponentiele banden te laten berekenen vanaf deze “Ehlers deviation scaled moving average”.
Houdt er rekening mee dat u de periode waarover de koers wordt berekend bij gebruik van de Ehlers DSMA hoger instelt dan bij gebruik van de andere moving averages, gebruikelijk is bijvoorbeeld voor de standaard moving averages een waarde van 20 terwijl dat voor de Ehlers DSMA een waarde van 40 is.
De bands indicator wordt vaak gebruikt samen met een andere indicator als de ADX of de CCI.
Een weergave van deze indicator ziet in onderstaande grafiek.
Grafiek:
Afbeelding
.
Handelen met deze indicator kan op vele manieren.
Zo laat Wealth-Lab een eenvoudig voorbeeld zien met een combinatie met de ADX.
Entry rules:
. Buy at limit at the lower exponential deviation band if ADX is less than it was 10 bars ago.
Exit rules:
. Sell on the open after 10 bars in the trade.
. Sell on the open if the ADX rises above its value 10 bars ago.
Ze doen er een grafiek bij die het winst verloop laat zien ten opzichte van -buy and hold- in Walmart.
Die grafiek ziet u hieronder:
Afbeelding

Maar ontwikkel gewoon een methode die u ligt.
.
De TA-script code is:

Code: Selecteer alles

{- Filename: DeviationBands Apirine -}

// Exponentiële Deviatiebanden
// Naar een idee van Vitali Apirine
// Uit Stocks&Commodities Juli-2019
// vertaling en toevoeging :  www.JSTAS.com
// 19-07-2019 versie 1.01
//***************************************************

Procedure Tekenlijn(sUpper,sMA,sLower:Tseries);
Begin
 With CreateLine(sUpper) Do
  Begin
    Name := 'UpperBand';
    Color := clBlue;
  End;
 With CreateLine(sMA) Do
  Begin
   Name := 'Center-MA';
   LineType := lsDot;
   Color := clBlue;
  End;
 With CreateLine(sLower) Do
  Begin
   Name := 'LowerBand';
   Color := clBlue;
  End;
End;
//*************************************************************************

Function  DeviationMA(Serie:TSeries;Periode:Integer):Tseries;  //Ehlers
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;
//*********************************************************************

Procedure ExDevBnd(Periode:Integer;sMA:TSeries);   //Apirine
VAR
  i : integer;
  MLTP: Real;
  ED, MDev,PD,  sUpper, SLower: TSeries;
Begin
 MLTP := 2.0/(Periode+1);
  ED := FillSeries(CreateSeries(BarCount),0);
  MDev := CreateSeries(BarCount);

 PD := MultiplySeriesBy(AbsSeries(SubtractSeries(sMA,C)),MLTP);

 For i:= 1 To BarCount-1 DO
  Begin
   If IsValid(PD[i]) Then
    ED[i] := PD[i] + ED[i-1]*(1-MLTP);
  End;

 sUpper := AddSeries(sMA,MultiPlySeriesBy(ED,2));
 SLower := SubtractSeries(sMA,MultiPlySeriesBy(ED,2));

 Tekenlijn(sUpper,sMA,sLower);
End;
//***************************************************

Function Gemiddelde(Krs,MAkze,Periode:Integer):TSeries;
Var
Reeks : TSeries;
Begin
 Case Krs Of
  0 : Reeks := Close;
  1 : Reeks := DivideSeriesBy(AddSeries(High,Low),2);
 End;

 Case MAkze Of
  0 : Result := MA(Reeks,maSimple,Periode);
  1 : Result := MA(Reeks,maWeighted,Periode);
  2 : Result := MA(Reeks,maExponential,Periode);
  3 : Result := DeviationMA(Reeks,Periode);
 End;
End;

//******************************************************************

Procedure SetUp(Periode: Integer);
Begin
With Indicator Do
  Begin
    RequiredBars := 3*Periode;
    NewBand := False;
    ScaleRange := srCommon;
  End;
End;
//********************************************************************
Var
 Periode,MAkze,Krs: integer;
 sMA : TSeries;
 maKeus : String;

Begin
 maKeus := 'Simple'#9
           'Weighted'#9
           'Exponential'#9
           'Ehlers DSMA';

 Periode   := CreateParameterInteger('MA periode', 1, 999, 20, True);
 MAkze     := CreateParameterSelect('MA-basis:',maKeus,2,True);
 Krs       := CreateParameterSelect('Koerstype:','Slotkoers'#9'(H+L)2',0,True);

 Setup(Periode);
 sMA := Gemiddelde(Krs,MAkze,Periode);
 ExDevBnd(Periode,sMA);

End.

.
Vriendelijke groet,
JanS ;)
Plaats reactie