Comment travailler correctement dans MT5 avec OrderSend ? - page 2

 
fxsaber:
Il s'agit déjà d'un argument terminologique. La mauvaise situation a été décrite en détail ci-dessus. Les bibliothèques standard ne prennent même pas cela en compte.

Non.

Mais continuez à persister. Je ne l'expliquerai pas davantage.

 
Renat Fatkhullin:

Non.

Mais continuez à persister. Je ne l'expliquerai pas davantage.

Les gens en parlent sur le forum. Et plus d'une fois. La réaction est juste ça.

 
fxsaber:

Les gens en parlent sur le forum. Et plus d'une fois. La réaction est juste comme ça.

Les gens ne veulent pas penser par eux-mêmes, mais veulent que les autres le fassent pour eux... C'est malheureusement le cas.
 
prostotrader:

Voulez-vous que je vous aide à contourner ces mésaventures (à partir de mon expérience personnelle de trading avec des robots MT5 sur un compte réel) ?

Ajouté

Absolument gratuit :)

Ajoutez également les vôtres à la tirelire.

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

Attente de la réponse du serveur après l'envoi de OrderSend()

Denis Sartakov, 2016.10.08 15:43

La fonction est synchrone, mais l'historique n'est pas mis à jour de manière synchrone avec l'achèvement de cette fonction,

Je le fais de cette façon, je pense que c'est plus facile que de bricoler avec OnTrade(), et d'autres trucs :

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+

 
prostotrader:
Les gens ne veulent pas penser par eux-mêmes, mais veulent que les autres le fassent pour eux... C'est malheureusement le cas.

Les gens ne se contentent pas de réfléchir mais partagent également leurs solutions. Les développeurs ne disent rien à ce sujet, malheureusement.

Pas un seul exemple dans la documentation sur ce sujet. Et ceci avec la fonction principale.

 
fxsaber:

Les gens ne se contentent pas de réfléchir mais partagent également leurs solutions. Les développeurs ne disent rien à ce sujet, malheureusement.

Pas un seul exemple dans la documentation sur ce sujet. Et ça, c'est avec la fonction principale.

L'exemple que vous avez donné ci-dessus est, excusez-moi, complètement absurde.

Ce n'est pas l'endroit pour commencer !

 
prostotrader:

L'exemple que vous avez donné ci-dessus est, excusez-moi, complètement absurde.

Ce n'est pas l'endroit pour commencer !

Ma variante

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

Bugs, bugs, questions

fxsaber, 2016.10.09 09:39

Si un OrderSend est envoyé, vous devez vous RAPPELER (c'est là que se trouve la vulnérabilité potentielle) qu'il est fait. Ensuite, il ne tient pas compte de l'historique actuel (environnement de négociation) jusqu'à ce que le message OnTrade approprié arrive. Une fois qu'il est arrivé, N'OUBLIEZ PAS d'oublier.

Lorsqu'il n'y a pas de REMEMBER, vous pouvez vous fier à l'historique comme dans MT4.


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   is_busy=false; 
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!is_busy && (order_ticket==0)) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};
     
     if(PositionSelect(Symbol()))
     {
       if(OrderSend(request, result)
       {
         if(result.retcode==TRADE_RETCODE_PLACED) //для биржи TRADE_RETCODE_PLACED
         {
           if(result.order>0)
           {
             is_busy=true;
             order_ticket=result.order;
             Print("Order plased, ticket = ",result.order);
           }
           else
           {
             Print("Internal error!");
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print("Order NOT send!");
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

Profitez-en.

 
prostotrader:

Utilisez-le.

En quoi est-ce différent de ce que j'ai écrit plus haut ? Un brave homme m'a même envoyé une bible sérieuse sur le sujet.

Les gens trouvent des solutions. C'était à propos du fait que les développeurs eux-mêmes ne l'ont même pas dans le SB.

 
fxsaber:

En quoi est-ce différent de ce que j'ai écrit plus haut ? Un brave homme m'a même laissé une bible sérieuse sur le sujet.

Les gens trouvent des solutions. C'était à propos du fait que les développeurs eux-mêmes ne l'ont même pas dans le SB.

Si vous ne l'aimez pas, ne l'utilisez pas.