Über den Kodierungsstil - Seite 2

 

Hier müssen Sie sich für eines von zwei Dingen entscheiden:

1) Einfaches Schreiben und leichte Lesbarkeit des Codes.

2) Die Geschwindigkeit der Programmausführung.

Ich persönlich habe immer die zweite Option bevorzugt, also versuche ich, alle Variablen global zu deklarieren und, wenn möglich, keine Funktionen zu verwenden (die Auswirkungen auf die Rechengeschwindigkeit habe ich schon vor langer Zeit bemerkt). Sie müssen sich darüber im Klaren sein, dass der Expert Advisor 24 Stunden am Tag auf Ihrem Computer läuft, manchmal muss er optimiert werden und so weiter. Daher sind die Geschwindigkeit der Berechnungen und ein geringer Ressourcenverbrauch sehr wichtig.

Sehen wir uns nun die verschiedenen Programmiersprachen von außen an. Basic zum Beispiel ist einfach zu programmieren und leicht zu lesen, aber die Rechengeschwindigkeit... Nun wollen wir C++ damit vergleichen. Hier haben sich die Pole bereits verschoben - es ist schwieriger zu kodieren (die Lesbarkeit des Codes hat sich verschlechtert), aber die Berechnungsgeschwindigkeit hat sich stark erhöht. Und wenn Sie Assembler nehmen, ist der Code fast unlesbar.

Eine andere Sache ist, dass es seltsam ist, wenn ein Programm, das in der gleichen Sprache geschrieben wurde, auch unter diese Kriterien fällt und sich entscheiden muss - entweder die Lesbarkeit des Codes oder die Geschwindigkeit der Ausführung des Programms (obwohl es nichts Seltsames ist, eine Variable zu deklarieren - zeitaufwendig; eine Funktion aufzurufen und ihr Parameter zu übergeben - zeitaufwendig). Aber es ist eine Tatsache, die übrigens nicht nur bei mql4... festgestellt wurde.

 

Ich bevorzuge Ersteres - vielleicht weil ich in MQL4 noch nicht auf Fälle gestoßen bin, in denen meine Berechnungen so umfangreich sind, dass ich zwischen Lesbarkeit und Geschwindigkeit wählen muss. Ich spiele nicht mit Ticks, also brauche ich auch keine verrückte Rechengeschwindigkeit.

Andererseits ist es schwer, sich einen EA vorzustellen, den ich später nicht modifizieren muss.

 
Mathemat >> :

Ich spiele nicht gegen Zecken.

Hier zeichnen sich bereits einige Merkmale ab. Ich stimme absolut zu - wenn man zu Eröffnungspreisen spielt, dann muss sich die Programmarchitektur ändern. Wenn man zum Beispiel zu Eröffnungskursen spielt, macht es keinen Sinn, Variablen auf globaler Ebene zu deklarieren und sie im Speicher zu halten, bis der nächste Balken erscheint.

Der Kodierungsstil eines Programms muss dem Verwendungszweck angemessen sein. Obwohl die Kodierungsregeln überall gleich sind (Funktionen, Variablen usw.), hängt die Häufigkeit und Art der Verwendung dieser Regeln im Programmcode von den spezifischen Endaufgaben ab - für welche Berechnungen das Programm verwendet wird. Jeder Fall der Verwendung von Kodierregeln erfordert einen anderen Ansatz.

 

Sehr empfehlenswert: http://astyle.sourceforge.net/ ist ein C-Text-Formatierer, leistet aber hervorragende Arbeit mit MQ4.

ein einziger Befehl: AStyle.exe -b -t -p before.mq4 macht aus "gepacktem" Text ein Bonbon


 

Ein ähnliches Dienstprogramm wurde vor langer Zeit von den Forumseigentümern hier angeboten, entweder hier oder auf metaquotes. Aber jetzt brauchen Sie nicht mehr danach zu suchen, danke Sergey. Und der Designstil ist derselbe, den ich selbst bevorzuge.

 

