Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 493

 
Roman Sharanov:
Könnten Sie bitte mitteilen, ob die Funktion zum Schließen aller vom EA geöffneten Aufträge nach Symbol korrekt implementiert ist?

Die Architektur selbst ist korrekt. Die Fehler liegen im Fehlen von Kontrollen und in der Verwendung einiger Funktionen:

bool OrderCloseAll()
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
         if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
            continue;

         if(OrderSymbol() !=Symbol() || OrderMagicNumber() != Magic)
            continue;
         
         if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), slippage, clrWhite))
            return false;
   }

   return true;
}

  1. Die erste Iteration wird in Ihrem Fall fehlschlagen - die Bestellung mit dem Index OrdersTotal() existiert nicht.
  2. Es gibt keine Prüfung für das Ergebnis der Funktion OrderSelect.
  3. Es gibt keine Prüfung für das Ergebnis der Funktion OrderClose. Wenn der Auftragsabschluss fehlschlägt, können wir nicht in der gleichen Funktion bleiben, da wir herausfinden müssen, warum der Abschluss nicht erfolgreich war. Dazu müssen wir die Funktion mit dem Ergebnis false verlassen und dann entscheiden, was als nächstes zu tun ist.
  4. Wir können nicht ein und denselben Schlusskurs für alle Aufträge verwenden. Erstens können die Aufträge unterschiedlicher Art sein, und zweitens kann sich der Preis während der Ausführung früherer Aufträge (beim Abschluss) geändert haben. Wir können eine MT4-Funktion nutzen, um zu vermeiden, dass wir raten müssen, welcher Preis zu verwenden ist: Der OrderClosePrice()-Wert einer Marktorder vor ihrem Abschluss ist der Geld- oder Briefkurs, je nach Ordertyp.
 
Ihor Herasko:

Die Architektur selbst ist korrekt. Die Fehler liegen im Fehlen von Kontrollen und in der Verwendung einiger Funktionen:

  1. Die erste Iteration wird in Ihrem Fall fehlschlagen - die Bestellung mit dem Index OrdersTotal() existiert nicht.
  2. Es gibt keine Prüfung für das Ergebnis der Funktion OrderSelect.
  3. Es gibt keine Prüfung für das Ergebnis der Funktion OrderClose. Wenn der Abschluss des Auftrags fehlschlägt, können wir nicht in der gleichen Funktion bleiben, da wir herausfinden müssen, warum der Abschluss nicht erfolgreich war. Dazu müssen wir die Funktion mit dem Ergebnis false verlassen und dann entscheiden, was als nächstes zu tun ist.
  4. Wir können nicht ein und denselben Schlusskurs für alle Aufträge verwenden. Erstens kann es sich um verschiedene Arten von Aufträgen handeln, und zweitens kann sich der Preis während der Ausführung früherer Aufträge (beim Abschluss) geändert haben. Um zu vermeiden, dass wir raten müssen, welcher Preis zu verwenden ist, können wir eine MT4-Funktion nutzen: Der OrderClosePrice()-Wert einer Marktorder vor ihrem Schließen ist der Geld- oder Briefkurs, je nach Ordertyp.

Danke, das Hauptproblem war wahrscheinlich, dass ich einfach den gleichen Preis verwendet habe.

 

Aus der OrderSelect-Hilfe: " Wenn Aufträge mit dem Parameter SELECT_BY_POS sequentiell ausgewählt werden, werden die Informationen in der Reihenfolge angegeben, in der sie vom Handelsserver kommen. Eine Sortierung der erhaltenen Bestellliste ist nicht gewährleistet".

Wenn wir glauben, dass dieser Satz umsonst in die Hilfe aufgenommen wurde, ist das in Ordnung. Wenn wir glauben, dass es einen Grund dafür gibt, sollten wir diese Liste während des Durchlaufs der Schleife durch die Liste der Aufträge nicht ändern. Wie die Aufträge geordnet werden, nachdem einer von ihnen auf dem Server gelöscht wurde und eine neue, aktuelle Liste mit einer kleineren Auftragssumme vorliegt, ist unbekannt. Es ist zuverlässiger, ohne zu löschen, die gleiche unveränderte Kopie der Liste zu durchlaufen und (in einem Array) alle Ticketnummern der zu löschenden Gewerke zu sammeln. Vergessen Sie dann diese Liste und löschen Sie die Gewerke, indem Sie sie nach Tickets auswählen.

Man würde natürlich gerne glauben, dass die Ordnung in der veränderbaren Liste erhalten bleibt, und sei es nur für diesen Fall des Entfernens mehrerer Aufträge am Ende einer ungeordneten Liste, aber die Entwickler sind dagegen... Jetzt funktioniert es, und wenn ein neues Build herauskommt - "wir haben gewarnt".

 
Vladimir:

Aus der OrderSelect-Hilfe: " Wenn Aufträge mit dem Parameter SELECT_BY_POS sequentiell ausgewählt werden, werden die Informationen in der Reihenfolge angegeben, in der sie vom Handelsserver kommen. Eine Sortierung der erhaltenen Bestellliste ist nicht gewährleistet".

Wenn wir glauben, dass dieser Satz umsonst in die Hilfe aufgenommen wurde, ist das in Ordnung. Wenn wir glauben, dass es einen Grund dafür gibt, sollten wir diese Liste während des Durchlaufs der Schleife durch die Liste der Aufträge nicht ändern. Wie die Aufträge geordnet werden, nachdem einer von ihnen auf dem Server gelöscht wurde und eine neue, aktuelle Liste mit einer kleineren Auftragssumme vorliegt, ist unbekannt. Es ist zuverlässiger, ohne zu löschen, die gleiche unveränderte Kopie der Liste zu durchlaufen und (in einem Array) alle Ticketnummern der zu löschenden Gewerke zu sammeln. Vergessen Sie dann diese Liste und löschen Sie die Gewerke, indem Sie sie nach Tickets auswählen.

Man würde natürlich gerne glauben, dass die Ordnung in der veränderbaren Liste erhalten bleibt, und sei es nur für diesen Fall des Entfernens mehrerer Aufträge am Ende einer ungeordneten Liste, aber die Entwickler sind dagegen... Jetzt funktioniert es, und wenn ein neues Build herauskommt - "wir haben gewarnt".

Dieses "Amerika" gibt es seit etwa dreihundert Jahren :)

 
Artyom Trishkin:

Diese Art von "Amerika" gibt es seit etwa dreihundert Jahren :)

Ich glaube nicht, dass die Leute, die hier im Namen von Neuankömmlingen Fragen stellen, dies bereits selbst entdeckt haben. Deshalb schreibe ich es ja auch. Nicht für die Moderatoren, sondern für die Fragesteller. Sehen Sie sich den Namen des Threads an.

P.S. Ich habe nachgesehen, woher dieses Interesse kommt. Wie sich herausstellte, stammt es aus dem https://www.mql5.com/ru/forum/215783/page8 Zweig "Organisation des Auftragszyklus". Wie sich im Oktober 2017 herausstellt, sind diese dreihundert Jahre noch nicht vorbei, es gibt immer noch Neues.

Организация цикла перебора ордеров
Организация цикла перебора ордеров
  • 2017.09.16
  • www.mql5.com
MQL4 и MetaTrader 4: Организация цикла перебора ордеров
 
Vladimir:

Ich glaube nicht, dass die Leute, die hier im Namen von Neuankömmlingen Fragen stellen, dies bereits selbst entdeckt haben. Das ist der Grund, warum ich schreibe. Nicht für die Moderatoren, sondern für die Fragesteller. Sehen Sie sich den Namen des Threads an.

P.S. Ich habe nachgesehen, woher dieses Interesse kommt. Wie sich herausstellte, stammt es aus dem https://www.mql5.com/ru/forum/215783/page8 Zweig "Organisation des Auftragszyklus". Wie sich herausstellt, sind diese dreihundert Jahre im Oktober 2017 noch nicht vorbei, es gibt immer noch Neues.

Wieder falsch :) Vor dreihundert Jahren begann es auf mql4.com - es gab eine Zeit, in der es dort aktiv diskutiert wurde. Und es gab sogar die Momente, die Sie in "Jetzt funktioniert es, und ein neues Build wird herauskommen - "wir haben Sie gewarnt" beschrieben haben. Nur ohne Warnungen, und das gleich mehrfach - es kommt darauf an, es kommt nicht auf die Sortierung an...

Und ja, es gibt einen speziellen Thread für solche Antworten:

