Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 517

 

MT4, lütfen topluluğa yardım edin.
1. M1 grafiğinde (tiklerle veya 0,5 sn'lik bir zamanlayıcı ile) çalışan bir Expert Advisor'da, H1 grafiğinde yeni bir mum çubuğu göründüğü anda hesaplamalar yapmanız gerekir.
Her saatin son M1 mum çubuğunu takip eden M1 mum çubuğunun başlangıcını yakalayabilirsiniz (NN:00 dakika), ama bu bir şekilde çirkin... Ve H1 mum çubuğu şu anda çekilmeyebilir.
Belki biri daha zarif bir şekilde yaptı?
2. EA metnindeki gösterge koduna kıyasla gösterge değerini iCustom() aracılığıyla almak ne kadar sürer?
3. Expert Advisor metnindeki gösterge kodu çok daha hızlı hesaplanırsa, M1 grafiğine ekli Expert Advisor'daki H1 grafiği kullanılarak gösterge değeri nasıl hesaplanabilir?

 
MikeZv :

MT4, lütfen topluluğa yardım edin.
1. M1 grafiğinde (tiklerle veya 0,5 sn'lik bir zamanlayıcı ile) çalışan bir Expert Advisor'da, H1 grafiğinde yeni bir mum çubuğu göründüğü anda hesaplamalar yapmanız gerekir.
Her saatin son M1 mum çubuğunu takip eden M1 mum çubuğunun başlangıcını yakalayabilirsiniz (NN:00 dakika), ama bu bir şekilde çirkin... Ve H1 mum çubuğu şu anda çekilmeyebilir.
Belki birisi daha zarif bir şekilde yaptı?
2. EA metnindeki gösterge koduna kıyasla gösterge değerini iCustom() aracılığıyla almak ne kadar sürer?
3. Expert Advisor metnindeki gösterge kodu çok daha hızlı hesaplanırsa, M1 grafiğine ekli Expert Advisor'daki H1 grafiği kullanılarak gösterge değeri nasıl hesaplanabilir?

İlk soruyu yanıtlayan işlev, yeni bir bar tanımlar.

 bool NevBar( int period)
  {
   static datetime StatTime;

   if (StatTime!= iTime ( NULL ,period, 0 ))
     {
      StatTime= iTime ( NULL ,period, 0 );
       return ( true );
     }
   return ( false );
  }

kullanım durumu

int OnInit()
  {
//---
   NevBar(PERIOD_H1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(NevBar(PERIOD_H1))
     {
      производим вычисления.
     }
  }
//+------------------------------------------------------------------+

 
Sergey Gritsay :

İlk soruyu yanıtlayan işlev, yeni bir bar tanımlar.

Çok teşekkür ederim Sergey, belgelere baktım ama bir şekilde iTime()'ı kaçırdım ... :
OnInit()'te neden NevBar()'ı çağırmalısınız?

 
MikeZv :

İlk işlev çağrısı , aksi takdirde hemen tetiklenir. Düzenlendi   OnInit() çağrılmadı

 bool NevBar( int period)
  {
   static datetime StatTime;
   
   if (StatTime== 0 )StatTime= iTime ( NULL ,period, 0 );

   if (StatTime!= iTime ( NULL ,period, 0 ))
     {
      StatTime= iTime ( NULL ,period, 0 );
       return ( true );
     }
   return ( false );
  }
 
Sergey Gritsay :

İlkişlev çağrısı , aksi takdirde hemen tetiklenir. Düzenlendi   OnInit() çağrılmadı

Teşekkürler, Sergey! Forumda beni çok ama çok korkuttular: "Statik değişkenler kullanmayın!" :)
 
MikeZv :
Teşekkürler, Sergey! Forumda beni çok ama çok korkuttular: "Statik değişkenler kullanmayın!" :)
Kullanmanız gerekiyorsa dinlemeyin - cesurca ama doğru kullanın!
 
MikeZv :
Teşekkürler, Sergey! Forumda beni çok ama çok korkuttular: "Statik değişkenler kullanmayın!" :)
Bunu ilk kez duyuyorum, onlarda neyin bu kadar korkunç olduğunu merak ediyorum, ben de nadiren kullanıyorum, ancak belirli görevler için daha uygunlar.
 
Sergey Gritsay :
Bunu ilk kez duyuyorum, onlarda neyin bu kadar korkunç olduğunu merak ediyorum, ben de nadiren kullanıyorum, ancak belirli görevler için daha uygunlar.
Buradaki nokta, bir statik değişkenin yalnızca Expert Advisor'ın tüm süresi boyunca aynı sembol ve zaman çerçevesi için NevDay() çağrılması durumunda kullanılabileceğidir. 2 veya daha fazla karakter varsa, NevDay() yanlış değerler döndürür. EA'm çoklu para birimi olarak tasarlandı... :(
 
MikeZv :
Buradaki nokta, bir statik değişkenin yalnızca Expert Advisor'ın tüm süresi boyunca aynı sembol ve zaman çerçevesi için NevDay() çağrılması durumunda kullanılabileceğidir. 2 veya daha fazla karakter varsa, NevDay() yanlış değerler döndürür. EA'm çoklu para birimi olarak tasarlandı... :(

Çoklu para birimi moduna ihtiyacınız varsa, işte hem MT4 hem de MT5'te çalışan bir örnek

 //+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   int SymbolTotal= SymbolsTotal ( true );
   Comment ( "SymbolTotal = " ,SymbolTotal);
   for ( int i= 0 ;i<SymbolTotal;i++)
     {
       if (NewBar(SymbolTotal,i, SymbolName (i, true ), PERIOD_H1 ))
        {
         Alert ( SymbolName (i, true ), " Новый бар на Н1" );
        }
     }

  }
//+------------------------------------------------------------------+
bool NewBar( int size, int i, string symbol, ENUM_TIMEFRAMES   period)
  {
   datetime curbar[];
   static datetime lastbar[];
   ArrayResize (curbar,size);
   ArrayResize (lastbar,size);

   curbar[i]=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );

   if (lastbar[i]== 0 )lastbar[i]=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar[i]!=curbar[i])
     {
      lastbar[i]=curbar[i];
       return ( true );
     }
   return ( false );
  }
//+------------------------------------------------------------------+
 
MikeZv :
Buradaki nokta, bir statik değişkenin yalnızca Expert Advisor'ın tüm süresi boyunca aynı sembol ve zaman çerçevesi için NevDay() çağrılması durumunda kullanılabileceğidir. 2 veya daha fazla karakter varsa, NevDay() yanlış değerler döndürür. EA'm çoklu para birimi olarak tasarlandı... :(

İşte sınıfı kullanan başka bir seçenek

 //+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private :
   datetime           curbar;
   datetime           lastbar;
public :
                     CNevBar();
                    ~CNevBar();
   bool               new_bar( string symbol, ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar( void )
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: new_bar( string symbol, ENUM_TIMEFRAMES period)
  {
   curbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar== 0 )lastbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar!=curbar)
     {
      lastbar=curbar;
       return ( true );
     }
   return ( false );
  }

CNevBar *eurusd_H1; // объявим экземпляр класса для симмвола EURUSD
CNevBar *eurusd_M15; // объявим экземпляр класса для симмвола EURUSD

CNevBar *audusd_M30; // объявим экземпляр класса для симмвола AUDUSD
CNevBar *audusd_M5; // объявим экземпляр класса для симмвола AUDUSD

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   eurusd_H1= new CNevBar(); // создадим экземпляр класса для симмвола EURUSD
   audusd_M30= new CNevBar(); // создадим экземпляр класса для симмвола AUDUSD
   eurusd_M15= new CNevBar(); // создадим экземпляр класса для симмвола EURUSD
   audusd_M5= new CNevBar(); // создадим экземпляр класса для симмвола AUDUSD

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   delete eurusd_H1; // удалим экземпляр класса для симмвола EURUSD
   delete audusd_M30; // удалим экземпляр класса для симмвола AUDUSD
   delete eurusd_M15; // удалим экземпляр класса для симмвола EURUSD
   delete audusd_M5; // удалим экземпляр класса для симмвола AUDUSD

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

   if (eurusd_H1.new_bar( "EURUSD" , PERIOD_H1 ))
     {
       Alert ( "EURUSD" , " Новый бар на Н1" );
     }

   if (eurusd_M15.new_bar( "EURUSD" , PERIOD_M15 ))
     {
       Alert ( "EURUSD" , " Новый бар на M15" );
     }

   if (audusd_M30.new_bar( "AUDUSD" , PERIOD_M30 ))
     {
       Alert ( "AUDUSD" , " Новый бар на M30" );
     }
   if (audusd_M5.new_bar( "AUDUSD" , PERIOD_M5 ))
     {
       Alert ( "AUDUSD" , " Новый бар на M5" );
     }

//---

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

test sonucu

 2016.02 . 20 21 : 09 : 43      2015.01 . 10 00 : 00   тест 3 test started
2016.02 . 20 21 : 09 : 45      2015.01 . 12 00 : 00   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 09 : 47      2015.01 . 12 00 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M30
2016.02 . 20 21 : 09 : 50      2015.01 . 12 00 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 09 : 53      2015.01 . 12 00 : 05   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 09 : 59      2015.01 . 12 00 : 10   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 04      2015.01 . 12 00 : 15   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 04      2015.01 . 12 00 : 15   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 10      2015.01 . 12 00 : 20   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 13      2015.01 . 12 00 : 25   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 16      2015.01 . 12 00 : 30   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 16      2015.01 . 12 00 : 30   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M30
2016.02 . 20 21 : 10 : 16      2015.01 . 12 00 : 30   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 23      2015.01 . 12 00 : 35   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 26      2015.01 . 12 00 : 40   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 29      2015.01 . 12 00 : 45   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 29      2015.01 . 12 00 : 45   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 34      2015.01 . 12 00 : 50   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 36      2015.01 . 12 00 : 55   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на Н 1
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M30
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 46      2015.01 . 12 01 : 05   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 50      2015.01 . 12 01 : 10   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 55      2015.01 . 12 01 : 15   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 55      2015.01 . 12 01 : 15   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 57      2015.01 . 12 01 : 17   Tester: stop button pressed