Mt4 End desteği. - sayfa 20

 
Alexey Viktorov :
Bununla başlamamak daha iyidir. Göz korkutucu olan budur. Onu bu metinden çok az tanıyan bir OOP destekçisi olan ben bile, bir sersemliğe kapıldım ... Hiçbir şey anlamadım. Bu nedenle aradaki farkı en alt düzeyde açıklamaya çalışıyorum.

Daha kolay olabilir.

OOP - tek bir arayüz tanımlamanıza izin verir. Bundan sonra - platforma özgü tüm şeyler "gizlenir" ve işe müdahale etmez.

Bu, elbette, tamamen prosedürel bir yaklaşımla yapılabilir. Ancak, her işlevde aynı anda tüm platformlarla ilgilenmeniz gerekeceğinden, prosedürel sürümü desteklemek daha zor olacaktır.

 

Hafif gecikme için özür dilerim.

İşte fonksiyonun ilk versiyonu. Daha da geliştirilebilir ve geliştirilebilir. Herhangi biri bir hata fark ederse, lütfen yorum yapın.

 //+------------------------------------------------------------------+
//|                                                    Новый бар.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//------------------------
datetime Время_последнего_бара;
//------------------------
//Счетчики
//------------------------
int Частота_таймера = 25 ;
int Минута;
int 5 _Минут;
int 15 _Минут;
int 30 _Минут;
int 1 _Час;
int 4 _Часа;
int 1 _День;
//------------------------
//Флаги
//------------------------
bool Новый_минутный_бар;
bool Новый_5_минутный_бар;
bool Новый_15_минутный_бар;
bool Новый_30_минутный_бар;
bool Новый_часовой_бар;
bool Новый_4_часовой_бар;
bool Новый_дневной_бар;
//--------------------------------------------
//Значения временных периодов в миллесекундах.
//--------------------------------------------
#define M1     60000
#define M5     300000
#define M15   900000
#define M30   1800000
#define H1     3600000
#define H4     14000000
#define D1     84000000
//------------------------
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetMillisecondTimer ( 25 );
   //-------------------------------------------------------------
   //Записываем время последнего бара на момент загрузки эксперта.  
   //Для корректного начала работы, робота нужно запустить на М1. 
   //-------------------------------------------------------------
   Время_последнего_бара = Time [ 0 ];
   //-------------------------------------------------------------
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
//---------------------------------------------------------------
//Считаем время в счетчиках. Для каждого таймфрейма свой счетчик.
//Как только значение счетчика достигает количество миллесекунд в 
//периоде таймфрейма, счетчик обнуляется и выставляется флаг нового
//бара этого таймфрейма. Этот флаг остается до тех пор, пока 
//один из вызовов функции Новый_бар() не снимет его. 
//Таким образом, флаг нового бара любого таймфрейма остается до тех
//пор, пока пользователь не узнает этот факт, вызвав функцию Новый_бар().
//---------------------------------------------------------------
void OnTimer ()
{
 static bool Ведется_отсчет;
   //---------------------------
   if (!Ведется_отсчет && Time [ 0 ] != Время_последнего_бара) 
     {
      Ведется_отсчет = true ;
     }   
   //---------------------------
   if (Ведется_отсчет)
     {
      Минута ++;
       5 _Минут  ++;
       15 _Минут ++;
       30 _Минут ++;
       1 _Час    ++;
       4 _Часа   ++;
       1 _День   ++;
       //--------------------------
       if (Минута*Частота_таймера >= M1)
        {
         Новый_минутный_бар = true ;
         Минута = 0 ;
        } 
       //--------------------------
       if ( 5 _Минут*Частота_таймера >= M5)
        {
         Новый_5_минутный_бар = true ;
         5 _Минут = 0 ;
        } 
       //--------------------------   
       if ( 15 _Минут*Частота_таймера >= M15)
        {
         Новый_15_минутный_бар = true ;
         15 _Минут = 0 ;
        } 
       //--------------------------   
       if ( 30 _Минут*Частота_таймера >= M30)
        {
         Новый_30_минутный_бар = true ;
         30 _Минут = 0 ;
        } 
       //--------------------------   
       if ( 1 _Час*Частота_таймера >= H1)
        {
         Новый_часовой_бар = true ;
         1 _Час = 0 ;
        } 
       //--------------------------  
       if ( 4 _Часа*Частота_таймера >= H4)
        {
         Новый_4_часовой_бар = true ;
         4 _Часа = 0 ;
        } 
       //--------------------------  
       if ( 1 _День*Частота_таймера >= D1)
        {
         Новый_дневной_бар = true ;
         1 _День = 0 ;
        } 
   //-------------------------- 
   }          
}
//--------------------------





