Trend met Hodrick Prescot

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
tesjoeva
Berichten: 204
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: Trend met Hodrick Prescot

Bericht door tesjoeva »

ik snap niet wat je hier bedoelt.....misschien een beetje dom, maar ja....

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

Re: Trend met Hodrick Prescot

Bericht door Eric »

Het lijkt me dat je vraag wel binnen dit topic past, vandaar dat ik hem hieraan toegevoegd heb. In combinatie met de uitleg en de link naar het originele topic geeft dat wat context. Zoals de waarschuwing van AlbertH met de reden waarom er geen signalen in zijn opgenomen.
AlbertH schreef:
do feb 18, 2016 12:29 am
Waarschuwing: Omdat het Hodrick-Prescott filter zich steeds aanpast aan de meest recente koersdata kan de vorm en richting van de filterlijn en band zich soms in een totaal andere richting bewegen. In Figuur 4 en 5 is dat verduidelijkt. Pas dus op met het innemen van posities, of misschien zou ik moeten zeggen: "Het is verboden om posities in te nemen gebruik makend van suggesties van dit TA-script filter, dit TA-script is alleen maar een oefening in het tekenen van fraaie plaatjes op een computer scherm".
Maar ja, wie luistert er nu naar mij :( .
http://www.ta-script.com/forum/viewtopi ... 9173#p9173

---
Eric

tesjoeva
Berichten: 204
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: Trend met Hodrick Prescot

Bericht door tesjoeva »

Dit gaat volgens mij allemaal over HP met ma filter, wat uiteindelijk een plaatje geeft van de koers mét banden .
maar dat is niet de layout die uit de sys-2-b komt welke door mij is toegevoegd en waar ik mee werk (succesvol)
deze geeft obv de staaf-weergave een soort histogram.

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

Re: Trend met Hodrick Prescot

Bericht door Eric »

Volgens mij is het Hodrick-Prescott filter onderdeel van de indicator die jij gebruikt. Vandaar dat het handig is om de vraag hier te stellen, dan kan Janus hier uitsluitsel over geven. Ik heb nog geen puntkomma geprogrammeerd voor deze indicator...

---
Eric

Janus
Berichten: 1371
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Trend met Hodrick Prescot

Bericht door Janus »

Beste Tesjoeva,

Ik wil graag helpen, maar begrijp niet goed wat je wilt.
Je hebt de code aangepast begrijp ik, vandaar de naam sys-two-b die je gebruikt.
Wanneer je die code even hier plaatst, kan ik misschien zien wat jij op je beeldscherm hebt staan, en dan begrijp ik beter wat je bedoelt.
Ik kan dan proberen dat voor je aan te passen.
.
Vriendelijke groet,
JanS ;)

tesjoeva
Berichten: 204
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: Trend met Hodrick Prescot

Bericht door tesjoeva »

Beste JanS,

Eerst natuurlijk dank voor je reactie.

Waar wil ik uiteindelijk naar toe;

Een indicator/systeem met alleen de entries.

Een combinatie van sys-one-b (script zet ik hier onder)
Als ik bij eigenschappen SLOT verander in STAAF krijg ik hier duidelijke lijnen ipv het 'blok' dat gevormd wordt door de standaard instelling.

Als nu op 3 timeframes groen of rood verschijnt wil ik graag hier een arrow up of down.

Om het makkelijk te houden (.....) nog een paar randvoorwaarden voor de enrty:

Woodies CCI moet >0 of <0 zijn om het signaal te genereren en...
de koers moet op dat moment boven of onder de Tenkan Sen staan.

Alleen de Tenkan zou ik regelmatig willen optimaliseren, rest is standaard.

Ik hoop dat je er iets mee kunt, bvd en vriendelijke groet


{- Filename: Sys-one b -}
// gebruikt wordt de Hodrick Prescot code vertaalt door albertH
// Meerdere tijdframes naar een idee van www.jstas.com
// Versie 1.01 30-04-2020

function LastValidIndex(aSer:TSeries):integer;
var
i, Count: integer;
begin
Count:=GetArrayLength(aSer);
if (Count>0) then
begin
result:=0;
for i:=Count-1 downto 0 do
begin
if IsValid(aSer) then
begin
result:=i;
break;
end;
end;
end;
end;
//*****************************************************************************
//AlbertH
function HodrickPrescot(aSSer:TSeries; aLambda:double):TSeries;
var
i, L, BarCount:integer;
H1, H2, H3, H4, H5, HH1, HH2, HH3, HH5, HB, HC, Z: double; {are zero}
FVI, LVI: integer;
a, b, c :Array of double;
begin
BarCount := GetArrayLength(aSSer);
if (BarCount>1) then
begin
result:= CreateSeries(BarCount);
{--------------------------------------------------------------------------}
FVI:=FirstValidIndex(aSser);
LVI:=LastValidIndex(aSser);
L:=LVI-FVI+1;
if (L>0) then
begin
{------------------------------------------------------------------------}
{--- init variables ---}
{------------------------------------------------------------------------}
SetArrayLength(a, L);
SetArrayLength(b, L);
SetArrayLength(c, L);
FillSeries(result, NaN);
H1 :=0;
H2 :=0;
H3 :=0;
H4 :=0;
H5 :=0;
HH1:=0;
HH2:=0;
HH3:=0;
HH5:=0;
HB :=0;
HC :=0;
Z :=0;
{------------------------------------------------------------------------}
{--- Calculate filter output ---}
{------------------------------------------------------------------------}
a[0]:= 1.0+aLambda;
b[0]:=-2.0*aLambda;
c[0]:=aLambda;
{---}
for i:=1 to L-3 do
begin
a:= 6.0*aLambda+1.0;
b:=-4.0*aLambda;
c:=aLambda;
end;
{---}
a[1] := 5.0*aLambda+1.0;
a[L-1]:= 1.0+aLambda;
a[L-2]:= 5.0*aLambda+1.0;
b[L-2]:=-2.0*aLambda;
b[L-1]:= 0.0;
c[L-2]:= 0.0;
c[L-1]:= 0.0;
{------------------------------------------------------------------------}
{--- Forward ---}
{------------------------------------------------------------------------}
for i:=0 to L-1 do
begin
Z :=a-H4*H1-HH5*HH2;
{---}
HB :=b;
HH1 :=H1;
H1 :=(HB-H4*H2)/Z;
b:=H1;
{---}
HC :=c;
HH2 :=H2;
H2 :=HC/Z;
c:=H2;
{---}
a:=(aSser[FVI+i]-HH3*HH5-H3*H4)/Z;
HH3 :=H3;
H3 :=a[i];
H4 :=HB-H5*HH1;
HH5 :=H5;
H5 :=HC;
end;
{------------------------------------------------------------------------}
{--- Backward ---}
{------------------------------------------------------------------------}
H2:=0.0;
H1:=a[L-1];
result[FVI+L-1]:=H1;
for i:=L-2 downto 0 do
begin
result[FVI+i]:=a[i]-b[i]*H1-c[i]*H2;
H2:=H1;
H1:=result[FVI+i];
end;
{------------------------------------------------------------------------}
SetArrayLength(a, 0);
SetArrayLength(b, 0);
SetArrayLength(c, 0);
end;
end;
end;
//******************************************************************************

procedure Initialisatie(bars:Integer);
begin
with Indicator do
begin
ShortName := 'HP-trend';
NewBand := True;
ScaleRange:= srCommon;
HelpText := 'Trend by HP';
RequiredBars := bars*2;
end;
end;
//******************************************************************************

procedure KleurBalk
(sHPTF2 : TSeries ; Hg, Lg, LnNr1, LnNr2, bars : integer; TijdInterval: Real);

var
g, i, r : integer;
sTF2H, sTF2L : TSeries;

Begin
g := 1;
r := 1;
sTF2H := CreateSeries(BarCount);
sTF2L := CreateSeries(BarCount);

If barCount>bars then
begin
for i := BarCount-bars to BarCount-1 do //BarCount-1 DownTo BarCount-bars do
Begin
if IsValid(sHPTF2[i]) then
begin
if (r=1) then
begin
if (sHPTF2[i] <= shptf2[i-1]) then
begin
sTF2H[i] := Lg;
sTF2L[i] := Hg;
g:= -1;
end;
if (sHPTF2[i] > sHPTF2[i-1]) then
begin
g := 1;
sTF2H[i] := Hg;
sTF2L[i] := Lg;
end;
end;

if (g=1) then
begin
if (sHPTF2[i] >= sHPTF2[i-1]) then
begin
sTF2H[i] := Hg;
sTF2L[i] := Lg;
r := -1;
end;
if (sHPTF2[i] < sHPTF2[i-1]) then
begin
r := 1;
sTF2H[i] := Lg;
sTF2L[i] := Hg;
end;
end;
end;
end;
end;

CreateLine (sTF2H).Color := ClBlack;
CreateLine( sTF2L).Color := ClBlack;
FillLinesRegion(LnNr1,LnNr2,clLime,clRed,bsSolid);
CreateText
(now,(Hg+Lg)/2.0,FormatFloat('0',TijdInterval) + ' Minuten').color := clRed;

end;
//******************************************************************************

var
pLambda,TF2time,TF3time,bars : integer;
sMA1, sHPTF2, sHPTF3 : TSeries;
s2,s3 : TSeriesEx;
TF2,TF3 : Boolean;

begin
pLambda := CreateParameterInteger('Lambda =', 0, 10000000,22, TRUE);
TF2 := CreateParameterBoolean('Tweede tijdframe weergeven',True,False);
TF2time :=
CreateParameterInteger('Tijdbasis tijdframe-2, Minuten:',5,1000,45,False);
TF3 := CreateParameterBoolean('Derde tijdframe weergeven',True,False);
TF3time :=
CreateParameterInteger('Tijdbasis tijdframe-3, Minuten:',5,1000,120,False);

bars :=Ceil(3/(BarInterval*2.6666));
Initialisatie(bars);
sMA1 := HodrickPrescot(Close, pLambda);
KleurBalk(sMA1,100,75,0,1,bars,BarInterval*24*60.0);

if TF2 then
begin
s2 := ReadPrices(Instrument.ID, (TF2time/24.0/60.0), 0, Now, 4);
sHPTF2 := HodrickPrescot(s2.close, pLambda);
sHPTF2 := SyncSeries(sHPTF2, s2, smInsDuplicate);
KleurBalk(sHPTF2,74,50,2,3,bars,TF2time);
end;

if TF3 then
begin
s3 := ReadPrices(Instrument.ID, (TF3time/24.0/60.0), 0, Now, 4);
sHPTF3 := HodrickPrescot(s3.close, pLambda);
sHPTF3 := SyncSeries(sHPTF3, s3, smInsDuplicate);
KleurBalk(sHPTF3,49,25,4,5,bars,TF3time);
end;

end.

Janus
Berichten: 1371
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Trend met Hodrick Prescot

Bericht door Janus »

tesjoeva,

Ik ben begonnen met het aanpassen van de indicator, standaard komt deze nu met-bars- in het onderste venster, de mogelijkheid om -gekleurde vakken- weer te geven is wel alsnog aan te vinken.
Gelijk even enkele 'onvolkomenheden' weggewerkt.
.
De CCI van Woodies en de Tenkan Sen moet ik er nog even in zetten.
.
Maar, even voor de duidelijkheid:
--jouw keuzes--:
**
in onderste window:
--- alle drie tijdframes rood -en-
--- Woodies CCI <0 -en-
--- Koers onder Tenkan Sen lijn (welke instelbaar en te optimaliseren is)
-------------> dan volgt een pijl omlaag in de koersgrafiek.
****
****
--- alle drie tijdframes groen -en-
--- Woodies CCI >0 -en-
--- Koers boven de Tenkan Sen lijn (welke instelbaar en te optimaliseren is)
-------------> dan volgt een pijl omhoog.

..

tot zover snap ik het ;)
.
Alleen verderop lees ik dan dat je een entry signaal wilt zien.
Wil je op de plaats van de pijl een koop/verkoop-signaal? (enterlong of entershort)?
En zoja, waar wil je dan het exit signaal zien, wanneer long in short wijzigt (of vice versa) of zodra één van de voorwaarden van het aangaan van de positie niet meer geldig is?
.
Graag wat toelichting, dan zit ik niet hele gedeelten voor Jan met de korte achternaam in te tikken ;)
.
Verder is het toevoegen van de mogelijkheid om een parameter te optimaliseren slechts een paar tikjes op het toetsenbord (in de code), maar omdat de HP indicator vandaag lak heeft aan de waarde van gisteren, en die dan ook vandaag in het verleden aanpast (waardoor het beeld op het scherm beter lijkt dan 't soms is) vermoed ik op voorhand (ik heb het nog niet geprobeerd) dat dit -niet werkt-.
Maar, wanneer je het niet test.... dan weet je 't niet ...;)
Ik zal dit mee programmeren, een kleine moeite.
Ik wil alleen maar even 'waarschuwen'.
.
Overigens, had je op basis van -alles groen- vrijdag wel mooi een paar punten mee kunnen pakken, en was je wanneer je aanhoudt dat je uitstapt wanneer -niet alles meer groen is- zonder positie geëindigd afgelopen vrijdag, en had je leuk kunnen gaan dineren van de opbrengst ... wanneer er ergens een restaurant open was ....nouja, je kan altijd nog de bezorgservice bellen die diverse restaurants hebben opgetuigd.
.
code tot nu toe:

Code: Selecteer alles

{- Filename: Sys-one b -}
// gebruikt wordt de Hodrick Prescot code vertaalt door albertH
// Meerdere tijdframes naar een idee van www.jstas.com
// Versie 1.2  18-10-2020

function LastValidIndex(aSer:TSeries):integer;
var
  i, Count: integer;
begin
  Count:=GetArrayLength(aSer);
  if (Count>0) then
  begin
    result:=0;
    for i:=Count-1 downto 0 do
    begin
      if IsValid(aSer[i]) then
      begin
        result:=i;
        break;
      end;
    end;
  end;
end;
//*****************************************************************************
//AlbertH
function HodrickPrescot(aSSer:TSeries; aLambda:double):TSeries;
var
  i, L, BarCount:integer;
  H1, H2, H3, H4, H5, HH1, HH2, HH3, HH5, HB, HC, Z: double; {are zero}
  FVI, LVI: integer;
  a, b, c :Array of double;
begin
  BarCount := GetArrayLength(aSSer);
  if (BarCount>1) then
  begin
    result:= CreateSeries(BarCount);
    {--------------------------------------------------------------------------}
    FVI:=FirstValidIndex(aSser);
    LVI:=LastValidIndex(aSser);
    L:=LVI-FVI+1;
    if (L>0) then
    begin
      {------------------------------------------------------------------------}
      {--- init variables                                                   ---}
      {------------------------------------------------------------------------}
      SetArrayLength(a, L);
      SetArrayLength(b, L);
      SetArrayLength(c, L);
      FillSeries(result, NaN);
      H1 :=0;
      H2 :=0;
      H3 :=0;
      H4 :=0;
      H5 :=0;
      HH1:=0;
      HH2:=0;
      HH3:=0;
      HH5:=0;
      HB :=0;
      HC :=0;
      Z  :=0;
      {------------------------------------------------------------------------}
      {--- Calculate filter output                                          ---}
      {------------------------------------------------------------------------}
      a[0]:= 1.0+aLambda;
      b[0]:=-2.0*aLambda;
      c[0]:=aLambda;
      {---}
      for i:=1 to L-3 do
      begin
        a[i]:= 6.0*aLambda+1.0;
        b[i]:=-4.0*aLambda;
        c[i]:=aLambda;
      end;
      {---}
      a[1]  := 5.0*aLambda+1.0;
      a[L-1]:= 1.0+aLambda;
      a[L-2]:= 5.0*aLambda+1.0;
      b[L-2]:=-2.0*aLambda;
      b[L-1]:= 0.0;
      c[L-2]:= 0.0;
      c[L-1]:= 0.0;
      {------------------------------------------------------------------------}
      {--- Forward                                                          ---}
      {------------------------------------------------------------------------}
      for i:=0 to L-1 do
      begin
        Z   :=a[i]-H4*H1-HH5*HH2;
        {---}
        HB  :=b[i];
        HH1 :=H1;
        H1  :=(HB-H4*H2)/Z;
        b[i]:=H1;
        {---}
        HC  :=c[i];
        HH2 :=H2;
        H2  :=HC/Z;
        c[i]:=H2;
        {---}
        a[i]:=(aSser[FVI+i]-HH3*HH5-H3*H4)/Z;
        HH3 :=H3;
        H3  :=a[i];
        H4  :=HB-H5*HH1;
        HH5 :=H5;
        H5  :=HC;
      end;
      {------------------------------------------------------------------------}
      {--- Backward                                                         ---}
      {------------------------------------------------------------------------}
      H2:=0.0;
      H1:=a[L-1];
      result[FVI+L-1]:=H1;
      for i:=L-2 downto 0 do
      begin
        result[FVI+i]:=a[i]-b[i]*H1-c[i]*H2;
        H2:=H1;
        H1:=result[FVI+i];
      end;
      {------------------------------------------------------------------------}
      SetArrayLength(a, 0);
      SetArrayLength(b, 0);
      SetArrayLength(c, 0);
    end;
  end;
end;
//******************************************************************************

procedure Initialisatie(bars:Integer);
begin
with Indicator do
  begin
   ShortName := 'HP-trend';
   NewBand   := True;
   ScaleRange:= srCommon;
   HelpText  := 'Trend by HP';
   RequiredBars := bars*2;
  end;
end;
//******************************************************************************

Procedure Bijschrift(dtm:TDateTime;wrd:Real;tekst:String;klr:TColor);
begin
 with CreateText(dtm,wrd,tekst) do
  begin
   Color := klr;
   font.size := 10;
   font.style := [fsItalic];

  end;
end;
//******************************************************************************

procedure KleurBalk
 (sHPTF2 : TSeries ; Hg, Lg, LnNr1, LnNr2, bars : integer; TijdInterval: Real;
                                                                 BarW: Boolean);

var
g, i, r : integer;
sTF2H, sTF2L, sDisplayH, sDisplayL, sBarH, sBarL : TSeries;

Begin
g :=  1;
r :=  1;
sTF2H := CreateSeries(BarCount);
sTF2L := CreateSeries(BarCount);
sBarH := CreateSeries(BarCOunt);
sBarL := CreateSeries(BarCount);
sDisplayH := Createseries(BarCount);
sDisplayL := CreateSeries(BarCount);

If barCount>bars then
begin
 for i := BarCount-bars to BarCount-1 do //BarCount-1 DownTo BarCount-bars do
 Begin
  if IsValid(sHPTF2[i]) then
   begin
       if (r=1) then
       begin
       if (sHPTF2[i] <= shptf2[i-1]) then
        begin
        sTF2H[i] := Lg;
        sTF2L[i] := Hg;
        g:= -1;
        end;
       if (sHPTF2[i] > sHPTF2[i-1]) then
        begin
        g := 1;
        sTF2H[i] := Hg;
        sTF2L[i] := Lg;
        end;
       end;

      if (g=1) then
       begin
       if (sHPTF2[i] >= sHPTF2[i-1]) then
       begin
        sTF2H[i] := Hg;
        sTF2L[i] := Lg;
        r := -1;
       end;
       if (sHPTF2[i] < sHPTF2[i-1]) then
       begin
        r := 1;
        sTF2H[i] := Lg;
        sTF2L[i] := Hg;
       end;
      end;
   end;
 end;
 end;

case BarW of
 false: begin
         sDisplayH := sTF2H;
         sDisplayL := sTF2L;
        end;
 true : begin
         sBarH     := sTF2H;
         sBarL     := sTF2L;
        end;
 end;
 
CreateLine (sDisplayH).Color := ClBlack;
CreateLine (sDisplayL).Color := ClBlack;
If Not(BarW) then FillLinesRegion(LnNr1,LnNr2,clLime,clRed,bsSolid);

with CreateLineOHLC(sBarH,sBarH,sBarL,sBarL) do
begin
 Color:=ClGray;
 LineType := LtHighLow;
 Width := 2;
end;

for i:= 1 to BarCount-1 do
 begin
  if IsValid(sTF2H[i]) and IsValid(sTF2L[i]) then
    if (sTF2H[i]>sTF2L[i]) then SetBarColor(LnNr1,i,clGreen)
    else SetBarColor(LnNr1,i,clRed);
 end;

Bijschrift(now,(Hg+Lg)/2.0,FormatFloat('0',TijdInterval) + ' Minuten',clRed);

end;
//******************************************************************************

var
pLambda,TF2time,TF3time,bars : integer;
sMA1, sHPTF2, sHPTF3 : TSeries;
s2,s3 : TSeriesEx;
TF2,TF3,BarW : Boolean;

begin
pLambda := CreateParameterInteger('Lambda =', 0, 10000000,22, TRUE);
TF2 := CreateParameterBoolean('Tweede tijdframe weergeven',True,False);
TF2time :=
      CreateParameterInteger('Tijdbasis tijdframe-2, Minuten:',5,1000,45,False);
TF3 := CreateParameterBoolean('Derde tijdframe weergeven',True,False);
TF3time :=
     CreateParameterInteger('Tijdbasis tijdframe-3, Minuten:',5,1000,120,False);
BarW := CreateparameterBoolean('Barweergave ipv. Vlakken', True,False);
bars :=Ceil(3/(BarInterval*2.6666));
Initialisatie(bars);

sMA1 := HodrickPrescot(Close, pLambda);
if BarW then
     if TF2 then KleurBalk(sMa1,100,75,2,2,bars,BarInterval*24*60.0,BarW)
     else  KleurBalk(sMa1,100,63,2,2,bars,BarInterval*24*60.0,BarW)
else
  if TF2 then KleurBalk(sMA1,100,75,0,1,bars,BarInterval*24*60.0,BarW)
  else Kleurbalk(sMA1,100,63,0,1,bars,BarInterval*24*60.0,BarW);
  
if TF2 then
begin
 s2 := ReadPrices(Instrument.ID, (TF2time/24.0/60.0), 0, Now, 4);
 sHPTF2 :=   HodrickPrescot(s2.close, pLambda);
 sHPTF2 := SyncSeries(sHPTF2, s2, smInsDuplicate);
 if BarW then
 KleurBalk(sHPTf2,74,50,5,5,bars,TF2time,BarW)
 else
 KleurBalk(sHPTF2,74,50,3,4,bars,TF2time,BarW);
end;

if TF3 then
begin
 s3 := ReadPrices(Instrument.ID, (TF3time/24.0/60.0), 0, Now, 4);
 sHPTF3 :=  HodrickPrescot(s3.close, pLambda);
 sHPTF3 := SyncSeries(sHPTF3, s3, smInsDuplicate);
 if BarW then
    If TF2 then KleurBalk(sHPTF3,49,25,8,8,bars,TF3time,BarW)
    else  KleurBalk(sHPTF3,62,25,5,5,bars,TF3time,BarW)
 else
      if TF2 then KleurBalk(sHPTF3,49,25,6,7,bars,TF3time,BarW)
       else KleurBalk(sHPTF3,62,25,3,4,bars,TF3time,BarW);
end;

end.
.
Plaatje d'rbij ;)
Afbeelding
.
Laatst gewijzigd door Janus op ma okt 19, 2020 12:56 am, 10 keer totaal gewijzigd.

Janus
Berichten: 1371
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Trend met Hodrick Prescot

Bericht door Janus »

Tesjoeva,
nog even als goed bedoelde opmerking,
wanneer je code plaatst, kan je dat het beste tussen de twee teksten (code) en (/code) maar dit dan met vierkante haakjes doen, zoals te zien in onderstaande afbeelding.
Het neemt dan minder ruimte in in je commentaar, je krijgt een apart venster voor de code, en dat is eenvoudiger te kopiëren.
Ik kan in deze tekst niet die -vierkante haakjes gebruiken, omdat dan de tekstverwerker hier direct denkt dat ik code plaats, en dan ook die vierkante haakjes niet laat zien.
Vandaar even de afbeelding.
.
Afbeelding
.
Vriendelijke groet,
JanS ;)

tesjoeva
Berichten: 204
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: Trend met Hodrick Prescot

Bericht door tesjoeva »

Hallo JanS....ik weet nog steeds niet hoe ik je moet aanspreken....

Eerst natuurlijk super bedankt dat je tijd aan mijn spinsels wilt besteden.

Een paar dingetjes:

De output zoals je die hebt opgestuurd (de nieuwe dus) is prima met bars op alle 3 timeframes.
Nu echter krijg ik alleen de onderste in bar en de 2 bovenste in lijn/slot.
Als ik daar iets probeer aan te passen krijg ik een wat vreemde output.
Wanneer het voor het signaal verder niks uitmaakt dan is het prima, maar graag dus de weergave zoals je hem hebt opgestuurd.

Optimaliseren van de HP hoeft niet, omdat ik de beperking al had gelezen:
Woodies CCI ook niet die blijft standaard, dus alleen de TenkanSen wil ik af en toe optimaliseren om enig gevoel bij de volatiliteit te houden.

Mag ik je ook om een advies vragen ( want volgens mij ben je net zo'n wizzard als Eric)

Wat is wijsheid bij de exit; het gevaar is dat je bij elke poep en een zucht eruit vliegt en dat wil ik dus niet, maar ook zien te voorkomen dat je, met de markt tegen je in, te lang met de billen bij elkaar moet zitten.


Zou een exit obv 2 indicatoren een oplossing zijn en dan denk ik aan een signaal verandering in de HP
bijv. op het eerste timeframe icm een contrasignaal in de Tenkan (of draaf ik nu helemaal door?)

ik hoor graag van je (zeker als je aanvullende vragen/opmerkingen hebt)

vriendelijke groet,

vincent
Berichten: 295
Lid geworden op: di jan 04, 2011 12:20 pm

Re: Trend met Hodrick Prescot

Bericht door vincent »

Als ik mijzelf er even tussendoor mag wurmen....
Jan, is het misschien een idee omdat die long-en-short pijl die gevraagd wordt zo te programmeren dat deze ook blijft staan, ookal gaan de HP-trend aan 'geschietsvervalsing' doen gedurende de candles die volgen na de initiële signaalcandle.
Op die manier is er niet via een optimalisatie terug te kijken (want die werkt toch niet goed op de HP-trend), en terugkijken via visualisatie werkt ook niet goed op de HP-trend (inderdaad zoals jij opmerkt is achteraf plaatje veel fraaier dan de signalen die daadwerkelijk in loop der dag ontstaan.
Maar dan is er wel correct via de richting van de signaalpijlen terug te kijken (mist de gebruiker de indicator enige tijd heeft laten meelopen.
Gegroet, Vincent
Laatst gewijzigd door vincent op di okt 20, 2020 3:31 pm, 1 keer totaal gewijzigd.

tesjoeva
Berichten: 204
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: Trend met Hodrick Prescot

Bericht door tesjoeva »

Hallo Jan en Vincent;

De up- en down arrows moeten sowieso blijven staan zoals ze initieel zijn ontstaan.

vriendelijke groet,

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

Re: Trend met Hodrick Prescot

Bericht door Eric »

tesjoeva schreef:
ma okt 19, 2020 12:16 pm
De up- en down arrows moeten sowieso blijven staan zoals ze initieel zijn ontstaan.
Dat is dus een compleet andere indicator die een compleet ander beeld zal geven. En die in ieder geval meerdere ordegroottes (afhankelijk van hoeveel koershistorie je wilt gebruiken) complexer dus trager zal zijn.

Maar de grote vraag voor mij is eigenlijk: als je die indicator nog nooit hebt gezien, dus als je niet weet hoe deze zich gedraagt, hoe kun je dan al voorsorteren op een nog ingewikkelder systeem waarbij je deze in meerdere timeframes met nog diverse andere indicatoren erbij betrekt?

Het lijkt mij dat je een belangrijke stap overslaat met je vragen. Je zult moeten beginnen met een verbouwde indicator die van bar tot bar het filter doorrekent, ipv zoals het nu gebeurt met de complete koersarray. Dat is al een flink klusje met het risico dat het resultaat onbruikbaar traag wordt (maar zoals gezegd ben ik niet goed bekend met de materie noch de code dus misschien zie ik het te somber in).

---
Eric

tesjoeva
Berichten: 204
Lid geworden op: vr jul 07, 2017 3:10 pm

Re: Trend met Hodrick Prescot

Bericht door tesjoeva »

Hallo Eric,

Jij hebt natuurlijk mijlen méér verstand van dit soort zaken dan ik, maar is het allemaal niet simpeler:

Bij de HP heb ik niets (meer) te maken met het verleden, welke nog kan veranderen cq worden aangepast.

Alleen op het moment dat 3 bars groen dan wel rood zijn en de 2 overige randvoorwaarden zijn ingelost, wil ik graag een arrow in de KOERSGRAFIEK en die kan/moet dan ook blijven staan.

Zoals gezegd boeit het verleden in de HP volstrekt niet meer.

cc jans en vincent

vriendelijke groet,

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

Re: Trend met Hodrick Prescot

Bericht door Eric »

Zo werkt het niet. Een TA-script kan geen "pijlen onthouden", hij kan een indicator berekenen en kijkt vervolgens aan de hand van entry/exit regels waar de signalen gegeven moeten worden.

---
Eric

Janus
Berichten: 1371
Lid geworden op: wo jan 30, 2008 2:07 am
Contacteer:

Re: Trend met Hodrick Prescot

Bericht door Janus »

Ik heb de code even aangepast.
Besef je terdege, besef je dat heel goed!!!, dat de code realtime is.
Wat hij nu aangeeft, daar weet hij zich niets meer van te herinneren over zeg 15 minuten, een soort Meneer Rutte dus.
Het opbouwen van een historie omtrent koerssignalen heeft geen zin met deze indicator.
Het kan wel, vanaf nu, via de harde schijf, maar heeft geen enkele zin.
De HP indicator zoekt op elk ogenblik de perfecte pasvorm, en heeft lak aan het verleden.
Pas je daarop aan, of vergeet deze indicator.
.
Ik heb een en ander aangepast, zie of je er wat mee kan, ik duik nu de bedstee in.

*
** code aangepast 20-oktober-2020 om 11:05 uur
*

Code: Selecteer alles

{- Filename: Sys-one Tesjoeva -}
// gebruikt wordt de Hodrick Prescot code vertaalt door albertH
// Meerdere tijdframes naar een idee van www.jstas.com
// Versie 1.21  20-10-2020

//

function LastValidIndex(aSer:TSeries):integer;
var
  i, Count: integer;
begin
  Count:=GetArrayLength(aSer);
  if (Count>0) then
  begin
    result:=0;
    for i:=Count-1 downto 0 do
    begin
      if IsValid(aSer[i]) then
      begin
        result:=i;
        break;
      end;
    end;
  end;
end;
//*****************************************************************************
//AlbertH
function HodrickPrescot(aSSer:TSeries; aLambda:double):TSeries;
var
  i, L, BarCount:integer;
  H1, H2, H3, H4, H5, HH1, HH2, HH3, HH5, HB, HC, Z: double; {are zero}
  FVI, LVI: integer;
  a, b, c :Array of double;
begin
  BarCount := GetArrayLength(aSSer);
  if (BarCount>1) then
  begin
    result:= CreateSeries(BarCount);
    {--------------------------------------------------------------------------}
    FVI:=FirstValidIndex(aSser);
    LVI:=LastValidIndex(aSser);
    L:=LVI-FVI+1;
    if (L>0) then
    begin
      {------------------------------------------------------------------------}
      {--- init variables                                                   ---}
      {------------------------------------------------------------------------}
      SetArrayLength(a, L);
      SetArrayLength(b, L);
      SetArrayLength(c, L);
      FillSeries(result, NaN);
      H1 :=0;
      H2 :=0;
      H3 :=0;
      H4 :=0;
      H5 :=0;
      HH1:=0;
      HH2:=0;
      HH3:=0;
      HH5:=0;
      HB :=0;
      HC :=0;
      Z  :=0;
      {------------------------------------------------------------------------}
      {--- Calculate filter output                                          ---}
      {------------------------------------------------------------------------}
      a[0]:= 1.0+aLambda;
      b[0]:=-2.0*aLambda;
      c[0]:=aLambda;
      {---}
      for i:=1 to L-3 do
      begin
        a[i]:= 6.0*aLambda+1.0;
        b[i]:=-4.0*aLambda;
        c[i]:=aLambda;
      end;
      {---}
      a[1]  := 5.0*aLambda+1.0;
      a[L-1]:= 1.0+aLambda;
      a[L-2]:= 5.0*aLambda+1.0;
      b[L-2]:=-2.0*aLambda;
      b[L-1]:= 0.0;
      c[L-2]:= 0.0;
      c[L-1]:= 0.0;
      {------------------------------------------------------------------------}
      {--- Forward                                                          ---}
      {------------------------------------------------------------------------}
      for i:=0 to L-1 do
      begin
        Z   :=a[i]-H4*H1-HH5*HH2;
        {---}
        HB  :=b[i];
        HH1 :=H1;
        H1  :=(HB-H4*H2)/Z;
        b[i]:=H1;
        {---}
        HC  :=c[i];
        HH2 :=H2;
        H2  :=HC/Z;
        c[i]:=H2;
        {---}
        a[i]:=(aSser[FVI+i]-HH3*HH5-H3*H4)/Z;
        HH3 :=H3;
        H3  :=a[i];
        H4  :=HB-H5*HH1;
        HH5 :=H5;
        H5  :=HC;
      end;
      {------------------------------------------------------------------------}
      {--- Backward                                                         ---}
      {------------------------------------------------------------------------}
      H2:=0.0;
      H1:=a[L-1];
      result[FVI+L-1]:=H1;
      for i:=L-2 downto 0 do
      begin
        result[FVI+i]:=a[i]-b[i]*H1-c[i]*H2;
        H2:=H1;
        H1:=result[FVI+i];
      end;
      {------------------------------------------------------------------------}
      SetArrayLength(a, 0);
      SetArrayLength(b, 0);
      SetArrayLength(c, 0);
    end;
  end;
end;
//******************************************************************************

procedure Initialisatie(bars:Integer);
begin
with Indicator do
  begin
   ShortName := 'HP-trend';
   NewBand   := True;
   ScaleRange:= srCommon;
   HelpText  := 'Trend by HP';
   RequiredBars := bars*2;
  end;
end;
//******************************************************************************

Procedure Bijschrift(dtm:TDateTime;wrd:Real;tekst:String;klr:TColor);
begin
 with CreateText(dtm,wrd,tekst) do
  begin
   Color := klr;
   font.size := 10;
   font.style := [fsItalic];

  end;
end;
//******************************************************************************

Procedure Tekst(dtm:TdateTime; wrd:Real; Text:string; Klr:TColor);
Begin
  With CreateText(dtm,wrd,Text) do
  begin
    Color := Klr;
    Font.size := 10;
  end;
End;
//******************************************************************************

Function KleurBalk
 (sHPTF2 : TSeries ; Hg, Lg, LnNr1, LnNr2, bars : integer; TijdInterval: Real;
                                                        BarW: Boolean):Boolean;

var
g, i, r : integer;
sTF2H, sTF2L, sDisplayH, sDisplayL, sBarH, sBarL : TSeries;

Begin
g :=  1;
r :=  1;
sTF2H := CreateSeries(BarCount);
sTF2L := CreateSeries(BarCount);
sBarH := CreateSeries(BarCOunt);
sBarL := CreateSeries(BarCount);
sDisplayH := Createseries(BarCount);
sDisplayL := CreateSeries(BarCount);

If barCount>bars then
begin
 for i := BarCount-bars to BarCount-1 do //BarCount-1 DownTo BarCount-bars do
 Begin
  if IsValid(sHPTF2[i]) then
   begin
       if (r=1) then
       begin
       if (sHPTF2[i] <= shptf2[i-1]) then
        begin
        sTF2H[i] := Lg;
        sTF2L[i] := Hg;
        g:= -1;
        end;
       if (sHPTF2[i] > sHPTF2[i-1]) then
        begin
        g := 1;
        sTF2H[i] := Hg;
        sTF2L[i] := Lg;
        end;
       end;

      if (g=1) then
       begin
       if (sHPTF2[i] >= sHPTF2[i-1]) then
       begin
        sTF2H[i] := Hg;
        sTF2L[i] := Lg;
        r := -1;
       end;
       if (sHPTF2[i] < sHPTF2[i-1]) then
       begin
        r := 1;
        sTF2H[i] := Lg;
        sTF2L[i] := Hg;
       end;
      end;
   end;
 end;
 end;

case BarW of
 false: begin
         sDisplayH := sTF2H;
         sDisplayL := sTF2L;
        end;
 true : begin
         sBarH     := sTF2H;
         sBarL     := sTF2L;
        end;
 end;
 
CreateLine (sDisplayH).Color := ClBlack;
CreateLine (sDisplayL).Color := ClBlack;
If Not(BarW) then FillLinesRegion(LnNr1,LnNr2,clLime,clRed,bsSolid);

with CreateLineOHLC(sBarH,sBarH,sBarL,sBarL) do
begin
 Color:=ClGray;
 LineType := LtHighLow;
 Width := 2;
end;

if BarW then
begin
for i:= 1 to BarCount-1 do
 begin
  if IsValid(sTF2H[i]) and IsValid(sTF2L[i]) then
    if (sTF2H[i]>sTF2L[i]) then
     SetBarColor(LnNr1,i,clGreen)
     else
     SetBarColor(LnNr1,i,clRed);
 end;
End;

for i:= 1 to BarCount-1 do
 begin
   if (i=BarCount-1) then
    begin
      if IsValid(sTF2H[i]) and IsValid(sTF2L[i]) then
    if (sTF2H[i]>sTF2L[i]) then
      Result := True
    else
      Result := False;
    end;
 end;
 
Bijschrift(now,(Hg+Lg)/2.0,FormatFloat('0',TijdInterval) + ' Minuten',clRed);

end;
//******************************************************************************

Procedure Signalen(Per_Tenk:integer;TF1sign, TF2sign, TF3sign:Boolean);

var
i,koop : integer;
CC, TK, Cl : Real;
sCCI_klassiek, sTenKanSen : Tseries;

begin
sCCI_klassiek := CCIClassic(H,L,C,14);
sTenKanSen := DivideSeriesBy(AddSeries(HighSeries(High,Per_Tenk),
                                                    LowSeries(Low,Per_Tenk)),2);
if Barcount>2 then
 begin
   for i:= (BarCount-1) Downto (Barcount-2) do
    begin
      if (i=BarCount-1) then
       begin
         CC := sCCI_klassiek[i];
         TK := sTenKanSen[i];
         Cl := C[i];
       end;
    end;
 end;

koop := 0;
if Tf1sign and TF2sign and TF3sign and (Cl>TK) and (CC>0) then koop := 1;
if Not(Tf1sign) and Not(TF2sign) and Not(TF3sign) and Not((Cl>TK))
                                          and Not((CC>0)) then koop := -1;


for i:= (BarCount-1) Downto (Barcount-2) do
 begin
  If i=BarCount-1 then
   begin
    Case koop of
     1: begin
         tekst (now,95,'BUY',clLime);
         SetParentBarColor(i,clLime);
        end;
    -1: begin
        tekst (now,95,'SELL',clRed);
        SetParentBarColor(i,ClRed);
        end;
    end;
    tekst(now,75,'CCI '+ FormatFloat('0.00',CC),ClLime);
    tekst(now,70,'Tenkan '+ FormatFloat('0.00',TK),clLime);
   end;
 end;
end;
//*****************************************************************************

var
pLambda,TF2time,TF3time,bars,Per_Tenk : integer;
sMA1, sHPTF2, sHPTF3 : TSeries;
s2,s3 : TSeriesEx;
TF2,TF3,BarW,TF1sign, TF2sign, TF3sign : Boolean;

begin
pLambda := CreateParameterInteger('Lambda =', 0, 10000000,22, TRUE);
Per_Tenk := CreateParameterInteger('Periode Tenkan Sen',1,999,9,True);
TF2 := CreateParameterBoolean('Tweede tijdframe weergeven',True,False);
TF2time :=
      CreateParameterInteger('Tijdbasis tijdframe-2, Minuten:',5,1000,45,False);
TF3 := CreateParameterBoolean('Derde tijdframe weergeven',True,False);
TF3time :=
     CreateParameterInteger('Tijdbasis tijdframe-3, Minuten:',5,1000,120,False);
BarW := CreateparameterBoolean('Barweergave ipv. Vlakken', True,False);
bars :=Ceil(3/(BarInterval*2.6666));
Initialisatie(bars);

sMA1 := HodrickPrescot(Close, pLambda);
if BarW then
  if TF2 then Tf1sign :=KleurBalk(sMa1,100,75,2,2,bars,BarInterval*24*60.0,BarW)
  else  TF1sign:=KleurBalk(sMa1,100,63,2,2,bars,BarInterval*24*60.0,BarW)
else
  if TF2 then Tf1Sign:=KleurBalk(sMA1,100,75,0,1,bars,BarInterval*24*60.0,BarW)
  else Tf1sign:=Kleurbalk(sMA1,100,63,0,1,bars,BarInterval*24*60.0,BarW);
  
if TF2 then
begin
 s2 := ReadPrices(Instrument.ID, (TF2time/24.0/60.0), 0, Now, 4);
 sHPTF2 :=   HodrickPrescot(s2.close, pLambda);
 sHPTF2 := SyncSeries(sHPTF2, s2, smInsDuplicate);
 if BarW then
 TF2sign :=KleurBalk(sHPTf2,74,50,5,5,bars,TF2time,BarW)
 else
 Tf2sign :=KleurBalk(sHPTF2,74,50,3,4,bars,TF2time,BarW);
end;

if TF3 then
begin
 s3 := ReadPrices(Instrument.ID, (TF3time/24.0/60.0), 0, Now, 4);
 sHPTF3 :=  HodrickPrescot(s3.close, pLambda);
 sHPTF3 := SyncSeries(sHPTF3, s3, smInsDuplicate);
 if BarW then
    If TF2 then TF3sign :=KleurBalk(sHPTF3,49,25,8,8,bars,TF3time,BarW)
    else  TF3sign :=KleurBalk(sHPTF3,62,25,5,5,bars,TF3time,BarW)
 else
      if TF2 then TF3sign :=KleurBalk(sHPTF3,49,25,6,7,bars,TF3time,BarW)
       else TF3sign :=KleurBalk(sHPTF3,62,25,3,4,bars,TF3time,BarW);
end;

Signalen(Per_Tenk,TF1sign,TF2sign,TF3sign);


end.

.
Niet meer aan de instellingen rommelen Tesjoeva, en dan krijg je ook de juiste weergave te zien.
Verwijder de oude code, en installeer deze als nieuwe code.
.
.
Grafiekje d'r bij ;)
Afbeelding
.
Jan S.
Laatst gewijzigd door Janus op di okt 20, 2020 11:04 am, 1 keer totaal gewijzigd.
Vriendelijke groet,
JanS ;)

Plaats reactie