Erreurs, bugs, questions - page 1978

 
STARIJ:
dans FireFox, les thèmes sont toujours mis à jour en haut de la page

Et les bleus sur la gauche

C'est la même chose dans Chrome. Je n'arrive pas à voir automatiquement ces icônes bleues/grises. Et la police en gras des sujets non lus est si impressionnante que j'ai même écrit à son sujet.

 
Quelqu'un a-t-il déjà écrit au service d'assistance ou est-il au courant des projets de MQ d'ajouter les friend-overs à MQL ? Cela fait cruellement défaut.
 

Un cas intéressant sur les comptes AcePrime-Demo.

Nous démarrons le conseiller expert

// Советник возвращает полностью сформированные торговые запросы (включая ручные)
#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + 
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) + 
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
         TOSTRING(Result.retcode_external));
}

void OnTradeTransaction(   const MqlTradeTransaction&, const MqlTradeRequest& Request, const MqlTradeResult& Result )
{
  if (Request.action)
  {
    Print(ToString(Request));
    Print(ToString(Result));    
  }
}

Et nous essayons d'ouvrir une position sur n'importe quel symbole binaire (options binaires). Dans le journal du terminal, on obtient

'3182780': market sell 1.00 XAUUSDbo
'3182780': failed market sell 1.00 XAUUSDbo [Invalid data]

Dans le journal de l'Expert Advisor, nous obtenons

Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = XAUUSDbo
Request.volume = 1.0
Request.price = 0.0
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0

Result.retcode = 4
Result.deal = 0
Result.order = 0
Result.volume = 0.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = 
Result.request_id = 9
Result.retcode_external = 0

Je l'ai vérifié et OrderCheck renvoie vrai. La session commerciale est ouverte, etc. Mais MT5 signale de la même manière les demandes manuelles et automatiques, en me donnant retcode = 4. Pourquoi y a-t-il une telle situation, lorsque le terminal dit que tout est ok, mais vous essayez et rien ne se passe ? Comment puis-je comprendre sans demande qu'il ne s'ouvre pas ? Et quel est ce quatrième code de retour ?

GetLastError() renvoie

ERR_TRADE_SEND_FAILED (ÉCHEC)

4756

Échec de l'envoi de la demande d'échange


Reproduit tout sans aucun problème.
 

Bon après-midi.

Suis-je le seul à penser qu'un code comme celui-ci ne devrait pas compiler (il devrait y avoir une erreur d'accès à un membre privé) ?

class cA;
class cB;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
   //====================
private:
   //====================
   //===============
   //===============
   cB               *B;
   //===============
   //===============
   void              testfunc(void){::Print(__FUNCSIG__);}
   //====================
public:
   //====================
   //===============
   //===============
   void              test(void)
     {
      ::Print(__FUNCSIG__);

      if(::CheckPointer(::GetPointer(this.B))==POINTER_INVALID)return;

      this.B.testfunc();   // Здесь идет вызов private метода объекта B, что вроде как не должно быть возможным
     }
   //===============
   //===============
   void              SetB(cB *const b){this.B=b;}
   //===============
   //===============
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cB  : public cA
  {

  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   cA A;
   cB B;

   A.SetB(&B);
   A.test();

//---
   return(INIT_SUCCEEDED);
  }

SD dit que c'est OK, il peut faire ça...

 
Andrey Barinov:

Bon après-midi.

Suis-je le seul à penser qu'un code comme celui-ci ne devrait pas compiler (il devrait y avoir une erreur d'accès aux membres privés) ?

SD dit que c'est bon, il peut faire ça...

Selon les règles MQL, une instance d'une classe peut accéder librement aux champs et méthodes privés d'une autre instance si elle appartient à la même classe que la première. Puisque cB est hérité de cA, cB est cA et donc cA peut accéder à toutes les méthodes et champs privés de l'instance cB, indépendamment de l'endroit où elle est déclarée.

 
Vasiliy Sokolov:

Selon les règles MQL, une instance d'une classe peut accéder librement aux champs et méthodes privés d'une autre instance si elle appartient à la même classe que la première. Puisque cB est hérité de cA, cB est cA et donc cA peut accéder à toutes les méthodes et champs privés de l'instance cB, peu importe où elle est déclarée.

Merci. Je n'ai pas vu cela dans la documentation. Pouvez-vous l'indiquer ?
 
Andrey Barinov:
Merci. Je n'ai pas vu cela dans la documentation. Pouvez-vous l'indiquer ?
Ce n'est pas dans la documentation, parce que c'est une "fonctionnalité" particulière et non documentée du langage. C'est très étrange et controversé, mais ça s'est quand même passé comme ça.
 
Andrey Barinov:
Merci. Je n'ai pas rencontré cette fonctionnalité dans la documentation. Pouvez-vous l'indiquer ?

C'est également le cas en C++(et MQL est construit à l'image et à la ressemblance de C++). Comme on dit, la confidentialité en C++ se situe au niveau des classes, pas au niveau des objets. Sinon, il ne serait pas possible de créer, par exemple, un constructeur de copie sans méthodes de récupération spéciales pour tous les champs privés.

 
Stanislav Korotky:

C'est la même chose en C++

Avez-vous essayé de compiler cet exemple en C++, ou s'agit-il simplement d'un raisonnement théorique général ?
 
Andrey Barinov:
Merci. Je n'ai jamais rencontré cela dans la documentation. Pouvez-vous l'indiquer ?
Il a inventé cette règle lui-même. La documentation dit :
  • private - permet l'accès aux variables et aux méthodes d'une classe uniquement à partir des méthodes de cette classe.

Par conséquent, testfunc() n'est accessible qu'à partir de méthodes cA: : -> dans ce cas, à partir de cA::test().