De volatiliteit wordt uit de koersgrafiek gehaald of zelf ingegeven.
.
Voorbeeldje met de koersgrafiek van ING:

.
Voorbeeldje met de koersgrafiek van de AEX:

.
De ta-script code:
Code: Selecteer alles
{- Filename: ProbabilityEnvelope -}
// Indicator plaats Probability Envelope in grafiek
// Volatiliteit wordt uit grafiek gehaald of zelf opgegeven
// Horizontale schaal op kalenderdagen instellen
// Versie 1.00 13-11-2019 www.jstas.com
function IsExpiryDate(DT: TDateTime): boolean;
var
Yr, Mon, Day: integer;
begin
DecodeDate(DT, Yr, Mon, Day);
Result := (DayOfWeek(DT) = 6) and (Day >= 15) and (Day < 22);
end;
//*****************************************************************
Procedure initialisatie();
begin
with indicator do
begin
newband := false;
scalerange := srcommon;
end;
end;
//**********************************************************************
Function LengteInDgn():Integer;
Var
kze,eigen : integer;
begin
kze := CreateParameterSelect('Volatiliteit over;',
'30-dagen'#9'45-dagen'#9'60-dagen'#9'Eigen opgave',1,False);
eigen := CreateParameterInteger('Eigen opgave in dagen:',1,1000,90,False);
Case kze of
0 : result := 30;
1 : result := 45;
2 : result := 60;
3 : result := eigen;
end;
end;
//********************************************************************
Function Volatiliteit(dagenHV:integer):Real;
var
i: integer;
ItdRtrn, sDevAn : tseries;
begin
ItdRtrn := CreateSeries(BarCount);
for i:= 1 to BarCount-1 do
begin
ItdRtrn[i] := (C[i]/C[i-1])-1;
end;
sDevAn := MultiplySeriesBy(StdDevS(ItdRtrn,dagenHV),Sqrt(253)*100.0);
for i:= BarCount-1 DownTo 1 do
begin
if (i=BarCount-1) then
begin
result := sDevAn[i];
i := 1;
end;
end;
//CreateLine(sDevAn).Color:=ClRed;
end;
//**********************************************************************
Function VolaKeuze(dagenHV:integer): real;
var
kze : integer;
ingv : real;
begin
kze := CreateParameterSelect
('Volatiliteitwaarde','Zelf ingeven'#9'Automatisch',1,False);
ingv := CreateParameterReal('Geef volatilitiet in %',0.1,500,22.1,False)/100.0;
Case kze of
0 : result := ingv;
1 : result := Volatiliteit(dagenHV)/100.0;
end;
end;
//***********************************************************************
Procedure tekst(YY,XX:Integer;tekst2:string);
begin
With CreateText(0,0,tekst2) do
begin
X1Pct := XX;
Y1Pct := YY;
Color := ClAqua;
end;
end;
//***********************************************************************
Procedure TekstEnvelope(dtm:TDateTime; tekst:String; YY:Integer; wrde:Real);
begin
With createtext(dtm,wrde,tekst) do
begin
If (wrde=0) then Y1Pct := YY;
Color := clAqua;
end;
end;
//***********************************************************************
Procedure VertLine(datum:TDateTime;kleur:TColor);
begin
With CreateTrendLine(datum,0,datum,100) do
begin
Y1PCt:=0;
Y2Pct :=100;
color := CLGreen;
Style := lsdot;
end;
end;
//***********************************************************************
Procedure DrawEnvelope(dagenHV,dagen:integer;vola:real;klr:TColor);
Var
i,j : integer;
krs : real;
sdevi : array of real;
dateLB : TDateTime;
begin
SetArrayLength(sdevi,dagen+1);
for i := BarCount-1 DownTo 1 do
begin
if (i=BarCount-1) then
begin
krs := C[i];
dateLB := DateTime[i];
i :=1;
end;
end;
for j :=0 to dagen do
begin
sdevi[j] := krs*vola*sqrt(j/365.0);
end;
for j :=0 to (dagen-1) DO
Begin
CreateTrendline(dateLB+j,krs+sdevi[j],dateLB+j+1,krs+sdevi[j+1]).color:=klr;
CreateTrendLine(dateLB+j,krs-sdevi[j],dateLB+j+1,krs-sdevi[j+1]).color:=klr;
If IsExpiryDate(dateLB+j) then
begin
VertLine(dateLB+j,clGreen);
TekstEnvelope(dateLB+j+1,'High: '+FormatFloat('0.00',krs+sdevi[j+1]),100,0);
TekstEnvelope(dateLB+j+1,'Days: '+IntToStr(j),97,krs);
TekstEnvelope(dateLB+j+1,'Low: ' +FormatFloat('0.00',krs-sdevi[j+1]),3,0);
end;
end;
Tekst(96,1,'Used Volatility: '+ FormatFloat('0.00',vola*100.0)+ '%');
Tekst(99,1,'HV gemeten over '+ IntToStr(dagenHV) + ' dagen');
end;
//***********************************************************************
var
vola : real;
klr : TColor;
dagen,dagenHV: integer;
begin
initialisatie();
dagenHV := LengteInDgn();
vola :=VolaKeuze(dagenHV);
dagen := CreateParameterInteger('Aantal dagen tekenen:',30,1000,100,False);
klr := CreateParameterColor('Kleur Envelope:',ClYellow);
DrawEnvelope(dagenHV,dagen,vola,klr);
end.


