Особенности языка mql4, тонкости и приёмы работы - страница 33

 
Nauris Zukas:
Добрый день!
У одного брокера постоянна (раз или два в сутки) слетает MarketInfo(), получает значение 0 ( конкретно MODE_MARGINREQUIRED). Это как бы всё нормально, защиту сделал но в это же время пропадает всякая попытка достучатся до iCustom() индикатора (подключен через ресурс). Даже после того как MarketInfo() опять получает данные  iCustom() молчит, стучу по нему но индикатор не подключается. Помогает только перезапуск терминала. Как достучатся до индикатора не перезапуская терминал, какие идей? Индикатор может куда-то пропасть из ресурса?

После месяца всяких тестов уже довольно уверенно могу сказать что проблема есть, только не могу сказать иле ресурс пропадает или iCustom() ломается. Проблема выявляется только у одного брокера, что очень не приятно влияет на реальную торговлю. Прежде чем кидаться громкими словами что это баг MT4 или MQL я предоставлю самый последний и простой код, как проводились тесты. Так же выложу результаты. Может в моем коде есть ошибка о чём я не догадываюсь. Ещё раз напомню что проблема выявляется только у одного брокера (в журнале будет видно).

Индикатор:

//+------------------------------------------------------------------+
//|                                               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);
  }
//+------------------------------------------------------------------+

Эксперт:

//+------------------------------------------------------------------+
//|                                           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());
  }
//+------------------------------------------------------------------+

Получает последние данные от индикатора.
Индикатор больше не отвечает.
Журнал эксперта:

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 в это время:

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:

После месяца всяких тестов уже довольно уверенно могу сказать что проблема есть, только не могу сказать иле ресурс пропадает или iCustom() ломается. Проблема выявляется только у одного брокера, что очень не приятно влияет на реальную торговлю. Прежде чем кидаться громкими словами что это баг MT4 или MQL я предоставлю самый последний и простой код, как проводились тесты. Так же выложу результаты. Может в моем коде есть ошибка о чём я не догадываюсь. Ещё раз напомню что проблема выявляется только у одного брокера (в журнале будет видно).

Индикатор:

Эксперт:

Получает последние данные от индикатора.
Индикатор больше не отвечает.
Журнал эксперта:

Журнал MT4 в это время:

При релогине перестает работать TimeCurrent() в индикаторе, вызываемом по iCustom?

А зачем TimeCurrent() в индикаторе?

Обновляются ли таймсерии (time[], open[], и т.д.)?

 
Andrey Khatimlianskii:

При релогине перестает работать TimeCurrent() в индикаторе, вызываемом по iCustom?

А зачем TimeCurrent() в индикаторе?

Обновляются ли таймсерии (time[], open[], и т.д.)?

Всё перестаёт работать, как будто индикатора больше нету. TimeCurrent() просто для проверки, последнее время увидеть. Не чего (не time[], open[], и т.д.) нечего не работает так как индикатор просто не отвечает больше. Это последний принт с индикатора, дальше больше нету:

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
 
Чтобы обойти ограничение MQL4, приходится писать так.
#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:
Чтобы обойти ограничение MQL4, приходится писать так.

Религия -это конечно хорошо (я про явное this.*), но лучше, все таки, ее оставить для церкви.

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);
}

Мне кажется, что так и лаконичнее будет.

 
Vladimir Simakov:

Религия -это конечно хорошо (я про явное this.*), но лучше, все таки, ее оставить для церкви.

Мне кажется, что так и лаконичнее будет.

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
}
Это под пятеркой.
 
fxsaber:
Это под пятеркой.

А это уже у разработчиков спроси: почему вызывается шаблонный метод из protected зоны?

UPD: именно его подставляет компилятор в вызов, а не B::f(const A*)

 

Помогите обойти ошибку MQL4-компилятора, который больше не развивается.

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>();
}

Строка для поиска: Oshibka 021.

 
fxsaber:

Помогите обойти ошибку MQL4-компилятора, который больше не развивается.

так компилируется в MQL4 :

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:

в принципе и без typename T2 тоже компилируется

 
Igor Makanu:

так компилируется в MQL4 :

UPD:

в принципе и без typename T2 тоже компилируется

Спасибо!