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

 
MrBrooklin #:

Vielen Dank, Sergey, für deine Antwort! Ihre Antwort hat mich noch mehr verblüfft. Wie kann das sein? Wenn ich das Skript ausführe, werden alle eingestellten schwebenden Aufträge abgefragt. Wie in der Abbildung zu sehen ist, gibt es zwei von ihnen auf dem Diagramm, und zur gleichen Zeit ist ein Ticket ausgewählt und das andere nicht? Das ist nicht ganz klar.

Können Sie das näher erläutern?

Ich stelle diese Frage nicht aus reiner Neugierde, sondern um das Selbststudium fortzusetzen.

Mit freundlichen Grüßen, Vladimir.

Hier haben Sie eine Schleife, in der Sie den Iterator i vom maximalen Index auf 0 ändern. Was passiert darin? Nun, folgendes passiert: Der erste Befehl, den Sie versuchen, den Parameter ORDER_SYMBOL zu erhalten. Aber aus welchem Auftrag wollen Sie es holen, denn der Auftrag wird drei Zeilen weiter unten ausgewählt!
 
Sergey Gridnev #:
Sie haben also eine Schleife, in der Sie den Iterator i vom Maximalindex auf 0 ändern. Was geht darin vor? Nun, es passiert folgendes: Der erste Befehl, den Sie versuchen, den Parameter ORDER_SYMBOL zu erhalten. Aber aus welcher Reihenfolge versuchen Sie es zu holen, denn die Reihenfolge wird drei Zeilen weiter unten ausgewählt!

Vielen Dank, Sergey, für die sehr ausführliche und verständliche Erklärung! Ich habe die Zeile mit dem Ticket für ausstehende Aufträge direkt nach dem Start des Zyklus eingefügt und alles hat gut funktioniert.

Ja ... Passen Sie auf und passen Sie noch einmal auf. Das ist es, was ich wirklich vermisse. Nochmals vielen Dank!

Mit freundlichen Grüßen, Vladimir.

 

Guten Morgen, geschätzte Experten!

Heute bin ich auf zwei weitere Probleme gestoßen, die ich nicht verstehe, aber in einem Code, der vollständig aus der MQL5-Referenz stammt. Diesmal habe ich nichts selbst geschrieben, sondern einfach ein fertiges Beispiel genommen.

Ich öffne MQL5 Referenz / Konstanten, Aufzählungen und Strukturen / Datenstrukturen / Struktur einer Handelsanfrage. Ich finde sie dort:

Struktur des Handelsantrags
Modify Pending Order
Торговый приказ на модификацию уровней цен отложенного ордера. Требуется указание 7 полей:
    action
    order
    price
    sl
    tp
    type_time
    expiration
 Пример торговой операции TRADE_ACTION_MODIFY для модификации уровней цен отложенного ордера:

Das ist klar. Es folgt ein Beispiel mit folgendem Code:

#define  EXPERT_MAGIC 123456  // MagicNumber эксперта
//+------------------------------------------------------------------+
//| Модификация отложенных ордеров                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//-- объявление и инициализация запроса и результата
   MqlTradeRequest request={};
   MqlTradeResult  result={};
   int total=OrdersTotal(); // количество установленных отложенных ордеров
//--- перебор всех установленных отложенных ордеров
   for(int i=0; i<total; i++)
     {
      //--- параметры ордера
      ulong  order_ticket=OrderGetTicket(i);                             // тикет ордера
      string order_symbol=Symbol();                                      // символ
      int    digits=(int)SymbolInfoInteger(order_symbol,SYMBOL_DIGITS);  // количество знаков после запятой
      ulong  magic=OrderGetInteger(ORDER_MAGIC);                         // MagicNumber ордера
      double volume=OrderGetDouble(ORDER_VOLUME_CURRENT);                // текущий объем ордера
      double sl=OrderGetDouble(ORDER_SL);                                // текущий Stop Loss ордера
      double tp=OrderGetDouble(ORDER_TP);                                // текущий Take Profit ордера
      ENUM_ORDER_TYPE type=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); // тип ордера
      int offset = 50;                                                   // отступ от текущей цены для установки ордера, в пунктах
      double price;                                                      // цена срабатывания ордера
      double point=SymbolInfoDouble(order_symbol,SYMBOL_POINT);          // размер пункта
      //--- вывод информации об ордере
      PrintFormat("#%I64u %s  %s  %.2f  %s  sl: %s  tp: %s  [%I64d]",
                  order_ticket,
                  order_symbol,
                  EnumToString(type),
                  volume,
                  DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits),
                  DoubleToString(sl,digits),
                  DoubleToString(tp,digits),
                  magic);
      //--- если MagicNumber совпадает, Stop Loss и Take Profit не заданы
      if(magic==EXPERT_MAGIC && sl==0 && tp==0)
        {
         request.action=TRADE_ACTION_MODIFY;                           // тип торговой операции
         request.order = OrderGetTicket(i);                            // тикет ордера
         request.symbol   =Symbol();                                   // символ
         request.deviation=5;                                          // допустимое отклонение от цены
        //--- установка уровня цены, тейк-профит и стоп-лосс ордера в зависимости от его типа
         if(type==ORDER_TYPE_BUY_LIMIT)
           {
            price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)-offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                // нормализованная цена открытия
           }
         else if(type==ORDER_TYPE_SELL_LIMIT)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)+offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // нормализованная цена открытия
           }
         else if(type==ORDER_TYPE_BUY_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_ASK)+offset*point; 
            request.tp = NormalizeDouble(price+offset*point,digits);
            request.sl = NormalizeDouble(price-offset*point,digits);
            request.price    =NormalizeDouble(price,digits);                 // нормализованная цена открытия
           }
         else if(type==ORDER_TYPE_SELL_STOP)
           {
           price = SymbolInfoDouble(Symbol(),SYMBOL_BID)-offset*point; 
            request.tp = NormalizeDouble(price-offset*point,digits);
            request.sl = NormalizeDouble(price+offset*point,digits);
            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);
         //--- обнуление значений запроса и результата
         ZeroMemory(request);
         ZeroMemory(result);
        }
     }
  }
//+------------------------------------------------------------------+

Ich versuche, die gelb markierte Zeile zu verstehen. Eine Frage stellt sich sofort: Was hat PositionGetDouble(POSITION_PRICE_OPEN) damit zu tun, wenn sich dieses Beispiel auf schwebende Aufträge bezieht? Vielleicht sollte es eine Zeile wie diese geben:

DoubleToString(OrderGetDouble(ORDER_PRICE_OPEN),digits)
Dies ist der erste Punkt. Das zweite Problem tritt auf, wenn ich versuche, dieses Skript auf einem Diagramm mit einer BUY_STOP Pending Order, die ich eingestellt habe, auszuführen (obwohl bei anderen Arten von Pending Orders Ähnliches passiert). Was passiert also? Nichts passiert! Ich sehe keine Änderung eines ausstehenden Auftrags. Vielleicht verstehe ich etwas nicht?

Ich finde dies nur auf der Registerkarte Experten:
2022.02.25 08:41:38.491 4 (EURUSD,M1)   #4727791  EURUSD  ORDER_TYPE_BUY_STOP  0.10  0.00000  sl: 0.00000  tp: 0.00000  [0]
Liebe Experten, bitte helfen Sie mir, dieses Beispiel zu verstehen, warum es im Verzeichnis ist, aber sein Code nicht funktioniert?

Mit freundlichen Grüßen, Vladimir.
 
MrBrooklin #:
...
Liebe Experten, bitte helfen Sie mir, dieses Beispiel zu verstehen, warum steht es im Referenzbuch, aber der Code funktioniert nicht?

Mit freundlichen Grüßen, Vladimir.

