Die Sprache MQL5 von Grund auf selbst erlernen - Seite 14

 
MrBrooklin:

Künftig soll das Skript gemäß dem Selbststudienplan Schritt für Schritt geändert werden:

  1. Stop Loss und Take Profit hinzufügen;
  2. Nachsatz hinzufügen;
  3. maximales Risiko hinzufügen;
  4. die Auswahl an schwebenden Aufträgen erweitern.
Mit freundlichen Grüßen, Vladimir.
Es ist natürlich schade, dass Sie die Ratschläge des Tutorials nicht befolgt haben. Sie werden lernen, wie man Linien, Aufträge usw. platziert, aber Sie werden trotzdem nicht in der Lage sein, eine Strategie zu schreiben, weil Sie keine theoretische Grundlage haben. All diese Zeilen und Skripte werden Ihnen nicht helfen, die Grundlagen der Programmierung zu verstehen, und Sie kommen ohne sie nicht weit. Die ersten vier Monate habe ich nur gelernt und nicht einmal versucht, etwas zu schreiben. Natürlich hätte ich auch dreist sein können, wie Sie es getan haben, aber die Qualität dieses Wissens ist gering - es gibt viele Lücken in den Grundlagen, die in Zukunft gefüllt werden müssen...
 
Реter Konow:
Natürlich hätten Sie die Ratschläge des Tutorials nicht befolgen sollen. Sie mögen zwar wissen, wie man Linien, Aufträge usw. festlegt, aber Sie werden trotzdem nicht in der Lage sein, eine Strategie zu entwickeln, weil Ihnen die theoretische Grundlage fehlt. All diese Zeilen und Skripte werden Ihnen nicht helfen, die Grundlagen der Programmierung zu verstehen, und Sie kommen ohne sie nicht weit. Die ersten vier Monate habe ich nur gelernt und nicht einmal versucht, etwas zu schreiben. Natürlich hätte ich auch dreist sein können, wie Sie, aber die Qualität dieses Wissens ist schlecht. Es gibt immer Lücken in den Grundlagen, die in Zukunft gefüllt werden müssen...

Hallo, Peter! Ich lese das Lehrbuch nach Bedarf, d. h. wenn ich eine Wissenslücke sehe. Ich habe das Gefühl, dass ich jetzt eine kleine Pause einlegen und das Lehrbuch genauer studieren muss. Alle Empfehlungen von Forumsteilnehmern werden berücksichtigt, und ich versuche, mich an sie zu halten. Und jetzt bin ich erstaunt, dass ich es geschafft habe, in so kurzer Zeit etwas nur mit dem MQL5-Referenzbuch zu schreiben.

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin:

Guten Abend an alle und gute Laune!

Ich füge ein neues Skript New6.mq5 ein, das Ihnen hilft, einen SellStop- und einen BuyStop-Auftrag mit einer festen Losgröße in einem bestimmten Abstand zum aktuellen Kurs im aktuellen Chart zu platzieren. In diesem Skript habe ich versucht, alles so zu beschreiben, wie ich es vorhin versprochen habe, in klarer und verständlicher Form für einen Programmierer der ersten Klasse.

Ich habe beim Schreiben des Skripts nur die Informationen aus der MQL5-Referenz verwendet!

Mit freundlichen Grüßen, Vladimir.

Dies ist ein gutes Beispiel. Ich schlage vor, sie als Ausgangspunkt zu verwenden. Die Grundlagen.

MrBrooklin:

In Zukunft soll das Skript laut Selbststudienplan Schritt für Schritt geändert werden, d.h:

  1. Stop Loss und Take Profit hinzufügen;
  2. Nachsatz hinzufügen;
  3. maximales Risiko hinzufügen;
  4. die Auswahl an schwebenden Aufträgen erweitern.
Mit freundlichen Grüßen, Vladimir.

Nein, nein. Schließen Sie die neuen Funktionen noch nicht an. Verbessern Sie nun die bestehende Logik. Gleichzeitig sollten die Probleme bei der Skriptimplementierung behoben werden (sie sind bereits sichtbar). Wenn Sie wissen wollen, was Sie umschreiben sollen, sage ich es Ihnen.

 
Vasiliy Sokolov:

Das Beispiel ist ein gutes Beispiel. Ich schlage vor, sie als Ausgangspunkt zu verwenden. Ausgangssituation.

Nein, nein. Schalten Sie jetzt noch keine neuen Funktionen ein. Verbessern Sie nun die bestehende Logik. Gleichzeitig sollten die Probleme bei der Skriptimplementierung beseitigt werden (sie sind bereits sichtbar). Was genau Sie umschreiben müssen, verrate ich Ihnen, wenn Sie daran interessiert sind.

Hallo Wassili! Natürlich können Sie mir sagen, was Sie umschreiben müssen, das würde mich interessieren!

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin:

Hallo Wassili! Sagen Sie mir natürlich, was Sie umschreiben müssen, ich bin sehr interessiert!

Mit freundlichen Grüßen, Vladimir.

Programmierer haben zwei Probleme: Fehler, die vom Compiler erzeugt werden, und Architekturprobleme. Als Anfänger konzentrieren Sie sich darauf, mit dem Compiler zu kämpfen, während Ihr oberstes Ziel ein korrekt funktionierendes Programm ist. Allerdings verwandelt sich ein Anfängerprogramm sehr schnell in so genannten Spaghetti-Code, den der Autor selbst nicht schnell genug durchschauen kann. Deshalb schlage ich vor, dass Sie sich nicht auf den Compiler und die Korrektheit des endgültigen Skripts konzentrieren, sondern auf Fragen der Architektur. Es ist wie beim Erlernen des Klavierspiels: Zuerst lernt man, die Finger richtig zu halten und richtig am Instrument zu sitzen, niemand verlangt von einem Anfänger, Bach zu spielen.

//+------------------------------------------------------------------+
//|                                                         New6.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"   //Тип ордера UP
#define       orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

Sie haben zwei Gruppen von Parametern, die das Verhalten Ihres Skripts bestimmen: Die erste Gruppe wird statisch, als Makro, festgelegt. Die zweite wird vom Benutzer beim Laden des Skripts im Diagramm festgelegt. Jetzt kann der Benutzer die Art der Bestellung nicht mehr auswählen, ohne dieses Skript neu zu kompilieren. Das ist nicht gut. Daher wäre es besser, auf diese Makros zu verzichten und stattdessen den zusätzlichen Parameter zu verwenden:

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

Dementsprechend haben wir eine neue Aufzählung definiert, die wir als Auswahlparameter für den Benutzer implementiert haben.

 
Vasiliy Sokolov:

Programmierer haben zwei Probleme: Compilerfehler und Architekturprobleme. Als Anfänger konzentrieren Sie sich darauf, den Compiler zu bekämpfen, und Ihr ultimatives Ziel ist ein Programm, das korrekt funktioniert. Allerdings verwandelt sich ein Anfängerprogramm sehr schnell in so genannten Spaghetti-Code, den der Autor selbst nicht schnell genug durchschauen kann. Deshalb schlage ich vor, dass Sie sich nicht auf den Compiler und die Korrektheit des endgültigen Skripts konzentrieren, sondern auf Fragen der Architektur. Es ist wie beim Erlernen des Klavierspiels: Zuerst lernt man, die Finger richtig zu halten und richtig am Instrument zu sitzen, niemand verlangt von einem Anfänger, Bach zu spielen.

Sie haben zwei Gruppen von Parametern, die das Verhalten Ihres Skripts bestimmen: Die erste Gruppe wird statisch, als Makro, festgelegt. Die zweite wird vom Benutzer beim Laden des Skripts im Diagramm festgelegt. Jetzt kann der Benutzer die Art der Bestellung nicht mehr auswählen, ohne dieses Skript neu zu kompilieren. Das ist nicht gut. Daher wäre es besser, auf diese Makros zu verzichten und stattdessen den zusätzlichen Parameter zu verwenden:

Dementsprechend haben wir eine neue Aufzählung definiert, die wir als Auswahlparameter für den Benutzer implementiert haben.

Großartig, Sie haben mich tatsächlich zu dem veranlasst, was in Schritt 4 der schrittweisen Änderung des Skripts steht, nämlich die Auswahl der ausstehenden Aufträge zu erweitern.

Ich danke Ihnen!

Mit freundlichen Grüßen, Vladimir.

 

Das nächste Problem mit Ihrem Code ist, dass er sich zu einem langen verfahrenstechnischen Blatt ausweitet. Alle Anfänger schreiben auf diese Weise. Und das ist ein Problem, das sie über Jahre hinweg begleitet. Lernen Sie, Ihren Algorithmus in Teile zu zerlegen, angefangen bei den Grundlagen wie diesem Skript. Es gibt zwei Möglichkeiten, dies zu tun: durch Funktionen und Klassen. Das Konzept der Klassen ist anfangs zu schwierig zu verstehen, daher schlage ich vor, dass Sie sich auf die Arbeit mit Funktionen konzentrieren. Denken Sie über die Bedeutung von Funktionen nach:

  • Der gesamte in MQL geschriebene Code (und das sind zum Beispiel alle Skripte, Indikatoren und Expert Advisors in CodeBase) befindet sich entweder innerhalb von Systemfunktionen oder innerhalb von Benutzerfunktionen.
  • Jeder MQL-Code ruft Dutzende von eingebauten MQL-Funktionen auf. Die gesamte Interaktion mit MetaTrader und seiner Handelsumgebung erfolgt durch den Aufruf dieser oder jener Systemfunktion.
  • Jede Funktion, die nicht von externen Parametern abhängt, liefert immer das gleiche Ergebnis. Eine solche Funktion kann einfach von einem Skript/Indikator/Berater in ein anderes kopiert werden, und sie funktioniert dann einwandfrei. Das Kopieren eines willkürlichen Stücks prozeduralen Codes hingegen wird wahrscheinlich nicht funktionieren.
  • Sie können jede beliebige benutzerdefinierte Funktion schreiben, die nützliche Arbeit leistet. Auf diese Weise wird die Standard-MQL-Funktionalität in der von Ihnen benötigten Weise erweitert. Sie denken zum Beispiel: "Wie cool wäre es, wenn MQL eine solche Funktion hätte: ....". - Aber warum schreiben Sie es nicht selbst?
 
