Mql4 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 33

 
Nauris Zukas :
Tünaydın!
Bir komisyoncu sürekli olarak (günde bir veya iki kez) MarketInfo() ile uçar, 0 değerini alır (özellikle MODE_MARGINREQUIRED). Her şey yolunda gibi görünüyor, korumayı yaptım, ancak aynı zamanda iCustom () göstergesine (bir kaynak aracılığıyla bağlı) ulaşma girişimleri de ortadan kalkıyor. MarketInfo() tekrar veri aldıktan sonra bile iCustom() sessiz, üzerine tıkladım ama gösterge bağlanmıyor. Yalnızca terminali yeniden başlatmak yardımcı olur. Terminali yeniden başlatmadan göstergeye nasıl ulaşılır, herhangi bir fikriniz var mı? Gösterge kaynaktan bir yerde kaybolabilir mi?

Her türlü testten geçen bir aydan sonra, bir sorun olduğunu zaten oldukça güvenle söyleyebilirim, ancak kaynağın kaybolup kaybolmadığını veya iCustom()'un bozulduğunu söyleyemem. Sorun, gerçek ticaret üzerinde çok hoş olmayan bir etkiye sahip olan yalnızca bir komisyoncu ile tespit edilir. Bunun bir MT4 veya MQL hatası olduğuna dair büyük sözler atmadan önce, testlerin nasıl yapıldığını, en son ve en basit kodu vereceğim. Sonuçları da yazacağım. Belki de kodumda bilmediğim bir hata var. Sorunun sadece bir broker ile tespit edildiğini bir kez daha hatırlatmama izin verin (günlükte görünecektir).

Gösterge:

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

Uzman:

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

Göstergeden en son verileri alır.
Gösterge artık yanıt vermiyor.
Uzman Günlüğü:

 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

Şu anda MT4 günlüğü:

 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 :

Her türlü testten geçen bir aydan sonra, bir sorun olduğunu zaten oldukça güvenle söyleyebilirim, ancak kaynağın kaybolup kaybolmadığını veya iCustom()'un bozulduğunu söyleyemem. Sorun, gerçek ticaret üzerinde çok hoş olmayan bir etkiye sahip olan yalnızca bir komisyoncu ile tespit edilir. Bunun bir MT4 veya MQL hatası olduğuna dair büyük sözler atmadan önce, testlerin nasıl yapıldığını, en son ve en basit kodu vereceğim. Sonuçları da yazacağım. Belki de kodumda bilmediğim bir hata var. Sorunun sadece bir broker ile tespit edildiğini bir kez daha hatırlatmama izin verin (günlükte görünecektir).

Gösterge:

Uzman:

Göstergeden en son verileri alır.
Gösterge artık yanıt vermiyor.
Uzman Günlüğü:

Şu anda MT4 günlüğü:

Yeniden oturum açma TimeCurrent() , iCustom tarafından çağrılan göstergede çalışmayı ne zaman durdurur?

Göstergede neden TimeCurrent()?

Zaman serileri güncellendi mi (zaman[], açık[] vb.)?

 
Andrey Khatimlianskii :

Yeniden oturum açma TimeCurrent(), iCustom tarafından çağrılan göstergede çalışmayı ne zaman durdurur?

Göstergede neden TimeCurrent()?

Zaman serileri güncellendi mi (zaman[], açık[] vb.)?

Gösterge artık orada değilmiş gibi her şey çalışmayı durdurur. TimeCurrent() sadece kontrol etmek içindir, son kez görmek içindir. Gösterge artık yanıt vermediği için hiçbir şey (zaman[], açık[] vb. değil) çalışmıyor. Bu, göstergenin son baskısıdır, başka bir şey yoktur:

 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 sınırlamasını aşmak için şöyle yazmalısınız.
 #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 sınırlamasını aşmak için şöyle yazmalısınız.

Din kesinlikle iyidir (bunun açık olanından bahsediyorum. *), ama yine de onu kiliseye bırakmak daha iyidir.

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

Bana öyle geliyor ki, daha özlü olurdu.

 
Vladimir Simakov :

Din kesinlikle iyidir (bunun açık olanından bahsediyorum. *), ama yine de onu kiliseye bırakmak daha iyidir.

Bana öyle geliyor ki, daha özlü olurdu.

 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
}
Beşin altında.
 
fxsaber :
Beşin altında.

Ve bu zaten geliştiricilere soruyor: şablon yöntemi neden korumalı bölgeden çağrılıyor?

UPD: derleyici onu B::f(const A*) değil, çağrının yerine koyar

 

Lütfen artık geliştirilmeyen MQL4 derleyicisinin hatasını atlamama yardım edin.

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

Arama dizisi : Oshibka 021.

 
fxsaber :

Lütfen artık geliştirilmeyen MQL4 derleyicisinin hatasını atlamama yardım edin.

MQL4'e şu şekilde derlenir:

 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:

prensipte ve typename olmadan T2 de derlenir

 
Igor Makanu :

MQL4'e şu şekilde derlenir:

UPD:

prensip olarak ve typename olmadan T2 de derlenir

Teşekkür ederim!