function MarketPivot(KursListe: TList; iItem,nPeriode: integer; var dAreaX: double): double;var iBar: integer; dAppar,dOp,dHi,dLo,dCl: double; DayKursX: PDayKurs;begin result:=0; dAppar:=0; dAreaX:=0; iBar:=iItem-(nPeriode-1); if iBar<0 then iBar:=0; dec(iBar); // Berechnung Pivot if iBar<iItem then repeat inc(iBar); DayKursX:=KursListe.Items[iBar]; dHi:=DayKursX^.High; dLo:=DayKursX^.Low; dCl:=DayKursX^.Close; dOp:=DayKursX^.Open; // Appareances if dHi<>dLo then dAppar:=dAppar + (dHi - dLo); if dCl<>dOp then dAppar:=dAppar + abs(dCl - dOp); // Areas if dHi<>dLo then dAreaX:=dAreaX + ((dHi + dLo)/2)*(dHi - dLo); if dCl<>dOp then dAreaX:=dAreaX + ((dCl + dOp)/2)*abs(dCl - dOp); until iBar=iItem; // Pivot value if dAppar>0 then result:=dAreaX/dAppar;end;
Die anderen Prozeduren für die Ermittlung der Pivotlinien durch numerische Integration sind sich ähnlich, hier die Resistance Pivots:
procedure p_GetResistancePivots(iBarX: integer; KursListe: TList; dAreaX,dPivotX,dHighX: double; var dR1X,dR2X: double);var i,iBar: integer; dAbstand,dInterval,dArea2,dLevel,dAreaL2,dAreaL1,dAreaL2Limit,dAreaL1Limit, dOp,dHi,dLo,dCl,dTemp: double; bLevel2OK,bLevel1OK: boolean; DayKursX: PDayKurs;begin dAbstand:=abs(dPivotX-dHighX); dInterval:=dAbstand/nIntervaleIntegration; dArea2:=dAreaX/2; dAreaL2Limit:=dArea2*(1-nAnteilR2S2/100); {100-90=10%} dAreaL1Limit:=dArea2*(1-nAnteilR1S1/100); {100-60=40%} dAreaL2:=0; dAreaL1:=0; bLevel2OK:=false; bLevel1OK:=false; dR1X:=dHighX; dR2X:=dHighX; dLevel:=dHighX+dInterval; repeat dLevel:=dLevel-dInterval; { Check jeden Bar ob sich auf dem Level befindet } for i:=0 to nMarketPeriode-1 do begin iBar:=iBarX-i; DayKursX:=KursListe.Items[iBar]; dHi:=DayKursX^.High; dLo:=DayKursX^.Low; dCl:=DayKursX^.Close; dOp:=DayKursX^.Open; if dHi=dLo then dHi:=dLo+1; if dCl=dOp then dCl:=dOp+1; { Swich damit Open<Close } if dCl<dOp then begin dTemp:=dCl; dCl:=dOp; dOp:=dTemp; end; if (dLevel<=dHi) and (dLevel>=dLo) then begin if bLevel2OK=false then begin dAreaL2:=dAreaL2+dLevel*dInterval; if (dLevel<=dCl) and (dLevel>=dOp) then dAreaL2:=dAreaL2+dLevel*dInterval; if dAreaL2>=dAreaL2Limit then begin dR2X:=dLevel; bLevel2OK:=true; end; end; if bLevel1OK=false then begin dAreaL1:=dAreaL1+dLevel*dInterval; if (dLevel<=dCl) and (dLevel>=dOp) then dAreaL1:=dAreaL1+dLevel*dInterval; if dAreaL1>=dAreaL1Limit then begin dR1X:=dLevel; bLevel1OK:=true; break; end; end; end; end; until ((bLevel2OK=true) and (bLevel1OK=true)) or (dLevel<=dPivotX);end;