Wie programmiert man? - Seite 306

 

Hallo,

Ich war nicht wirklich etwas mit den Funktionen zu bekommen, überprüfte ich sie unzählige Male ohne Erfolg so beschlossen, viele Print() Nachrichten in jeder Phase meines Codes zu schreiben, um zu sehen, wie weit es vor clonking out bekommt. Er kommt tatsächlich nicht bis zur Funktion GetLots und schlägt bei der Überprüfung meiner Kauf- und Verkaufskriterien fehl. Seltsamerweise habe ich diesen Teil des Codes nicht geändert, aber irgendetwas ist falsch - aber zumindest weiß ich jetzt, worauf ich mich konzentrieren muss!

 

Hallo zusammen,

Ich habe meinen Code heute früh getestet und er hat relativ gut funktioniert. Ohne den Code oder Backtest-Kriterien (wie Daten usw.) zu ändern, habe ich einen Backtest eine Stunde später und die Ergebnisse sind völlig anders, wie in keine Ergebnisse, was so überhaupt. Also im nur fragen, warum dies passiert ist? Zum Beispiel MT4 Konnektivität?

 

...

Wenn Sie keine Parameter geändert haben, überprüfen Sie Folgendes: Wenn Sie den Backtest ausführen, öffnen Sie die Registerkarte "Journal" und überprüfen Sie, ob dort einige Fehler angezeigt werden. Fehler bei der Ausführung von Aufträgen könnten die Ursache für fehlerhafte Ergebnisse sein. Überprüfen Sie auch, ob Ihre Kauf- und Verkaufskriterien "solide" sind, d.h. ob sie am gleichen Punkt eintreten.

crsnape@btinternet.com:
Hallo zusammen, ich habe meinen Code heute früh getestet und er hat relativ gut funktioniert. Ohne den Code oder die Backtest-Kriterien (wie Daten usw.) zu ändern, habe ich eine Stunde später einen Backtest durchgeführt, und die Ergebnisse sind völlig anders, d.h. es gibt keine Ergebnisse, was auch immer. Also im nur fragen, warum dies passiert ist? Zum Beispiel MT4 Konnektivität?
 

Ich erhalte keine Fehler in meinem Journal. Der erste Eintrag ist dieser:

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: erfolgreich geladen

Gefolgt von einer riesigen Liste von diesen:

2012.07.22 15:47:07 TestGenerator: unmatched data error (Volumenlimit 56304 am 2012.07.19 12:00 überschritten)

und dann schließlich:

2012.07.22 15:47:07 H4 Period EA inputs: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Aber danach nichts mehr.

Mein Test wurde vom 04.01.2012 - 21.07.2012 durchgeführt.

 

...

Dann haben Sie ein Problem mit den Eingabebedingungen (Ihr EA hat nie versucht, eine Order zu öffnen)

crsnape@btinternet.com:
Ich erhalte keine Fehler in meinem Journal. Der erste Eintrag ist dieser:

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: erfolgreich geladen

Gefolgt von einer riesigen Liste von diesen:

2012.07.22 15:47:07 TestGenerator: unangepasster Datenfehler (Volumenlimit 56304 am 2012.07.19 12:00 überschritten)

und dann schließlich:

2012.07.22 15:47:07 H4 Period EA inputs: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Aber danach kommt nichts mehr.

Mein Test wurde vom 04.01.2012 - 21.07.2012 durchgeführt.
 

Ja, es ist seltsam, weil es vorher Positionen eingegeben hat. Ich habe einige print() in meinem Code von Anfang bis Ende geschrieben und nichts wird in das Journal geschrieben, um sogar die Anfänge meines Codes aufzuzeichnen. Nicht einmal das hier, um zu prüfen, ob eine vorherige Position bereits auf dem aktuellen Balken geöffnet wurde:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST");

if (... Einstiegsbedingungen...

 

...

Wenn Ihr EA zu irgendeinem Zeitpunkt versucht hätte, eine Order zu öffnen, wäre dies im Journal vermerkt worden (Fehler oder nicht, das spielt keine Rolle - wenn es einen Fehler gab, wäre ein Fehler dort zu finden gewesen, wenn er eine Order geöffnet hätte, wäre dies dort vermerkt worden)

Da dort aber nichts steht, bedeutet das, dass Ihr EA nie dazu gekommen ist, tatsächlich einen Auftrag zu öffnen, und das kann nur passieren, wenn Ihre Bedingungen, die im EA erfüllt sein müssen, nie dazu kommen, tatsächlich einen Auftrag zu öffnen. Sie müssen also Ihre Bedingungen klären. Beginnen Sie mit der einfachsten Bedingung, von der Sie wissen, dass sie ausgeführt wird, und fügen Sie dann weitere Bedingungen hinzu. Auf diese Weise werden Sie in der Lage sein, den Schritt zu identifizieren, der Sie daran hindert, Aufträge zu öffnen

crsnape@btinternet.com:
Ja, es ist seltsam, weil es vorher Positionen eingegeben hat. Ich habe einige print() in meinem Code von Anfang bis Ende geschrieben und nichts wird in das Journal geschrieben, um auch nur die Anfänge meines Codes aufzuzeichnen. Nicht einmal diese eine, um zu überprüfen, ob eine vorherige Position bereits auf der aktuellen Bar geöffnet wurde:

wenn ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

wenn (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST");

wenn (... Eingangsbedingungen...
 

Ich habe ein paar weitere Print()s nach den if-Befehlen eingefügt, und ich denke, dass es an diesem Punkt fehlschlägt, insbesondere bei der roten Zeile, da mein Journal nach diesem Punkt aufhört zu drucken.

//--- GLOBALE VARIABLEN

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Ermitteln, ob die Order bereits im H4-Zeitblock platziert wurde

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Ermitteln, ob für den aktuellen Balken bereits eine Order erteilt wurde", HasOrderedGV);

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

if (GlobalVariableGet (HasOrderedGV) == false)

{

Ich habe diesen Code online gefunden und ihn in meinem Programm verwendet. Aber ich frage mich jetzt, ob es funktionieren wird. Die globale Variable barsGV ist als String deklariert, aber in der ersten Zeile wird sie auf 0 referenziert. Ist das richtig?

 

...

Dieser Code funktioniert beim ersten Mal gut

0 wird aus folgendem Grund getestet :

double GlobalVariableGet([/TD] [TD]string name)

"Gibt den Wert einer vorhandenen globalen Variable zurück oder 0, wenn ein Fehler auftritt"

Ein Fehler beim Abrufen des Wertes einer globalen Variable würde auftreten, wenn die globale Variable noch nicht erstellt wurde. Aber, wie gesagt, dieser Code ist OK, wenn er zum ersten Mal ausgeführt wird. Das Problem ist folgendes: Stellen Sie sich vor, Sie führen einen Test durch und die barsGV wird am Ende des Tests auf 5000 gesetzt. Nun führen Sie den EA erneut aus und die Balken werden immer kleiner sein als der barsGV-Wert (der immer noch 5000 beträgt). Er (der Code) muss anders geschrieben werden. Verwenden Sie etwas wie dies

GlobalVariableSet(barsGV,0);

in init(), und dann sollte es auch bei aufeinanderfolgenden Tests funktionieren. Aber es wird auch künstlich "so tun", als gäbe es keine geöffnete Order zum aktuellen Bar, wenn Sie den EA starten, was ein Fehler sein kann. Es ist viel besser, die Funktion zum Zählen der geöffneten Orders auf einem aktuellen Balken zu verwenden, als globale Variablen für diesen Zweck zu benutzen (aus mehreren Gründen)

________________________________________________

PS: Die Verwendung globaler Variablen verhindert, dass Sie mehrere Instanzen eines EAs verwenden können (jede globale Variable ist von einem anderen Code aus sichtbar - jeder Code : EA, Skript, Indikator ..., wenn also der Name nicht eindeutig ist, riskieren Sie eine Verwechslung von EAs, die alle dieselbe globale Variable zur gleichen Zeit lesen und setzen)

crsnape@btinternet.com:
Ich habe ein paar weitere Print()s nach den if-Befehlen eingefügt, und ich denke, dass es an diesem Punkt fehlschlägt, insbesondere bei der roten Zeile, da mein Journal nach diesem Punkt aufhört zu drucken.

//--- GLOBALE VARIABLEN

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Feststellen, ob die Order bereits im H4-Zeitblock platziert wurde

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Ermitteln, ob für den aktuellen Balken bereits eine Order erteilt wurde", HasOrderedGV);

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

if (GlobalVariableGet (HasOrderedGV) == false)

{

Ich habe diesen Code im Internet gefunden und ihn in meinem Programm verwendet. Aber jetzt frage ich mich, ob es funktionieren wird. Die globale Variable barsGV ist als String deklariert, aber in der ersten Zeile wird sie auf 0 referenziert. Ist das richtig?
 

Ahh... ich verstehe. Weil globale Variablen ihre Werte im Speicher speichern. Also, wie Sie sagen, wenn es beendet Backtesting und seine bei 5000 sagen, dies ist im Speicher gespeichert, auch wenn die Backtesting erneut ausgeführt wird, so dass es nie falsch zurückgeben, weil BarsGV nicht unter 5000 ist? Mein Gott, ist das tiefsinnig.

Und auch, wenn es einen Fehler erzeugt, setzt es HasOrderedGV auf false, so dass es mit dem Rest des Codes fortfahren kann?

Habe ich Sie richtig verstanden?

BTW- ist das erlaubt?

GlobalVariableSet(HasOrderedGV, false);

Weil im MQL4 Book steht:

datetime GlobalVariableSet([/TD] [TD]string name, double value)

Der zweite Wert in meiner Instanz ist bool nicht double?

Grund der Beschwerde: