In einem früheren Beitrag bin ich auf Golden und Death Crosses diverser Indikatoren eingegangen, bzw. wie man die Erkennung eines solchen in einem Computerprogramm abbildet. Versucht man Ichimoku in einem solchen Programm zu implementieren, kommt man schnell vom Hundersten ins Tausendste. Anlass dieses Blogposts ist ein Detail, dass mir bei der ursprünglichen Implementierung durch die Lappen gegangen ist, auf das ich aber beim Neuschreiben des Handelssystems gestoßen bin.

 Während Golden/Death Crosses von Kijun/Tenkan, Senkou A und B, Kijung mit Preis usw. nach dem in obigen Beitrag beschriebenen Algorithmus bestimmbar sind, ist beim Kreuzen von Chikou Span und Preis eine Besonderheit zu beachten: es genügt nicht, dass sich Chikou und Preis kreuzen. Für ein Golden Cross muss Chikou selber STEIGEN. Es genügt nicht, dass der Preis fällt und Chikou beispielsweise seitwärts läuft oder gar selber fällt. Im alten System habe ich über diese Feinheit großzügig hinweggesehen (bzw. ich habe einfach vergessen, es zu berücksichtigen). Möglicherweise wurden für den Live-Test Werte gekauft, deren zugrundeliegendes Kaufsignal eigentlich nicht gültig war. Shame on me.

Nun, woher weiss das Programm ob Chikou steigt, seitwärts löuft oder fällt? Ein einfacher Vergleich Chikou heute vs.Chikou gestern ist nicht wirklich aussagekräftig, insbesondere in der derzeitigen Situation hoher Volatilität. Also entschied ich mich, eine längere Periode zu betrachten, in diesem Fall die letzten 5 Tage (= Schlusskurse). Durch diese fünf Schlusspunkte läßt sich eine Regressionsgerade legen, d.h. eine Gerade welche die Eigenschaft hat, von allen möglichen Geraden diese 5 Punkte am Besten zu approximieren. Die Steigung dieser Geraden interpretiert das System also nun als Trend des Chikou Indikators. Werte größer 0 bedeuten einen steigenden Chikou, Werte kleiner 0 einen fallenden Chikou. Um einen seitwärts verlaufenden Chikou besser "einzufangen" änder ich die Definition geringfügig und definiere, dass eine Steigung größer 0,05 einen steigenden, kleiner -0,05 einen fallenden und zwischen -0,05 und 0,05 einen seitwärts verlaufenden Chikou bedeutet.

Aus der Berechnung des Chikou kann man nun eine Wissenschaft machen, oder man bemüht einfach Wikipedia, in dem die korrekte Formel bereits fix und fertig hergeleitet ist:

b={\frac  {SS_{{xy}}}{SS_{{xx}}}}={\frac  {{\frac  {1}{n}}\sum \limits _{{i=1}}^{n}(x_{i}-{\bar  x})(y_{i}-{\bar  y})}{{\frac  {1}{n}}\sum \limits _{{i=1}}^{n}(x_{i}-{\bar  x})^{2}}}={\frac  {\sum \limits _{{i=1}}^{n}(x_{i}-{\bar  x})(y_{i}-{\bar  y})}{\sum \limits _{{i=1}}^{n}\left(x_{i}-{\bar  x}\right)^{2}}}={\frac  {n\sum \limits _{{i=1}}^{n}x_{i}y_{i}-\sum \limits _{{i=1}}^{n}x_{i}\sum \limits _{{i=1}}^{n}y_{i}}{n\sum \limits _{{i=1}}^{n}x_{i}^{2}-\left(\sum \limits _{{i=1}}^{n}x_{i}\right)^{2}}} (Quelle: wikipedia.de)

Die x-Werte sind in diesem Fall das Datum, genauer gesagt die Anzahl der Tage seit dem 01.01.1900 (diese Umrechnung macht es möglich, verschiedene Daten miteinander zu vergleichen, Durchschnitte zu berechnen etc.-> vielleicht sollte ich darüber auch mal einen Beitrag verfassen). Die y-Werte sind die Chikou-Werte (bzw. die Werte für einen beliebigen Indikator, ich bemühe mich ja, halbwegs portablen und wiederverwendbaren Code zu schreiben :)). Für meine Zwecke am Besten geeignet schien mir die Formulierung Nr. 3 (bzw. die zweite von rechts). Das Ganze übersetzt in C-Code:

for(i=daynr-5; i< daynr; i++)    
    {
        daysum = daysum + get_daynr_from_bstr(theIndicator->dates[i]);
        quotesum = quotesum + theIndicator->quotes[i];
    }
    avg_daynr = (float) daysum / 5;
    avg_quote = quotesum / 5; 
    
    for(i=daynr-5; i< daynr; i++)
    {
        numerator= numerator + \
            ( ((float) get_daynr_from_bstr(theIndicator->dates[i])- avg_daynr)* \
            (theIndicator->quotes[i] - avg_quote));
        denominator = denominator + \
            (((float) get_daynr_from_bstr(theIndicator->dates[i]) - avg_daynr)* \
            ((float) get_daynr_from_bstr(theIndicator->dates[i]) - avg_daynr));
    }
    slope = numerator / denominator;
    if(slope > 0.05) // TODO: make the "tolerance level" configurable
        return uptrend;
    else if (slope < -0.05)
        return downtrend;
    else
        return sideways;

Sobald Backtests möglich sind, werde ich sowohl mit der "Toleranzschwelle" für Seitwärtstrends als auch mit der Anzahl zu berücksichtigender Tage experimentieren. Fürs Erste läuft es aber stabil, im Vergleich mit der Bewertung von Charts durch "Scharfes Hinsehen" macht die beschriebene Methode ihren Job ganz gut. Der selbe Code sollte sich eigentlich auch eignen, z.B. Divergenzen im RSI aufzuspüren (auch wenn das jetzt noch alles Zukunftsmusik ist, aber man darf ja schonmal Pläne haben).

Für das Vorliegen eines Chikou Golden Cross muss nun das Vorliegen eines Golden Cross (wie das funktionert habe ich hier beschrieben) festgestellt werden und danach geprüft werden, ob der Chikou auch tatsächlich steigt. Die letzte Funktion heisst indicator_trend und ist oben beschrieben (weggelassen habe ich die Deklarationen). Zu guter Letzt der komplette Code für ein Chikou Golden Cross:

         if(ichimoku_golden_X(daynr, chikou->quotes, close->quotes) && indicator_trend(daynr, chikou)==uptrend)
            {
                Chikou_Span_Cross-> date= bstrcpy(close-> dates[daynr+parms.ICHI_PERIOD_MID]);
                Chikou_Span_Cross-> type= longsignal;
                Chikou_Span_Cross-> amp_info= bstrcpy(chikou->dates[daynr]);
                Chikou_Span_Cross-> indicator_quote = chikou->quotes[daynr];
                Chikou_Span_Cross-> price = close->quotes[daynr];
                switch(kumo_trend)
                {
                    case uptrend:
                        Chikou_Span_Cross->strength = strong;
                        break;
                    case downtrend:
                        Chikou_Span_Cross->strength = weak;
                        break;
                    case sideways:
                        Chikou_Span_Cross->strength = neutral;
                        break;
                }
                mysql_update_signal(symbol, Chikou_Span_Cross);

ToDo: Artikel mit ein paar Bildern anreichern, da ich grad in den US of A unterwegs bin, bin ich zeitlich und IT-mäßig eingeschränkt.

Comments powered by CComment