Erreurs, bugs, questions - page 2412

 
Andrey Dik:

le lot est correct, donc le ticket est correct.

Non. Les deux transactions, In et Out, ont le même lot. Mais le bénéfice ne l'est pas.

Voici mon code. Ça marche.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
ulong LastOutDealTicket(const string symbol,const uint magic)
  {
//===============
   long lasttime=0;
//===============

//===============
   ulong ticket=0;
//===============

//===============
#ifdef __MQL5__
//===============
   ::HistorySelect(0,TimeCurrent()+60);
//===============
   const int deals=::HistoryDealsTotal();
//===============
   for(int i=deals-1;i>=0;i--)
     {
      //===============
      const ulong tempticket=::HistoryDealGetTicket(i);
      //===============

      //===============
      if(::HistoryDealGetInteger(tempticket,DEAL_ENTRY)!=DEAL_ENTRY_OUT || ::HistoryDealGetString(tempticket,DEAL_SYMBOL)!=symbol ||
         ::HistoryDealGetInteger(tempticket,DEAL_MAGIC)!=magic)continue;
      //===============

      //===============
      if(::MQLInfoInteger(MQL_TESTER))return(tempticket);
      //===============

      //===============
      if(::HistoryDealGetInteger(tempticket,DEAL_TIME)<=lasttime)continue;
      //===============

      //===============
      ticket=tempticket;
      lasttime=::HistoryDealGetInteger(tempticket,DEAL_TIME);
      //===============
     }
//===============
#endif 
//===============

//===============
#ifdef __MQL4__
//===============
   const int ordershistory=OrdersHistoryTotal();
//===============
   for(int i=ordershistory-1;i>=0;i--)
     {
      //===============
      if(!::OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) || ::OrderSymbol()!=symbol || ::OrderMagicNumber()!=magic || 
         (::OrderType()!=OP_SELL && ::OrderType()!=OP_BUY))continue;
      //===============

      //===============
      if(::MQLInfoInteger(MQL_TESTER))return(::OrderTicket());
      //===============

      //===============
      if(::OrderCloseTime()<=lasttime)continue;
      //===============

      //===============
      ticket=::OrderTicket();
      lasttime=::OrderCloseTime();
      //===============
     }
//===============
#endif 
//===============

//===============
   return(ticket);
//===============
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastClosedProfit(const string symbol,const uint magic)
  {
//===============
   const ulong lastoutticket=::LastOutDealTicket(symbol,magic);
//===============

//===============
   if(lastoutticket<=0)return(0);
//===============

//===============
   double result=0;
//===============

//===============
#ifdef __MQL5__
//===============
   result=::HistoryDealGetDouble(lastoutticket,DEAL_PROFIT);
//===============
#endif 
//===============

//===============
#ifdef __MQL4__
//===============
   if(::OrderSelect((int)lastoutticket,SELECT_BY_TICKET,MODE_HISTORY))result=::OrderProfit();
//===============
#endif 
//===============

//===============
   return(result);
//===============
  }
 
Andrey Barinov:

Non. Les deux transactions, In et Out, ont le même lot. Le bénéfice ne l'est pas.

Voici mon code. Ça marche.

je l'ai essayé, votre code donne 0.0 aussi)))

Le compte est couvert, si tant est qu'il le soit.
 
Andrey Dik:

je l'ai essayé, votre code donne 0.0 aussi)))

Le compte est couvert, si tant est qu'il le soit.

Je viens de vérifier tout ce qui concerne la construction 2009. Mon code donne ce qu'il doit donner. S'il donne 0, cela signifie que vous avez 0 à cet endroit.

 
Andrey Barinov:

J'ai tout vérifié sur la version 2009. Mon code donne ce qu'il est censé donner. S'il donne 0, cela signifie que vous avez 0 à cet endroit.

Comment se fait-il que, dans l'historique, il y a des transactions fermées avec un résultat non nul, et que cela donne 0

 
Andrey Barinov:
Andrey Dik:

Il est possible que le problème se situe du côté du courant continu.

 
Alexey Kozitsyn:

Il est possible que le problème se situe du côté du courant continu.

Je l'ai essayé sur Metaquotes et Robo, dans le testeur.

 
J'ai trouvé mon erreur... Mon erreur est que je n'ai pas passé une majik à la fonction de fermeture de position, mais à la fonction d'ouverture, et en conséquence la transaction n'a pas pu être sélectionnée par la majik....
 

Si vous utilisez CSymbolInfo en multidevise, qui est appelé par la méthode Name au moment de l'initialisation :

if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE,m_tick_value))
   return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_PROFIT,m_tick_value_profit))
   return(false);
if(!SymbolInfoDouble(m_name,SYMBOL_TRADE_TICK_VALUE_LOSS,m_tick_value_loss))
   return(false);

Pendant le test du symbole USDCAD, des erreurs se produiront :

no prices for symbol
 
Andrey Pogoreltsev:

Si vous utilisez CSymbolInfo en multidevise, qui est appelé par la méthode Name au moment de l'initialisation :

Il y aura des erreurs pour le symbole USDCAD pendant les tests :

Est-ce que quelqu'un comprend au moins ce dont nous parlons ?

 
Je ne peux pas joindre un fichier avec le cahier des charges dans le corps du message. Dans quel format doit-il être ?