In den letzten paar Tagen habe ich mich viel der Schnittstelle meines Programmes zu mysql beschäftigt, die API steht sogut wie. Das ist letztlich aber ziemlich langweilig (=darüber blogge ich wenn ich mal ein Regenwochenende Zeit habe), deshalb nun zu etwas völlig Anderem: In diesem Blogbeitrag bin ich auf die Infrastruktur und das Drumherum für das neue Handelssystem eingegangen. Dort habe ich erwähnt, dass zur Erleichterung der Entwicklung und als nettes Extrafeature die Ausgabe von Charts geplant ist. Die letzten zwei Abende habe ich mit Gnuplot, googlen und Herumprobieren verbracht, das Ergebnis kann sich meiner Meinung nach sehen lassen.
Gleich zum Angeben vorneweg der Zwischenstand meiner Bemühungen (klicken zum Vergrößern):
Ganz ok für paar Stunden suchen und copy&paste :) Gnuplot ist letzlich kein Hexenwerk, die Links die mich Schritt für Schritt zum Ziel geführt haben sind unten angeführt. Falls jemand irgendwann etwas Ähnliches versucht, hier die gröbsten Stolpersteine.
Die csv Datei, aus der die Daten stammen hat die Spaltenreihenfolge (1;2;3;4;5;6;7,8,9,10):
Date;Open;High;Low;Close;Tenkan-Sen;Kijun-Sen;Chikou Span;Senkou Span A;Senkou Span B
Alle darunter folgenden Zeilen enthalten die Zahlenwerte, in obigen Fall durch Semikolon getrennt (die Daten wurden übrigens mit der alten Version meines Systems erzeugt und einfach herausexportiert).
Plottet man nun die Kurven anhand der ersten Spalte, ist die x-Achse schön mit dem Datum als Legende formatiert. ABER: die Datei enthält natürlich für Wochenenden und Feiertage keine Kursdaten (auch kein Datum, was das betrifft). An den Stellen, wo eine solche "Lücke" existiert, plottet Gnuplot dann auch eine Lücke. Anscheinend wird die x-Achse bei Lücken einfach äquidistant aufgefüllt. Dies kann man umgehen, wenn man den Index der Zeilen für die x-Achse nutzt. Dieser Index braucht nicht in der csv Datei zu stehen, sondern kann mit der fiktiven Spalte '0' referenziert werden. Plottet man mit der Spalte 0 für die x-Achse, verliert man leider die Einträge anhand des Datums, stattdessen wird die x-Achse mit 1,2,3,...n beschriftet. Abhilfe schafft ein kleiner Trick: man definiert eine Funktion, die in Spalte 1 (dem Datum) nachschaut und diese der Spalte 0 (dem Index) als "Legende" zuordnet. Bei der Gelegenheit kann man auch noch Daten überspringen und beispielsweise nur jeden 5. Tag auf der x-Achse eintragen:
everyNth(countColumn, labelColumnNum, N) = \
( (int(column(countColumn)) % N == 0) ? stringcolumn(labelColumnNum) : "" )
Diese Funktion nutzt man dann beim eigentlichen Plot-Befehl, hier am Beispiel der Candlesticks:
plot "dax_ichimoku.csv" using 0:2:3:4:5:($5 < $2 ? 1 : 2):xticlabels(everyNth(0, 1, 5)) linecolor variable notitle with candles
Der Vergleich $5 < $2 ? 1 : 2 in obigem Befehl erzeugt unterschiedlich gefärbte Candlesticks, je nachdem ob der close-Wert über oder unter dem open-Wert liegt (also eine steigende bzw. fallende Tageskerze vorliegt). Bei den Farben kann man sich frei austoben, das oben gezeigte Beispiel nutzt
set linetype 1 lc rgb 0xCD5C5C #dark red
set linetype 2 lc rgb 0x32CD32 #light green
Am Ende des Beitrages folgt noch der selbe Chart als Beispiel mit stärkerem Kontrast.
Die Kumo (=Wolke) ließ sich viel einfacher plotten als befürchtet: Dafür stellt Gnuplot die filledcurves
bereit. Die in den Spalten 9 bzw. 10 enthaltenen Daten für Senkou Span A bzw B lassen sich folgendermassen darstellen:
plot "dax_ichimoku.csv" using 0:9:10 with filledcurves above fill pattern 7 lt 2 title 'Kumo steigend', \
"dax_ichimoku.csv" using 0:9:10 with filledcurves below fill pattern 6 lt 4 title 'Kumo fallend'
Obiger Befehl füllt automatisch die Flächen zwischen den beiden Kurven mit unterschiedlichen Farben, je nachdem ob die Wolke steigend oder fallend verläuft. Einen letzten kleinen Trick musste ich für die Reihenfolge der Plots anwenden: werden alle Kurven nacheinander und die Wolke am Schluss geplottet, überlagert diese den gesamten Chart. Alle darunter liegenden Kurven werden verdeckt. Ich habe etwas mit Transparenz experimentiert, diese verfärbt aber natürlich auch alles darunter liegende. Deshalb plotte ich die Kurven in umgekehrter Reihenfolge: Erst Kumo, dann die restlichen Ichimoku Indikatoren und mit
replot "dax_ichimoku.csv" using 0:2:3:4:5:($5 < $2 ? 1 : 2):xticlabels(everyNth(0, 1, 5)) linecolor variable notitle with candles
schließlich die eigentlichen Candlesticks am Schluss. Der Rest des Plotskriptes ist relativ straightforward und dürfte mit etwas herumprobieren selbsterklärend sein. Die Struktur der .csv Datei habe ich oben erläutert, falls jemand eine Datei mit Beispieldaten haben möchte, einfach einen Kommentar hinterlassen oder eine Mail an
Abschließend noch der Schwenk zum neuen Handelssystem: Die Idee des Gefechts ist nun, die Skripte für Gnuplot automatisch generieren zu lassen. Analog dazu, wie die Anfragen an die MySQL Datenbank aus Textbausteinen zusammengesetzt werden, können auch die Plotskripte je nach Bedarf vom Programm zusammengebastelt werden. Grundsätzlich kann alles geplottet werden, wofür Daten generiert (oder importiert) werden. Auch für Depotauswertungen, Visualisierungen von Statistiken, Backtests usw. läßt sich Gnuplot hervorragend nutzen. Als Nutzer des Handelssystems will ich mit Gnuplot selber letztlich aber nicht weiter interagieren müssen, das System stellt (basierend auf der Konfigurationsdatei) das Skript aus fertigen Bauteilen zusammen, der Aufruf erfolgt automatisch, den Export der fertigen Grafikdatei erledigt Gnuplot auf Wunsch ebenso.
Das unten stehende lauffähige Beispiel stellt für alle zukünftigen Bemühungen zur Chartvisualisierung dabei die Ausgangsbasis dar.
Ganz zum Schluß noch ein Beispiel des selben Charts, in einer kontrastreicheren augenkrebsfreundlichen Variante (klicken zum Vergrößern):
Die bei meiner Recherche hilfreichsten Links und Quellen sind nachfolgend aufgelistet (Link Nr. 2 übrigens von John Bollinger himself):
http://gnuplot.sourceforge.net/demo/finance.html
http://stackoverflow.com/questions/36030346/remove-weekend-gaps-in-gnuplot-for-candlestick-chart
https://groups.google.com/forum/#!msg/comp.graphics.apps.gnuplot/M_ldKLSFXwg/FFeOPZ4MCccJ
http://stackoverflow.com/questions/24092212/gnuplot-candlesticks-and-boxwidth
http://www.gnuplot.info/demo/fillbetween.html
Und natürlich noch das komplette Skript, enjoy!
# (c) 2016 www.spare-time-trading.de
# feel free to modify this file to your needs
# no warranty if gnuplot eats your cat (or any other circumstances)
set title "DAX daily"
set label " www.spare-time-trading.de" at graph 0.021, 0.19 center rotate by 90
set terminal wxt size 800,600 enhanced
set grid
set lmargin 9
set rmargin 2
set linetype 1 lc rgb 0xCD5C5C #dark red
set linetype 2 lc rgb 0x32CD32 #light green
set style fill solid 0.25 border #style 1
set cbrange [-1:1]
unset colorbox
everyNth(countColumn, labelColumnNum, N) = \
( (int(column(countColumn)) % N == 0) ? stringcolumn(labelColumnNum) : "" )
set xtics rotate 90
set datafile separator ";"
set key autotitle columnhead
plot "dax_ichimoku.csv" using 0:9:10:xticlabels(everyNth(0, 1, 5)) with filledcurves above fill pattern 7 lt 2 title 'Kumo steigend', \
"dax_ichimoku.csv" using 0:9:10:xticlabels(everyNth(0, 1, 5)) with filledcurves below fill pattern 6 lt 4 title 'Kumo fallend', \
"dax_ichimoku.csv" using 0:6 with lines lt 3 lw 2,\
"dax_ichimoku.csv" using 0:7 with lines lt 7 lw 2,\
"dax_ichimoku.csv" using 0:8 with lines lt 2 lw 1
replot "dax_ichimoku.csv" using 0:2:3:4:5:($5 < $2 ? 1 : 2):xticlabels(everyNth(0, 1, 5)) linecolor variable notitle with candles
pause -1 "Hit any key to continue"
Comments powered by CComment