//--------------------------
bool Новый_бар( int Таймфрейм = M1)
{
 bool Новый_бар;
 //-----------------------
 switch (Таймфрейм)
   {
     case M1: 
           //-----------------------
          Новый_бар  = Новый_минутный_бар;
           if (Новый_бар)Новый_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------      
     case M5: 
           //-----------------------
          Новый_бар  = Новый_5_минутный_бар;
           if (Новый_бар)Новый_5_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------  
     case M15: 
           //-----------------------
          Новый_бар  = Новый_15_минутный_бар;
           if (Новый_бар)Новый_15_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------  
     case M30: 
           //-----------------------
          Новый_бар  = Новый_30_минутный_бар;
           if (Новый_бар)Новый_30_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------  
     case H1: 
           //-----------------------
          Новый_бар  = Новый_часовой_бар;
           if (Новый_бар)Новый_часовой_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------      
     case H4: 
           //-----------------------
          Новый_бар  = Новый_4_часовой_бар;
           if (Новый_бар)Новый_4_часовой_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------              
     case D1: 
           //-----------------------
          Новый_бар  = Новый_дневной_бар;
           if (Новый_бар)Новый_дневной_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------     
   }
 //-----------------------
 return ( false );
}
//--------------------------
//+------------------------------------------------------------------+
 
@Peter Konow OOP olmadan bile daha kolay hale getirilebilir, düşünün ve deneyin.

Samimi olarak.
 
Kullanıcı New_bar() işlevini çağırır çağırmaz, istenen zaman diliminde yeni bir bar olayı hakkında ondan bir yanıt alır. Bu durumda fonksiyon çağrısından sonra yeni bir çubuğun olayı meydana gelmişse olay bayrağı kaldırılır. Yani, her çubuk için yalnızca bir kez, istediğiniz zaman aralığındaki yeni bir çubuk hakkında bir bildirim alabilirsiniz. Sonuçta, yeni bir çubuk hakkında bir bildirim aldıktan sonra bu çubuk artık yeni değil.
 
Реter Konow :

İşte fonksiyonun ilk versiyonu. Daha da geliştirilebilir ve geliştirilebilir. Herhangi biri bir hata fark ederse, lütfen yorum yapın.

Hazırlıksız - her şey yolundaymış gibi. Derin kazmadım.

Şahsen, muhtemelen önceki ve şimdiki zamanı çubuğun süresine bölerdim, eğer değer değiştiyse, yeni bir çubuk geldi. Ancak, mümkün ve böyle.

Stile gelince, değişken türüne göre ne tür olduğunu belirlemenin imkansız olması beni kişisel olarak biraz rahatsız ediyor (herhangi bir değişkenin öneki türünün kısaltılmış adı olduğunda "Macar notasyonuna alışkınım) , ama belki de bu gereksizdir.

 
Andrey Kisselyov :
@Peter Konow OOP olmadan bile daha kolay hale getirilebilir, düşünün ve deneyin.

Samimi olarak.
Tabii ki, mümkün olması mümkündür. Bunun için bir saatim vardı. Bir şeyler düşünebilir ve kesebilirsin. Bütün bunlar mümkün.
 
Andrey Kisselyov :
@Peter Konow OOP olmadan bile daha kolay hale getirilebilir, düşünün ve deneyin.

Samimi olarak.

Doğru anladığım kadarıyla. Amaç, çalışmasını sağlamaktır. Bu işleve sahip korumalı bir dosya göndermiş olsaydı - hayatta bu şekilde yazıldığını tahmin edemezlerdi.

 
George Merts :

Hazırlıksız - her şey yolundaymış gibi. Derin kazmadım.

Şahsen, muhtemelen önceki ve şimdiki zamanı çubuğun süresine bölerdim, eğer değer değiştiyse, yeni bir çubuk geldi. Ancak, mümkün ve böyle.

Stile gelince, değişken türüne göre ne tür olduğunu belirlemenin imkansız olması beni kişisel olarak biraz rahatsız ediyor (herhangi bir değişkenin öneki türünün kısaltılmış adı olduğunda "Macar notasyonuna alışkınım) , ama belki de bu gereksizdir.

Eh, stil algısı bir alışkanlık meselesidir. Ayrıca şubelerde verilen kodları okumakta zorlanıyorum. Sadece bazen sinir bozucu.

 
George Merts :

Daha kolay olabilir.

OOP - tek bir arayüz tanımlamanıza izin verir. Bundan sonra - platforma özgü tüm şeyler "gizlenir" ve işe müdahale etmez.

Bu, elbette, tamamen prosedürel bir yaklaşımla yapılabilir. Ancak, her işlevde aynı anda tüm platformlarla ilgilenmeniz gerekeceğinden, prosedürel sürümü desteklemek daha zor olacaktır.

Görünüşe göre, tek bir arayüzün herhangi bir hesaplama görevinin programlanması için tamamen uygulanamaz olduğu daha önce tartışılmıştı... Arayüzler şeklinde güzelliği getirmek, sadece hazır koda uygulanabilen ve dahası, önleyen tamamen kozmetik bir prosedürdür. kodun daha fazla desteklenmesi ve iyileştirilmesi .. .

 
Mickey Moose :

Doğru anladığım kadarıyla. Amaç, çalışmasını sağlamaktır. Bu işleve sahip korumalı bir dosya göndermiş olsaydı - hayatta bu şekilde yazıldığını tahmin edemezlerdi.

sadece çalışması değil, hızlı, doğru, hatasız çalışması, kaynak kodunda yapılandırılmış bir görünüme ve anlaşılır bir yazıya sahip olması arzu edilir.

Samimi olarak.