Ich habe mich einmal gefragt, welchen Programmierstil ich wählen soll. Da ich wenig Erfahrung hatte, löste ich das Problem einfach, indem ich den FreeBSD-Quellcode öffnete und mir genau ansah, welchen Stil die Programmierer der alten Schule verwendeten. Damals erschienen mir einige Dinge unbequem, aber jetzt verstehe ich, warum sie sich für solche Lösungen entschieden haben.

Hier sind also die Regeln, nach denen ich schreibe:

int main()

{

int sum;

for(int i=0;i<100;i++){

sum+=i;

Print("Число равно:", i);

}

return(0);

}

1. Bei Funktionen gebe ich für geschweifte Klammern immer separate Zeilen an. In Schleifen/Bedingungen setze ich die erste geschweifte Klammer in die erste Zeile.

2. Ich hasse die sehr verbreitete Art, geschweifte Klammern auf diese Weise zu setzen:

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

//----

return(0);
}
//+------------------------------------------------------------------+

Kommentare //---- - Ich verstehe das überhaupt nicht.

3. Ich versuche, eine Variable für Iterationen in der Schleife selbst zu deklarieren

4. Ich verwende gerne Funktionen, ich versuche, ein Programm in viele Teile zu unterteilen. Aber es gibt keine starre Vorgabe von 20 Zeilen pro Funktion. Ich glaube, dass eine Funktion eine lokale Aufgabe erfüllen muss. Die Aufgaben sind manchmal groß, manchmal nicht so groß, so dass die Funktion unterschiedlich ist.

5. Ich verwende Funktionen innerhalb einer Funktion:

res=OrderSend(Symbol(),OP_BUY,GetVolume(GetPrice(OP_BUY),GetStopLossLevel(GetPrice(OP_BUY))),GetPrice(OP_BUY),3,GetStopLossLevel(GetPrice(OP_BUY)),GetTakeProfitLevel(GetPrice(OP_BUY)),"",GetMagicNumber(OP_BUY),0,Blue);


6. Ich verwende die Funktion timing():

void Timing()
{
//Здесь вызываем функции которые необходимо вызывать каждый тик
//...
//Здесь вызываем функции которые необходимо вызывать каждую минуту
if(IsNewMinute()==true){
}
//Здесь вызываем вункции которые достаточно вызывать каждый новый бар
if(IsNewBar()==true){
CheckForClosed();
CheckForOpen();
}
//Здесь вызываем функции которые необходимо вызывать каждый новый день, например функцию для расчета свопов
if(IsNewDay()==true){
}
}

Wie Sie sehen, wird auch bei der tickweisen Modellierungsmethode nicht bei jedem Tick der gesamte Berechnungsblock gesetzt, sondern nur dann aufgerufen, wenn er wirklich benötigt wird.

7. Ich weiß nicht, warum, aber ich verwende fast immer die for()-Schleife anstelle von while().

8. Ich hasse es, verschachtelte Bedingungen zu verwenden:

if(param1==1){

if(param2==2){

if(param3==3){

if(param4==4){

if(param5==5){

Print("Наконец-то дошли!");

}

}

}

}

}

Ich verwende stattdessen einen Code wie diesen:

if(param1!=1)return;

if(param2!=2)return;

...

if(param5!=5)return;

Print("Наконец-то дошли!");

Ich finde diesen Weg viel bequemer.
 

if(param1!=1)return;

if(param2!=2)return;

...

if(param5!=5)return;

Print("Наконец-то дошли!");

Im Grunde handelt es sich um normalen Code, der die gleichen Berechnungen durchführt wie die verschachtelte if-Konstruktion. Aber irgendwo habe ich gehört, dass die Rückgabe in der Funktion eine sein sollte. Wahrscheinlich tut man das, um nicht mit ihnen in Konflikt zu geraten. Ich halte mich nicht strikt an diese Regel.

Im Übrigen ist mein Ansatz dem Ihren sehr ähnlich, C-4, abgesehen von ein paar Details.

 
C-4 >> :

2. Ich hasse die sehr verbreitete Art, Klammern so zu setzen:

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

//----
return(0);
}
//+------------------------------------------------------------------+

Kommentare //---- - Ich verstehe das überhaupt nicht.

Ich hingegen bevorzuge diesen Stil: Man muss nicht nach geschweiften Klammern am Ende einer Zeile suchen. Viele Menschen verlieren aus diesem Grund Klammern (weil sie vergessen haben, eine schließende Klammer zu setzen), oder im Gegenteil, sie machen zusätzliche schließende Klammern. Aber im Allgemeinen ist es eine Frage des Geschmacks - jeder hat eine andere Handschrift auf dem Papier. Und jeder schreibt seine Notizen anders (der eine macht eine Fußnote, der andere unterstreicht, der andere rückt ein) - Hauptsache, der Autor des Notizbuchs konnte die Informationen auf einen Blick erfassen. Die Syntax der Sprache erlaubt es, geschweifte Klammern überall zu setzen - sogar in einer Zeile. Aber aus irgendeinem Grund setzt niemand solche schließenden geschweiften Klammern:

if( param1==1){

   if( param2==2){

      if( param3==3){

         if( param4==4){

            if( param5==5){

               Print("Наконец-то дошли!");}}}}}
Deshalb spare ich keinen Platz für eine separate Codezeile - alle Klammern (sowohl öffnende als auch schließende) stehen links nebeneinander (mit Einrückungen für jeden folgenden eingeschlossenen Block, im Fischgrätenstil), und man kann auf einen Blick den Anfang und das Ende eines zusammengesetzten Operators (Blocks) erkennen, egal wie intelligent und ausgeklügelt ein Teil des Programms ist. :)

--------

Klammern werden nämlich nur zur Kennzeichnung eines zusammengesetzten Operators (Blocks) und nicht zur Kennzeichnung des Schleifenkörpers verwendet. Ich verwende keine Klammern, wenn der Operator nicht zusammengesetzt ist:
//--Например, так:

if( param5==5) Print("Наконец-то дошли!");


//--Или так:

if( param5==5)
  Print("Наконец-то дошли!");

            

Und wenn Sie einen zusammengesetzten Operator mit einer öffnenden Klammer irgendwo auf der rechten Seite auswählen, aber schließende Klammern auf der linken Seite setzen, dann

//---Вот так многие поступают выделяя блок:

if( param5==5){
   Print("Наконец-то дошли!");
}


//--Т.е. блок выделяют вот так:

             {
   Print("Наконец-то дошли!");
}

---------------

Wie man kodiert, wo man Klammern setzt, usw. - ist eine Frage des persönlichen Geschmacks. Die Hauptsache ist, dass das Programm lesbar und fehlerfrei ist, das System nicht belastet (der Algorithmus muss optimal sein) und die Kriterien erfüllt, für die es geschrieben wurde.

 
Mathemat >> :

Ein ähnliches Tool wurde schon vor langer Zeit von Forenbetreibern hier angeboten - entweder hier oder auf metaquotes. Aber jetzt müssen Sie nicht mehr danach suchen. Und das Design ist das gleiche, wie ich es bevorzuge.

Ja, es gibt eine. :)


Zur Codebereinigung verwende ich MetaQuotes Styler aus zwei Dateien, die Sie von diesem Link herunterladen und im Verzeichnis /Windows/System32 ablegen können.

Sie können den Styler mit dem Befehl ausführen:

mqstyler.exe /file:Dateiname.mq4
mqstyler.exe /file: "langer Dateiname mit Leerzeichen.mq4" (Wenn der Name Leerzeichen enthält)

 

Ich persönlich nehme Visual Studio (VC++), kopiere MQL-Code dorthin und formatiere ihn entsprechend der Microsoft-Konvention, ohne Tools. Als Code-Editor ist VS auch cooler (Code-Faltung?). Es ist vielleicht möglich, einen Kompilierbefehl einzuschrauben, aber ich habe es noch nicht versucht.