Kijk even heer bakstenen of de code doet wat je voor ogen hebt, en zo niet even melden a.u.b..
wanneer je wat gewijzigd of toegevoegd wilt zien, gewoon even melden.
.
Code: Selecteer alles
{- Filename: ProbabilityEnvelope ta-script-forum -}
// Indicator plaats Probability Envelope in grafiek
// Volatiliteit wordt uit grafiek gehaald of zelf opgegeven
// Horizontale schaal op koersdagen instellen
// Versie 1.06 31-08-2020 www.jstas.com
// diverse aanpassingen / toevoegingen
Var
OffsetLow, OffsetHigh : Integer;
//**************************************************************************
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;
//*****************************************************************
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;
//********************************************************************
Procedure initialisatie(dagenHV,Bbit: Integer);
begin
with indicator do
begin
newband := false;
scalerange := srcommon;
RequiredBars := 2*dagenHV+Bbit;
end;
end;
//**********************************************************************
Function Volatiliteit(dagenHV,Bbit:integer):Real;
var
ItdRtrn, sDevAn : tseries;
begin
ItdRtrn := ROC(C,1);
sDevAn := MultiPlySeriesBy(StdDevS(ItdRtrn,dagenHV),Sqrt(252)); //////
If (BarCount>(Bbit+1)) Then
result := sDevAn[BarCount-1-Bbit];
end;
//**********************************************************************
Function VolaKeuze(dagenHV,Bbit:integer): real;
var
kze : integer;
ingv : real;
begin
kze := CreateParameterSelect
('Volatiliteitwaarde','Zelf ingeven'#9'Automatisch',1,False);
ingv := CreateParameterReal('Geef volatiliteit in %',0.1,500,22.1,False)/100.0;
Case kze of
0 : result := ingv;
1 : result := Volatiliteit(dagenHV,Bbit)/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; Klr:TColor);
begin
With createtext(dtm,wrde,tekst) do
begin
If (wrde=0) then Y1Pct := YY;
Color := Klr;
end;
end;
//***********************************************************************
Procedure VertLine(datum:TDateTime;kleur:TColor);
begin
with CreateTrendLine(datum,0,datum,0) do
begin
Y1PCt:=0;
Y2Pct :=100;
color := Kleur;
Style := lsdot;
end;
end;
//************************************************************************
Procedure TrendLijn
(DatBeg,DatEnd:TDateTime; wrd1,wrd2:Real; Kleur:TColor; Stijl:TTrendLineStyle);
begin
with CreatetrendLine(DatBeg,wrd1,DatEnd,wrd2) do
begin
if wrd2=0 then
begin
//Y1Pct := 50;
y2Pct := 25;
end;
color := Kleur;
Style := Stijl;
end;
end;
//***********************************************************************
Procedure Waterpaslijntje(krspls,krsmin,krs:real;Start:TDateTime;Bbit:Integer);
Begin
With CreateTrendline(Start,krspls,now+14,krspls) do
begin
Color := clRed;
Style := LsDot;
end;
With CreateTrendLine(Start,krsmin,now+14,krsmin) do
begin
color := ClRed;
Style := LsDot;
end;
TrendLijn(Start,Start,krspls,krsmin,clRed,LsDot);
if (Bbit=0) then
CreateText(now+BarInterval,krs,DateToStr(now+BarInterval)).color:=clRed
else
CreateText(now,krs,DateToStr(now)).color:=clRed;
CreateText(now+14,krspls,FormatFloat('0.00',krspls)).color:=ClRed;
CreateText(now+14,krsmin,FormatFloat('0.00',krsmin)).color:=ClRed;
end;
//************************************************************************
Procedure WeekExp
(dateLB:TDateTime; j,vph,vpl,vpx,vpxx,wk1,wk2,wk3,WkExp,Bbit:Integer;
krs,krspls,krspls2,krsmin,krsmin2:Real;sd2,waterpas:Boolean;
klr1,klr2,klr3:TColor);
begin
if (WkExp>=1) and (j<7) and (wk1=0)then
begin
vpx:=3;
VertLine(dateLB+j,klr3);
TekstEnvelope(dateLB+j+1,'H1: '+FormatFloat('0.00',krspls),vph-vpx,0,Klr1);
if (sd2) then TekstEnvelope
(dateLB+j+1,'H2: '+FormatFloat('0.00',krspls2),vph-vpx-3,0,Klr2);
TekstEnvelope(dateLB+j+1,'L1: '+FormatFloat('0.00',krsmin),vpl+vpx,0,Klr1);
if (sd2) then
TekstEnvelope(dateLB+j+1,'L2: '+FormatFloat('0.00',krsmin2),vpl+vpx+3,0,Klr2);
wk1:=1;
TekstEnvelope(dateLB+j+1,' D:'+IntToStr(j),vph-3,krs*1.005,clAqua);
end;
if (j >7) and (j<15) and (wk2=0) then
begin
vpx:=6;
VertLine(dateLB+j,klr3);
TekstEnvelope
(dateLB+j+1,'H1: '+FormatFloat('0.00',krspls),vph-vpx-vpxx,0,Klr1);
if (sd2) then TekstEnvelope
(dateLB+j+1,'H2: '+FormatFloat('0.00',krspls2),vph-vpx-3-vpxx,0,Klr2);
TekstEnvelope
(dateLB+j+1,'L1: ' +FormatFloat('0.00',krsmin),vpl+vpx+vpxx,0,Klr1);
if (sd2) then TekstEnvelope
(dateLB+j+1,'L2: ' +FormatFloat('0.00',krsmin2),vpl+3+vpx+vpxx,0,Klr2);
wk2:=1;
TekstEnvelope (dateLB+j+1,' D:'+IntToStr(j),vph-3,krs,clAqua);
end;
if (j>14) and (j<22)and (wk3=0)then
begin
vpx:=9;
VertLine(dateLB+j,klr3);
TekstEnvelope
(dateLB+j+1,'H1: '+FormatFloat('0.00',krspls),vph-vpx-vpxx*2,0,Klr1);
if (sd2) then TekstEnvelope
(dateLB+j+1,'H2: '+FormatFloat('0.00',krspls2),vph-vpx-6-vpxx,0,Klr2);
TekstEnvelope
(dateLB+j+1,'L1: ' +FormatFloat('0.00',krsmin),vpl+vpx+3+vpxx,0,Klr1);
if (sd2) then TekstEnvelope
(dateLB+j+1,'L2: ' +FormatFloat('0.00',krsmin2),vpl+6+vpx+vpxx,0,Klr2);
wk3:=1;
TekstEnvelope (dateLB+j+1,' D:'+IntToStr(j),vph-3,krs,clAqua);
end;
end;
//**********************************************************************
Procedure MaandExpiratie
(datj,datj1,dateLB:TDateTime;krs,krspls,krspls2,krsmin,krsmin2:Real;vph,vpl,j,
dagen2:Integer;klr1,klr2:TColor;sd2:Boolean);
begin
VertLine(datj,clGreen);
TekstEnvelope (datj1,'H: '+FormatFloat('0.00',krspls),vph,0,Klr1);
if (sd2) then
TekstEnvelope (datj1,'H: '+FormatFloat('0.00',krspls2),vph-3,0,Klr2);
TekstEnvelope (datj1,'Days: '+IntToStr(j),vph-3,krs,clAqua);
TekstEnvelope (datj1,'L: ' +FormatFloat('0.00',krsmin),vpl,0,Klr1);
if (sd2) then
TekstEnvelope(datj1,'L: ' +FormatFloat('0.00',krsmin2),vpl+3,0,Klr2);
With CreateTrendLine(dateLB,krs,dateLB+dagen2,krs) do //
begin
color := clAqua;
style := lsDot;
end;
end;
//**************************************************************************
Procedure DrawEnvelope
(dagenHV,dagen,Bbit,WkExp:integer;vola:real;klr1,klr2,klr3:TColor;
sd2,Waterpas:Boolean);
Var
j,vph,vpl,dagen2,vpx,vpxx, wk1, wk2, wk3,wrdVert : integer;
krs,X0,CorFctr : real;
KrsPls0,KrsPls1,KrsMin0,KrsMin1 : Real;
KrsPls0SD2,KrsPls1SD2,KrsMin0SD2,KrsMin1Sd2 : Real;
sdevi : array of real;
dateLB,X1Daytime,X2Daytime : TDateTime;
begin
CorFctr := 1.2; // 7.0/5.0
dagen2 := Trunc(dagen*CorFctr);
vph := 100 - OffsetHigh;
vpl := 3 + OffsetLow;
wk1:=0;
wk2:=0;
wk3:=0;
SetArrayLength(sdevi,dagen2+1); //
If (BarCount>(Bbit+1)) then
begin
krs := Close[BarCount-1-Bbit];
dateLB := DateTime[BarCount-1-Bbit];
X0 := DateTimeToX(DateTime[BarCount-1-Bbit]);
end;
for j :=0 to (dagen2) do
begin
sdevi[j] := krs*vola*sqrt(j/252.0); //
end;
for j :=0 to (dagen2-1) DO //
Begin
X1DayTime := XtoDateTime(X0+(j *BarInterValX));
X2DayTime := XtoDateTime(X0+(j+1)*BarIntervalX) ;
KrsPls0 := krs+(sdevi[j]) *CorFctr;
KrsPls1 := krs+(sdevi[j+1]) *CorFctr;
KrsMin0 := Krs-(sdevi[j]) *CorFctr;
KrsMin1 := Krs-(sdevi[j+1]) *CorFctr;
KrsPls0SD2 := krs+((sdevi[j]) *CorFctr)*2.0;
KrsPls1SD2 := Krs+((sdevi[j+1])*CorFctr)*2.0;
KrsMin0SD2 := Krs-((sdevi[j]) *CorFctr)*2.0;
KrsMin1Sd2 := Krs-((sdevi[j+1])*CorFctr)*2.0;
CreateTrendLine(X1Daytime,KrsPls0,X2DayTime,KrsPls1).Color:=klr1;
CreateTrendLine(X1DayTime,KrsMin0,X2DayTime,KrsMin1).Color:=Klr1;
if (sd2) then
begin
CreateTrendLine(X1DayTime,KrsPls0SD2,X2DayTime,KrsPls1SD2).Color:=klr2;
CreateTrendLine(X1DayTime,KrsMin0SD2,X2DayTime,KrsMin1Sd2).Color:=klr2;
end;
Vpxx := 0;
if sd2 then vpxx:= 3;
if (j=0) and waterpas then
// begin
if (Bbit=0) then
Waterpaslijntje
(krs+(sdevi[j+1+Bbit])*CorFctr,krs-(sdevi[j+1+Bbit])*CorFctr,krs,
x2daytime+BarInterval+(Bbit-1)*BarInterval,Bbit)
else
Waterpaslijntje
(krs+(sdevi[j+Bbit])*CorFctr,krs-(sdevi[j+Bbit])*CorFctr,krs,
x2daytime+(Bbit-1)*BarInterval,Bbit);
// end;
if (DayOfWeek(dateLB+j)=6) And (j<WkExp) And (WkExp>0) then WeekExp
(dateLB,j,vph,vpl,vpx,vpxx,wk1,wk2,wk3,WkExp,Bbit,krs,(krs+sdevi[j+1]),
(krs+sdevi[j+1]*2),(krs-sdevi[j+1]),(krs-sdevi[j+1]*2), sd2,waterpas,
klr1,klr2,klr3);
if IsExpiryDate(dateLB+j) then MaandExpiratie(
(dateLB+j),(dateLB+j+1),dateLB,krs,(krs+sdevi[j+1]),(krs+sdevi[j+1]*2),
(krs-sdevi[j+1]),(krs-sdevi[j+1]*2),vph,vpl,j,dagen2,klr1,klr2,sd2);
end;
Tekst(96,1,'Used Volatility: '+ FormatFloat('0.00',vola*100.0)+ '%');
Tekst(99,1,'HV gemeten over '+ IntToStr(dagenHV) + ' dagen');
Tekst(93,1,'Expiration-days are from start-date Cone');
Tekst(90,1,'Expiration-values are from start-date Cone');
WrdVert := 10+OffSetLow;
With CreateText(dateLB,0,'Start-date-Cone ' + DateToStr(dateLB)) do
begin
Y1Pct := WrdVert;
Color := clYellow;
end;
With CreateTrendline(dateLB,krs,dateLB,0) do
begin
color := clYellow;
style := lsDot;
end;
end;
//***********************************************************************
//**Main**//
var
vola : real;
klr1,klr2,klr3 : TColor;
sd2,Waterpas : Boolean;
dagen,dagenHV, Bbit, WkExp: integer;
begin
dagenHV := LengteInDgn();
Bbit := CreateParameterInteger('koersbars back in time',0,500,0,false);
initialisatie(dagenHV,Bbit);
vola :=VolaKeuze(dagenHV,Bbit);
dagen := CreateParameterInteger('Aantal bars tekenen:',30,1000,100,False);
WkExp := CreateParameterInteger('Aantal week expiraties',0,3,0,False)*7;
klr3 := CreateParameterColor('Kleur WeekExpiratieLijn',clAqua);
OffsetHigh := CreateParameterInteger('Verplaatsen tektst -High-',0,50,0,False);
OffsetLow := CreateParameterInteger('Verplaatsen tekst -Low-',0,50,0,False);
klr1 := CreateParameterColor('Kleur Envelope SD1:',clYellow);
sd2 := CreateParameterBoolean('SD2 envelope weergeven?',false,false);
klr2 := CreateParameterColor('Kleur Envelope SD2:', clRed);
Waterpas := CreateParameterBoolean('StDev-1 week-1 weergave?',True,False);
DrawEnvelope(dagenHV,dagen,Bbit,WkExp,vola,klr1,klr2,klr3,sd2,Waterpas);
end.
Plaatje d'rbij

.
.


