Indicators John Ehlers - Hilbert transformtatie

Vragen en suggesties over Vesticode

Moderator: Perry

Indicators John Ehlers - Hilbert transformtatie

Berichtdoor poekmeister » wo 13 aug 2003, 21:24

Op www.mesasoftware.com vind je erg interessante technical papers die een aantal technieken uit de signaaltheorie beschrijven en m.n. de toepassing in indicatoren/systemen.

Ik probeer de Hilbert transformatie te bouwen die als functie de lengte van de dominante cyclus geeft. De bedoeling is dat ik de transformatie als functie opneem en die vervolgens in een indicator aanroep. Hieronder staat de code voor functie en indicator.

Hij doet het echter niet. Ik denk dat het komt door het aanroepen van xInphase[1] in de regel met xInphase in de functie, zelfde bij xQuadrature. Heb ooit begrepen dat dit soort statements niet kan in een functie. Weet echter niet meer hoe wel te doen...hulp van iemand?
Michel

Functie:
value Function zfHilbertPeriod(value xPrice=(H+L)/2) begin

Vars:xImult (.635),
xQmult (.338),
xInPhase(0),
xQuadrature(0),
xPhase(0),
xDeltaPhase(0),
xcount(0),
xInstPeriod(0),
xPeriod(0),
xValue1(0),
xValue2(0),
xValue3(0),
xValue4(0);
value xDummy1,xDummy2,xDummy3;

If CurrentBar > 15 then begin

{Detrend Price}
xValue3 = xPrice - xPrice[7];

{Compute InPhase and Quadrature components}
xInphase := 1.25*(xValue3[4] ?- xImult*xValue3[2]) + xImult*xInphase[1];
xQuadrature := xValue3[2] - xQmult*xValue3 + xQmult*xQuadrature[1];

{Use ArcTangent to compute the current phase}
If AbsValue(xInPhase +xInPhase[1]) > 0 then xPhase = ArcTangent(AbsValue((xQuadrature+xQuadrature[1]) / (xInPhase+xInPhase[1])));

{Resolve the ArcTangent ambiguity}
If xInPhase < 0 and xQuadrature > 0 then xPhase = 180 - xPhase;
If xInPhase < 0 and xQuadrature < 0 then xPhase = 180 + xPhase;
If xInPhase > 0 and xQuadrature < 0 then xPhase = 360 - xPhase;

{Compute a differential phase, resolve phase wraparound, and limit delta phase errors}
xDeltaPhase = xPhase[1] - xPhase;
If xPhase[1] < 90 and xPhase > 270 then xDeltaPhase = 360 + xPhase[1] - xPhase;
If xDeltaPhase < 1 then xDeltaPhase = 1;
If xDeltaPhase > 60 ?then xDeltaphase = 60;

{Sum DeltaPhases to reach 360 degrees. ?The sum is the instantaneous period.}
xInstPeriod = 0;
xValue4 = 0;
For xcount = 0 to 50 begin
xValue4 = xValue4 + xDeltaPhase[xcount];
If xValue4 > 360 and xInstPeriod = 0 then begin
xInstPeriod = xcount;
end;
end;

{Resolve Instantaneous Period errors and smooth}
If xInstPeriod = 0 then xInstPeriod = xInstPeriod[1];
xPeriod = .25*(xInstPeriod) + .75*xPeriod[1];

zfHilbertPeriod:=xPeriod;
end;
end;


Indicator:
value function zHilbertPeriod(value xPrice=((H+L)/2)) begin
value xPeriod[];
xPeriod=zfHilbertPeriod((H+L)/2);
Plot1(xPeriod,'Period');
end;
poekmeister
 
Berichten: 88
Geregistreerd op: za 17 aug 2002, 19:50

Indicators John Ehlers

Berichtdoor Marco » do 14 aug 2003, 8:24

Michel,

Zonder nu meteen door te hebben wat de Hilbert Transform nu precies doet (behalve een relatie leggen tussen de tijd/horizontale component oftewel inphase en de verandering in hoogte/vertikale component oftwel quadrature van de koers) kom je ook veel eenvoudigere versies van deze indicator tegen, zoals je hieronder kunt zien.
Of deze het dan wel doet weet ik ook niet, ben ook maar aan het werk ;)

De smilies krijg je er gratis bij. Vervangen door een ) en je code klopt weer.

Marco.

value function zIndHilbertTransform(value pxPrice[] = (High + Low) /2)
begin
?value xInPhase = 0, xQuadrature = 0;
?value xValue1, xValue2, xValue3;

