Caractéristiques du langage mql4, subtilités et techniques - page 33

 
Nauris Zukas:
Bonjour !
Un courtier est constamment (une ou deux fois par jour) MarketInfo() s'envole, obtient la valeur 0 ( spécifiquement MODE_MARGINREQUIRED). C'est plutôt normal, mais en même temps il n'y a aucune tentative d'atteindre l'indicateur iCustom() (connecté par une ressource). Même après que MarketInfo() ait reçu des données, iCustom() reste silencieux. Seul le redémarrage du terminal est utile. Comment accéder à l'indicateur sans redémarrer le terminal, des idées ? L'indicateur peut-il disparaître d'une ressource quelconque ?

Après un mois de tests de toutes sortes, je peux déjà dire avec certitude qu'il y a un problème, seulement je ne peux pas dire si la ressource est manquante ou si iCustom() est cassé. Le problème n'est détecté que chez un seul courtier, ce qui est très désagréable pour le trading réel. Avant de lancer des mots comme MT4 ou MQL, c'est un bug, je vais vous donner le dernier code le plus simple et l'exécution du test. Je publierai également les résultats. Il y a peut-être un bug dans mon code, que je ne connais pas. Je vous rappelle encore une fois que le problème n'est détecté qu'avec un seul courtier (vous le verrez dans le journal de bord).

Indicateur :

//+------------------------------------------------------------------+
//|                                               Test_Lost_Indi.mq4 |
//|                                                     Nauris Zukas |
//|                             https://www.mql5.com/ru/users/abeiks |
//+------------------------------------------------------------------+
#property copyright "Nauris Zukas"
#property link      "https://www.mql5.com/ru/users/abeiks"
#property version   "1.00"
#property strict
#property indicator_chart_window

double OutputBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   IndicatorBuffers(1);
   SetIndexBuffer(0,OutputBuffer,INDICATOR_CALCULATIONS);
   SetIndexEmptyValue(0,0.0);


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

   Print("-4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): ",TimeCurrent());
   OutputBuffer[0]=(double)TimeCurrent();
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Expert :

//+------------------------------------------------------------------+
//|                                           Test_Lost_Resource.mq4 |
//|                                                     Nauris Zukas |
//|                             https://www.mql5.com/ru/users/abeiks |
//+------------------------------------------------------------------+
#property copyright "Nauris Zukas"
#property link      "https://www.mql5.com/ru/users/abeiks"
#property version   "1.00"
#property strict

#resource "\\Indicators\\Test_Lost_Indi.ex4"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   EventSetTimer(60);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
   double Output1=iCustom(NULL,PERIOD_M1,"::Indicators\\Test_Lost_Indi.ex4",0,0);
   datetime ReceiveTime=(datetime)(int)Output1;
   if(TimeCurrent()>ReceiveTime+61)
      Print("-4002- INCORECT LAST INDICATOR TIME ReceiveTime: ",ReceiveTime, " TimeCurrent(): ",TimeCurrent());

   Print("-4003- OnTimer() ReceiveTime: ",ReceiveTime, " TimeCurrent(): ",TimeCurrent());
  }
//+------------------------------------------------------------------+

Reçoit les dernières données de l'indicateur.
L'indicateur ne répond plus.
Journal d'expert :