Ich habe vor ein paar Seiten darüber geschrieben.

Dies ist das Forum für Handel, automatisierte Handelssysteme und Strategietests.

Alle Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion von Algorithmen und Codes

Alexey Viktorov, 2022.02.20 10:24

Sascha, du kannst dir nichts Schlimmeres vorstellen, als Beispiele aus der Dokumentation oder Tumblr-Beispiele zu verwenden. Und Sie haben auch das Flag für die erzwungene Beendigung der while-Schleife irgendwo verloren. Alles in allem ... ohne Worte.
Ich bezweifle, dass die in der Dokumentation und sogar in der Standardbibliothek enthaltenen Beispiele gründlich überprüft werden. Solche Fehler gibt es zuhauf. Beispiele können meiner Meinung nach nur als Muster verwendet werden...
 
Alexey Viktorov #:

Darüber habe ich bereits vor einigen Seiten geschrieben

Ich bezweifle, dass die in der Dokumentation und sogar in der Standardbibliothek enthaltenen Beispiele gründlich überprüft werden. Es gibt eine Menge solcher Fehler. Beispiele können meines Erachtens nur als Beispiele verwendet werden...

Hallo Alexey!

Es ist sehr traurig, dass ein so seriöses Unternehmen eine so schlechte Einstellung zu Handbüchern hat.

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin #:

Hallo Alexey!

Es ist sehr traurig, dass ein so seriöses Unternehmen eine so unernste Einstellung zum Handbuch hat.

Mit freundlichen Grüßen, Vladimir.

In diesem Beispiel gibt es noch einen weiteren Fehler. Oder völlig blind.

Unter den aufgelisteten Pflichtfeldern ist ein Ablaufdatum angegeben, aber im Code des Beispiels sehe ich nicht, wo das Ablaufdatum zugewiesen ist. Stattdessen wird die zulässige Abweichung vom Preis zugewiesen.

 
Alexey Viktorov #:

In diesem Beispiel gibt es noch einen Fehler. Oder vielleicht bin ich völlig blind...

Unter den aufgelisteten obligatorischen Feldern befindet sich ein Ablaufdatum, aber im Beispielcode sehe ich nicht, wo das Ablaufdatum zugewiesen ist. Stattdessen wird die zulässige Abweichung vom Preis angegeben.

Nicht nur die Verfallszeit, sondern auch der Zeitpunkt des Verfalls sollte berücksichtigt werden:

type_time - тип истечения

Mit freundlichen Grüßen, Vladimir.

 
MrBrooklin #:

Und nicht nur das, es sollte auch eine Verfallszeit geben:

Mit freundlichen Grüßen, Vladimir.

Ich wende mich an Artem Trishkin, den Moderator und Organisator dieses Zweigs!

Haben Sie die Möglichkeit, alle Fragen im Zusammenhang mit dem MQL5 Guide to MQL zu bestehen?

Wenn es nicht zu viel Mühe macht, können Sie zumindest diese Seite aktualisieren?

Mit freundlichen Grüßen, Vladimir.
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Типы торговых операций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
MrBrooklin #:

Ich wende mich an Artem Trishkin, den Moderator und Organisator dieses Threads!

Haben Sie Ihrerseits die Möglichkeit, alle Fragen im Zusammenhang mit dem MQL5-Leitfaden an MQL5 weiterzuleiten?

Wenn es Ihnen nichts ausmacht, kann zumindest diese Seite aktualisiert werden?

Hochachtungsvoll, Vladimir.

Sie können es auch in diesem Thread melden.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2022.02.24
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Alexey Viktorov #:

Sie können es auch in diesem Thread melden.

Danke für den Tipp, Alexey! Ich werde zunächst auf eine Antwort in diesem Thread warten, aber wenn nichts passiert, werde ich es im Thema Fehler, Bugs, Fragen melden.

Mit freundlichen Grüßen, Vladimir.