Die Neuimplementierung des Ichimoku Handelssystems schreitet gut voran. Die Auswertung der ersten Handelssignale ist programmiert, Zeit um die Ideen dahinter etwas zu rekapitulieren. Betrachtet man einen Chart, ist es für einen Menschen sehr intuitiv, das Kreuzen zweier Linien in diesem Chart zu erkennen. Tut man dies für Ichimoku mit seinen fünf Indikatoren, wird die Sache zwar aufwändiger, im Kern vergleicht man aber jeweils nur zwei Linien gleichzeitig. Der folgende Artikel dreht sich darum, wie ich versucht habe, dem Computer die selbe -eigentlich absolut triviale- Tätigkeit beizubringen.
Starten wir mit dem aktuellen DAX-Chart, ergänzt um die Ichimoku Indikatoren:
Easy-Piesi
Im Folgenden konzentriere ich mich auf die Schnittpunkte zwischen Tenkan-Sen und Kijun-Sen, also den roten und blauen Durchschnitten. Auf den ersten Blick erkennt man fünf Schnittpunkte (den Beginn des Charts Anfang Dezember lassen wir aussen vor), wobei Mitte April etwas uneindeutig scheint, da müsste man etwas tiefer in den Chart hineinzoomen (was an dieser Stelle nicht geht, da das Bild statisch ist ;)). Was charakterisiert jetzt einen Schnittpunkt? Intuitive Antwort: Linie 1 liegt zuerst unter Linie 2, dann an irgend einem Tag darüber. Das Signal am 25.2.2016 ist dafür wie aus dem Bilderbuch (klicken zum Vergrößern):
Der Tenkan-Sen kommt von unten und schneidet den Kijun-Sen, danach verläuft er oberhalb. Absolut kein Interpretationsspielraum. Dieser Artikel soll nicht das komplette Ichimoku System erklären, daher nur ganz kurz: dies ist ein Bullishes Signal. Da die Kreuzung unterhalb der Wolke erfolgt, wird es als schwaches Kaufsignal gewertet. Soweit so gut. Übersetzt man dieses Muster in einen Algorithmus, wäre eine naive Implementierung desselbigen:
Schleife über alle Handelstage:
|----Prüfung: Liegt heutiger Tenkan über dem Kijun?
|------- WENN NEIN: Abbruch, weiter mit nächstem Tag
|------- WENN JA:
|------- Prüfung: Lag gestriger Tenkan unter dem Kijun?
|--------------- WENN
JA: --> Signal gefunden!
|--------------- WENN
NEIN: Abbruch, weiter mit nächstem Tag
Not so easy-Piesi
So weit, so nicht gut. Betrachten wir nämlich folgende Fiesematente am 20.04.2016:
Genauer gesagt, den rechten Teil der Grafik, bevor Tenkan und Kijun auseinanderlaufen. Die Tage vorher verlaufen beide Indikatoren aufeinander. Für einen Menschen ist es relativ einfach festzustellen, ob eine Kreuzung vorliegt oder nicht, man geht gedanklich einfach "rückwärts" und schaut woher beide Indikatoren kommen. Der obige Algorithmus würde das Signal nicht finden. Mit einer kleinen Erweiterung kommt er aber auch mit solchen Situationen zurecht:
Schleife über alle Handelstage:
|--Prüfung: Liegt heutiger Tenkan über dem Kijun?
|----- WENN NEIN: Abbruch, weiter mit nächstem Tag
|----- WENN JA:
|---------Prüfung: Lag gestriger Tenkan auch über dem Kijun?
|----------- WENN JA: --> Abbruch, Tenkan verläuft bereits seit mehreren Tagen über Kijun
|----------- WENN NEIN: aktuellen Tag merken, gestriger Tenkan verlief also genau auf oder unter Kijun
|-------------- Schleife rückwärts von heute bis zurück zum ersten Handelstag
|----------------- Prüfung: Liegt der Tenkan an diesem Tag über Kijun?
|---------------------WENN JA: Abbruch, Tenkan verlief insgesamt über Kijun, dann auf Kijun und danach wieder über Kijun
|---------------------WENN NEIN:
|-------------------------Prüfung: Liegt Tenkan unter Kijun?
|-----------------------------WENN NEIN: Weiter rückwärts gehen, Tenkan liegt noch direkt auf Kijun
|--- -------------------------WENN JA: an oben gemerktem Tag haben wir ein Kaufsignal!
Ersetzt man in obigem Beispiel "Tenkan" durch "Indikator1" und "Kijun" durch "indikator2", hat man eine allgemeingültige "Definition" eines Golden Cross zwischen Indikator1 und Indikator2. Der selbe Algorithmus kann genutzt werden, um das Kreuzen von Kijun-Sen und Schlusskurs zu bestimmen, das Kreuzen von Senkou Span A und Senkou Span B und so weiter, und so fort. Analog läßt sich der Algorithmus zum Auffinden eines Death Cross formulieren, die Ausgangsbasis ist dann eben "liegt Indikator1 heute unter Indikator2". Wie man merkt, habe ich wenig bis gar keine Ahnung, wie man vernünftigen Pseudocode schreibt, deshalb im Folgenden der "richtige" C-Code, der für mein Handelssystem Golden und Death Crosses aller Art auffinden soll:
bool ichimoku_golden_X(unsigned int daynr, float *quotes_1, float *quotes_2)
{
extern parameter parms; // parms are declared global in ichinscratchy.c
unsigned int i;
// in general: bullish signal if indicator1 crosses indicator2 from below to above
// check if indicator1 today is above indicator2
if(quotes_1[daynr] > quotes_2[daynr])
{
// now check, if yesterdays indicator1 was also above indicator2
if(quotes_1[daynr-1] > quotes_2[daynr-1])
return false; // yeah it was, so definitely no golden cross
else
{
// much more interesting, yesterday we were below or equal indicator2
// so loop backwards until we find a indicator1 not equal to indicator2
for (i = daynr; i-- > 0 ; )
{
if(quotes_1[i] > quotes_2[i])
return false; // indicator1 was above indicator2, then eqal then above again
else if(quotes_1[i] < quotes_2[i])
return true; // ind1 was below ind2, then above (and maybe a couple of days equal)
// next i will be evaluated only if ind1 and ind2 were equal so far
}
}
return false;
}
else
return false; //no, indicator1 is below or equal indicator2
}
bool ichimoku_death_X(unsigned int daynr, float *quotes_1, float *quotes_2)
{
extern parameter parms; // parms are declared global in ichinscratchy.c
unsigned int i;
// in general: bearish signal if indicator1 crosses indicator2 from above to below
// check if indicator1 today is below indicator2
// close quotes must be shifted by 26 days,
if(quotes_1[daynr] < quotes_2[daynr])
{
// now check, if yesterdays indicator1 was also below indicator2
if(quotes_1[daynr-1] < quotes_2[daynr-1])
return false; // yeah it was, so definitely no death cross
else
{
// much more interesting, yesterday we were above or equal indicator2
// so loop backwards until we find a indicator1 not equal to indicator2
for (i = daynr; i-- > 0 ; )
{
if(quotes_1[i] < quotes_2[i])
return false; // indicator1 was below indicator2, then eqal then below again
else if(quotes_1[i] > quotes_2[i])
return true; // ind1 was above ind2, then below (and maybe a couple of days equal)
// next i will be evaluated only if ind1 and ind2 were equal so far
}
}
return false;
}
else
return false; //no, indicator1 is above or equal indicator2
Lockerungsübungen
So. Sehr trockener Beitrag bis hierher, wer bisher durchgehalten hat: Chapeau! Als Belohnung noch etwas Statusbericht und wie immer ein buntes Bild zum Angeben :-D
Für Kijun/Tenkan Cross und Kijun/Price Cross habe ich bereits alle Prüfungen programmiert, die "Hilfsfunktionen" zum Befüllen der Signal-Datenstruktur und Abspeichern derselbigen in der Datenbank funktionieren. Eine händische Abfrage der Datenbank nach Kijun/Tenkan-Crosses liefert folgendes Ergebnis:
(Die Auswertung lief über die letzten 100 Handelstage). Nebenbei, aus der Rubrik "Lernen durch Schmerz" bzw. "Knoten ins Taschentuch". Der Primärschlüssel DIESER Tabelle ist, abweichend von den bisher beschriebenen {date,symbol,name}. Es ist nämlich ohne weiteres möglich, mehr als ein Signal pro Tag und Symbol zu erhalten. Diese Erkenntnis kostete mich etwa 2h Fehlersuche und ist für den geneigten Blogleser kostenlos ;)
Die Plotroutine habe ich etwas erweitert, alle Signale können jetzt auch direkt im Chart angezeigt werden *trommelwirbel*:
An der genauen Darstellung der Signale werde ich noch etwas feilen, man sieht aber grob wo die Reise in etwa hingeht. Ich freue mich über alle Kommentare, insbesondere über den vorgestellten Algorithmus. Hat er Fehler? Gibt es Situationen in denen er versagen würde? Am Besten direkt ins Kommentarfeld unter diesem Beitrag, dann haben zukünftige Leser auch etwas davon.
Comments powered by CComment