Caractéristiques du langage mql5, subtilités et techniques - page 155

 
Nikolai Semko:

J'ai trouvé une étude intéressante datant d'il y a deux ans, qui compare l'efficacité de différentes langues.

https://greenlab.di.uminho.pt/wp-content/uploads/2017/09/paperSLE.pdf



Oh là là !

Ada est vraiment vivante et en pleine croissance ! Si je ne me trompe pas, le premier OOP. Je l'ai étudié au début des années 80. Je n'en avais jamais entendu parler jusqu'à présent, je pensais que ce langage était aussi mort que Modula. Les deux sont des mises à jour profondes de Pascal. Je n'avais pas de compilateur Ada, et j'avais Modula - un sept-passe sur DWK, si quelqu'un s'en souvient.

 

Pour éviter les erreurs d'exécution dans le testeur, envoyez des ordres au marché appropriés au cas où un pending ou un SL/TP devrait être placé auprix actuel:

  • Placez un ordre en attente au prix actuel - ajoutez-le après l'ordre au marché OrderSend.
  • Placez une position SL/TP au prix actuel - ajoutez après la position OrderClose.
 
fxsaber:

Pour éviter les erreurs d'exécution dans le testeur, envoyez des ordres au marché appropriés au cas où un ordre en attente ou un SL/TP devrait être placé au prix actuel:

  • Placez un ordre en attente au prix actuel - ajoutez-le après l'ordre au marché OrderSend.
  • Placez une position SL/TP au prix actuel - ajoutez-la après la position OrderClose.

Pouvons-nous en discuter plus en détail ? Ce n'est pas très clair :

  • pour placer un ordre en attente au prix actuel, il faut ajouter quelque chose après avoir envoyé une demande d'ouverture de position ( ?????????)
  • pour placer un ordre stop (à quoi ?) au prix actuel, il faut ajouter quelque chose après avoir envoyé une demande de fermeture de position ( ?????????)
Ce sont les questions qui se posent après avoir essayé de déchiffrer ce que vous avez écrit ...
 
Artyom Trishkin:

Pourriez-vous être plus précis ? Ce n'est pas très clair :

  • pour placer un ordre en attente au prix actuel, il faut ajouter quelque chose après avoir envoyé une demande d'ouverture de position ( ?????????)
  • pour placer un ordre stop (à quoi ?) au prix actuel, il faut ajouter quelque chose après avoir envoyé une demande de fermeture de position ( ?????????)
Ces questions apparaissent après avoir essayé de déchiffrer ce que vous avez écrit ...

Le problème est illustré ici. Solution.

// Делает более точными MT4/5-тестеры.
TICKET_TYPE MyOrderSend( const string Symb, int Type, const double dVolume, const double Price, const int SlipPage, const double SL, const double TP,
                         const string comment = NULL, const MAGIC_TYPE magic = 0, const datetime dExpiration = 0, color arrow_color = clrNONE )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  MqlTick Tick = {0};  
  
  bool Res = IsTester && SymbolInfoTick(Symb, Tick);
  
  if (Res && (Type > OP_SELL))
  {
    if ((Type == OP_BUYLIMIT) || (Type == OP_BUYSTOP))
    {
      if (Price == Tick.ask)
        Type = OP_BUY;
    }
    else if (Price == Tick.bid)
      Type = OP_SELL;
  }
  
  const TICKET_TYPE Ticket = OrderSend(Symb, Type, dVolume, Price, SlipPage, SL, TP, comment, magic, dExpiration, arrow_color);
  
  Res = Res && (Type <= OP_SELL) && (Ticket != -1) &&
        (Type ? (SL == Tick.ask) || (TP == Tick.ask) : (SL == Tick.bid) || (TP == Tick.bid)) &&
        OrderClose(Ticket, dVolume, Type ? Tick.ask : Tick.bid, SlipPage, arrow_color);
  
  return(Ticket);
}

// Делает более точными MT4/5-тестеры.
bool MyOrderModify( const long Ticket, const double Price, const double SL, const double TP, const datetime Expiration, const color Arrow_Color = clrNONE )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  
  bool Res = false;
  
  if (IsTester && OrderSelect(Ticket, SELECT_BY_TICKET) && !OrderCloseTime())
  {
    if (OrderType() <= OP_SELL)
    {
      Res = (OrderClosePrice() == SL) || (OrderClosePrice() == TP);
      Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color) && (!Res || OrderClose(Ticket, OrderLots(), OrderClosePrice(), 0, Arrow_Color));
    }
    else if (OrderClosePrice())    
      Res = ((OrderClosePrice() == Price) &&
             (MyOrderSend(OrderSymbol(), OrderType() & 1, OrderLots(), Price, 0, SL, TP,
                          OrderComment(), OrderMagicNumber(), OrderExpiration(), Arrow_Color) != -1) && OrderDelete(Ticket)) ||
            OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);
    else
    {
      MqlTick Tick = {0};
      
      if (SymbolInfoTick(OrderSymbol(), Tick))
        Res = (((bool)(OrderType() & 1) ? (Price == Tick.bid) : (Price == Tick.ask)) &&
               (MyOrderSend(OrderSymbol(), OrderType() & 1, OrderLots(), Price, 0, SL, TP,
                            OrderComment(), OrderMagicNumber(), OrderExpiration(), Arrow_Color) != -1) && OrderDelete(Ticket)) ||
               OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);
      else
        Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color);                     
    }
  }
  else
    Res = OrderModify(Ticket, Price, SL, TP, Expiration, Arrow_Color); 
  
  return(Res);
}

#define OrderSend MyOrderSend
#define  OrderModify MyOrderModify
 
fxsaber:

Le problème est illustré ici. Solution.

Cela ne permet pas de savoir plus clairement à quoi il sert ou ce qu'il faut faire. Après tout, de nombreuses personnes ont besoin de comprendre ce qui est écrit sur la raison de l'écriture d'une solution avant de commencer à lire le code pour créer la leur ou utiliser une solution toute faite.

J'ai demandé une explication plus détaillée à ce sujet :

Le forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading.

Caractéristiques du langage mql5, subtilités et techniques

fxsaber, 2019.12.18 12:45

Pour éviter les erreurs d'exécution dans le Testeur, envoyez des ordres au marché appropriés au cas où vous auriez besoin de placer un pending ou un SL/TP au prix actuel:

  • Placez un ordre en attente au prix actuel - ajoutez après l'OrdreEnvoyez un ordre au marché.
  • Placez une position SL/TP au prix actuel - ajoutez-la après la position OrderClose.

Et montré un exemple de la façon dont il est perçu par moi, ou peut-être par quelqu'un d'autre :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Particularités de mql5, trucs et astuces

Artyom Trishkin, 2019.12.18 12:53 pm

Comment puis-je l'expliquer plus en détail ? Je ne comprends rien :

  • pour placer un ordre en attente au prix actuel, vous devez ajouter quelque chose après avoir envoyé une demande d'ouverture de position ( ?????????)
  • pour placer un ordre stop (à quoi ?) au prix actuel, il faut ajouter quelque chose après avoir envoyé une demande de fermeture de position ( ?????????)
Ce sont les questions qui apparaissent après avoir essayé de déchiffrer ce que vous avez écrit...

En tout cas...

 
Artyom Trishkin:

Je vous ai demandé d'être plus précis

Placer un ordre en suspens et un SL/TP au prix actuel n'accepte pas l'exécution sur le tick actuel dans le MT5-Tester.

 

Bonjour à tous.

Pouvez-vous me dire quels sont les outils disponibles dans MT5 pour afficher les graphiques en tic-tac ?

Dans MT4, il y avait une option "ouvrir hors ligne". Il était pratique de travailler avec des ticks en créant mes propres fichiers hst d'historique.

Dans MT5, il n'y a pas d'option "ouvrir en mode autonome". Mais les outils logiciels permettant de travailler avec les tiques sont excellents.

Il n'est pas impossible qu'il n'y ait pas la possibilité de les montrer sur un graphique.

 
fxsaber:

Le problème est illustré ici. Solution.

  const TICKET_TYPE Ticket = OrderSend();
  ...
  OrderClose(Ticket, dVolume, Type ? Tick.ask : Tick.bid, SlipPage, arrow_color);

Quelle connerie ! Pourquoi ouvrir avec SL/TP au prix actuel ?

Eh bien, clôturer en plaçant le SL/TP au prix actuel, si tant est que ce soit le cas, est fait intentionnellement. Il n'est pas non plus nécessaire d'émuler le déclenchement.

 
Andrey Khatimlianskii:

Quelle connerie ! Pourquoi ouvrir avec SL/TP au prix actuel ?

Eh bien, clôturer en plaçant le SL/TP au prix actuel, si tant est que ce soit le cas, est fait intentionnellement. Il n'est pas non plus nécessaire d'émuler le déclenchement.

De cette façon, vous pouvez facilement obtenir un déclencheur en quelques dizaines de minutes ou d'heures.

Imaginez que vous ayez besoin de fermer par TP qui est en quelque sorte calculé. Et maintenant, il est égal au prix actuel.

 
fxsaber:

doivent fermer au TP, qui est en quelque sorte calculé. Et maintenant, il est devenu égal au prix actuel.

Dans ce cas, je vérifie toujours si ce TP n'aurait pas déjà dû se déclencher (le prix l'a franchi), et je ferme en fonction du marché.

Ou, s'il est nécessaire de sortir avec une limite, je la tire derrière le prix, jusqu'à ce qu'elle se remplisse.