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

 
fxsaber:

Mis à jour ci-dessus.

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

Particularités de mql5, trucs et astuces

fxsaber, 2020.04.09 13:13

Il semble que vous ne l'ayez pas du tout rencontré. Jetez un coup d'œil à la documentation. Il y a deux volumes par commande.

Ce sont des limiteurs en direct. Le premier chiffre est le volume original, le second est le volume versé. Dès qu'ils deviennent égaux ou sont supprimés, ils passent à l'histoire.


N'est-ce pas un ordre exécuté en deux parties ? Il semble étrange que les volumes non exécutés soient les mêmes.

 
Alexey Viktorov:

N'est-ce pas un ordre exécuté en deux parties ? Il semble étrange que les volumes non exécutés soient les mêmes.

Coïncidence. Ils ont même des chargeurs différents.

 
fxsaber:

Il ne peut y avoir d'ordre dans le mode d'ordre lorsqu'il est vivant. Une fois mort - il y aura un temps de première exécution, comme il a été dit à l'origine.


Trouvé dans l'histoire.

 
fxsaber:

Lorsque l'on ferme via CloseBy, il semble perdre les majuscules. Je dois vérifier.

Cela semble être la raison pour laquelle le premier code ci-dessous ne fonctionne pas.

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

Historique des bénéfices dans MQL5 ?

fxsaber, 2017.08.26 19:16

  1. MQL5
    double Profit( void )
    {
     double Res = 0;
    
     if (HistorySelect(0, INT_MAX))
       for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
       {
         const ulong Ticket = HistoryDealGetTicket(i);
         
         if((HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) && (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symbol()))
           Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
       }
         
      return(Res);
    }


  2. MQL5 + MQL4
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0;
    
     for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()))
         Res += OrderProfit();
         
      return(Res);
    }

Compter le profit en magie semble être un problème.

 
Les prix des ordres sont normalisés, les transactions ne le sont pas. Le script trouve de telles transactions.
void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--) // Перебираем все сделки
    {
      const ulong Ticket = HistoryDealGetTicket(i); // Тикет сделки
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE); // Цена сделки
      
      if (NormalizeDouble(Price, 5) != Price) // Если цена сделки не нормализована,      
        Print(Ticket);                        // печатаем тикет сделки.
    }
}
 

Les flèches d'ouverture/fermeture des positions, que MT5 place automatiquement en temps réel, sont basées sur les événements TradeTransaction.


Je viens de voir que ces événements (ouverture et fermeture d'une douzaine de positions) ne sont pas parvenus au terminal en raison d'une défaillance momentanée de la connexion - c'était une telle coïncidence, j'étais assis devant mon PC et je les ai regardés à l'œil. Par conséquent, il n'y a pas de flèches correspondantes.


Et, comme cela a parfois été dit ici, vous ne pouvez pas compter sur OnTradeTransaction dans les EA de combat. Dommage qu'il n'y ait pas de mécanisme public fiable pour traiter OrderSendAsync.

 
fxsaber:

Dommage qu'il n'y ait pas de mécanisme public fiable pour traiter OrderSendAsync.

les services peuvent-ils accéder aux métiers? - si oui, alors il est possible de surveiller toutes les 10 ms et d'envoyer l'évènement au graphique

j'ai regardé l'aide, j'ai pensé que j'avais peut-être ajouté des infos sur les services, mais je pense que c'était comme ça l'année dernière :

-Il s'agit d'un programme qui, contrairement aux indicateurs, aux Expert Advisors et aux scripts, ne nécessite pas d'être lié à un graphique. Comme les scripts, les services ne gèrent aucun événement, à l'exception de l'événement de lancement. Afin de démarrer un service, son code doit contenir la fonction de gestion OnStart. Les services n'acceptent pas d'autres événements que Start, mais ils peuvent envoyer des événements personnalisés aux graphiques eux-mêmes en utilisant EventChartCustom

UPD : J'ai écrit un script de service.

struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator==(const SOrderInfo &v){return(positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while(!IsStopped())
   {
      Sleep(10);
      CurrState = UpdateOrdersInfo();
      if(CurrState == LastState) continue;
      LastState = CurrState;
      Print("Orders changed!");
   }
   return(0);
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal();
   result.orderstotal        = OrdersTotal();
   result.historyorderstotal = HistoryOrdersTotal();
   return(result);
}
//+------------------------------------------------------------------+

J'ai ouvert plusieurs ordres et les ai fermés manuellement.

 
Igor Makanu:

les services peuvent-ils accéder aux métiers? - si oui, il est possible de surveiller toutes les 10ms et d'envoyer un événement au graphique

Ce n'est pas différent du même dépassement à Sovtenik. Seulement il ne suffit pas de comparer les comptes, les internes peuvent changer.

 
Andrey Khatimlianskii:

Ce n'est pas différent de la même surenchère dans Owletnik. Seulement il ne suffit pas de comparer la quantité, les internes peuvent changer.

Des services comme Alerters sont très bons. Vous n'avez pas besoin de graphiques, ils sont automatiquement lancés avec le Terminal. Il vous suffit de vous arranger pour passer d'un compte à l'autre.

Le service peut également être un conseiller au combat. Sans l'interface graphique, ce n'est tout simplement pas très pratique.
 
Andrey Khatimlianskii:

Ce n'est pas différent de la même surenchère dans Owletnik. Seulement il ne suffit pas de comparer la quantité, les internes peuvent changer.

est différent.

il existe des tâches dites de contrôle et de gestion

EA - gestion, service - contrôle

le contrôle ne doit pas être superflu - vous prendrez toutes les ressources du système et obtiendrez un système instable au lieu d'un contrôle

il faut définir la criticité des événements, à mon avis, la fermeture et l'ouverture des ordres - ce sont des événements critiques qui doivent être contrôlés, tandis que le changement de TP et SL pourrait être fait comme avant (quelques tentatives ratées - laissez faire, au prochain tick nous réessayerons).

et la manière que vous suggérez - contrôler tout est possible - vous pouvez répéter l'état des commandes dans SQLite, alors il y aura un problème de synchronisation de la base de données avec le service et EA..... tout ceci est inutile


Je pense que le schéma devrait être plus simple - il devrait ressembler à ceci : obtenir l'événementOnTradeTransaction du terminal dans EA et générer l'événement OnChartEvent du service pour un contrôle supplémentaire dans EA.

Raison: