Questions des débutants MQL5 MT5 MetaTrader 5 - page 1266

 

Bon temps à vous tous !

J'ai une question sur la fonction ResultDeal() dans la classe CTrade.

Le problème est que dans le testeur de stratégie, cette fonction renvoie le ticket de transaction sans aucun problème, mais lorsque vous lancez l'EA sur le graphique, il renvoie toujours "zéro", malgré le fait que la fonction ResultRetcode() renvoie toujours "TRADE_RETCODE_DONE".

Exemple de code :

/////////////////////////////////////////////////////////////////////
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
/////////////////////////////////////////////////////////////////////
CTrade Trade;
CSymbolInfo SymbolInfo;

uint Retcode;
ulong TicketDeal;
bool first_calc;
bool second_calc;
bool third_calc;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---
   TicketDeal = 9999999;
   
   first_calc = true;
   second_calc = false;
   third_calc = false;   
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
   if(first_calc)
   {
      first_calc = false;
      second_calc = true;
      
      SymbolInfo.Name(Symbol());
      SymbolInfo.RefreshRates();
      Trade.Buy(1.0, Symbol(), SymbolInfo.Ask(), 0.0, 0.0, "BUY");
//---
      Retcode = Trade.ResultRetcode();
      if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
      
      Print("first_calc ////////////////////////////////////");
      Print("PositionsTotal(): ", PositionsTotal());
      Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
   }
   else
   {
      if(second_calc)
      {
         second_calc = false;
         third_calc = true;
//---
         Retcode = Trade.ResultRetcode();
         if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
         
         Print("second_calc ////////////////////////////////////");
         Print("PositionsTotal(): ", PositionsTotal());
         Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
      }
      else
      {
         if(third_calc)
         {
            third_calc = false;
//---
            Retcode = Trade.ResultRetcode();
            if(Retcode == TRADE_RETCODE_DONE) TicketDeal = Trade.ResultDeal();
            
            Print("third_calc ////////////////////////////////////");
            Print("PositionsTotal(): ", PositionsTotal());
            Print("Retcode: ", Retcode, "; TicketDeal: ", TicketDeal);
         }
         else
         {
            //Print("TicketDeal: ", Trade.ResultDeal());
         }
      }
   }   
}
//+------------------------------------------------------------------+

Journal d'exécution dans le Testeur :

2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   first_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:00   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   second_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:02   Retcode: 10009; TicketDeal: 2
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   third_calc ////////////////////////////////////
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   PositionsTotal(): 1
2020.11.25 18:08:54.225 Core 1  2020.11.23 00:05:05   Retcode: 10009; TicketDeal: 2

Journal d'exécution sur le graphique :

2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) first_calc ////////////////////////////////////
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) PositionsTotal(): 0
2020.11.25 18:08:13.991 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.026 _TestSelect (EURUSD,M1) second_calc ////////////////////////////////////
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.027 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) third_calc ////////////////////////////////////
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) PositionsTotal(): 1
2020.11.25 18:08:14.260 _TestSelect (EURUSD,M1) Retcode: 10009; TicketDeal: 0


Qu'est-ce que je fais de mal ? Comment obtenir un ticket d'échange en temps réel ?

Et la deuxième question (de moindre importance), pourquoi, immédiatement après l'exécution d'une transaction , la fonction PositionsTotal() renvoie "zéro" ? Et il affiche des données fiables au prochain tic-tac. Est-il possible d'obtenir ces informations en une seule fois ?


Dossiers :
 
ZAKST:

Bon temps à vous tous !

J'ai une question sur la fonction ResultDeal() dans la classe CTrade.

Le problème est que dans le testeur de stratégie, cette fonction renvoie le ticket de transaction sans aucun problème, mais lorsque vous lancez l'EA sur le graphique, il renvoie toujours "zéro", malgré le fait que la fonction ResultRetcode() renvoie toujours "TRADE_RETCODE_DONE".

Exemple de code :

Journal d'exécution dans le Testeur :

Journal d'exécution sur le graphique :


Qu'est-ce que je fais de mal ? Comment obtenir un ticket d'échange en temps réel ?

Et la deuxième question (de moindre importance), pourquoi, immédiatement après l'exécution d'une transaction , la fonction PositionsTotal() renvoie "zéro" ? Et il affiche des données fiables au prochain tic-tac. Est-il possible d'obtenir ces informations en une seule fois ?


Hmm... Tout à coup, les données dont j'ai besoin en temps réel sont renvoyées par la fonction ResultOrder() de la même classeCTrade, bien que je n'aie pas utilisé d'ordres en attente...

La question est la même : qu'est-ce que je fais mal ?

 

Il existe une macro comme celle-ci.

#define  Warning if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

Je l'utilise comme ça.

Warning"Warnig  сработал. ");

Question : Que faut-il corriger dans la définition de la macro pour pouvoir l'utiliser de cette manière ?

Warning("Warnig  сработал. ");