Особенности языка mql4, тонкости и приёмы работы
Особенности языка mql4, тонкости и приёмы работы
  • 2017.02.24
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql4, примеры решения тех, или иных задач...
 
Vladimir:

Aus der OrderSelect-Hilfe: " Wenn Aufträge mit dem Parameter SELECT_BY_POS sequentiell ausgewählt werden, werden die Informationen in der Reihenfolge angegeben, in der sie vom Handelsserver kommen. Eine Sortierung der erhaltenen Bestellliste ist nicht gewährleistet".

Wenn wir glauben, dass dieser Satz umsonst in die Hilfe aufgenommen wurde, ist das in Ordnung. Wenn wir glauben, dass es einen Grund dafür gibt, sollten wir diese Liste während des Durchlaufs der Schleife durch die Liste der Aufträge nicht ändern. Wie die Aufträge geordnet werden, nachdem einer von ihnen auf dem Server gelöscht wurde und eine neue, aktuelle Liste mit einer kleineren Auftragssumme vorliegt, ist unbekannt. Es ist zuverlässiger, ohne zu löschen, dieselbe unveränderte Kopie der Liste zu durchlaufen und (in einem Array) alle Ticketnummern der zu löschenden Gewerke zu sammeln. Vergessen Sie dann diese Liste und löschen Sie die Gewerke, indem Sie sie nach Tickets auswählen.

Ich würde natürlich gerne glauben, dass die Reihenfolge in der änderbaren Liste zumindest für diesen Fall des Löschens mehrerer Aufträge am Ende einer ungeordneten Liste erhalten bleibt, aber die Entwickler sind dagegen... Jetzt funktioniert es, und wenn ein neues Build herauskommt, "haben wir gewarnt".

Als gute Idee (wenn man bedenkt, dass mehrere Expert Advisors + Trader parallel auf dem Konto arbeiten können), können Sie überhaupt keine Trades in einer Schleife durchführen. Der erforderliche Auftrag geht ein, die Operation wird ausgeführt, das gesamte OnTick() wird erneut ausgeführt (nicht unbedingt mit Eintreffen eines neuen Ticks). Und so weiter, bis alle notwendigen Vorgänge ausgeführt sind.

Die Bildung eines Arrays zum Löschen von Aufträgen ist also gleichbedeutend mit dem Löschen von Aufträgen in der Schleife.

 

Es gibt eine Schaltfläche "Stopp", wie ändere ich ihren Text in "Start", wenn sie gedrückt wird?

bool stop;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//Closed at Profit
   ObjectCreate(0,"Stop",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"Stop",OBJPROP_XDISTANCE,10);
   ObjectSetInteger(0,"Stop",OBJPROP_YDISTANCE,105);
   ObjectSetInteger(0,"Stop",OBJPROP_XSIZE,100);
   ObjectSetInteger(0,"Stop",OBJPROP_YSIZE,25);

   ObjectSetString(0,"Stop",OBJPROP_TEXT,"Stop");

   ObjectSetInteger(0,"Stop",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"Stop",OBJPROP_BGCOLOR,Green);
   ObjectSetInteger(0,"Stop",OBJPROP_BORDER_COLOR,Green);
   ObjectSetInteger(0,"Stop",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"Stop",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"Stop",OBJPROP_STATE,false);
   ObjectSetInteger(0,"Stop",OBJPROP_FONTSIZE,12);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
if(sparam=="Stop")
     {
      ObjectSetInteger(0,"Stop",OBJPROP_STATE,false);
      CloseAtProfit();
      stop=true;
     }
     }
 
lil_lil: Es gibt eine Schaltfläche "Stopp", wie ändere ich ihren Text in "Start", wenn sie gedrückt wird?

Siehe mein Expertenbeispiel

Dateien:
ToFile.mq4  11 kb
 
STARIJ:

Sehen Sie sich mein Expert Advisor Beispiel an

Danke, genau das, was ich brauchte.

Es könnte hilfreich sein zu wissen, dass es einen Fehler bei fehlenden Positionen gibt--- ToFile EURUSD,H1: Nullteilung in 'ToFile.mq4' (62,39)

/*62*/  Строка=DoubleToStr(AccountEquity()/AccountMargin()*100,2)+"%"; // Уровень=Средства/Залог
Der Text ändert sich im Testgerät nicht, gibt es keine solche Option?
Grund der Beschwerde: