Anleitung MetaTrader Indikator-Schnitt zwischen 2 Bars by shck — Sonntag, 04. Juli 2010 —

Bei meiner letzten Projektarbeit ist mir ein merkwürdiges Phänomen aufgefallen.
Für einen Alert sollten Stochastic-Schnitte >80 und <20 mit in die Berechnungen einfließen.

Das ist gar nicht so einfach, da man einen Schnitt nicht einfach so ermitteln kann, weil dieser genau zwischen 2 Bars liegt!

Den Schnitt habe ich (näherungsweise) durch ein paar (If-)Abfragen versucht abzugreifen:

extern int K_Period        = 5;
extern int D_Period        = 3;
extern int Slowing_Period  = 3;
extern int SC_MA_Methode   = 1;  // MODE_SMA = 0 | MODE_EMA = 1 | MODE_SMMA = 2 | MODE_LWMA = 3
extern int SC_Preisfeld    = 1;  // price_field = 0 = Low/High | price_field = 1 = Close/Close

...

SCM = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_MAIN, i);
SCM_1 = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_MAIN, i+1);

SCS = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_SIGNAL, i);
SCS_1 = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_SIGNAL, i+1);


if ((SCM_1>=SCS_1 && SCM<=SCS) &&  // Hiermit wird generell ein Schnitt abgefragt
  ((SCM_1>=SC_Sell && SCM>=SC_Sell) || (SCM_1<=SC_Sell && SCM>=SC_Sell) || (SCM_1>=SC_Sell && SCM<=SC_Sell)) &&
  ((SCS_1>=SC_Sell && SCS>=SC_Sell) || (SCS_1<=SC_Sell && SCS>=SC_Sell) || (SCS_1>=SC_Sell && SCS<=SC_Sell))
  ) {
  ...
}

Schritt für Schritt muss man sich an alle möglichen Szenarien rantasten, zuerst soll ein Pfeil für ein "Schnitt" erfolgen,
wenn die Stoch- und die Signal-Linie vor und nach dem Cross >= 80 sind, damit ist sichergestellt, dass der Cross >80 stattfindet.
Bestätigt wird dies aber erst zum Open nach dem Schnitt, da man sonst nicht mit Gewissheit sagen kann, dass er eindeutig stattgefunden hat.

Leider werden so viele Schnitte nicht angezeigt, auch wenn die Schnitte bei >80 stattgefunden haben,
da bspw. die Stoch-Linie vor dem Schnitt <80 war und nach dem Schnitt >80, dies gilt auch für die Signal-Linie.

Also wurden diese Bedingungen oben mit eingefügt. Zusätzlich wurde noch die Möglichkeit einbezogen,
dass die Stoch-Linie vor dem Cross >80 und nach dem Cross <80 ist (Signal-Linie das gleiche Spiel),
da dort auch ein Cross >80 erfolgen könnte.

Trotz obiger Bedingungen hat man nicht den korrekten Schnitt ermittelt, nachfolgend ein Beispiel:

Das Fragezeichen zeigt ein Cross mit Pfeil an, dies ist aber nicht korrekt, wenn man ganz genau auf den Stochastic-Indikator schaut.

Der Stoch-Wert ist vor dem Schnitt >80 und die Signal-Linie liegt auch über 80.
Im nächsten Bar sind die beiden Werte so stark abgefallen,
dass es zwar zu einem Cross kommt, aber dieser liegt unter 80.

Und nun beginnen die Probleme: Wie kann man den Cross eindeutig zwischen den Bars ermitteln?

Nach einigem Grübeln ist mir aufgefallen, das die Verbindung der Indikator-Punkte zwischem dem Bar
vor und nach dem Schnitt einer Geraden gleichkommt. Mehr ist es im Grunde auch nicht.

Jetzt könnte man mit den Geraden-Funktionen (wenn man diese erstmal ermittelt hat) einen Schnittpunkt eruieren.

          y2-y1                 y2-y1
f(x) = ———— · x + y1 - ———— · x1
          x2-x1                x2-x1

Obige Formel wird einmal für die Stoch- und einmal für die Signal-Linie angewendet
und beide gegenübergestellt, um x herauszufinden, was dem Zeitpunkt des Schnittpunktes entspräche.

Der Zeitpunkt ist eigentlich unerheblich, da er zwischen den beiden Bars stattfindet, wichtig ist nur
der Wert des Schnittpunktes, deswegen haben ich die X- und Y-Achse getauscht, sodass man gleich den Schnittpunkt erhält.

y1 wäre dann nicht mehr der Wert 93,5872 sondern 1 (habe ich mir ausgedacht) auf der X-Achse,
y2 wäre dann statt 55,3663 der Zeitpunkt 2, ist am Einfachsten, wenn man einen fiktiven Zeitwert nimmt

                  2-1                                    2-1
f(x) = —————————— · x + 1 - —————————— · 93,5872
          55,3663-93,5872              55,3663-93,5872

f(x) = -0,0261·x + 3,4485  //wäre die Funktion für die Stoch-Gerade zw. den beiden Bars
                                      //für die Signal-Linie macht man das auch und stellt die Funktionen gegenüber, um den Schnittpunkt zu erhalten.

Im Metatrader soll das automatisch erfolgen, deswegen wurde von mir die Formel auch schon umgestellt:

SCxy[i] = ((1-MathPow(SCS-SCS_1, -1)*SCS_1)-(1-MathPow(SCM-SCM_1, -1)*SCM_1))*MathPow((MathPow((SCM-SCM_1), -1)-MathPow((SCS-SCS_1), -1)), -1);

Obige Formel errechnet den exakten Schnittpunkt der zwei Geraden. *Mächtig stolz auf mich bin*
(Der Metatrader hat Probleme mit "1/"-Division usw., deswegen wurde die Formel (mit MathPow) umgeschrieben.)

Der errechnete Wert liegt unter 80 und somit ist an der besagten (Fragezeichen-)Stelle "kein Pfeil" korrekt.

Die Abfrage des Schnittpunktes für die Pfeildarstellung ist jetzt auch etwas übersichtlicher:

SCM = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_MAIN, i);
SCM_1 = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_MAIN, i+1);

SCS = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_SIGNAL, i);
SCS_1 = iStochastic(NULL, 0, K_Period, D_Period, Slowing_Period, SC_MA_Methode, SC_Preisfeld, MODE_SIGNAL, i+1);

SCxy[i] = ((1-MathPow(SCS-SCS_1, -1)*SCS_1)-(1-MathPow(SCM-SCM_1, -1)*SCM_1))*MathPow((MathPow((SCM-SCM_1), -1)-MathPow((SCS-SCS_1), -1)), -1);

if ((SCM_1>=SCS_1 && SCM<=SCS) && (SCxy[i]>=SC_Sell)) {
  ...
}