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

 
Ce sujet abordera les façons non documentées de travailler avec le langage mql5, des exemples de résolution de certains problèmes. Je souhaite que le contenu de cette branche soit plus proche de la FAQ que de la discussion. J'invite tous les programmeurs expérimentés à partager leurs solutions et leurs techniques de programmation. La couverture de fonctionnalités non décrites dans l'aide est particulièrement bienvenue.
 
fxsaber:

lorsqu'uneposition est ouverte avec succès par un ordre au marché, un Result.deal nul est obtenu à chaque fois ?

Du conseil d'administration
Il n'est pas garanti que le billet de l'opération Résultat soit rempli. Le fait qu'il soit rempli ou non dépend du mode d'exécution de l'instrument et des paramètres d'un serveur particulier.
Qui a réservé un résultat non nul - agissez.
 
Une fois qu'un OrderSend a été exécuté, l'adressage de l'ordre, de la position ou de la transaction en question ne réussit pas toujours. Il existe des situations où il est nécessaire d'attendre plusieurs dizaines de millisecondes pour que les informations historiques ou actuelles sur les transactions deviennent correctes.
 
fxsaber:
Une fois que l'envoi d'un ordre a été exécuté, il n'est pas toujours possible d'accéder à l'ordre, à la position ou à la transaction en question. Il existe des situations où vous devez attendre quelques dizaines de millisecondes pour que les informations historiques ou actuelles sur les transactions deviennent correctes.
la même chose dans MT4, cela dépend du serveur spécifique.
 
Il n'est pas toujours possible de connaître le prix de l'ordre qui a généré la transaction.
 
Il n'est pas toujours possible de connaître les niveaux SL/TP d'une position fermée.

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

TakeProfit (et StopLoss) d'une position fermée

fxsaber, 2016.07.17 20:19

Avant l'introduction du hedge TakeProfit, les positions ouvertes n'étaient pas stockées sur la bourse sous forme d'ordres limités, mais sur le serveur de trading MT5. Au moment de l'acceptation, ils ont été envoyés à la bourse non pas comme des ordres à cours limité au prix indiqué, mais comme des ordres au marché au prix indiqué.

Cette fonctionnalité est très bien visible dans le testeur lorsque le TP est déclenché : l'ordre au marché approprié (plutôt que la limite) apparaît. Étant donné que le takeprofit est un type d'ordre inexistant en bourse (il n'existe que des ordres au marché et à cours limité), cet état de fait était tout à fait conforme à la "négociabilité".

Avec l'apparition de la couverture, la situation n'a pas changé - le takeprofit est resté virtuel. La situation est différente dans MT4 : au fil des années de ponts MT4, il est devenu standard que les ordres takeprofit MT4 soient des ordres à cours limité.

C'est en raison de cette virtualité que certaines des fonctionnalités de MT5 se traînent comme une traînée. Non seulement il est préférable de ne pas placer le takeprofit dans MT5, mais si vous voulez une contrepartie limite, il n'y a aucun moyen de connaître ses valeurs de takeprofit et de stoploss à travers MQL5 après avoir fermé une position.

Il ne s'agit pas d'une accusation sans discernement, mais du résultat d'heures passées à essayer de comprendre (l'absence de HistorySelectByPosition et d'autres trucs n'aide pas) comment tout fonctionne. Et je suis heureux de m'excuser si je me trompe. Pour ne pas être sans fondement, je montre un Expert Advisor pour le testeur (il est plus facile à comprendre) sur le serveur RoboForexEU-MetaTrader 5, qui ouvre une position, puis met des niveaux SL et TP.

void OnTick()
{
  static bool Flag = true;

  if (Flag)
  {
    // Открываем SELL-позицию
    MqlTradeRequest Request = {0};

    Request.action = TRADE_ACTION_DEAL;

    Request.symbol = Symbol();
    Request.volume = 1;
    Request.price = SymbolInfoDouble(Symbol(), SYMBOL_BID);

    Request.type = ORDER_TYPE_SELL;

    MqlTradeResult Result;

    if (OrderSend(Request, Result))
    {
      // Устанавливаем SL и TP
      Request.position = Result.deal;

      Request.action = TRADE_ACTION_SLTP;

      Request.tp = Result.ask - 10 * _Point;
      Request.sl = Result.ask + 10 * _Point;

      if (OrderSend(Request, Result))
        Print("Сделка в тестере закроется либо по SL, TP, либо по окончании бэктеста")    ;

      Flag = false;
    }
  }
}

Dans cet EA, le SL et le TP d'une seule position fermée ne peuvent pas être définis (dans OnDeinit). C'est censé faire ça ?


Il ressort également de cette citation que le TP d'une position dans MT5 est toujours un ordre au marché. Ne pas mettre en signet la contrepartie de la limite - voir ci-dessus.
 

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

Bugs, bugs, questions

Slawa, 2017.02.14 13:46

Pourquoi ? Une seule action suffit.

Tant que le symbole est sélectionné dans la revue de marché et que l'historique du symbole est détenu par le Conseiller Expert, il est maintenu en synchronisation. Le maintien par le conseiller expert signifie que vous accéderez à cet historique au moins une fois toutes les 2 minutes, par exemple en copiant une barre. Si l'historique est synchronisé, aucun temps n'est passé à copier une barre - seulement quelques cycles de processeur. Ou, comme cela vient d'être dit ici, demandez le nombre de barres, également quelques cycles d'horloge...

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

Bugs, bugs, questions

Alexey Kozitsyn, 2017.02.14 13:47

Les indicateurs comprennent-ils un intervalle de 2 minutes ?

Oui, et en vérifiant le fait de la synchronisation, la synchronisation sera-t-elle également retenue ?

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

Bugs, bugs, questions

Slawa, 2017.02.14 13:50

Cela s'applique également aux indicateurs. Créez une minuterie d'une minute et demandez le nombre de barres de toutes les séries temporelles qui vous intéressent.

La vérification du fait de la synchronisation ne maintient pas la synchronisation.

 
fxsaber:
Une fois l'OrderSend exécuté, la référence à l'ordre, à la position ou à la transaction appropriée n'est pas toujours réussie. Il existe des situations où vous devez attendre quelques dizaines de millisecondes pour que les informations historiques ou actuelles sur les transactions soient correctes.

Vous n'avez pas besoin d'attendre quelques millisecondes.

Le message viendra dans OnTradeTransaction

voir code

Dossiers :
 
prostotrader:

Vous n'avez pas besoin d'attendre quelques millisecondes.

Le message viendra dans OnTradeTransaction

voir le code.

Les scripts ne l'ont pas. Il est stupide d'utiliser EA+ExpertRemove au lieu du script.

De plus, OrderSend se bloque par timeout s'il n'y a pas de réponse du serveur pendant 180 secondes. Cela suggère que la transaction OnTradeTransaction peut accumuler pour toujours des tickets en attente. Et l'option d'un seul order_ticket pour OnTradeTransaction, comme dans votre script, est mauvaise. Après l'envoi asynchrone, il y a un travail avec les listes de commandes. C'est pourquoi il est asynchrone - pour travailler par lots. Et s'il n'y a pas de travail par lot, alors l'asynchronisme n'est jamais nécessaire.

 
L'astuce MT4-OrderClosePrice fonctionne également dans MT5 -PositionGetDouble(POSITION_PRICE_CURRENT).
Raison: