Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 189

 
Nikolai Semko :

CTestTimer sınıfının Timer4 yönteminin (mavi renkle vurgulanmıştır) başlatılması gereklidir.

İçeri girmedi.

 #property indicator_chart_window
#include <Timer.mqh> // https://www.mql5.com/ru/code/31306

//+------------------------------------------------------------------+
class CTestTimer {
 private :
   //typedef void (CTestTimer::*TFunc2)(); // так работает в C++, но здесь не работает
 public :
   static int x4;
   CTestTimer() {
       //TFunc2 p=CTestTimer::Timer4;
       //TFunc2 p=Timer4;
       //timers.NewTimer(700,p);
      timers.NewTimer( 700 ,Method2Function); // ошибка 'Timer4' - pointer to this function type is not supported yet
   };
   ~CTestTimer(){};
   static void Timer4() {
      x4++;
       if (x4== 7 ) timers.KillTimer(Method2Function); // удаляем этот таймер
   }
};
//+------------------------------------------------------------------+

static int CTestTimer::x4 = 0 ;

void Method2Function()
{
  CTestTimer::Timer4();
}
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

fxsaber , 2020.05.14 02:57

Tekrar koştu. Nadir durumlarda bunun yeniden oturum açma sırasında olabileceğini düşünüyorum.

Çözüm - yanlışsa kısa bir aradan sonra tekrar deneyin.

 bool IsTradeAllowed( const int Attempts = 0 )
{        
   // https://www.mql5.com/ru/forum/170952/page174#comment_16363677
   bool Res = false ;
   int Count = 0 ;
  
   // https://www.mql5.com/ru/forum/170952/page174#comment_16363677
   while (!(Res = :: MQLInfoInteger ( MQL_TRADE_ALLOWED ) &&
                 :: AccountInfoInteger ( ACCOUNT_TRADE_EXPERT ) &&
                 :: AccountInfoInteger ( ACCOUNT_TRADE_ALLOWED ) &&
                 :: TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED )) &&
         (Count++ < Attempts) && !:: IsStopped ())
    :: Sleep ( 100 );
    
   return (Res);
}

Bu kötü bir karar. Bu çok daha iyi.

 const bool Init = EventSetMillisecondTimer ( 1 );

bool Allowed()
{
   return (:: MQLInfoInteger ( MQL_TRADE_ALLOWED ) &&
         :: AccountInfoInteger ( ACCOUNT_TRADE_EXPERT ) &&
         (:: AccountInfoInteger ( ACCOUNT_TRADE_ALLOWED ) || !:: TerminalInfoInteger ( TERMINAL_CONNECTED ) ) &&
         :: TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ));
}

void OnTimer ()
{
   if (!Allowed())
     ExpertRemove ();
}

Manuel olarak yeniden oturum açarsanız, bu danışman çalışmaya devam edecektir. Vurgulanan bir satır olmadan, kendini siler.

 
fxsaber :

İçeri girmedi.

Zaman ayırdığınız için teşekkür ederim. Ama yöntemin statik olmaması gerektiğini yukarıda yazdım. Bunun statik ile mümkün olduğu açıktır. Statik bir yöntem hiç OOP değildir.
Açıkçası, çok fazla istedim, daha doğrusu imkansız.
Bunu C++'da yapmanın mümkün olduğu gerçeğiyle kafam karıştı, ancak anladıktan sonra, böyle bir işaretçinin tamamen farklı bir yapıya sahip olduğunu fark ettim,

https://habr.com/ru/post/333334/


Ve bu anlaşılabilir.

Sonuçta, statik olmayan bir sınıf yönteminin bellekte bir yerde bulunan bir uygulaması vardır ve bu, sınıfın tüm nesneleri için bir tanedir.
Ancak sonuçta, her nesnenin kendi benzersiz geçerli dahili değişken durumu vardır, bu nedenle statik olmayan bir yönteme yönelik böyle bir işaretçi, doldurulduğu anda bu yöntemin uygulandığı nesnenin parametrelerinin yapısına hala sahip olmalıdır.
Zamanınızı boşa harcadığım için herkesten özür dilerim.
Çeşitli sınıflardaki nesnelerin genel kontrolünün başka yollarını aramak gerekir.

Çözümün yokluğunun kanıtı da çözümdür.

 
Nikolai Semko :

Zaman ayırdığınız için teşekkür ederim. Ama yöntemin statik olmaması gerektiğini yukarıda yazdım. Bunun statik ile mümkün olduğu açıktır.

Yukarıda iki örnek vermişsiniz. tam uygulama ile bir
 
TheXpert :
Yukarıda iki örnek vermişsiniz. tam uygulama ile bir

Görevimi yanlış anlamış gibisin.
Çözümü yok.

 
Nikolai Semko :

Görevimi yanlış anlamış gibisin.
Çözümü yok.

yakınlarda bir kapı varsa neden kafanı duvara çarpıyorsun? harici bir sınıftan işleyici çağrısı olan bir multitimer'ın görevi çözüldü.

bu yoldaşın senin gördüğün gibi problemine bir çözümü var, halka açık olmayan bir gerçek.

 
TheXpert :
yakınlarda bir kapı varsa neden kafanı duvara çarpıyorsun? harici bir sınıftan işleyici çağrısı olan bir multitimer'ın görevi çözüldü.

Artık zamanlayıcıyla ilgili değildi.
Sadece hayal ettim ve tupanul.

 
Nikolai Semko :

Sadece hayal ettim ve tupanul.

Ben sadece mql'de tam teşekküllü bir typedef veya aynı ciltler varsa, ama elimizde ne var.

 

Bir gösterge veya danışman tarafından oluşturulan bir nesneden manuel olarak oluşturulan bir grafik nesneyi bir şekilde ayırt etmek mümkün müdür?

işlevde

 void OnChartEvent ( const int id, const long &lparam, const double &dparam, const string &sparam)
  {
   if (id == CHARTEVENT_OBJECT_CREATE )
     {

     }
  }
 
Vladimir Pastushak :

Bir gösterge veya danışman tarafından oluşturulan bir nesneden manuel olarak oluşturulan bir grafik nesneyi bir şekilde ayırt etmek mümkün müdür?

işlevde

kontrolü ile farenin sol tuşuna basılarak yapılabilir.
Örneğin şöyle:

 #property indicator_chart_window
#include <Timer.mqh> //https://www.mql5.com/ru/code/31306

uint t_LMB= 0 ;
int OnInit () {
   ChartSetInteger ( 0 , CHART_EVENT_OBJECT_CREATE , 0 , true );
   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , true );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   return (rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent ( const int id, const long &lparam, const double &dparam, const string &sparam) {
   static string str=sparam;
   if (str!= "1" && sparam== "1" ) t_LMB= GetTickCount (); // нажате левая кнопка мышки
   if (id == CHARTEVENT_OBJECT_CREATE ) {
      CheckManual( GetTickCount ());
   }
   str=sparam;
}
//+------------------------------------------------------------------+
void CheckManual( uint start= 0 ) {
   static uint s= 0 ;
   if (start> 0 ) {
      s=start;
      timers.NewTimer( 20 ,Timer1); // Создаем таймер на 20 милисекунд и функцией-обработчиком Timer1()
       return ;
   }
   int pause = int (t_LMB-s);
   if (pause>= 0 && pause< 20 ) Print ( "Создан графический объект в ручную" );
   else Print ( "Создан графический объект программно" );
   timers.KillTimer(Timer1); // удаляем таймер Timer1
}
//+------------------------------------------------------------------+
void Timer1() {CheckManual();}