[Archiv!] Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Könnte nirgendwo ohne dich hingehen - 2. - Seite 294

 
CreAndr:
Ich habe eine Frage über das Schleppnetz, wer kann mir das sagen. Es scheint das richtige Schleppnetz zu sein, um die Gewinnschwelle zu erreichen, aber es funktioniert nicht.

Hier ist ein Schleppnetz: https://www.mql5.com/ru/forum/131859

Um den Code in den Text einzufügen, drücken Sie auf die Schaltfläche SRC oberhalb des Texteingabefeldes.

 
DhP:

Hier ist ein Schleppnetz: https://www.mql5.com/ru/forum/131859

Um den Code in den Text einzufügen, drücken Sie auf die Schaltfläche SRC oberhalb des Texteingabefeldes.


Ich danke Ihnen.
 
CreAndr:
Ich habe eine Frage zum Schleppnetz, wer kann sie mir beantworten. Es scheint ein korrektes Schleppnetz zu sein, um die Gewinnschwelle zu erreichen, aber es funktioniert nicht.


Liste der Gründe in absteigender Reihenfolge ihrer Bedeutung:

1. Der Computer ist nicht eingeschaltet

2. Metatrader ist nicht eingeschaltet.

3. das Skript auf der Karte ist nicht installiert

4. Expert Advisors nicht aktiviert

5. Nichts zu schleppen.

6. Irgendetwas im Code ist falsch.

 
Roger:


Auflistung der Gründe in absteigender Reihenfolge ihrer Bedeutung:

1. Der Computer ist nicht eingeschaltet

2. Metatrader ist nicht eingeschaltet.

3. das Skript auf der Karte ist nicht installiert

4. Expert Advisors nicht aktiviert

5. Nichts zu schleppen.

6. Irgendetwas im Code ist falsch.

Tolle Antwort, Roger, aber der Computer ist eingeschaltet, der Metatrader auch, der EA ist an den Chart angehängt, die EAs sind aktiviert, die Trades werden geöffnet und daher gibt es etwas zu durchsuchen! Aber was stimmt mit dem Code nicht, das war die Frage.
 
artmedia70:
OrderOpenTime() verwenden
Wozu brauchen wir sie dann?


Also, ja, aber durch die Auftragsnummer habe ich ziemlich kurz, aber mit OrderOpenTime ich nicht verstehen, was zu tun ist, muss ich offene Zeit irgendwo setzen, vergleichen Sie mit der nächsten Bestellung in der Liste, wenn die Zeit länger ist, die Variable neu zu schreiben, usw. Ich verstehe den Algorithmus noch nicht.


bool DeleteOrders()
{
   for(int i=0 ; i <=OrdersTotal() ; i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(Symbol()==OrderSymbol())
            {
            if(OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return(true);
               }
            }
         }
      }
return(false);
} 
 
CreAndr:
Tolle Antwort, Roger, aber der Computer ist aktiviert, der MetaTrader auch, der EA ist an den Chart angehängt, die EAs sind aktiviert, die Trades sind geöffnet und daher gibt es etwas zu suchen! Aber was stimmt mit dem Code nicht, das war die Frage.


Am Anfang gab es keinen Code, den haben Sie später angebracht.

Wahrscheinlich, weil Sie in der Funktion zur Auftragseröffnung einen Trailing gesetzt haben, d.h. die Bedingungen für die Auftragseröffnung treten zwar ein, der Auftrag wird eröffnet, aber er kommt möglicherweise nicht weiter.

 
Pyro:

Also, ja, aber durch die Auftragsnummer habe ich ziemlich kurz, aber mit OrderOpenTime ich nicht verstehen, was zu tun ist, muss ich offene Zeit irgendwo setzen, vergleichen Sie mit der nächsten Bestellung in der Liste, wenn die Zeit länger ist, die Variable neu zu schreiben, usw. Ich verstehe den Algorithmus noch nicht.


Die Seriennummer ist nicht verlässlich, diese Nummerierung garantiert nichts, nur für den Tester. Ein paar Seiten zuvor hatte ich einen Code für die Suche nach dem letzten abgeschlossenen Auftrag geschrieben. Es ist ganz einfach, wir haben das Ticket durchgesehen, dann haben wir den Auftrag oder die Position entsprechend dem Ticket gewählt, und das war's:

  int lastclosetime=-1;
  int lastcloseticket=-1;
  int lastdealtype=0;

  for (int i=0; i<OrdersHistoryTotal(); i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; 
    if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
      if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

  if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
    if (OrderType()==OP_BUY) lastdealtype=1;
    if (OrderType()==OP_SELL) lastdealtype=-1;   
  }
 