?If CurrentBar > 5 then begin
? ?xValue1 ? ? := pxPrice - pxPrice[6];
? ?xValue2 ? ? := xValue1[3];
? ?xValue3 ? ? := .75*(xValue1 - xValue1[6]) + .25*(xValue1[2] - xValue1[4]); ? ?
? ?xInPhase ? ?:= .33*xValue2 + .67*xInPhase[1];
? ?xQuadrature := .20*xValue3 + .80*xQuadrature[1];

? ?Plot1(xInphase, ? ?"I");
? ?Plot2(xQuadrature, "Q");
?end;
end;
Marco
 
Berichten: 66
Geregistreerd op: di 08 jul 2003, 12:34

Indicators John Ehlers

Berichtdoor Paul M » do 14 aug 2003, 9:34

Hallo Michel en Marco,

value function HilbertTransform()
begin
?value xInPhase[] , xQuadrature[] ,xPrice[];
?value xValue1, xValue2, xValue3,xvalue4,xvalue5;
xPrice = Medianprice;
?
?If CurrentBar > 5 then begin
? ?
? ?xValue1 ? ? := xPrice - xPrice[6];
? ?xValue2 ? ? := xValue1[3];
? ?xValue3 ? ? := .75*(xValue1 - xValue1[6]) + .25*(xValue1[2] - xValue1[4]);
? ?xvalue4:= ? ?.33*xValue2;
? ?xvalue5:= .20*xValue3;
? ?if currentbar=10 then ?xInPhase=xValue2 else
? ?xInPhase ? ?:= xValue4 + .67*(xInPhase[1]);
? ?if currentbar=13 then xQuadrature :=xValue3 else
? ?xQuadrature := ?xValue5 + .80*(xQuadrature[1]);

? ?Plot1(xInphase, ? ?"Inphase");
? ?Plot2(xQuadrature, "Quadrature");
?end;
end;

Paul


(Edited by Paul M at 10:25 pm op 14,aug. 2003)
Paul M
 
Berichten: 263
Geregistreerd op: vr 13 dec 2002, 23:21

Indicators John Ehlers

Berichtdoor Marco » do 14 aug 2003, 10:11

Mooi zo'n versie. Ik ga ervan uit dat deze werkt Paul???

Enne, wat doet zo'n ding nu??? Oftewel wat kan ik ermee?!?!!?

Marco.
Marco
 
Berichten: 66
Geregistreerd op: di 08 jul 2003, 12:34

Indicators John Ehlers

Berichtdoor FM » do 14 aug 2003, 10:29

De volgende code heb ik gevonden voor Tradestation op internet
http://trader.online.pl/ELZ/t-i-Hilbert_Transform.html
Geen idee of het werkt, maar g ik vnavond eens proberen.

met groet,

Frans


Inputs: ? ?Price((H+L)/2);

Vars: ? ?InPhase(0),
? Quadrature(0);

If CurrentBar > 5 then begin

? Value1 = Price - Price[6];
? Value2 =Value1[3];
? Value3 =.75*(Value1 - Value1[6]) + .25*(Value1[2] - Value1[4]); ? ?
? InPhase = .33*Value2 + .67*InPhase[1];
? Quadrature = .2*Value3 + .8*Quadrature[1];

? Plot1(Inphase, "I");
? Plot2(Quadrature, "Q");

end;
FM
 
Berichten: 113
Geregistreerd op: do 15 aug 2002, 12:58

Indicators John Ehlers

Berichtdoor poekmeister » do 14 aug 2003, 19:42

Marco, Paul,
Hartelijk dank voor jullie hulp. De truc lijkt dus te zijn om een series niet aan te roepen in een functie met [1] tenzij je zeker weet dat er data inzit. Dus eerst met currentbar testen.

Goed, waarom wat doet dit ding nou en wat ga ik er in hemelsnaam meedoen. Wel kijk eerst eens op http://www.mesasoftware.com/pub/index.html en lees het artikel over market modes. ?John Ehlers zegt dat de markt of in trend mode is of in cycle mode. Als de markt in een cycle mode is dan is het handig om te weten met welke cyclus lengte (of afgeleid daarvan, frequentie) nu de market op en neer beweegt.... Wat kun je ermee doen? Nu, mijn idee is om de informatie over de cyclus lengte te gebruiken om andere indicatoren etc adaptief te maken....

Hoop dat dit helpt.
Michel
poekmeister
 
Berichten: 88
Geregistreerd op: za 17 aug 2002, 19:50

Indicators John Ehlers

Berichtdoor JanBrinker » wo 22 dec 2004, 15:13

Ik ben aan het stoeien met de signaaltheorie. De SineWave indicator, ook al van John Ehler, geeft bij mij in Vestics niet de juiste waarden. De uitkomst is altijd 1 voor ?de Sine en 0.71 voor de LeadSine. ?Ik heb van alles geprobeerd maar krijg de code niet correct werkend. ?Hieronder de oorspronkelijke code. Iemand suggesties om dit aan de praat te krijgen?

B.v.d.,
Bertjan


Inputs:Price((H+L)/2);

Vars:Imult (.635),
Qmult (.338),
InPhase(0),
Quadrature(0),
Phase(0),
DeltaPhase(0),
count(0),
InstPeriod(0),
Period(0),
DCPhase(0),
RealPart(0),
ImagPart(0);

If CurrentBar > 5 then begin

{Detrend Price}
Value3 = Price - Price[7];

{Compute InPhase and Quadrature components}
Inphase = 1.25*(Value3[4] ?- Imult*Value3[2]) + Imult*InPhase[3];
Quadrature = Value3[2] - Qmult*Value3 + Qmult*Quadrature[2];

{Use ArcTangent to compute the current phase}
If AbsValue(InPhase +InPhase[1]) > 0 then Phase = ArcTangent(AbsValue((Quadrature+Quadrature[1]) / (InPhase+InPhase[1])));

{Resolve the ArcTangent ambiguity}
If InPhase < 0 and Quadrature > 0 then Phase = 180 - Phase;
If InPhase < 0 and Quadrature < 0 then Phase = 180 + Phase;
If InPhase > 0 and Quadrature < 0 then Phase = 360 - Phase;

{Compute a differential phase, resolve phase wraparound, and limit delta phase errors}
DeltaPhase = Phase[1] - Phase;
If Phase[1] < 90 and Phase > 270 then DeltaPhase = 360 + Phase[1] - Phase;
If DeltaPhase < 1 then DeltaPhase = 1;
If DeltaPhase > 60 ?then Deltaphase = 60;

{Sum DeltaPhases to reach 360 degrees. ?The sum is the instantaneous period.}
InstPeriod = 0;
Value4 = 0;
For count = 0 to 40 begin
Value4 = Value4 + DeltaPhase[count];
If Value4 > 360 and InstPeriod = 0 then begin
InstPeriod = count;
end;
end;

{Resolve Instantaneous Period errors and smooth}
If InstPeriod = 0 then InstPeriod = InstPeriod[1];
Value5 = .25*InstPeriod + .75*Period[1];

{Compute Dominant Cycle Phase, Sine of the Phase Angle, and Leadsine}
Period = IntPortion(Value5);
?RealPart = 0;
ImagPart = 0;
?For count = 0 To Period ?- 1 begin
RealPart = RealPart + Sine(360 * count / Period) * (Price[count]);
? ? ImagPart = ImagPart + Cosine(360 * count / Period) * (Price[count]);
end;
If AbsValue(ImagPart) > 0.001 then DCPhase = Arctangent(RealPart / ImagPart);
If AbsValue(ImagPart) <= 0.001 then DCPhase = 90 * Sign(RealPart);
DCPhase = DCPhase + 90;
If ImagPart < 0 then DCPhase = DCPhase + 180;

Plot1(Sine(DCPhase), "Sine");
Plot2(Sine(DCPhase + 45), "LeadSine");

end;
JanBrinker
 
Berichten: 14
Geregistreerd op: za 09 aug 2003, 13:18

Indicators John Ehlers

Berichtdoor JanBrinker » wo 22 dec 2004, 17:12

Ik had deze thread wat beter moeten lezen want de oplossing voor het aan de praat krijgen van de code voor de SineWave staat er al in beschreven. ?Door het eerste gedeelte van de code, waarin de Hilbert Transformation wordt berekend, te vervangen door bovenstaande versie van Paul heb ik de code werkend gekregen. Dus Paul, bij deze nog bedankt voor de Hilbert Transform.

Met vr. gr.,
Bertjan
JanBrinker
 
Berichten: 14
Geregistreerd op: za 09 aug 2003, 13:18

Indicators John Ehlers

Berichtdoor Jo » wo 22 dec 2004, 20:46

Hoi,

Beste PoekeMeister je funktie werkt perfect, je hoef enkel de indicator aanpassen

value function zHilbertPeriod(value xPrice=((H+L)/2)) begin
value xPeriod[];
xPeriod=zfHilbertPeriod(xPrice);
Plot1(xPeriod,'Period');-----------------------------------


Paul M. & Frans M.

Beide versies geven dezelfde te plotten grafieklijnen enkel de ene begin vroeger dan de andere.

Hoe komt het dat deze plots niet beginnen vanaf de begin van de grafiek ondanks een voldoen voorloopperiode???

JanBrinker

Ziehier de werkend code van de SineWave;

Inputs:xPrice((H+L)/2);
Vars:DCPhase(0),RealPart(0),ImagPart(0), HilbertPeriod(0);
Vars:xImult (.635),xQmult (.338),xInPhase(0),xQuadrature(0),
xPhase(0),xDeltaPhase(0),xcount(0),xInstPeriod(0),xPeriod(0),
xValue1(0),xValue2(0),xValue3(0),xValue4(0);
value xDummy1,xDummy2,xDummy3;
If CurrentBar > 15 then begin
{Detrend Price}
xValue3 = xPrice - xPrice[7];
{Compute InPhase and Quadrature components}
xInphase := 1.25*(xValue3[4] ?- xImult*xValue3[2]) + xImult*xInphase[1];
xQuadrature := xValue3[2] - xQmult*xValue3 + xQmult*xQuadrature[1];
{Use ArcTangent to compute the current phase}
If AbsValue(xInPhase +xInPhase[1]) > 0 then
xPhase = ArcTangent(AbsValue((xQuadrature+xQuadrature[1]) / (xInPhase+xInPhase[1])));
{Resolve the ArcTangent ambiguity}
If xInPhase < 0 and xQuadrature > 0 then xPhase = 180 - xPhase;
If xInPhase < 0 and xQuadrature < 0 then xPhase = 180 + xPhase;
If xInPhase > 0 and xQuadrature < 0 then xPhase = 360 - xPhase;
{Compute a differential phase, resolve phase wraparound, and limit delta phase errors}
xDeltaPhase = xPhase[1] - xPhase;
If xPhase[1] < 90 and xPhase > 270 then xDeltaPhase = 360 + xPhase[1] - xPhase;
If xDeltaPhase < 1 then xDeltaPhase = 1;
If xDeltaPhase > 60 ?then xDeltaphase = 60;
{Sum DeltaPhases to reach 360 degrees. ?The sum is the instantaneous period.}
xInstPeriod = 0;
xValue4 = 0;
For xcount = 0 to 50 begin
xValue4 = xValue4 + xDeltaPhase[xcount];
If xValue4 > 360 and xInstPeriod = 0 then begin
xInstPeriod = xcount;
end;
end;
{Resolve Instantaneous Period errors and smooth}
If xInstPeriod = 0 then xInstPeriod = xInstPeriod[1];
xPeriod = .25*(xInstPeriod) + .75*xPeriod[1];
HilbertPeriod :=xPeriod;
{Compute Dominant Cycle Phase, Sine of the Phase Angle, and Leadsine}
xPeriod = IntPortion(HilbertPeriod);
?RealPart = 0;
ImagPart = 0;
?For xcount = 0 To xPeriod ?- 1 begin
RealPart = RealPart + Sine(360 * xcount / xPeriod) * (xPrice[xcount]);
? ?ImagPart = ImagPart + Cosine(360 * xcount / xPeriod) * (xPrice[xcount]);
end;
If AbsValue(ImagPart) > 0.001 then DCPhase = Arctangent(RealPart / ImagPart);
If AbsValue(ImagPart) <= 0.001 then DCPhase = 90 * Sign(RealPart);
DCPhase = DCPhase + 90;
If ImagPart < 0 then DCPhase = DCPhase + 180;

Plot1(Sine(DCPhase), "Sine");
Plot2(Sine(DCPhase + 45), "LeadSine");

end;

Hier dezelfde opmerking :Hoe komt het dat deze plots niet beginnen vanaf de begin van de grafiek ondanks een voldoen voorloopperiode???

Hartelijk dank Vestico genoten

Jo
Jo
 
Berichten: 44
Geregistreerd op: wo 07 jan 2004, 14:00

Indicators John Ehlers

Berichtdoor JanBrinker » do 23 dec 2004, 13:54

Jo,

Hartelijk bedankt voor je code.

Volgens mij beginnen de plots niet vanaf het begin van de grafiek door het gebruik van een For loop in de code. De waarden van de te berekenen variabelen zijn pas bekend na de voorloopbars plus het aantal bars uit de For loop.

Groeten,
Bertjan
JanBrinker
 
Berichten: 14
Geregistreerd op: za 09 aug 2003, 13:18


Keer terug naar Vesticode

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 3 gasten

cron