Mittwoch, 3. Februar 2010

Fehleranalyse - isNewDay()

Bevor es die nächstes Wochen mit konkreten Themen weiter geht kurz ein Fehlerquiz. Seit heute handel ich ein und dieselbe Strategie auf 3 Märkten, das hei0t ich habs versucht. Durch eine Codeumstellung wurde immer nur ein Markt gehandelt, obwohl Signale für alle drei vorhanden waren. 2 Märkte hatte ich schonmal parallel mit einer Strategie gehandelt, aber 3? Sollte es daran liegen, oder doch an folgendem Code:

Code aus der Strategie, um festzustellen, ob ein neuer Tag angefangen hat. Es wird eine Variable schonGetradet (zurück-)gesetzt, so dass ich damit sicherstellen kann, jeden Tag definitiv nur einen Trade auszuführen:












Code aus UserDefinedMethods.cs, um in einer Oberklasse zentrale Methoden zu verwalten, die alle Strategien verwenden können. Hier wird die von der Subklasse aufgerufene Methode isNewDay() implementiert:

















Wo ist der Fehler und warum wird nur ein Markt gehandelt und nicht alle 3 Signale, die es gestern und heute mit derselben Strategie gab?


Die Auflösung gibt es die nächsten Tage, wer möchte kann mit raten :-)

Beste Grüße
DarthTrader


UPDATE und AUFLÖSUNG:

Gerd hat recht newDay ist eine Klassenvariable und keine Instanzvariable. Deswegen existiert sie nur einmal. Zudem ist sie als private deklariert und wird demzufolge nicht mit vererbt. Ein Deklaration von

protected int newDay = -1

könnte das Problem lösen. Allerdings habe ich mich für die sicherere Variante entschieden und meinen Code wieder auf das hier geändert ...

if (ToDay(Time[0]) != ToDay(Time[1])) { ... }

... um weitere Fehler vorerst zu vermeiden.

Für Fortgeschrittene in Sachen Programmierung: Sicherlich gibt es auch Situationen, in denen die Fehler-Variante von oben von mehr als einer Strategie aufgerufen werden kann, aber sicher ist es nicht. Stichwort hierbei ist "Thread-Sicherheit", denn obiger Code ist nicht synchronisiert (vorr. in C# ist es ähnlich wie in Java :-)

1 Kommentar:

Anonym hat gesagt…

Ich würde schätzen, dass die Variable newDay von den drei Strategien "global" genutzt wird. Der Aufruf von isNewDay durch die erste Strategie setzt newDay auf den aktuellen Tag. Danach ruft Strategie2 die Funktion auf während newDay noch auf dem aktuellen Tag steht. Daher wird für die zweite und dritte Strategie false zurück gegeben... Fiese Sache...

Habe selber an der Stelle Variablen deklariert doch bisher zum Glück nicht gleichzeitig in unterschiedlichen Strategien benutzt...

Lol das muss ich ändern :-) Dort speicher ich Tages Hoch und Tiefsstände. Nicht auszudenken, wenn ich ein und die selbe Strategie gleichzeitig auf zwei unterschiedliche Basiswerte anwende... Ich muss los... ;-)

Gruß,
Gerd

Kommentar veröffentlichen

Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.