0       09:08:42.942    Test_Lost_Indi.ex4 GBPNZD,M1: -4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): 2020.10.27 09:08:41
0       09:08:42.942    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:08:41 TimeCurrent(): 2020.10.27 09:08:41
0       09:09:42.955    Test_Lost_Indi.ex4 GBPNZD,M1: -4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): 2020.10.27 09:09:42
0       09:09:42.955    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:09:42 TimeCurrent(): 2020.10.27 09:09:42
0       09:10:42.966    Test_Lost_Indi.ex4 GBPNZD,M1: -4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): 2020.10.27 09:10:42
0       09:10:42.966    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:10:42 TimeCurrent(): 2020.10.27 09:10:42
0       09:11:42.979    Test_Lost_Indi.ex4 GBPNZD,M1: -4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): 2020.10.27 09:11:42
0       09:11:42.979    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:11:42 TimeCurrent(): 2020.10.27 09:11:42
0       09:12:43.080    Test_Lost_Indi.ex4 GBPNZD,M1: -4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): 2020.10.27 09:12:32
0       09:12:43.080    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:12:32 TimeCurrent(): 2020.10.27 09:12:32
0       09:13:43.010    Test_Lost_Indi.ex4 GBPNZD,M1: -4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): 2020.10.27 09:12:48
0       09:13:43.010    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:12:48 TimeCurrent(): 2020.10.27 09:12:48
0       09:14:43.012    Test_Lost_Resource GBPNZD,H1: -4002- INCORECT LAST INDICATOR TIME ReceiveTime: 2020.10.27 09:12:48 TimeCurrent(): 2020.10.27 09:14:42
0       09:14:43.012    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:12:48 TimeCurrent(): 2020.10.27 09:14:42
0       09:15:43.025    Test_Lost_Resource GBPNZD,H1: -4002- INCORECT LAST INDICATOR TIME ReceiveTime: 2020.10.27 09:12:48 TimeCurrent(): 2020.10.27 09:15:42
0       09:15:43.025    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:12:48 TimeCurrent(): 2020.10.27 09:15:42
0       09:16:43.039    Test_Lost_Resource GBPNZD,H1: -4002- INCORECT LAST INDICATOR TIME ReceiveTime: 2020.10.27 09:12:48 TimeCurrent(): 2020.10.27 09:16:42
0       09:16:43.039    Test_Lost_Resource GBPNZD,H1: -4003- OnTimer() Broker MarketInfo error ReceiveTime: 2020.10.27 09:12:48 TimeCurrent(): 2020.10.27 09:16:42
0

MT4 log en ce moment :

0       07:13:36.398    '21035322': login datacenter on RoboForex-Pro through DataCenter Europe #3 (ping: 53.56 ms)
0       07:13:36.802    '21035322': previous successful authorization performed from 87.110.24.238
1       09:12:42.982    '21035322': ping failed
0       09:12:43.690    '21035322': login on RoboForex-Pro through DataCenter Europe #3 (ping: 53.56 ms)
0       09:12:44.907    '21035322': login datacenter on RoboForex-Pro through DataCenter Europe #3 (ping: 53.56 ms)
0       09:12:45.317    '21035322': previous successful authorization performed from 87.110.24.238
1       09:12:58.925    '21035322': datacenter connecting failed [6]
0       09:12:59.475    '21035322': login on RoboForex-Pro through DataCenter Europe #3 (ping: 53.56 ms)
0       09:13:02.919    '21035322': ping to current access point DataCenter Europe #3 is 48.62 ms
0       09:13:59.826    '21035322': login datacenter on RoboForex-Pro
0       09:14:05.639    '21035322': login on RoboForex-Pro through DataCenter Europe #5 (ping: 68.86 ms)
0       09:14:06.482    '21035322': login datacenter on RoboForex-Pro through DataCenter Europe #5 (ping: 68.86 ms)
0       09:14:07.048    '21035322': previous successful authorization performed from 87.110.24.238
0       09:14:17.958    '21035322': ping to current access point DataCenter Europe #5 is 89.81 ms
1       11:12:31.864    '21035322': ping failed
1       11:12:31.864    '21035322': datacenter connecting failed [6]
 
Nauris Zukas:

Après un mois de toutes sortes de tests, je peux déjà dire avec certitude qu'il y a un problème, seulement je ne peux pas dire si la ressource est manquante ou si iCustom() est cassé. Le problème n'est détecté que chez un seul courtier, ce qui est très désagréable pour le trading réel. Avant de balancer des mots comme MT4 ou MQL c'est un bug, je vais vous donner le dernier code le plus simple et l'exécution du test. Je publierai également les résultats. Il y a peut-être une erreur dans mon code, que je ne connais pas. Je vous rappelle encore une fois que le problème n'est détecté qu'avec un seul courtier (vous le verrez dans le journal de bord).

Indicateur :

Expert :

Reçoit les dernières données de l'indicateur.
L'indicateur ne répond plus.
Journal d'expert :

MT4 log en ce moment :

TimeCurrent() dans l'indicateur appelé par iCustom cesse de fonctionner lorsqu'on se reconnecte ?

Pourquoi avez-vous besoin deTimeCurrent() dans l'indicateur ?

Les séries temporelles (time[], open[], etc.) sont-elles mises à jour ?

 
Andrey Khatimlianskii:

Est-ce que TimeCurrent() dans un indicateur appelé par iCustom cesse de fonctionner lorsqu'on se reconnecte ?

A quoi sertTimeCurrent() dans l'indicateur ?

Les séries temporelles (time[], open[], etc.) sont-elles mises à jour ?

Tout cesse de fonctionner, comme s'il n'y avait plus d'indicateur. TimeCurrent() juste pour vérifier, la dernière fois pour voir. Rien (pas time[], open[], etc.) ne fonctionne car l'indicateur ne répond plus. C'est le dernier tirage de l'indicateur, il n'y en a plus :

0       09:13:43.010    Test_Lost_Indi.ex4 GBPNZD,M1: -4005- - - - OnCalculate() Broker MarketInfo error  Broke indicator next TimeCurrent(): 2020.10.27 09:12:48
 
Pour contourner la limitation de MQL4, vous devez écrire comme ceci.
#property strict

class A
{
protected:
  template <typename T>
  void f( const T* ) {}
};

class B : public A
{
public:
  void f( const B* b )
  {
  #ifdef __MQL5__
    this.A::f(b);
  #else
    this.f((const A*) b); // Обходим Stack overflow.
  #endif
  }  
};

void OnStart()
{  
  B b;
  
  b.f(&b);
}
 
fxsaber:
Pour contourner la limitation de MQL4, je dois l'écrire de cette façon.

La religion est certainement une bonne chose (je veux dire explicitement ceci.*), mais il est préférable de la laisser à l'église.

class A
{
protected:
  template <typename T>
  void f( const T* ) {Print(typename(T));}
};

class B : public A
{
public:
  void f( const B* b )
  {
    A::f(b);
  }  
};

void OnStart()
{  
  B b;
  
  b.f(&b);
}

Je pense que ce serait plus succinct.

 
Vladimir Simakov:

La religion est certainement une bonne chose (je veux dire explicitement ceci.*), mais il est préférable de la laisser à l'église.

Je pense que ce serait plus succinct.

class A
{
protected:
  static void f( const A* ) { Print(__FUNCSIG__); }
  
  template <typename T>
  void f( const T* ) {Print(typename(T));} // Почему B?
};

class B : public A
{
public:
  void f( const A* a )
  {
    A::f(a); // как вызвать static-метод?
  }  
};

void OnStart()
{  
  B b;
  
  b.f(&b); // deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
}
C'est sous un A.
 
fxsaber:
C'est en dessous de 5.

Demandez aux développeurs : pourquoi la méthode du modèle de la zone protégée est-elle appelée ?

UPD : c'est celui que le compilateur substitue dans l'appel, pas B::f(const A*)

 

Aide à contourner un bug du compilateur MQL4 qui n'est plus développé.

class A
{
public:
  static bool f() { return(true); }
};

template <typename T>
void g( )
{
  bool Res = T::f(); // '::' - unexpected token, 'f' - function not defined.
  
  T::f(); // OK
}

void OnStart()
{
  g<A>();
}

Chaîne de recherche: Oshibka 021.

 
fxsaber:

Aide à contourner un bogue du compilateur MQL4 qui n'est plus développé.

c'est ainsi que MQL4 compile :

class A
{
public:
  static bool f() { return(true); }
};

template <typename T1, typename T2>
void g( )
{
  
  T1 tmp;
  T2 res = tmp.f(); // OK
}

void OnStart()
{
  g<A,bool>();
}
//+------------------------------------------------------------------+

UPD :

En fait, il compile aussi sans typename T2.

 
Igor Makanu:

C'est ainsi qu'il se compile dans MQL4 :

UPD :

En fait, il compile aussi sans typename T2.

Merci !