Probability Envelope

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

Re: Probability Envelope

Bericht door Janus »

Ik heb de code wat aangepast.
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 ;)
Afbeelding
.
.
Vriendelijke groet,
JanS ;)
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Mijnheer Jan,
Over een paar weken laat ik het weten, alvast bedankt
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Jan,
daar moet ik even dieper induiken,kijken waar ik vinkjes moet zetten,of weg laten,nu is het erg druk
weekopies.JPG
Janus
Berichten: 1520
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

Ik zie dat het niet goed gaat zodra je ervoor kiest om de weekoptie-lijn weer te geven. Wanneer je die op 0 laat staan gaat 't wel goed. Ik zal dat van de week even aanpassen.
.
Vriendelijke groet,
JanS ;)
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Jan,
ik heb de vorige versie verwijderd, en de oude weer terug gezet, daar red ik mij mee, ik ben tevreden, voor mij hoef je niets meer te veranderen, nog bedankt voor de indicator
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Jan,
ik gebruik tot volle tevredenheid nog steeds deze indicator, zoals je weet ben ik kampioen in gekke vragen stellen, nu heb ik er weer een, is het mogelijk dat je ook een koersbar in de toekomst kan zetten?, dan zit je uiteraard met een koers die er niet is, dan krijg je dus een witte invulstrook hoeveel koersbar, en dan ook een met welke koers .
Is dat mogelijk?
ik heb bijgevoegde indicator
Knipsel.JPG
Janus
Berichten: 1520
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

Hoi Bakstenen,
Ik kan een koers-candle laten tekenen door het programma, maar dan heb ik wel eerst een paar vragen:
* De TA-script-code van welke datum in deze topic gebruik je
* Je bedoelt één koers-candle voor de volgende dag of meerdere dagen
* Ik kan een koers intekenen, maar welke waarde moet worden aangehouden
* Jij werkt denk ik met een zwarte achtergrond, dus een witte candle(s)
.
Vriendelijke groet,
JanS ;)
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Ik.post vanavond een grafiek en de code
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Daar ben ik weer, 1 dag vooruit is voldoende, ik schrijf n.l weekopties, en wil eigenlijk ongeveer weten welke range ik kan aanhouden als ik niet achter de pc zit.
Hierbij hoe mijn grafiek ingesteld is, en de code.
Knipsel.JPG
{- 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.05 26-08-2020 www.jstas.com
// week-optie-vrijdagen toegevoegd

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 Waterpaslijntje(krspls,krsmin:real);
Begin
With CreateTrendline(now,krspls,now+14,krspls) do
begin
Color := clRed;
Style := LsDot;
end;
With CreateTrendLine(now,krsmin,now+14,krsmin) do
begin
color := ClRed;
Style := LsDot;
end;
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: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,clAqua);
If Waterpas then Waterpaslijntje(krspls,krsmin);
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 : 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 (DayOfWeek(dateLB+j)=6) And (j<WkExp) And (WkExp>0) then
WeekExp(dateLB,j,vph,vpl,vpx,vpxx,wk1,wk2,wk3,WkExp,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');

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,1,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.
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Sorry, kon alleen zo via omweg de code plaatsen
Janus
Berichten: 1520
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

Ik heb even een opzetje gemaakt in de code, kijk even of dit is wat jij weergegeven wilt zien.
Zoja, dan ga ik dat even verder afwerken, en nog wat kleinigheden in dat script veranderen voordat ik het script plaats.
Geef gewoon even aan wat je gewijzigd wilt zien in dit plaatje, dan pas ik dat als standaard aan in het script.
.
Afbeelding
.
Vriendelijke groet,
JanS ;)
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Jan, ik heb ook koerspointer erin staan, die geeft een verticale streep van de volgende expiratie weer, maar ik kwam er ook achter dat ik ook gewoon een getal kan nemen, omdat Shell niet zo beweeglijk is.
Om jou nu met veel werk op te zadelen terwijl het zo kan, ik probeer dit een paar weken en kom er dan op terug.
Bedankt voor je reactie
Janus
Berichten: 1520
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

De ‘Expected Move’

In de optieprijzen zitten de verwachtingen van optiehandelaren verdisconteerd.
Verwacht men een rustige periode, dan is de IV (implied volatility) doorgaans laag—en hoog bij onrust.
De IV geeft daarmee een indicatie van de verwachte beweeglijkheid: binnen welke koersbreedte men verwacht dat de koers zich zal bewegen — de expected move.

Ik heb er een kort stukje over geschreven:
https://www.bullnochbear.com/expected%20move.htm

Daarnaast heb ik een indicator gemaakt die de expected-move-lijnen in de grafiek tekent.
Ik heb meteen de sigma-1 en sigma-2 lijnen toegevoegd (de standaarddeviatie-banden).

Voor gebruik hoef je alleen het volgende in te vullen:
de prijs van de onderliggende waarde,
de ATM-callpremie,
de ATM-putpremie
de datum van de koersnotatie
de expiratie datum

De code:

Code: Selecteer alles

 
{- Filename: Expected-Move -}
// tekent de Expectedmove range berekent uit de Call en Put prijs van ATM opties
// www.JSTAS.com
// versie 1.0 d.d. 30-09-2025

procedure TekenLijn(startDate, endDate :TDateTIME; niveau :Real; kleur:TColor;
                                                           LineWidth : Integer);
begin
 With CreateTrendLine(startDate, niveau, endDate, niveau) do
 begin
  color := Kleur;
  width := LineWidth;
 end;
end;
//*
procedure Initialisatie();
begin
 with Indicator do
  begin
    NewBand    := False;
    ScaleRange := srAuto;
    ShortName  := 'Expected-Move';
    HiddenParams:= True;
  end;
end;
 //*
Procedure CreateTextInfo(Xxx1,Yyy1: Integer; bericht: String; kleur: TColor);
begin
 with CreateText(Xxx1, Yyy1, bericht) do
   begin
      X1pct := Xxx1;
      y1pct := Yyy1;
      Color := kleur;
      font.size := 8;
      Font.Style := [];
   end;
end;
//*
Procedure InfoVenster(EMplus, EMmin, Stdv1PLus, Stdv1Min,    Stdv2Plus,
                      Stdv2Min :Real; InfoHor, Infovert :Integer; EMcolor,
                      Stdv1Color, Stdv2Color :TColor; ShowEM, ShowStdv1,
                                                           ShowStdv2 :Boolean);
var
txtEM, txtStdv1, txtStdv2 : String;
begin

txtEM := 'Exp-Move - ' + FormatFloat('0.00',EMmin) + '--' +
                                                     FormatFloat('0.00',EMplus);
txtStdv1 := 'Std-dev-1 - '+ FormatFloat('0.00',Stdv1Min) + '--' +
                                                   FormatFloat('0.00',Stdv1Min);
txtStdv2 := 'Std-dev-2 - '+ FormatFloat('0.00',Stdv2Min) + '--' +
                                                   FormatFloat('0.00',Stdv2Min);

CreateTextInfo(InfoHor, InfoVert, txtEM, EMcolor);
CreateTextInfo(InfoHor, InfoVert-5, txtStdv1, Stdv1Color);
CreateTextInfo(InfoHor, InfoVert-10, txtStdv2, Stdv2Color);

end;
//*
{ head }
var
 Callpremie, Putpremie, Underlying, ExpectedMove, EMplus, EMmin : Real;
 Stdv1Plus, Stdv1Min, Stdv2Plus, Stdv2Min, Sigma1, Sigma2       : Real;
 EMcolor, Stdv1Color, Stdv2Color    : Tcolor;
 ShowEM, ShowStdv1, ShowStdv2, Info : Boolean;
 StartDate, ExpDate                 : TDateTime;
 InfoHor, InfoVert, LineWidth       : Integer;
begin
{ Parameters }
 Callpremie := CreateParameterReal('Call-premie:', 0,999999,82.90,False);
 Putpremie  := CreateParameterReal('Put-premie:' , 0,999999,69.00,False);
 Underlying := CreateParameterReal('Koerswaarde:', 0,9999999,6643.75,False);
 StartDate  := CreateParameterDate('Start-datum:'    , EncodeDate(2025, 9, 26));
 ExpDate    := CreateParameterDate('Expiratie-datum:', EncodeDate(2025,10, 17));
 ShowEM := CreateParameterBoolean('Expected Move lijnen weergeven?',True,False);
 ShowStdv1 := CreateParameterBoolean('Stand.-deviatie 1 weergeven?',True,False);
 showStdv2 := CreateParameterBoolean('Stand.-deviatie 2 weergeven?',True,False);
 Info   := CreateParameterBoolean('Informatie venster weergeven?:', True,False);
 EMcolor := CreateParameterColor('Kleur EM -lijn:', clBlue);
 Stdv1Color := CreateParameterColor('Kleur Stdv1 -lijn:', clRed);
 Stdv2Color := CreateParameterColor('Kleur Stdv2 -lijn:', clGreen);
 LineWidth  := CreateParameterInteger('Dikte van lijnen:', 1,20,2,False);
 InfoHor   := CreateParameterInteger('Plaats-info-horizontaal:',0,100,1,False);
 InfoVert  := CreateParameterInteger('Plaats-info-verticaal:',0,100,98,False);

 StartDate :=  Int(StartDate);
 
 Initialisatie();
 
{ Calculations }
 ExpectedMove := Callpremie + Putpremie;
 EMplus := Underlying + ExpectedMove;
 EMmin  := Underlying - ExpectedMove;
 Sigma1 := ExpectedMove/(Sqrt(2/Pi));
 Sigma2 := 1.96 * Sigma1;
 Stdv1Plus := Underlying + Sigma1;
 Stdv1Min  := Underlying - Sigma1;
 Stdv2Plus := Underlying + Sigma2;
 Stdv2Min  := Underlying - Sigma2;
 
{ drawings }
if ShowEM then TekenLijn(StartDate, ExpDate, EMplus, EMcolor, LineWidth);
if ShowEM then TekenLijn(StartDate, ExpDate, EMmin,  EMcolor, LineWidth);
if ShowStdv1 then TekenLijn(StartDate,ExpDate, Stdv1Plus, Stdv1Color,LineWidth);
if ShowStdv1 then TekenLijn(StartDate,ExpDate, Stdv1Min , Stdv1Color,LineWidth);
if ShowStdv2 then TekenLijn(StartDate,ExpDate, Stdv2Plus, Stdv2Color,LineWidth);
if ShowStdv2 then TekenLijn(StartDate,ExpDate, Stdv2Min , Stdv2Color,LineWidth);
if Info      then InfoVenster(EMplus, EMmin, Stdv1PLus, Stdv1Min, Stdv2Plus,
                  Stdv2Min, InfoHor, InfoVert, EMcolor,Stdv1Color,Stdv2Color,
                  ShowEM, ShowStdv1, ShowStdv2);
end.
Dag grafiek:
Afbeelding

Uur grafiek:
Afbeelding
.
Commentaar is welkom.
.
Vriendelijke groet,
JanS ;)
Bakstenen
Berichten: 993
Lid geworden op: zo jul 19, 2015 7:51 pm

Re: Probability Envelope

Bericht door Bakstenen »

Bedankt Jan, ga het de komende week lezen
Janus
Berichten: 1520
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

Bedankt voor je reactie Bakstenen, ik denk dat ik komende week deze laatste topic, de EM, even in een nieuwe topic plaats, het is namelijk een enorm sterk 'wapen', vanwege de 'achterliggende - redenen/oorzaken', zoals indekken van de partijen die verkeerd zitten/zaten, die partijen die de EM negeren. Vanmiddag (US-middag) werden er namelijk veel punten geïncasseerd op de SPX opties door toepassen van de korte termijn EM. Ik ga nadenken 'hoe-dat-uit-te-leggen'.
.
Vriendelijke groet,
JanS ;)
Plaats reactie