% Demo fr den Bereich Financial ZigZag Kurve erstellen aus
% Kurswerten von yahoo.com.
% 18. Oktober 2005
% marthiens@ifum.uni-hannover.de
clear all
close all
% 'MM/DD/YY'
D1 = '01/01/00'
D2 = '10/17/05'
% yahoo max. 200 Kurse von D2 rckwirkend nach D1 abfragbar
% Spalte Funktion
% 1 Date
% 2 Open
% 3 High
% 4 Low
% 5 Close
% 6 Volume
% 7 Close
daxkurse=fetch(yahoo,{'VOW.DE'},D1,D2,'d');
Volumen=daxkurse(end:-1:1,6);
Kurs=daxkurse(end:-1:1,7);
Dateset=daxkurse(end:-1:1,1);
Datestartstr=Datestr(Dateset(1))
% =============================================
% ============== ZigZag =======================
% =============================================
% Wann wird ein Richtungswechsel erkannt
prozent=3;
% richtung = 0 unbekannte Steigung des aktuellen Arms
% richtung = 1 positive Steigung des aktuellen Arms
% richtung = -1 negative Steigung des aktuellen Arms
richtung=0;
% In ZZ werden die Wendepunkte gespeichert. Der erste
% ZigZag-Punkt ist der erste verfgbare Kurs.
ZZ=0;
ZZ(1,1)=Dateset(1);
ZZ(1,2)=Kurs(1);
% In SF werden die Zeitpunkte eines Richtungswechsels
% gesichert und angezeigt. Wichtig, da der Zeitpunkt eines
% Richtungswechsel nicht mit dem Zeitpunkt der Entscheidung
% fr einen Richtungswechsel zusammenfllt. ZigZag schaut
% nicht in die Zukunft sonderen in die Vergangenheit.
SF=0;
SF(1,1)=richtung;
% Algorithmus
j=1;
for i=2:length(Kurs)
% Aktuelle Kursabweichung in Prozent zum letzten
% gefundenen hchst bzw. niedrigsten ZigZag-Kurs
relKurs = (Kurs(i)-ZZ(j,2))/ZZ(j,2)*100;
% Abschnitt wird nur einmal am Anfang durchlaufen.
% Hier wird zunchst nach der ersten mglichen Richtung
% gesucht. Dabei muss der aktuelle Kurs vom ersten Kurs
% mindestens um Prozent abweichen, damit dann eine
% Richtung entschieden werden kann. Dieser Zeitpunkt und
% der akutelle Kurs bilden den zweiten Punkt der
% ZigZag-Kurve
if (abs(relKurs)>=prozent) & (richtung==0)
j=j+1;
ZZ(j,1)=Dateset(i);
ZZ(j,2)=Kurs(i);
richtung=sign(relKurs);
end
% Wenn der Kurs weiter steigt speichere dies in den
% aktuellen ZigZag-Punkt
if (Kurs(i)>=ZZ(j,2)) & (richtung==1)
ZZ(j,1)=Dateset(i);
ZZ(j,2)=Kurs(i);
end
% Wenn der akutelle Kurs zum letzten Hchstwert von ZZ
% unter prozent liegt und die Richtigung positiv ist,
% muss jetzt ein Richtungwechsel stattfinden. Der Kurs
% fllt demnach tendenziell.
% Dazu wird ein neuer ZigZag-Punkt mit dem aktuellen
% Kurs generiert und die Richtung gendert.
if (relKurs < -prozent) & (richtung==1)
richtung=-1;
j=j+1;
ZZ(j,1)=Dateset(i);
ZZ(j,2)=Kurs(i);
end
% Wenn der Kurs weiter fllt speichere dies in den
% aktuellen ZigZag-Punkt.
if (Kurs(i)<ZZ(j,2)) & (richtung==-1)
ZZ(j,1)=Dateset(i);
ZZ(j,2)=Kurs(i);
end
% Wenn der akutelle Kurs zum letzten Tiefstwert von ZZ
% unter prozent liegt und die Richtigung positiv ist,
% muss jetzt ein Richtungwechsel stattfinden. Der Kurs
% steigt demnach tendenziell.
% Dazu wird ein neuer ZigZag-Punkt mit dem aktuellen
% Kurs generiert und die Richtung gendert.
if (relKurs >= prozent) & (richtung==-1)
richtung=1;
j=j+1;
ZZ(j,1)=Dateset(i);
ZZ(j,2)=Kurs(i);
end
% Wenn sich der relKurs innerhalb von +-prozent bewegt,
% und kein neuer Hchst- bzw. Tiefstwert gefunden wurde,
% tue nichts und vergleiche mit dem nchsten Kurs.
% Richtung zu jedem Kurstag
SF(i,1)=richtung;
end
% Letzter Kurs beendet auch den ZigZag-Kurs. Egal ob
% positive oder negative Richtung. Die Richtung kann sich
% erst durch zuknftige Kurse ndern.
j=j+1;
ZZ(j,1)=Dateset(i);
ZZ(j,2)=Kurs(i);
% Anzeigen
figure
hold on
plot(Dateset,Kurs, 'linewidth',3,'color','k')
axis([Dateset(1) Dateset(end) min(Kurs) max(Kurs)]);
dateaxis('x',2,Datestartstr)
avg1= 3; % 3 Tage
avg2= 15; % 15 Tage
[Avg1set,Avg2set]=movavg(Kurs, avg1, avg2, 1);
plot(Dateset,Avg1set,'linestyle','--', 'linewidth',2,'color','g')
plot(Dateset,Avg2set,'linestyle','--', 'linewidth',2,'color','c')
plot(ZZ(:,1),ZZ(:,2)','linestyle','--', 'linewidth',3,'color','r')
DHLKurs=max(Kurs)-min(Kurs);
plot(Dateset,(SF+1)/2*DHLKurs*0.9+min(Kurs)+DHLKurs*0.05,'linestyle','--', 'linewidth',1,'color','b')