Probability Envelope

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

Probability Envelope

Bericht door Janus »

Onderstaand een indicator die de 'probability envelope' in de koersgrafiek tekent.
De volatiliteit wordt uit de koersgrafiek gehaald of zelf ingegeven.
.
Voorbeeldje met de koersgrafiek van ING:
Afbeelding
.
Voorbeeldje met de koersgrafiek van de AEX:
Afbeelding
.
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.
.
Vriendelijke groet,
JanS ;)
hpwijk
Berichten: 80
Lid geworden op: ma okt 29, 2018 5:51 am

Re: Probability Envelope

Bericht door hpwijk »

Wauw!! Erg mooi :-D Je zou dit kunnen combineren met het schrijven van opties (alleen puts of calls op basis van een koop of verkoopsignaal op basis van de trend (opgaand of dalend))?

Afbeelding
AlbertH
Berichten: 185
Lid geworden op: di apr 27, 2010 12:47 pm
Locatie: Oegstgeest

Re: Probability Envelope

Bericht door AlbertH »

Hallo Janus,

Goed werk.
Ik ben je code aan het bestuderen (foutjes check :wink: )

Een aantal jaren geleden heb ik ook een TA-script "Probability Cone" indicator geschreven voor optie trading.

Helaas maak ik geen gebruik meer van TA-Script en ben ik overgestapt naar Python wat meer mogelijkheden heeft.

De "Probability Cone" indicator die ik geschreven had, had allemaal toeters en bellen die voor de meeste mensen onbruikbaar zouden zijn. Ik heb hem daarom niet gepost.

Ik zal binnenkort eens kijken of er toch elementen/tips in zitten die je kunt gebruiken voor je next generation "Probability Envelope" indicator.
Als voorbeeld heb ik hieronder een screendump van mijn "Probability Cone Indicator" geplaatst.

Albert

Voorbeeld &quot;Probability Cone&quot;
Voorbeeld "Probability Cone"
Optiontrader
Berichten: 396
Lid geworden op: ma jan 01, 2007 8:41 pm

Re: Probability Envelope

Bericht door Optiontrader »

Goede morgen,

Enige uitleg > https://www.dynamictrend.com/dthelp/Pro ... velope.htm

Is er nog meer uitleg?

Is er in Wallstreet Pro een mogelijkheid om meerdere maanden vooruit te kijken, zoals hier in het voorbeeld van HPWijk of bij de website staat?

Groet OT
Eric
Berichten: 3678
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Probability Envelope

Bericht door Eric »

Optiontrader schreef: do nov 14, 2019 2:02 pm Is er in Wallstreet Pro een mogelijkheid om meerdere maanden vooruit te kijken, zoals hier in het voorbeeld van HPWijk of bij de website staat?
Je kunt de schaal verschuiven door met de muis in het midden van de horizontale schaalaanduiding te klikken (waar de muisaanwijzer een handje wordt) en de schaal dan te verslepen.

Bedoel je dat?

---
Eric
Janus
Berichten: 1523
Lid geworden op: wo jan 30, 2008 1:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

AlbertH schreef: do nov 14, 2019 10:54 am Hallo Janus,
Goed werk.
Ik ben je code aan het bestuderen (foutjes check :wink: )
Een aantal jaren geleden heb ik ook een TA-script "Probability Cone" indicator geschreven voor optie trading.
De "Probability Cone" indicator die ik geschreven had, had allemaal toeters en bellen die voor de meeste mensen onbruikbaar zouden zijn. Ik heb hem daarom niet gepost.
Ik zal binnenkort eens kijken of er toch elementen/tips in zitten die je kunt gebruiken voor je next generation "Probability Envelope" indicator.
Alle toevoegingen zijn welkom Albert, en wanneer m'n code wat slimmer kan hoor ik het ook graag.
.
En voor iedereen: wanneer er verder toevoegingen en/of wensen zijn .. gewoon je idee plaatsen ….
.
Laatst gewijzigd door Janus op vr nov 15, 2019 11:56 pm, 1 keer totaal gewijzigd.
Vriendelijke groet,
JanS ;)
Janus
Berichten: 1523
Lid geworden op: wo jan 30, 2008 1:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

