Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1919

 
MrBrooklin #:

Merci, Sergey, pour votre réponse ! Votre réponse m'a laissé encore plus perplexe. Comment est-ce possible ? Lorsque je lance le script, tous les ordres en attente sont interrogés. Comme on peut le voir sur l'image, il y en a deux sur le graphique, et en même temps, un ticket est sélectionné et l'autre non ? Ce n'est pas très clair.

Pouvez-vous l'expliquer plus en détail ?

Je ne pose pas cette question par pure curiosité, mais dans le but de poursuivre l'auto-apprentissage.

Salutations, Vladimir.

Ici, vous avez une boucle où vous changez l'itérateur i de l'indice maximum à 0. Que se passe-t-il à l'intérieur ? Eh bien, voici ce qui se passe : la première commande que vous essayez d'obtenir le paramètre ORDER_SYMBOL. Mais de quel ordre essayez-vous de l'obtenir, car l'ordre sera sélectionné trois lignes plus bas !
 
Sergey Gridnev #:
Vous avez donc une boucle dans laquelle vous faites passer l'itérateur i de l'indice maximal à 0. Que se passe-t-il à l'intérieur ? Eh bien, voici ce qui se passe : la première commande que vous essayez d'obtenir le paramètre ORDER_SYMBOL. Mais, de quel ordre essayez-vous de l'obtenir, car l'ordre sera sélectionné trois lignes plus bas !

Merci, Sergey, pour cette explication très détaillée et compréhensible ! J'ai mis la ligne avec le ticket d'ordre en attente juste après le début du cycle et tout a bien fonctionné.

Oui ... Faites attention et faites attention encore une fois. C'est ce qui me manque vraiment. Merci encore !

Sincèrement, Vladimir.

 

Bonjour, chers experts !

Aujourd'hui, j'ai été confronté à deux autres problèmes que je ne comprends pas, mais dans un code entièrement tiré de la référence MQL5. Cette fois, je n'ai rien écrit moi-même, mais j'ai simplement pris un exemple tout fait.

J'ouvre MQL5 Reference / Constantes, énumérations et structures / Structures de données / Structure d'une demande commerciale. Je le trouve là :

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

C'est clair. Je suis suivi d'un exemple avec le code suivant :

#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);
        }
     }
  }
//+------------------------------------------------------------------+

J'essaie de comprendre la ligne surlignée en jaune. Une question se pose immédiatement : quel est le rapport entre PositionGetDouble(POSITION_PRICE_OPEN) et cetexemple qui concerne les ordres en attente ? Peut-être, il devrait y avoir une ligne comme ça :

DoubleToString(OrderGetDouble(ORDER_PRICE_OPEN),digits)
C'est la première chose. Le deuxième problème survient lorsque j'essaie d'exécuter ce script sur un graphique avec un ordre en attente BUY_STOP que j'ai défini (bien que tout ce qui est similaire se passe avec d'autres types d'ordres en attente). Alors, que se passe-t-il ? Rien ne se passe ! Je ne vois pas de modification d'un ordre en cours. Peut-être, je ne comprends pas quelque chose ?

Je ne le trouve que dans l'onglet Experts :
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]
Chers experts, aidez-moi à comprendre cet exemple, pourquoi il est dans le répertoire, mais son code ne fonctionne pas ?

Salutations, Vladimir.
 
MrBrooklin #:
...
Chers experts, veuillez m'aider à comprendre cet exemple, pourquoi est-il dans le livre de référence, mais son code ne fonctionne pas ?

Sincèrement, Vladimir.

J'ai écrit à ce sujet il y a quelques pages.

C'est le forum pour le trading, les systèmes de trading automatisés et les tests de stratégies.

Toutes questions des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes.

Alexey Viktorov, 2022.02.20 10:24

Sasha, il n'y a rien de pire que d'utiliser des exemples tirés de la documentation ou des exemples de tumblr. Et vous avez également perdu le drapeau de terminaison forcée de la boucle while quelque part. En tout et pour tout... pas de mots.
Je doute que les exemples écrits dans la documentation et même dans la bibliothèque standard soient vérifiés de manière approfondie. Ces erreurs sont légion. Les exemples, à mon avis, ne peuvent être utilisés que comme des échantillons...
.
 
Alexey Viktorov #:

J'ai écrit à ce sujet il y a quelques pages

Je doute que les exemples écrits dans la documentation et même dans la bibliothèque standard soient soigneusement vérifiés. Il y a beaucoup d'erreurs de ce type. Les exemples, à mon avis, ne peuvent être utilisés qu'à titre d'exemples...
.

Bonjour Alexey !

Il est très triste qu'une entreprise aussi sérieuse ait une attitude aussi peu respectueuse des manuels.

Sincèrement, Vladimir.

 
MrBrooklin #:

Bonjour Alexey !

Il est très triste qu'une entreprise aussi sérieuse ait une attitude aussi peu sérieuse à l'égard du manuel.

Sincèrement, Vladimir.

Il y a une autre erreur dans cet exemple. Ou complètement aveugle.

Parmi les champs obligatoires énumérés, il y a une expiration, mais dans le code de l'exemple, je ne vois pas où l'expiration est attribuée. Au lieu de cela, l'écart admissible par rapport au prix est attribué.

 
Alexey Viktorov #:

Il y a encore une erreur dans cet exemple. Ou suis-je devenu complètement aveugle...

Parmi les champs obligatoires énumérés, il y a l'expiration, mais dans l'exemple de code, je ne vois pas où l'expiration est affectée. Au lieu de cela, l'écart autorisé par rapport au prix est spécifié.

Non seulement le temps d'expiration, mais il devrait être là aussi :

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

Sincèrement, Vladimir.

 
MrBrooklin #:

Non seulement cela, mais il devrait également y avoir un délai d'expiration:

Sincèrement, Vladimir.

Je m'adresse à Artem Trishkin, le modérateur et organisateur de cette branche !

Pour votre part, avez-vous la possibilité de passer toutes les questions relatives au Guide MQL5 ?

Si cela ne vous dérange pas trop, pouvez-vous au moins mettre à jour cette page?

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

Je m'adresse à Artem Trishkin, le modérateur et l'organisateur de ce fil de discussion !

Avez-vous, de votre côté, la possibilité de transmettre à MQL5 toutes les questions relatives au Guide MQL5 ?

Si cela ne vous dérange pas, cette page pourra au moins être mise à jour ?

Respectueusement, Vladimir.

Vous pouvez également le signaler dans ce fil.

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

Vous pouvez également le signaler dans ce fil.

Je vais d'abord attendre la réponse dans ce fil, mais si rien ne se passe, je le signalerai dans le sujet Erreurs, bogues, questions.

Sincèrement, Vladimir.