Vasiliy Sokolov:

Das nächste Problem mit Ihrem Code ist, dass er sich zu einem langen verfahrenstechnischen Blatt ausweitet. Alle Anfänger schreiben auf diese Weise. Und das ist ein Problem, das sie über Jahre hinweg begleitet. Lernen Sie, Ihren Algorithmus in Teile zu zerlegen, angefangen bei den Grundlagen wie diesem Skript. Es gibt zwei Möglichkeiten, dies zu tun: durch Funktionen und Klassen. Das Konzept der Klassen ist anfangs zu schwierig zu verstehen, daher schlage ich vor, dass Sie sich auf die Arbeit mit Funktionen konzentrieren. Denken Sie über die Bedeutung von Funktionen nach:

  • Der gesamte in MQL geschriebene Code (und das sind zum Beispiel alle Skripte, Indikatoren und Expert Advisors in CodeBase) befindet sich entweder innerhalb von Systemfunktionen oder innerhalb von Benutzerfunktionen.
  • Jeder MQL-Code ruft Dutzende von eingebauten MQL-Funktionen auf. Die gesamte Interaktion mit MetaTrader und seiner Handelsumgebung erfolgt durch den Aufruf dieser oder jener Systemfunktion.
  • Jede Funktion, die nicht von externen Parametern abhängt, liefert immer das gleiche Ergebnis. Eine solche Funktion kann einfach von einem Skript/Indikator/Berater in ein anderes kopiert werden, und sie funktioniert dann einwandfrei. Das Kopieren eines willkürlichen Stücks prozeduralen Codes hingegen wird wahrscheinlich nicht funktionieren.
  • Sie können jede beliebige benutzerdefinierte Funktion schreiben, die nützliche Arbeit leistet. Auf diese Weise wird die Standard-MQL-Funktionalität in der von Ihnen benötigten Weise erweitert. Sie denken zum Beispiel: "Wie cool wäre es, wenn MQL eine solche Funktion hätte: ....". - Aber warum schreiben Sie es nicht selbst?

Vielen Dank, Vasily, für diese umfassende Beratung. Ich werde sie auf jeden Fall berücksichtigen und versuchen, mein Bestes zu geben.

Mit freundlichen Grüßen, Vladimir.

 
Vasiliy Sokolov:

Das nächste Problem mit Ihrem Code ist, dass er sich zu einem langen verfahrenstechnischen Blatt ausweitet. Alle Anfänger schreiben auf diese Weise. Und das ist ein Problem, das sie über Jahre hinweg begleitet. Lernen Sie, Ihren Algorithmus in Teile zu zerlegen, angefangen bei den Grundlagen wie diesem Skript. Es gibt zwei Möglichkeiten, dies zu tun: durch Funktionen und Klassen. Das Konzept der Klassen ist anfangs zu schwierig zu verstehen, daher schlage ich vor, dass Sie sich auf die Arbeit mit Funktionen konzentrieren. Denken Sie über die Bedeutung von Funktionen nach:

  • Der gesamte in MQL geschriebene Code (und das sind zum Beispiel alle Skripte, Indikatoren und Expert Advisors in CodeBase) befindet sich entweder innerhalb von Systemfunktionen oder innerhalb von Benutzerfunktionen.
  • Jeder MQL-Code ruft Dutzende von eingebauten MQL-Funktionen auf. Alle Interaktionen mit dem MetaTrader und seiner Handelsumgebung werden durch den Aufruf einer Systemfunktion ausgeführt.
  • Jede Funktion, die nicht von externen Parametern abhängt, liefert immer das gleiche Ergebnis. Eine solche Funktion kann einfach von einem Skript/Indikator/Berater in ein anderes kopiert werden, und sie funktioniert dann einwandfrei. Das Kopieren eines willkürlichen Stücks prozeduralen Codes hingegen wird wahrscheinlich nicht funktionieren.
  • Sie können jede beliebige benutzerdefinierte Funktion schreiben, die nützliche Arbeit leistet. Auf diese Weise wird die Standard-MQL-Funktionalität in der von Ihnen benötigten Weise erweitert. Sie denken zum Beispiel: "Wie cool wäre es, wenn MQL eine solche Funktion hätte: ....". - Aber warum schreiben Sie es nicht selbst?
Vasily, der Mann beherrscht noch nicht einmal die Arrays. Es ist noch zu früh für ihn, sich solche Vorträge anzuhören).
 
Реter Konow:
Vasily, der Mann hat noch nicht einmal Arrays beherrscht. Es ist noch zu früh für ihn, sich solche Vorträge anzuhören).

Peter, jeder konstruktive Rat ist mir wichtig, auch Ihrer!

Mit freundlichen Grüßen, Vladimir.

Grund der Beschwerde: