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;