c'est-à-dire avec une parenthèse entre Warning et "Warnig worked". "J'ai essayé d'utiliser une parenthèse dans la définition de la macro.

#define  Warning( if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+" ",

mais le compilateur ne me laisse pas utiliser une parenthèse.

 
ZAKST:

Hmm... Soudain, la fonction ResultOrder() de la même classeCTrade renvoie les données dont j'ai besoin en temps réel, bien que je n'aie pas utilisé d'ordres en attente...

La question est la même : qu'est-ce que je fais de mal ?

Il suffit de comprendre le système d'ordre de MT5, ordre - transaction - position.

ResultOrder est l'ordre d'ouverture. La position sera avec POSITION_IDENTIFIER égale au ticket de cette commande.

Toutes les transactions peuvent être retrouvées dans l'historique par l'identifiant de la position. Ne pas confondre avec le billet de la position, il peut changer, et l'identifiant est constant.

s.s. Le testeur est différent en ce sens qu'il n'y a pas de retard dans l'exécution de l'ordre et que l'affaire est créée immédiatement. Dans la vie réelle, le temps passe et au moment de la création réussie d'un ordre, il n'y a pas encore d'accord, il doit être pris dans les événements OnTrade.
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
pivomoe:

Il existe une macro comme celle-ci.

Je l'utilise comme ça.

Question : Que faut-il corriger dans la définition de la macro pour pouvoir l'utiliser de cette manière ?

c'est-à-dire avec une parenthèse entre Warning et "Warnig worked". "J'ai essayé d'utiliser une parenthèse dans la définition de la macro.

mais le compilateur ne vous laissera pas utiliser une parenthèse.

vous voulez utiliser une forme paramétrique, mais vous avez spécifié une forme non-paramétrique. cela devrait se passer comme suit

#define  Warning(CUSTOM) (if(ComentWarnig)LogWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')+"",string(CUSTOM)))


Warning("Warnig  сработал. ");
 

Je ne l'ai pas bien expliqué. Commençons par le début. Maintenant, j'utilise la macro comme ceci :

Warning,"Warnig  сработал. i=",i);

Voici la macro elle-même :

#define  Warning if(LogWarnig)MoiLoggerWarnig.Write(__FILE__":"+IntegerToString(__LINE__,4,'0')

Dans l'appel de la macro entre "Warning," et ") ;" Un nombre arbitraire de paramètres de types arbitraires. Tout ceci est réalisé en rechargeant de manière répétée la fonction d'écriture.

Question. Que dois-je corriger dans la macro pour pouvoir l'appeler comme ceci :

Warning("Warnig  сработал. i=",i);
 
pivomoe:

Je ne l'ai pas bien expliqué. Commençons par le début. Maintenant, j'utilise la macro comme ceci :

Voici la macro elle-même :

Dans l'appel de la macro entre "Warning," et ") ;" Un nombre arbitraire de paramètres de types arbitraires. Tout cela est réalisé en rechargeant de manière répétée la fonction d'écriture.

Question. Que faut-il corriger dans la macro pour permettre son appel comme ceci :

Réponse : rechargez également la macro plusieurs fois)

Mais il est préférable d'utiliser l'opérateur + pour les chaînes de caractères et de tout convertir en chaînes de caractères. Ainsi, vous n'avez pas besoin d'une version de la fonction (et de la macro) avec de nombreux paramètres.

 
Aleksey Mavrin:

Il suffit de comprendre le système d'ordre de MT5, ordre - transaction - position.

ResultOrder est l'ordre d'ouverture. La position sera avec POSITION_IDENTIFIER égale au ticket de cette commande.

Toutes les transactions peuvent être retrouvées dans l'historique par l'identifiant de la position. Ne pas confondre avec le billet de la position, il peut changer, et l'identifiant est constant.

s.w. Le testeur est différent en ce sens qu'il n'y a pas de retard dans l'exécution de l'ordre et qu'une transaction est immédiatement née. Dans une transaction réelle, le temps passe et au moment de l'exécution réussie, il n'y a pas encore d'accord, cela doit être pris en compte dans les événements OnTrade.
Je vous remercie de votre réponse. Je vais m'en occuper))
 
Bonjour, comment accéder aux propriétés d'un indicateur depuis un EA ? Par exemple, je veux changer la couleur d'une ligne d'un EA connaissant la poignée de l'indicateur. J'ai cherché dans l'aide, je n'ai rien trouvé, peut-être que je ne cherche pas assez ?
 
Tango_X:
Bonjour, comment puis-je accéder aux propriétés d'un indicateur à partir d'une EA ? Par exemple, je veux changer la couleur de la ligne d'un EA si je connais la poignée de l'indicateur. Je l'ai cherché, je ne l'ai pas trouvé, peut-être que je cherche trop ?

Un indicateur pour cela doit avoir un paramètre de couleur d'entrée. C'est-à-dire qu'il doit s'agir d'un indicateur personnalisé.