mql4言語の特徴、微妙なニュアンスとテクニック - ページ 33

 
Nauris Zukas:
こんにちは! あるブローカーは、常に(1日に1〜2回)MarketInfo()が飛んで、値0(具体的にはMODE_MARGINREQUIRED)を取得することである。それはある意味正常ですが、同時にiCustom()インジケータに到達しようとする試みがありません(リソースを通じて接続されています)。MarketInfo()がデータを受信しても、iCustom()は沈黙したままである。端末を再起動するのみで、解決します。ターミナルを再起動せずにインジケーターにアクセスする方法、何かいい方法はないでしょうか?どこかのリソースからインジケーターが消えることはないのでしょうか?

1ヶ月間、あらゆる種類のテストを行った結果、問題があると自信を持って言えますが、ただ、リソースが足りないのか、iCustom()が壊れているのかが分かりません。この問題は、あるブローカーでのみ検出され、実際の取引には非常に不都合です。MT4やMQLそれはバグだという言葉を投げかける前に、最新で最も簡単なコードとテスト実行をお見せします。また、その結果を掲載します。もしかしたら、私のコードにバグがあるのかもしれません。もう一度言いますが、問題が検出されるのは1つのブローカーだけです(ログブックに記載されています)。

指標となる。

//+------------------------------------------------------------------+
//|                                               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:

1ヶ月間、あらゆる種類のテストを行った結果、問題があると自信を持って言えますが、ただ、リソースが足りないのか、iCustom()が壊れているのかが分かりません。この問題は、あるブローカーでのみ検出され、実際の取引には非常に不都合です。MT4やMQLそれはバグだという言葉を投げかける前に、最新で最も簡単なコードとテスト実行をお見せします。また、その結果を掲載します。もしかしたら、私のコードに誤りがあるのかもしれません。もう一度言いますが、問題が検出されるのは1つのブローカーだけです(ログブックに記載されています)。

指標となる。

専門家

インジケーターの最新データを受信する。
インジケーターが反応しなくなった。
専門家によるログ

この時のMT4ログ。

iCustomから呼び出されるインジケータのTimeCurrent() が再ログインで動かなくなる?

なぜインジケータにTimeCurrent()が必要なのですか?

時系列(time[]、open[]など)は更新されているか?

 
Andrey Khatimlianskii:

iCustomから呼び出されるインジケーターのTimeCurrent()は、再ログインすると動作しなくなるのでしょうか?

インジケーターの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の制限を 回避するためには、このように書くしかないのです。

宗教は確かに良いものですが(明示的にこれという意味です※)、教会に置いておいた方が良いのです。

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:

宗教は確かに良いものですが(明示的にこれという意味です※)、教会に任せた方が良いのではと思います。

その方が簡潔でいいと思います。

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
}
Aの下にある。
 
fxsaber:
これは5歳以下です。

開発者に聞く:なぜテンプレートメソッドがプロテクトゾーンから呼び出されるのですか?

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

検索文字列:オシブタ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がなくてもコンパイル可能です。

ありがとうございました。