Figar0:


Die Bestellnummer ist unzuverlässig, niemand garantiert bei dieser Nummerierung etwas, nur der Prüfer. Ein paar Seiten vorher habe ich einen Code geschrieben, um den letzten geschlossenen Auftrag zu finden, dasselbe gilt für offene Aufträge. Alles ist ganz einfach, wir sind es durchgegangen, haben uns das Ticket gemerkt, dann einen Auftrag oder eine Position anhand des Tickets ausgewählt, und das war's:

Danke, es ist wirklich einfach. Ich werde mich damit befassen.
 
Roger:


Am Anfang gab es keinen Code, den haben Sie später hinzugefügt.

Wahrscheinlich, weil Sie die Funktion zur Auftragseröffnung mit einem Trailing versehen haben, d.h. die Bedingungen für die Auftragseröffnung treten zwar ein, der Auftrag wird eröffnet, aber er kommt möglicherweise nicht weiter.

Ich verstehe, danke.
 
Figar0:


Die Bestellnummer ist unzuverlässig, niemand garantiert bei dieser Nummerierung etwas, nur der Prüfer. Ein paar Seiten vorher habe ich einen Code geschrieben, um den letzten geschlossenen Auftrag zu finden, dasselbe gilt für offene Aufträge. Alles ist ganz einfach, wir haben das Ticket durchgesehen, dann haben wir einen Auftrag oder eine Position durch das Ticket ausgewählt und das war's:

Der Code ist falsch.

Zunächst einmal ist da Folgendes:

if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 

Wenn das Ordnungssymbol gleich dem angegebenen Symbol in der Symbolvariablen oder ist, ist die Ordnungsmagie gleich der Magie... Wenn also eine Bestellung mit dem Symbol ausgewählt wird und die Magie anders ist oder fehlt, ist die Bedingung erfüllt. Weil es entweder dies oder das ist. Dementsprechend sollten wir entweder durch oder ersetzen, oder, besser noch, die Prüfungen in getrennte Strings aufteilen - die Schleife wird dadurch schneller, was für die Optimierung entscheidend ist.

Außerdem... Pick by ticket: Der Parameter pool wird ignoriert, d.h. es macht keinen Sinn, ihn hier zu schreiben.

if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 

Sobald der Auftrag erfolgreich per Ticket ausgewählt wurde, sollte geprüft werden, aus welcher Liste von Aufträgen er ausgewählt wurde - aus der Liste der Marktaufträge oder der Liste der geschlossenen Aufträge. Dazu müssen wir den Zeitpunkt des Auftragsschlusses überprüfen, und wenn dieser größer als Null ist, dann wurde der Auftrag definitiv geschlossen. Dieser Parameter ist bei offenen Positionen immer gleich Null. IMHO sollten wir, nachdem die letzte Bestellung ausgewählt wurde, sofort ihren Typ überprüfen und in die Variable schreiben.

Die Funktion sieht nun wie folgt aus:

int   GetTypeLastClosePos(int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int   i, lastclosetime=0, 
         lastdealtype=-1;

   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)          continue;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)      continue;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()>1)                  continue;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();              // ... запишем его как предыдущее
            lastdealtype=OrderType();                    // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
      else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError());  // Посмотрим номер ошибки
         break;                                                // Выходим из цикла перебора ордеров
         }
      }
   return(lastdealtype);
}

Wenn wir nun nur die Käufe oder Verkäufe des aktuellen Charts überprüfen wollen und welche davon zuletzt geschlossen wurden, sollten wir diese Funktion wie folgt aufrufen:

int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else {// ... код обработки ошибки ... }

Für die Fehlerbehandlung können wir im Prinzip eine globale Variable anlegen, z.B. int err; und im Körper der Funktion selbst die Fehlernummer in dieser Variable speichern:

else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err=GetLastError();                                                     // Посмотрим номер ошибки
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break;                                                                  // Выходим из цикла перебора ордеров
         }

Um dann den Fehler nach dem Aufruf der Funktion zu bearbeiten ...

GetTypeLastClosePos(Symbol(), Magic);

... und ein Fehler auftritt, wird seine Nummer in der Variablen err gespeichert und im Verarbeitungsblock wird diese Nummer verarbeitet.

else {
   if (err==???) {
      // обработка этой ошибки
      }
   if (err==???) {
      // обработка этой ошибки
      }
// ... и т.д. ...
   }

Besser noch, verwenden Sie den Schalter