Höchste Profitable Position schließen, Zeitlich begrenzter Handel

 

Hallo zusammen,

ich bin absoluter Neuling bei MQL5 und möchte eine Strategie testen. Dazu schreibe ich mir einen EA. Dank YT bin ich schon recht weit. Nur habe ich keine Ahnung wie ich folgende Bedingungen an den EA weitergeben kann.

1) Bei jeder neuer Kerze soll er prüfen ob er eine gewisse Anzahl laufenden Positionen hat. Ist dies der Fall, soll er die Position mit dem höchsten Profit schließen. Wie kann ich jetzt herausfinden welche Position den höchsten Profit im Moment hat? 

2) Ich möchte, dass der EA nur in einem bestimmten Zeitraum arbeitet. Nachts soll er nicht handeln. Wie kann ich An/Aus Zeiten erstellen?


Ich würde mich freuen wenn mir jemand helfen kann. Und wirklich, ich habe wenig Ahnung. Habe früher nur mit VB programmiert. Aber auch nur als Hobby... 

VG Simon

 
Simon:

Hallo zusammen,

ich bin absoluter Neuling bei MQL5 und möchte eine Strategie testen. Dazu schreibe ich mir einen EA. Dank YT bin ich schon recht weit. Nur habe ich keine Ahnung wie ich folgende Bedingungen an den EA weitergeben kann.

1) Bei jeder neuer Kerze soll er prüfen ob er eine gewisse Anzahl laufenden Positionen hat. Ist dies der Fall, soll er die Position mit dem höchsten Profit schließen. Wie kann ich jetzt herausfinden welche Position den höchsten Profit im Moment hat? 

2) Ich möchte, dass der EA nur in einem bestimmten Zeitraum arbeitet. Nachts soll er nicht handeln. Wie kann ich An/Aus Zeiten erstellen?


Ich würde mich freuen wenn mir jemand helfen kann. Und wirklich, ich habe wenig Ahnung. Habe früher nur mit VB programmiert. Aber auch nur als Hobby... 

VG Simon

Klar geht das. Wenn ich Funktionen mit bestimmten Fähigkeiten suche mach ich das meist hier: https://www.mql5.com/de/docs/function_indices.

Man kann aber auch die PDF-Datei nehmen und die nach Schlüsselworten durchsuchen. Beides ist schneller als eine Antwort hier.

add 1)
Such (Ctrl+F) da mal nach "PositionsTotal".
Dann lies weiter unten unter Eigenschaften der Positionen.
In einer Schleife über alle Positionen dann den höchsten Gewinn finden.

add 2)
Du musst nur ganz am Anfang von OnTick einer Variablen des Typs MqlDateTime die aktuelle Zeit zuweisen und dann sofort aus OnTick() zurückkehren, wenn zur Stunde und Minute nicht gehandelt werden soll

Dokumentation zu MQL5: MQL5 Funktionenliste
Dokumentation zu MQL5: MQL5 Funktionenliste
  • www.mql5.com
MQL5 Funktionenliste - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Carl Schreiber:

Klar geht das. Wenn ich Funktionen mit bestimmten Fähigkeiten suche mach ich das meist hier: https://www.mql5.com/de/docs/function_indices.

Man kann aber auch die PDF-Datei nehmen und die nach Schlüsselworten durchsuchen. Beides ist schneller als eine Antwort hier.

add 1)
Such (Ctrl+F) da mal nach "PositionsTotal".
Dann lies weiter unten unter Eigenschaften der Positionen.
In einer Schleife über alle Positionen dann den höchsten Gewinn finden.

add 2)
Du musst nur ganz am Anfang von OnTick einer Variablen des Typs MqlDateTime die aktuelle Zeit zuweisen und dann sofort aus OnTick() zurückkehren, wenn zur Stunde und Minute nicht gehandelt werden soll

Hallo Carl,

vielen Dank für deine schnelle Antwort. Ich habe mir die "PositionsTotal" und die Eigenschaften angeschaut. Aber so richtig verstehe ich das nicht. Wie gesagt, ich habe von dieser Programmiersprache wenig bis keine Ahnung bis jetzt. 
Im Internet habe ich folgende Zeilen gefunden die den höchsten Profit einer Position anzeigen soll. Der Code funktioniert bei mir aber nicht.

void OnTick()

  {

     {

      int i = PositionsTotal();

      while(i-->0)

        {

         ulong  position_ticket=PositionGetTicket(i);// das Ticket der Position

         PositionSelectByTicket(position_ticket);

         string position_symbol=PositionGetString(POSITION_SYMBOL); // Symbol

         double PositionProfit = PositionGetDouble(POSITION_PROFIT);

         if(position_symbol==Währung

            PositionProfit > hprofit

           )

           {

            Ticket=position_ticket;

           }

        }

      return(Ticket);

     }

   Comment(Ticket);



Als globale Variablen gibts dann noch:

ulong HighestProfit(const string symbol, const int MagicNumber); //Gewinn der Gesamtposition

double hprofit = DBL_MIN;

ulong   Ticket = 0;

input string Währung = "BTCUSD"


Beim Komplilieren bekomme ich dann 1 Fehler:

"´return´- ´void´funktion retruns a value


Bin ich auf dem kompletten Holzweg? 

VG Simon

 
Simon:

Hallo Carl,

vielen Dank für deine schnelle Antwort. Ich habe mir die "PositionsTotal" und die Eigenschaften angeschaut. Aber so richtig verstehe ich das nicht. Wie gesagt, ich habe von dieser Programmiersprache wenig bis keine Ahnung bis jetzt. 
Im Internet habe ich folgende Zeilen gefunden die den höchsten Profit einer Position anzeigen soll. Der Code funktioniert bei mir aber nicht.

void OnTick()

  {

     {

      int i = PositionsTotal();

      while(i-->0)

        {

         ulong  position_ticket=PositionGetTicket(i);// das Ticket der Position

         PositionSelectByTicket(position_ticket);

         string position_symbol=PositionGetString(POSITION_SYMBOL); // Symbol

         double PositionProfit = PositionGetDouble(POSITION_PROFIT);

         if(position_symbol==Währung

            PositionProfit > hprofit

           )

           {

            Ticket=position_ticket;

           }

        }

      return(Ticket);

     }

   Comment(Ticket);



Als globale Variablen gibts dann noch:

ulong HighestProfit(const string symbol, const int MagicNumber); //Gewinn der Gesamtposition

double hprofit = DBL_MIN;

ulong   Ticket = 0;

input string Währung = "BTCUSD"


Beim Komplilieren bekomme ich dann 1 Fehler:

"´return´- ´void´funktion retruns a value


Bin ich auf dem kompletten Holzweg? 

VG Simon

  1. Wenn Du Code postest, bitte als Code formatiert (Alt+S oder das Icon </> aus der Eiditierzeile).
  2. Schau die in der Refenerenz die Bedeutung von OnTick an: Kursor auf OnTick und dann F1 drücken.
  3. Lies mal das hier:
    https://www.mql5.com/de/articles/496 // Quickstart for newbies
    https://www.mql5.com/de/articles/211 // Orders, Positions und Abschlüsse in MetaTrader 5

Schnelleinstieg oder Kurzanleitung für Anfänger
Schnelleinstieg oder Kurzanleitung für Anfänger
  • www.mql5.com
Liebe Leser, in diesem Artikel möchte ich Ihnen vermitteln und zeigen, wie man sich möglichst schnell und einfach die Grundlagen der Erstellung automatischer Handelssysteme, wie die Arbeit mit Indikatoren u. a., erschließt. Der Beitrag richtet sich an Neueinsteiger, in ihm kommen weder komplizierte noch schwer zu verstehende Beispiele zur Anwendung.
 
Simon:

Hallo zusammen,

ich bin absoluter Neuling bei MQL5 und möchte eine Strategie testen. Dazu schreibe ich mir einen EA. Dank YT bin ich schon recht weit. Nur habe ich keine Ahnung wie ich folgende Bedingungen an den EA weitergeben kann.

1) Bei jeder neuer Kerze soll er prüfen ob er eine gewisse Anzahl laufenden Positionen hat. Ist dies der Fall, soll er die Position mit dem höchsten Profit schließen. Wie kann ich jetzt herausfinden welche Position den höchsten Profit im Moment hat? 

2) Ich möchte, dass der EA nur in einem bestimmten Zeitraum arbeitet. Nachts soll er nicht handeln. Wie kann ich An/Aus Zeiten erstellen?


Ich würde mich freuen wenn mir jemand helfen kann. Und wirklich, ich habe wenig Ahnung. Habe früher nur mit VB programmiert. Aber auch nur als Hobby... 

VG Simon

So grob ist das erstmal ein Ansatz für dich.



#include <Trade/trade.mqh>
CTrade tr;
int cnt = 0;

int OnInit()
  {

   tr.Buy(0.1,"EURUSD",0,0,0);
   tr.Buy(0.2,"EURUSD",0,0,0);
   tr.Buy(0.3,"EURUSD",0,0,0);
   
   return(INIT_SUCCEEDED);
  }


void OnTick()
  {

  cnt = cnt + 1;
  ulong ticket = GetTicketHighestPos();
  if (!fmod(cnt,500))
   {
    printf("Ticket: %s",(string)ticket);
   }

  }
ulong GetTicketHighestPos()

     {

      int i = PositionsTotal();
      double hprofit = 0;
      ulong   Ticket = 0;

      while(i-->0)

        {

         ulong  position_ticket=PositionGetTicket(i);// das Ticket der Position

         PositionSelectByTicket(position_ticket);

         string position_symbol=PositionGetString(POSITION_SYMBOL); // Symbol

         double PositionProfit = PositionGetDouble(POSITION_PROFIT);

         if(position_symbol=="EURUSD" && PositionProfit > hprofit)
           
           {

            Ticket=position_ticket;
            hprofit = PositionProfit;

           }

        }
        
       return(Ticket);

     }

   



 
Christian:

So grob ist das erstmal ein Ansatz für dich.

Vielen Dank für die Infos. Es funktioniert zwar noch immer nicht aber ich denke mit etwas Geduld wird das dann schon noch klappen. Die Hilfedatei ist ja schon sehr umfangreich ;-)