Diskussion zum Artikel "Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5" - Seite 3

 
Mario31415927 #:

Versuche den neuen Code zu verstehen. Der Code funktioniert erst mal.
Leider öffnet der EA weitere Positionen, wenn schon welche offen sind.
Wo steckt der Fehler?

Danke

Vermutlich daran das du nicht fragst ob schon eine position offen ist oder nicht. Wenn du das nicht machst eröffnet er solange die bedingung erfüllt ist

 

Hallo allerseits,

ich habe Samuels EA derzeit auf einem Demokonto laufen und bin durchaus zufrieden. Gute Programmierung!

Er zeigt immer mal wieder gute Handelsabläufe, aber er hat eine Schwäche:

SELL-Optionen häufen sich bei Wendepunkten im Tal der Chartverläufe und dasselbe an entsprechenden Scheitelpunkten mit BUY-Optionen, die dann erstmal massiv als Negativa zu buche schlagen. Ich würde das gerne umprogrammieren, d. h. BUYs im Tag, SELLs auf dem Scheitel, und scheitere mit meinen Versuchen bislang. Ich beherrsche auch nur rudimentär MQL5.

Kann mir jemand helfen?

SG und vielen Dank!

 

So etwas funktioniert meist nicht, weil dann auch die anderen Punkte, an denen der EA eine profitable Position eingeht, umgedreht werden  ....

Lies aber mal das hier:

EA-freelancer Pflichtenheft : https://www.mql5.com/de/articles/4368
Indi : https://www.mql5.com/de/articles/4304
How to Order a Trading Robot in MQL5 and MQL4 : https://www.mql5.com/de/articles/117

Mit den dortigen Hinweisen kannst Du Deine Idee genauer präzisieren, sei es nur für Dich, um zu sehen, ob es geht, oder sei es, um jemanden zu bitten es zu tun, mit oder ohne Bezahlung.

So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
 
Joosy #:

Hallo zusammen😊

@Mario31415927

Das liegt ganz einfach daran, dass im Ticker, jedes Mal, wenn eine neue Periode- bzw. neuer Balken (wie auch immer) die Variablen:

zurückgesetzt werden, unabhängig davon, ob bereits Positionen offen sind oder nicht.

Lässt sich ja im Code relativ schnell finden.

 

Hier stellt sich mir allerding die Frage, ob das beabsichtig wurde, und wenn ja, wie werden dann alle Positionen wieder geschlossen?

Vielleicht verstehe ich auch den Ordertyp TRADE_ACTION_DEAL in dem Zusammenhang nicht?

Den Ablauf der Handelsorder könnte man auch einfach auf die Handelsklasse Trade anpassen. Wie z.B.:

Schöne Grüße:-)

 

Lies mal: https://www.mql5.com/de/articles/232

Das erklärt den Unterschied und die Zusammenhänge von Orders, Positionen und Deals. Letztere spiegeln die Buchungsvorgänge auf Brokerseite.

Handelsereignisse in MetaTrader 5
Handelsereignisse in MetaTrader 5
  • www.mql5.com
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
 
Carl Schreiber #:

Lies mal: https://www.mql5.com/de/articles/232

Das erklärt den Unterschied und die Zusammenhänge von Orders, Positionen und Deals. Letztere spiegeln die Buchungsvorgänge auf Brokerseite.

Hallo Carl,

danke für den Hinweis!

 

Ich muss mich allerdings berichtigen.

Es ist zwar richtig, dass die Variablen bei jeder neuen Zeitperiode zurückgesetzt werden:

   bool Buy_opened = false, Sell_opened = false; // variables to hold the result of the opened position

Aber diese werden anschließend wieder gesetzt, wenn dementsprechend eine Position vorliegt.

   if(PositionSelect(_Symbol) == true) { // we have an opened position

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

         Buy_opened = true;  //It is a Buy

      }

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) {

         Sell_opened = true; // It is a Sell

      }

   }

 Bei mir tritt jedoch das Phänomen auf, dass die Buy (POSITION_TYPE_BUY) korrekterweise abgefragt wird, jedoch nicht die Sell (POSITION_TYPE_SELL). Die Variable wir einfach nicht mehr gesetzt??

  Muss den Code Schritt- für Schritt durch-debuggen. Das kann doch nur ein logischer Fehler sein😉

Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
  • www.mql5.com
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
 
Joosy #:
         Sell_opened = true; // It is a Sell

Ohje, ich steh heute sowas von auf der Leitung.

Es wird ja auch nur einmal abgefragt. Das ist der Fehler;-)

Hier sollten wie folgt alle Positionen abgesucht werden;

   bool Buy_opened = false, Sell_opened = false; // variables to hold the result of the opened position
   
   for(int i=0; i < PositionsTotal(); i++) {
      ticket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == EA_Magic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { 
            Buy_opened = true; 
         }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { 
            Sell_opened = true; 
         }
      }   
   }