Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Indikatorwert aus der Vergangenheit

Geschrieben

Hallo, :vibration:

 

einen Indikatorwert aus der Vergangenheit kann man leicht ermitteln wenn man genau weiss um welche Periodenanzahl er zurück liegt. Kann man dies aber auch tun wenn die Zeit variabel ist und der Zeitpunkt an ein Ereignis geknüpft ist.

Z.B. Zwei gleitende Durchschnitte, und ich möchte den Wert eines MA zum Zeitpunkt der Kreuzung der beiden MA haben. Und dies solange bis es wieder erneut zum kreuzen der beiden MA kommt.

Nur ist dies ja zeitlich jeweils unterschiedlich. Gibt es da Lösungen?

 

Hoffe meine komische Frage ist allgemeinveständlich formuliert.

Featured Replies

Geschrieben
...

einen Indikatorwert aus der Vergangenheit kann man leicht ermitteln wenn man genau weiss um welche Periodenanzahl er zurück liegt. Kann man dies aber auch tun wenn die Zeit variabel ist und der Zeitpunkt an ein Ereignis geknüpft ist.

Z.B. Zwei gleitende Durchschnitte, und ich möchte den Wert eines MA zum Zeitpunkt der Kreuzung der beiden MA haben. Und dies solange bis es wieder erneut zum kreuzen der beiden MA kommt.

Nur ist dies ja zeitlich jeweils unterschiedlich. Gibt es da Lösungen?

 

Hoffe meine komische Frage ist allgemeinveständlich formuliert.

 

keine komische Frage, du bist dir nur nicht im Klaren, ob 1. die gewünschte Logik realisierbar ist und wenn ja, dann 2. wie man sowas angehen könnte.

zu 1. aber sicher doch

zu 2. schaun wir mal ...

 

Erstmal muss klar sein, was wir unter 'Zeitpunkt der Kreuzung' verstehen. Das kann je nach Logik variieren und auch zur Laufzeit dynamisch ausgelegt werden.

--> erster Fx-Wert, wo sich die vertikale Anordnung beider MA gegenüber der vorherigen Kerze geändert hat.

Für solche Sachen habe ich immer ein 'MinDiff' als Abstand zwischen beiden MAs, der vom aktuellen Markt abhängig ist, aber obiges dürfte hier erstmal genügen.

 

Weiterhin nehme ich an, dass du diese Informationen in einem EA in Erfahrung bringen möchtest und die MAs auch dort erstellt werden. Sind diese MAs dagegen in einem Indikator, kannst du diese

einfach via iCustum unter Angabe des entsprechenden Modes (== BufferNr) auslesen. Weitere Annahme: Berechnung auch bei Werten zwischen Candle-Open und Candle-Close.

 

Da du den Wert eines MAs zum Zeitpunkt der Kreuzung haben möchtest, liegt es Nahe diesen zum Kreuzungszeitpunkt einfach abzuspeichern.

Allerdings birgt das eine Unwägbarkeit, die berücksichtigt werden muss. D.h. für den Fall, dass wieder 'zurückgekreuzt' wird und der notierte

Zeitpunkt somit später nicht mehr im Chart zu sehen ist wird zusätzlich der vorherige Wert gesichert (prevCrossingValMA1).

Eine andere Variante, also vom aktuellen Zeitpunkt Kerze für Kerze zurückzulaufen bis zur Kreuzung

ist nicht wirklich elegant und kostet sehr viel Performance.

 

Wenn du im EA also beide MA-Werte berechnest und auf Kreuzung prüfst dann im Falle der Fälle die Werte abspeichern.

Es würde auch genügen nur die Zeit zu speichern, nur würde man dann durchgehend mit Candle-Close Daten hantieren.

 

#define STATE_NEUTRAL 0
#define STATE_GREEN   1
#define STATE_RED     2
...
datetime MACrossing, prevMACrossing;
double   prevCrossingValMA1, crossingValMA1;
double   MA1_0,  MA2_0;
int      currentMAState;

MA1_0 = iMA( ... );
MA2_0 = iMA( ... );

// Kreuzungsbedignung für LONG
if((MA1_0 >= MA2_0) && STATE_RED) {
// Rückkreuzungsbedingung
if(Open[0] < MACrossing) {
  MACrossing = prevMACrossing;  
  prevCrossingValMA1 = crossingValMA1;
} else {
 prevMACrossing = MACrossing;
 MACrossing = Time[ii];
 crossingValMA = MA1_0;
 currentMAState = STATE_GREEN;
}
}
// Kreuzungsbedignung für SHORT
else if((MA1_0 < MA2_0) && STATE_GREEN) {
// Rückkreuzungsbedingung
if(Open[0] < MACrossing) {
 MACrossing = prevMACrossing;
 prevCrossingValMA1 = crossingValMA1;
} else {
 prevMACrossing = MACrossing;
 MACrossing = Time[ii];
 crossingValMA = MA1_0;
 currentMAState = STATE_RED;
}
}

 

Da nicht ausschliesslich Candle-Close betrachtet wird werden bis zum Rückkreuzen (und somit dem invalidate der Kreuzung) neue Werte für MA1 geliefert,

nach dem Rückkreuzen wieder die voherigen, da dorthin zurückgesetzt wurde. Das ist nicht schön, lässt sich aber nicht ändern, ausser man nutzt nur Candle-Close.

Das ist grundsätzlich auch zu empfehlen! Der obige Code ändert sich dann nur in der Rückkreuzungsbedingung. Vielleicht sind ein paar Flüchtigkeitsfehler im Code

und die Validierung von Signalen packe ich immer in eine Art Revalidierungs-Funktion, aber das sind dann Details ...

 

:vibration: :vibration: :ph34r:

Geschrieben
  • Autor

Hallo Maerl,

 

danke für die ausführliche Antwort. Da brauche ich erstmal etwas Zeit dies zu verarbeiten.

Ein paar Fragen habe ich jetzt schon:

 

Wofür ist "currentMAState" ?

 

Und sehe ich das richtig, crossingValMA liefert den Wert des MA zum Zeitpunkt der Kreuzung solange bis es eine neue Kreuzung gibt?

Geschrieben
Und sehe ich das richtig, crossingValMA liefert den Wert des MA zum Zeitpunkt der Kreuzung solange bis es eine neue Kreuzung gibt?

 

genau.

 

currentMAState == letzter ermittelter Signalwert.

Zwei Flüchtigkeitsfehler hab ich gesehen, currentMAState muss natürlich mit in die entsprechende Bedingung aufgenommen werden und Abprüfung der Crossing-Time mit Time und nicht Open.

 

#define STATE_NEUTRAL 0
#define STATE_GREEN 1
#define STATE_RED 2
...
datetime MACrossing, prevMACrossing;
double prevCrossingValMA1, crossingValMA1;
double MA1_0, MA2_0;
int currentMAState;

MA1_0 = iMA( ... );
MA2_0 = iMA( ... );

// Kreuzungsbedignung für LONG
if((MA1_0 >= MA2_0) && (currentMAState == STATE_RED)) {
// Rückkreuzungsbedingung
if(Time[0] < MACrossing) {
MACrossing = prevMACrossing;
prevCrossingValMA1 = crossingValMA1;
} else {
prevMACrossing = MACrossing;
MACrossing = Time[ii];
crossingValMA = MA1_0;
currentMAState = STATE_GREEN;
}
}
// Kreuzungsbedignung für SHORT
else if((MA1_0 < MA2_0) && (currentMAState == STATE_GREEN)) {
// Rückkreuzungsbedingung
if(Time[0] < MACrossing) {
MACrossing = prevMACrossing;
prevCrossingValMA1 = crossingValMA1;
} else {
prevMACrossing = MACrossing;
MACrossing = Time[ii];
crossingValMA = MA1_0;
currentMAState = STATE_RED;
}
}

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.