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 로그:

다시 로그인하면 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
}
5시 미만입니다.
 
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>();
}

검색 문자열 : Osibka 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 >();
}
//+------------------------------------------------------------------+

상향:

원칙적으로 유형 이름 없이 T2도 컴파일됩니다.

 
Igor Makanu :

다음과 같이 MQL4로 컴파일됩니다.

상향:

원칙적으로 유형 이름 없이 T2도 컴파일됩니다.

고맙습니다!