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

 
Je suis en train de bricoler avec CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) et je réalise que ce n'est pas exactement organisé à l'intérieur. Il s'agit de 2 codes de retour - bool et ResultRetcode(). RetCode n'est pas toujours remis à zéro en interne avant de renvoyer false, donc si PositionClose donne false, RetCode peut très bien renvoyer TRADE_RETCODE_DONE. Il serait bien que les développeurs puissent synchroniser ces 2 valeurs de retour.
 
. ... Rick D. ... .:
Je suis en train de bricoler avec CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) et je réalise que ce n'est pas exactement organisé à l'intérieur. Il s'agit de 2 codes de retour - bool et ResultRetcode(). RetCode n'est pas toujours remis à zéro en interne avant de renvoyer false, donc si PositionClose donne false, RetCode peut très bien renvoyer TRADE_RETCODE_DONE. Il serait bien que les développeurs puissent synchroniser ces 2 valeurs de retour.

Code + exemple + journaux.

 
J'ai trouvé un bug étrange. Peut-être que c'est seulement pour moi.

COrderInfo::OrderType() renvoie toujours 0.

Pour le vérifier, vous pouvez placer manuellement n'importe quel ordre en attente (BuyStop, SellStop, ...),
puis entrez-la dans le script.
#include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart()
{
  ulong ticket = 250262937; //здесь ваш тикет
  
  if (!m_order.Select(ticket))
  {
    PrintFormat("COrderInfo::Select(#%I64u) failed", ticket);
    return;
  }
  
  PrintFormat("OrderType= %d", m_order.Type());
}

Peut-être quelque chose avec la table des fonctions virtuelles ? En déboguant, je n'arrive qu'à virtual int CObject::Type()

PS. Je l'ai déjà compris moi-même. COrderInfo possède 2 méthodes similaires : Type() et OrderType().

 
Vladimir Karputov:

Code + exemple + journaux.

Vous voyez ce que je veux dire.

#include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart()
{ 
  int LErr;
  bool bRC;
  double price;

  ResetLastError();
  
  price = 0.0;
  bRC = m_trade.Buy(0.1, "EURUSD", price, 0.0, 0.0);

  LErr = GetLastError();

  PrintFormat("! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
  //---

  ulong ticket = 1; //Позиции с таким тикетом нет
  
  ResetLastError();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError();
  
  PrintFormat("! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

Je ne vois aucune méthode SetResultRetcode et SetResultComment dans CTrade pour les réinitialiser avant chaque nouvelle opération.

Je dois hériter de ma classe, où j'ajoute une seule méthode


class CTradeEx : public CTrade
{
public:
  void SetResult(MqlTradeResult& result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... .:

Vous voyez ce que je veux dire.

Je ne vois aucune méthode SetResultRetcode et SetResultComment dans CTrade pour les réinitialiser avant chaque nouvelle opération.

Pour quoi faire ? Des fonctions totalement inutiles.

Premièrement : vous tirez en l'air - vous envoyez un ordre de transaction sans vérification préalable - sans vérifier ce que l'opération a retourné. Regardez la référence :PositionClose est du type bool.

Ensuite, examinons la chaîne de fermeture de la position : lorsque la position n'est pas trouvée (elle ne peut pas être sélectionnée par le ticket spécifié), "false" est retourné.

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean

Les structures ne sont alors effacées nulle part - car cela n'a aucun sens - après tout, la position n'a pas pu être sélectionnée auparavant, et il n'y a donc aucune information dans les structures.

 
Vladimir Karputov:

Quel est l'intérêt ? Des fonctions totalement inutiles.

Premièrement : vous tirez en l'air - vous envoyez un ordre de transaction sans vérification préalable - sans vérifier ce que l'opération a retourné. Regardons la référence :PositionClose est du type bool.

Ensuite, examinons la chaîne de fermeture de la position : lorsque la position n'est pas trouvée (elle ne peut pas être sélectionnée par le ticket spécifié), "false" est renvoyé.

Dans le même temps, les structures ne sont effacées nulle part, car cela n'a pas de sens - après tout, la position ne pouvait pas être sélectionnée avant, donc il n'y a pas d'information dans les structures.

1) On peut tout aussi bien dire que ResetLastError() est une fonction absolument inutile.

2) Il y a un contrôle pour le résultat retourné. Imaginez, par analogie, que vous appelez une fonction WinAPI, qu'elle renvoie une erreur et que GetLastError() (analogue à ResultRetcode) renvoie tout dernier code.

Si j'ajoute une vérification avant d'appeler PositionClose (ce que je vais faire), cela ne remplace pas les autres vérifications avant les autres appels, lorsque le RetCode ne change pas.

Mon conseiller expert écrit des informations dans le journal. Tout ce dont j'ai besoin, c'est d'écrire dans le journal un ResultRetcode et un ResultComment sains si un appel renvoie faux.

 
. ... Rick D. ... .:

1) On pourrait tout aussi bien dire que ResetLastError() est complètement inutile.

2) Il y a un contrôle du résultat du retour. Imaginez, par analogie, que vous appelez une fonction WinAPI, qu'elle renvoie une erreur et que GetLastError() (analogue à ResultRetcode) renvoie tout dernier code.

Si j'ajoute une vérification avant d'appeler PositionClose (ce que je ferai), cela ne remplace pas les autres vérifications avant les autres appels lorsque le RetCode ne change pas.

Mon conseiller expert écrit des informations dans le journal. Tout ce que j'ai besoin de faire est d'écrire un ResultRetcode et un ResultComment sains dans le journal si un appel renvoie faux.

Lisez l'aide de la classe CTrade lorsque vous devezvérifier le résultat de l'exécution d'une demande de transaction (code de retour du serveur de transaction) en appelant la méthodeResultRetcode().

 
Vladimir Karputov:

Lisez dans l'aide de la classe CTrade quandvérifier le résultat de l'exécution de la demande de transaction (code de retour du serveur de transaction) en appelant la méthodeResultRetcode().

Vous pouvez l'affirmer.

1) Si PositionClose retourne false, alors le Retcode n'est jamais rempli ?

2) Si PositionClose retourne vrai, alors le Retcode est toujours rempli ?

 
Vladimir Karputov:

Ordre -> transaction -> position. Prenez le prix d'ouverture de la position.

Pouvez-vous montrer une image de la façon dont cet ordre -> transaction -> position, il est en dessous de l'endroit où les transactions sont écrites donc il ne permet pas la copie à cet endroit.


 
Seric29:

Pouvez-vous montrer une image de la façon dont cet ordre -> transaction -> position, c'est en bas où les transactions sont écrites donc il ne vous laisse pas copier.


Veuillez soit réécrire votre question, soit mettre des signes de ponctuation, ou mieux encore ajouter sur une image quoi, où et qui. Sinon, il s'avère que je vois des lettres familières, mais ne peut pas comprendre le sens et votre point.