D'r kwamen twee vragen naar boven:
1. kun je ook de envelope voor standaard deviatie 2 in laten tekenen?
2. kun je ook de envelope voor -backtest- een aantal koersbars terug in de tijd weer laten geven waarbij dan de op dat moment geldende Historische Volatiliteit wordt toegepast?
.
Die vragen kwamen wel van mezelf, maar dat maakt niet uit, toch? ;)
.
Ik heb die mogelijkheden even ingebouwd, was weinig werk.
.
Ik beeld hieronder even een grafiek af van ING met daarin SD1 en SD2, en ik heb de -starttijd- even terug geplaatst in de tijd.
Dat terug plaatsen van de startdatum geeft je inzicht in wat je -gemiddeld- van het fonds of index als lijdend voorwerp mag verwachten.
Moet u zeker doen, u ziet dan af en toe -onverwachte- uitslagen, de punten waar bijv. een ironcondor het -moeilijk- krijgt.
Veel plezier ermee ;)
.
Afbeelding
.

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.01  15-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,Bbit: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-Bbit) then                                              //
    begin
     result := sDevAn[i];
     i := 1;
    end;
 end;
//CreateLine(sDevAn).Color:=ClRed;
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 volatilitiet 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,100) do
  begin
    Y1PCt:=0;
    Y2Pct :=100;
    color := CLGreen;
    Style := lsdot;
  end;
end;
//***********************************************************************

Procedure DrawEnvelope
           (dagenHV,dagen,Bbit:integer;vola:real;klr1,klr2:TColor; sd2:Boolean);
Var
i,j,vph,vpl : integer;
krs : real;
sdevi : array of real;
dateLB : TDateTime;

begin

vph := 100;
if (sd2) then vph := 98;

vpl := 3;
if (sd2) then vpl:=5;

SetArrayLength(sdevi,dagen+1);
for i := BarCount-1 DownTo 1 do
   begin
     if (i=BarCount-1-Bbit) 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:=klr1;
  CreateTrendLine(dateLB+j,krs-sdevi[j],dateLB+j+1,krs-sdevi[j+1]).color:=klr1;
  
  If (sd2) then
   Begin
    CreateTrendline(dateLB+j,krs+sdevi[j]*2,dateLB+j+1,krs+sdevi[j+1]*2)
                                                                  .color:=klr2;
    CreateTrendLine(dateLB+j,krs-sdevi[j]*2,dateLB+j+1,krs-sdevi[j+1]*2)
                                                                  .color:=klr2;
   end;
   
  If IsExpiryDate(dateLB+j) then
   begin
    VertLine(dateLB+j,clGreen);
    TekstEnvelope(dateLB+j+1,'High: '+FormatFloat('0.00',krs+sdevi[j+1]),
                                                                    vph,0,Klr1);
    If (sd2) then
    TekstEnvelope(dateLB+j+1,'High: '+FormatFloat('0.00',krs+sdevi[j+1]*2)
                                                                   ,100,0,Klr2);
    
    TekstEnvelope(dateLB+j+1,'Days: '+IntToStr(j),97,krs,clAqua);
    
    TekstEnvelope(dateLB+j+1,'Low: ' +FormatFloat('0.00',krs-sdevi[j+1]),
                                                                    vpl,0,Klr1);
    if (sd2) then
    TekstEnvelope(dateLB+j+1,'Low: ' +FormatFloat('0.00',krs-sdevi[j+1]*2),
                                                                      3,0,Klr2);
   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;
klr1,klr2 : TColor;
sd2 : Boolean;
dagen,dagenHV, Bbit: integer;

begin
 initialisatie();
 dagenHV := LengteInDgn();
 Bbit  :=  CreateParameterInteger('koersbars back in time',0,500,0,false);
 vola  :=VolaKeuze(dagenHV,Bbit);
 dagen := CreateParameterInteger('Aantal dagen tekenen:',30,1000,110,False);
 klr1  := CreateParameterColor('Kleur Envelope SD1:',clYellow);
 sd2   := CreateParameterBoolean('SD2 envelope weergeven?',false,false);
 klr2  := CreateParameterColor('Kleur Envelope SD2:', clRed);
 DrawEnvelope(dagenHV,dagen,Bbit,vola,klr1,klr2,sd2);
end.
.
Vriendelijke groet,
JanS ;)
Optiontrader
Berichten: 396
Lid geworden op: ma jan 01, 2007 8:41 pm

Re: Probability Envelope

Bericht door Optiontrader »

Hallo Eric,
Inderdaad, hartelijk dank!

Hallo Janus, kan je mijn vraag beantwoorden?

Groet OT
AlbertH
Berichten: 185
Lid geworden op: di apr 27, 2010 12:47 pm
Locatie: Oegstgeest

Re: Probability Envelope

Bericht door AlbertH »

Hallo Janus,

Dank voor je aanmoediging voor commentaar, hier zat ik op te wachten voordat ik er veel tijd in ga steken.

Er zijn een aantal zaken waar ik een reaktie op wil geven.

1: Deze versie is alleen geschikt for dag koersen.

2: Ik kan een aantal suggesties doen om je code iets beter te maken en eventueel kleine model foutjes te corrigeren die er volgens mij inzitten (volgende post).

3: Een disclaimer:
  • Het gebruik van deze indicator voor het innemen van posities moet voorzichtig gebeuren en met een zekere marge.
  • De envelopes zijn dynamisch en veranderen in de tijd (een envelope nu ziet er anders uit dan over N bars) (zie onderliggende screendump)
  • Een eenmaal ingenomen positie gebaseerd op een toekomstige verwachting zal daarom continu gecheckt moeten worden.
  • Het onderliggende statistische model is complexer dan nu in dit script geimplementeerd is waardoor er snel onrealistische envelopes worden getekend.
4: Een theoretische en praktische discussie van het onderliggende model en de afgeleide indicatoren.

Punt 4 neemt wat meer tijd in beslag dus ik weet niet of ik daar aan toekom want een forum zoals TA-script is vaak te beperkt voor dit soort discussies.

Als een teaser heb ik de volgende screendump bijgesloten:
Hier zijn 3 Probability Cones getekend die proberen te voorspellen wat de kans is dat de AEX koers op
20-12-2019 lager is dan 500. De worstCase kans (20.14%) is in de grafiek geplot.
Twee van deze ProbCones zijn gekoppeld aan een WCMA() Moving average en de laatste Cone is gekoppeld aan de Close van de laatste bar (dit zijn verschillende onderliggende statistische modellen).
De paarse rechthoeken zijn de 1xSigma areas voor de ProbCones.
Ik zat er aan te denken om deze indicator de "Shark" indicator te noemen :D

Albert
Bijlagen
Probability Cones example
Probability Cones example
AlbertH
Berichten: 185
Lid geworden op: di apr 27, 2010 12:47 pm
Locatie: Oegstgeest

Re: Probability Envelope

Bericht door AlbertH »

Hallo Janus,

Ik heb wat suggesties voor verbeteringen van je script.
Je moet dit zelf wel even checken aangezien ik niet meer in TA-script kan programmeren doordat Alex gestopt is.

Volgens mij kan de function Volatiliteit(...) herschreven worden als volgt:

Code: Selecteer alles

Function Volatiliteit(dagenHV:integer):Real;
var
  i: integer;
  ItdRtrn, sDevAn : tseries;
begin
  ItdRtrn := ROC(Close,1);  
  sDevAn  := StdDevS(ItdRtrn, dagenHV), Sqrt(253))
  result  := sDevAn[BarCount-1];
end;
Function VolaKeuze()
vrouwelijke typo in CreateParameterReal()

Procedure DrawEnvelope()
Je gebruikt de volgende code:

Code: Selecteer alles

for i := BarCount-1 DownTo 1 do
  begin
    if (i=BarCount-1) then
    begin
      krs := C[i];
      dateLB := DateTime[i];
      i :=1;
    end;
  end;
Volgens mij kan dit vervangen worden door:

Code: Selecteer alles

 
  krs    := Close[BarCount-1];
  dateLB := DateTime[BarCount-1];

De horizontale as van de grafiek is niet linear (o.a. weekends worden overgeslagen)
hierdoor ontstaan er trendlijn teken fouten die eruit zien als zaagtandlijnen (zie de grafiek van hpwijk hierboven).
Je kan beter de toekomstige datetime coordinaten voor de screen X coordinaten berekenen via XToDateTime(), DateTimeToX() en BarIntervalX functies.
Hierdoor worden de envelope lines gladder en netter.

Volgens mij wordt het zoiets als dit:

Code: Selecteer alles

  X0:= DateTimeToX(DateTime[BarCount-1]);
  X1:= X0 + NumberOfFutureBars * BarIntervalX;
  with CreateTrendLine(XToDateTime(X0), Y0, XToDateTime(X1), Y1) do
  begin
  ...
  end;

De waarde 253 voor de geprojecteerde toekomstige StdDev in de functie Volatiliteit() komt niet overeen met de waarde in DrawEnvelope() (=365)
Volgens mij moeten beide gelijk zijn aan het aantal handelsdagen in een jaar.
Zelf neem ik altijd 260 dagen als benadering (52 weken x 5 dagen) maar het kan minder zijn als er feestdagen in de week vallen.

succes,
Albert
Janus
Berichten: 1523
Lid geworden op: wo jan 30, 2008 1:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

Je plaatje hierboven ziet er 'gehaaid' uit Albert ;)

Bedankt voor de opmerkingen/aanvullingen Albert, die stukken code zien er nu overzichtelijker uit.
Verder heb ik de XToDateTime(X0) en DateTimeToX toegepast, de lijnen worden nu mooi geleidelijk getekend.
Ik moet alleen het stuk code DrawEnvelope() een keer opnieuw schrijven, het is nu nogal rommelig geworden. Zodra ik tijd heb ..
.
Plaatje d'rbij
.
Afbeelding
.
De koersgrafiek hierboven is van ING in Amerika, dus in Dollars.
.
code:

Code: Selecteer alles

{- Filename: ProbabilityEnvelope -}

// Indicator plaats Probability Envelope in grafiek
// Volatiliteit wordt uit grafiek gehaald of zelf opgegeven
// Horizontale schaal op koersdagen instellen
// Versie 1.02  17-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;
//*****************************************************************

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 := CLGreen;
    Style := lsdot;
  end;
end;
//***********************************************************************

Procedure DrawEnvelope
         (dagenHV,dagen,Bbit:integer; vola:real; klr1,klr2:TColor; sd2:Boolean);
Var
j,vph,vpl,dagen2 : 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;
if (sd2) then vph := 98;

vpl := 3;
if (sd2) then vpl:=5;

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;
   
If IsExpiryDate(dateLB+j) then
 begin
  VertLine(dateLB+j,clGreen);
  TekstEnvelope
           (dateLB+j+1,'High: '+FormatFloat('0.00',krs+sdevi[j+1]),vph,0,Klr1);
  if (sd2) then
  TekstEnvelope
         (dateLB+j+1,'High: '+FormatFloat('0.00',krs+sdevi[j+1]*2),100,0,Klr2);
  TekstEnvelope(dateLB+j+1,'Days: '+IntToStr(j),97,krs,clAqua);
  TekstEnvelope
           (dateLB+j+1,'Low: ' +FormatFloat('0.00',krs-sdevi[j+1]),vpl,0,Klr1);
  if (sd2) then
  TekstEnvelope
           (dateLB+j+1,'Low: ' +FormatFloat('0.00',krs-sdevi[j+1]*2),3,0,Klr2);
 end;
end;

With CreateTrendLine(dateLB,krs,dateLB+dagen2,krs) do                 //
 begin
   color := clAqua;
   style := lsDot;
 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 : TColor;
sd2 : Boolean;
dagen,dagenHV, Bbit: 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);
 
 klr1  := CreateParameterColor('Kleur Envelope SD1:',clYellow);
 sd2   := CreateParameterBoolean('SD2 envelope weergeven?',false,false);
 klr2  := CreateParameterColor('Kleur Envelope SD2:', clRed);
 DrawEnvelope(dagenHV,dagen,Bbit,vola,klr1,klr2,sd2);
end.
Vriendelijke groet,
JanS ;)
Janus
Berichten: 1523
Lid geworden op: wo jan 30, 2008 1:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

@optiontrader,
ik denk dat de volgende video een antwoord op je vraag is.
https://www.youtube.com/watch?v=RtJXYtekPP4
.
Afbeelding
.
Vriendelijke groet,
JanS ;)
Bakstenenplus
Berichten: 2
Lid geworden op: zo nov 17, 2019 8:56 am

Re: Probability Envelope

Bericht door Bakstenenplus »

Janus,
mooi stuk werk,ben er mee aan het vogelen,alleen een vraag,ik heb de Volatiteitswaarde op automatisch staan,maar daaronder waar staat ,Geef vol in % aan,die blijft op 22,1 staan,terwijl links boven in de used vol op b,v 13,28 staat,en die veranderd als ik meer candles terug gaat
Janus
Berichten: 1523
Lid geworden op: wo jan 30, 2008 1:07 am
Contacteer:

Re: Probability Envelope

Bericht door Janus »

Hoi Bakstenen,
misschien een beetje verwarrend.
Ik heb het als volgt bedacht:
1.) Je kan de Volatiliteit door het ta-script uit laten rekenen wanneer de opgave -automatisch- is.
In deze stand zie je dan links boven in de grafiek welke volatiliteit is berekend door het script.
Wanneer je de envelope terugzet in de tijd, dan wordt de volatiliteit berekend op het punt waarop de envelope start. Je kan op deze manier zien hoe de volatiliteit op dat punt terug in de tijd was en hoe de envelope er toen uitzag.
2.) Zet je de stand op: -zelf ingeven-, dan kun je op de regel eronder ingeven met welke volatiliteit je de envelope berekend wilt hebben. (die regel wordt dus in de stand -automatisch-, genegeerd) Je ziet dan links boven in de grafiek de volatiliteit die je zelf ingegeven hebt en waarmee op dat moment gewerkt wordt. Die waarde wijzigt dan niet wanneer je de envelope terugzet in de tijd.
.
Vriendelijke groet,
JanS ;)
Bakstenenplus
Berichten: 2
Lid geworden op: zo nov 17, 2019 8:56 am

Re: Probability Envelope

Bericht door Bakstenenplus »

Oke,we gaan er verder mee werken,nog bedankt voor je reactie
Plaats reactie