Abenteuer eines Neulings - Seite 10

 
niko:
Dein Wunsch ist mir Befehl (ich wollte eigentlich "Überflieger" sagen, aber dann habe ich im Online-Wörterbuch nachgeschaut und anscheinend ist das eine unhöfliche Bemerkung, also vergiss es)

Ok. Ich habe nur einen kurzen Blick darauf geworfen, da Sie jetzt für meinen Geschmack etwas zu willkürlich vorgehen.

Sie haben Ihre Änderungen nicht auf die neueste Version meines Codes gestützt.

Daher habe ich keine Ahnung, ob die letzte Version meines Codes das tat, was Sie brauchten, bevor Sie anfingen, der vorherigen Version weitere Dinge hinzuzufügen.

Was mir aber aufgefallen ist, ist, dass direkt am Anfang der Funktion start() die öffnende geschweifte Klammer fehlt. Ich dachte, das hätten wir schon besprochen.

Sie müssen etwas Kontrolle ausüben. Wenn Sie etwas ändern wollen, dann fügen Sie Ihre Änderung in die neueste Version ein. Und lassen Sie uns wissen, was Sie ändern und warum Sie es tun.


CB.

 
niko wrote >>

Tim,

Ich habe den Code so weit gebracht, dass beim Kompilieren keine Fehler mehr gemeldet werden (ich habe nur ein paar Fehler behoben, die Sie hervorgehoben haben), auch wenn er im Strategietester noch keine Geschäfte macht. Aber ich bin über etwas verwirrt: ...

Hallo Nick,

Wenn ich mir Ihre Kommentare hier und einige der Änderungen, die Sie am Code vorgenommen haben, ansehe, vermute ich, dass Ihre "Verwirrung" auf eine Verwechslung zwischen Variablen und Funktionsparametern zurückzuführen ist. Sie sehen sehr ähnlich aus und verhalten sich auch so, aber in Wirklichkeit sind sie ganz unterschiedliche Wesen.


Vielleicht macht das folgende kommentierte Codebeispiel die Dinge etwas klarer.


Ich habe mir die Freiheit genommen, den Entwicklungscode etwas aufzuräumen und einige Funktionsparameternamen etwas zu ändern, um sie von anderen Variablen zu unterscheiden. Außerdem habe ich alle überflüssigen Anmerkungen, Kommentare usw. in einen "Anhang" am Ende der Datei verschoben, mit dem Sie nach Belieben verfahren können.

Der Code sieht gut aus. Es gibt noch ein paar Kleinigkeiten zu tun, die ich in der Datei als TODOs markiert habe, aber die Hauptaufgabe, die jetzt vor Ihnen liegt, ist das Debuggen und Testen.


Das Testen ist ein sehr wichtiger Teil des Entwicklungszyklus. Bei Handelssystemen kann ein unzureichendes Testen zu subtilen Problemen führen, die sich negativ auf Ihre Handelsstrategie und letztendlich auf Ihr Konto auswirken können. Die Hauptaufgabe beim Testen besteht darin, sicherzustellen, dass der Code das tut, was Sie von ihm erwarten. Dazu müssen Sie entweder aufschreiben oder sich selbst sagen: "In dieser Situation erwarte ich dieses Ergebnis". Dann entwickeln Sie einen Test und führen ihn durch, um zu sehen, ob dies auch tatsächlich geschieht. Wenn dies nicht der Fall ist, müssen Sie das Problem beheben. Sie wiederholen diesen Vorgang für alle wahrscheinlichen Situationen, die Sie sich vorstellen können, und vielleicht auch für einige unwahrscheinliche. Natürlich suchen Sie auch nach Laufzeitfehlern oder Bugs, die in den Fehlermeldungen des MetaTrader-Systems auftauchen können oder auch nicht.


Bei MT4 sind der Strategietester und die Protokolldateien (unter der Registerkarte "Journal") sowie die Funktionen "Ergebnisse", "Grafik" und "Bericht" Ihre wichtigsten Testwerkzeuge.


Bei der Protokolldatei finde ich es oft einfacher, die gesamte Datei in Microsoft Notepad zu öffnen, als zu versuchen, einen Teil der Datei über den Journal-Viewer zu betrachten. Vergessen Sie nicht, die Protokolldatei/das Journal vor jedem Durchlauf zu löschen, sonst sehen Sie am Ende eine Menge alter und vielleicht nicht mehr relevanter Informationen durch. Nach jedem Testlauf im Strategietester untersuchen Sie die Protokolldatei sowohl auf Debug-Anweisungen als auch auf Metatrader-Systemmeldungen. Sie können Ihre MetaTrader-Online-Dokumentation verwenden, um nach Fehlercodes für zusätzliche Informationen zu suchen. Verwenden Sie auch die Funktionen Ergebnisse, Grafiken und Berichte, um zu sehen, was das Programm unter bestimmten Bedingungen tut.


Tipp - Wenn Sie Ihre ersten Testläufe durchführen, halten Sie den Testzeitraum kurz, um die Datenmenge in der Protokolldatei zu minimieren.


Wir haben bereits einige Debug-Funktionen in den Code eingebaut, aber Sie werden diese wahrscheinlich noch erweitern müssen. Deaktivieren Sie bei Bedarf einzelne Debug-Anweisungen, um die Informationen in der Protokolldatei komprimiert und relevant zu halten. Im Code gibt es ein Beispiel dafür, wie man dies tun kann, ohne Debug-Anweisungen zu löschen oder auszukommentieren, was ziemlich zeitaufwändig sein kann. Ich lasse meine wichtigsten Debug-Anweisungen auf unbestimmte Zeit in der Programmdatei und schalte sie einfach alle mit dem DEBUG_ON-Flag im Programm aus, wenn ich mit dem Testen fertig bin.


Die effiziente Verwaltung der Protokolldateien und Debug-Anweisungen ist meiner Meinung nach der Schlüssel zu guten und effizienten Tests und Debugging in der MetaTrader-Umgebung. Ich habe in diesem Forum Leute gesehen, die sich über den Mangel an Debugging-Möglichkeiten in MetaTrader beschwert haben. Millionen von Zeilen kommerziellen Codes wurden erfolgreich debuggt und getestet, und zwar mit Einrichtungen, die nicht ausgefeilter sind als die, die Sie in MetaTrader finden. Diese Einrichtungen mögen zwar einfach sein, aber sie funktionieren gut, vorausgesetzt, man weiß, wie man sie richtig einsetzt.


Ein weiterer wichtiger Punkt ist, dass der Versuch, unordentlichen oder schlecht organisierten Code zu debuggen, sehr zeitaufwändig und frustrierend sein kann. Von diesem Punkt an werden Sie die Vorteile Ihres gut strukturierten und gut kommentierten Codes wirklich zu schätzen wissen. Wenn jemand anderes jemals an Ihrem Code arbeiten muss, wird er Ihnen für Ihre Bemühungen in dieser Hinsicht sehr dankbar sein.


Nick, diese Reise hat noch einen weiten Weg vor sich. Für mich ist das Testen, Debuggen und Optimieren - das "alles zum Laufen bringen" - der interessanteste Teil der Arbeit und oft auch die größte Herausforderung. Ich werde den Code an Sie weitergeben, damit Sie mit dem Testen beginnen können, und ich warte darauf, dass Sie sich bei Fragen und/oder Problemen, die Sie feststellen, bei mir melden.


Mit freundlichen Grüßen

Tim



Ein einfaches Codebeispiel, um den Unterschied zwischen einer globalen Variablen und einem Funktionsparameter zu verdeutlichen

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
stringMyGlobalVariable; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = "Nick"; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction(MyGlobalVariable); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment(MyFunctionParameter); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

 
hey CB, das ist seltsam, da ich die mq4-Datei immer als neu speichere, mit dem letzten Datum, um die anderen Dateien zu trennen. die Verwirrung muss durchgerutscht sein. die Klammer wollte ich einfügen, aber ich dachte, dass du mich irgendwann gebeten hast, sie zu entfernen (es war die letzte, aber ohne die letzte wäre die start() unausgewogen. deshalb habe ich die erste auch entfernt, aber ich füge sie wieder ein).
 
niko
hey CB, das ist seltsam, denn ich speichere die mq4 datei immer als neu ab, mit dem letzten datum, um die anderen dateien zu trennen. da muss wohl etwas durchgerutscht sein. die klammer wollte ich einfügen, aber ich dachte, du hättest mich gebeten, sie zu entfernen (es war die letzte, aber ohne die letzte wäre der start() unausgewogen. deshalb habe ich die erste auch entfernt, aber ich füge sie wieder ein).

Fangen wir nicht an, willkürlich Klammern hinzuzufügen oder zu entfernen. Ich hatte bereits darauf hingewiesen, dass Sie einen völlig überflüssigen Satz haben, der entfernt werden kann.

Hier ist die neueste Version. Bitte tun Sie Folgendes:

- Kompilieren Sie sie zuerst und beheben Sie etwaige Fehler - so wissen Sie, dass etwaige spätere Fehler auf Änderungen zurückzuführen sind, die Sie vornehmen.

- Teilen Sie mir mit, ob Sie irgendwelche Fehler beheben mussten oder nicht

- Probieren Sie es aus und sehen Sie, ob es das tut, was Sie brauchen

- Lassen Sie mich wissen, wie es läuft - und teilen Sie mir mit, welche Änderungen Sie Ihrer Meinung nach vornehmen müssen.


CB

Dateien:
 
Danke, CB. Ich kümmere mich darum, entschuldige, wenn ich dich ein wenig frustriert habe.
 

Danke, Tim,

Ich weiß es wirklich zu schätzen, dass Sie sich die Mühe machen, mir diese Dinge zu erklären, das ist sehr ermutigend. Ich habe den Eindruck, dass ich es mal verstehe und dann wieder nicht (in Bezug auf Funktionen und Aufrufe), obwohl ich die Dokumentation zu den Funktionen bestimmt schon zwanzig Mal gelesen habe. Ich werde mir mehr Zeit dafür nehmen. Was das "Testen und Debuggen" angeht, so habe ich dies bereits in einem anderen Paket getan (ich bin jeden getätigten Handel durchgegangen und habe sichergestellt, dass alles zusammenpasst), da ich dies für unerlässlich halte, sogar für den manuellen Handel(Strategietests). Ich werde mit Ihrem Code fortfahren und Ihnen Bescheid geben.

 
niko:
Danke CB. Ich kümmere mich darum, entschuldige, wenn ich dich ein bisschen frustriert habe.

Keine Sorge, Kumpel. Ich versuche nur, einen Schritt nach dem anderen zu machen.


CB

 

Hallo CB,


Ich habe ein paar Fehler im Code behoben, vor allem fehlende Klammern, die im Code hervorgehoben sind. Keine Syntaxfehler mehr.

ich habe den Code auf dem Strategietester ausgeführt, aber es werden nur KAUFEN-Trades durchgeführt. Keine Short-Trades überhaupt. Ich habe die Protokolle durchgesehen, es erzeugt den Fehler 130 (der mit den Stops zu tun hat), was also kein Licht auf unser Problem wirft.

Ich habe versucht, herauszufinden, wo der Fehler liegt (ich nehme an, er liegt in fnSHouldWeTrade oder fnOrderDuplicate).

Die neueste Version des Codes ist beigefügt, ich habe Werte zu TopFilter und BotFilter hinzugefügt, um der Strategie zu ermöglichen, Trades zu machen.

ps: ich habe herausgefunden, warum ich den alten Code für dich eingefügt habe, ich habe mt4 in einem anderen Ordner neu installiert (keine Verbindungsfehler) und der Code war ein altes Duplikat aus dem alten Ordner

 
niko:

Hallo CB,


Ich habe ein paar Fehler im Code behoben, hauptsächlich fehlende Klammern, die im Code hervorgehoben sind. Keine Syntaxfehler mehr.

ich habe den Code auf dem Strategietester ausgeführt, aber es werden nur KAUFEN-Trades durchgeführt. Keine Short-Trades überhaupt. Ich habe die Protokolle durchgesehen, es erzeugt den Fehler 130 (der mit den Stops zu tun hat), was also kein Licht auf unser Problem wirft.

Ich habe versucht, herauszufinden, wo der Fehler liegt (ich nehme an, er liegt in fnSHouldWeTrade oder fnOrderDuplicate).

Die neueste Version des Codes ist beigefügt, ich habe Werte zu TopFilter und BotFilter hinzugefügt, um der Strategie zu ermöglichen, Trades zu machen.

ps: ich habe herausgefunden, warum ich den alten Code für dich eingefügt habe, ich habe mt4 in einem anderen Ordner neu installiert (keine Verbindungsfehler) und der Code war ein altes Duplikat aus dem alten Ordner


Ändern:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point, "Nikos First EA",0,0,Red);

bis:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point, "Nikos First EA",0,0,Red);


CB

 
Danke CB, das hätte ich bemerken müssen, so dass der Fehler am Ende richtig war (130).