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:
.
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:
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.