Questions des débutants MQL5 MT5 MetaTrader 5 - page 517

 

MT4, aidez la communauté.
1. Dans l'Expert Advisor, en travaillant (par ticks ou sur un timer 0.5 sec) sur le graphique M1, vous devez faire des calculs au moment d'une nouvelle bougie sur le graphique H1.
Nous pouvons attraper le début de la bougie M1, en suivant la dernière bougie M1 de chaque heure (NN:00 minutes), mais ce n'est pas très beau ... En outre, le chandelier H1 peut ne pas apparaître à ce moment-là.
Peut-être que quelqu'un l'a fait de manière plus élégante ?
2. Combien de temps faut-il pour obtenir les valeurs de l'indicateur via iCustom(), par rapport au code de l'indicateur dans le texte du Conseiller Expert ?
3. si le code de l'indicateur dans le texte de l'Expert Advisor est beaucoup plus rapide à calculer, comment dans l'Expert Advisor attaché au graphique M1, calculer la valeur de l'indicateur sur le graphique H1 ?

 
MikeZv:

MT4, je demande l'aide de la communauté.
1. Dans l'Expert Advisor, en travaillant (par ticks ou par timer 0.5 sec) sur le graphique M1, vous devez faire des calculs au moment où une nouvelle bougie apparaît sur le graphique H1.
Nous pouvons attraper le début de la bougie M1, en suivant la dernière bougie M1 de chaque heure (NN:00 minutes), mais ce n'est pas très beau ... En outre, le chandelier H1 peut ne pas apparaître à ce moment-là.
Peut-être que quelqu'un l'a fait plus élégamment ?
2. Combien de temps faut-il pour obtenir les valeurs de l'indicateur via iCustom(), par rapport au code de l'indicateur dans le texte du Conseiller Expert ?
3. si le code de l'indicateur dans le texte de l'Expert Advisor est beaucoup plus rapide à calculer, comment dans l'Expert Advisor attaché au graphique M1, calculer la valeur de l'indicateur sur le graphique H1 ?

La réponse à la première question, la fonction définit une nouvelle barre.

bool NevBar(int period)
  {
   static datetime StatTime;

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

exemple d'utilisation

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:

La réponse à la première question, la fonction définit une nouvelle barre.

Merci beaucoup Sergey, j'ai regardé la documentation, mais j'ai manqué iTime() ... :
Et pourquoiappeler NevBar() dansOnInit() ?

 
MikeZv:

Le premier appel de la fonction, sinon elle sera déclenchée immédiatement. Pour s'assurer queOnInit() n'est pas appelé

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:

Le premier appel de la fonction, sinon elle sera déclenchée immédiatement. Pour s'assurer queOnInit() n'est pas appelé

Merci, Sergei ! Sur le forum, j'ai été fortement effrayé : "N'utilisez pas de variables statiques ! " :)
 
MikeZv:
Merci Sergei ! Sur le forum, j'ai eu une peur bleue : "N'utilisez pas de variables statiques ! " :)
N'écoutez pas, si vous devez l'utiliser - utilisez-le courageusement mais correctement !
 
MikeZv:
Merci Sergei ! Sur le forum, j'ai eu une peur bleue : "N'utilisez pas de variables statiques ! " :)
C'est la première fois que j'en entends parler, je me demande ce qu'ils ont de si effrayant, je les utilise rarement aussi, mais pour certaines tâches, ils sont mieux adaptés.
 
Sergey Gritsay:
C'est la première fois que j'en entends parler, je me demande ce qu'ils ont de si effrayant, je les utilise rarement aussi, mais ils sont mieux adaptés à certaines tâches.
Le problème est qu'une variable statique ne peut être utilisée que si NevDay() est appelée pour le même symbole et la même période pendant toute la durée d'exécution de l'EA. S'il y a 2 symboles ou plus, NevDay() renverra des valeurs incorrectes. Mon Conseiller Expert est conçu pour les multidevises ... :(
 
MikeZv:
Le fait est que la variable statique ne peut être utilisée que si NevDay() est appelé pour le même symbole et la même période. S'il y a 2 symboles ou plus, NevDay() retournera des valeurs incorrectes. Mon conseiller expert est multi-devises ... :(

Si vous en avez besoin pour le mode multidevises, voici un exemple, il fonctionne dans MT4 et MT5

//+------------------------------------------------------------------+
//|                                                         тест.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:
Le point est que la variable statique ne peut être utilisée que si NevDay() est appelé pour le même symbole et la même période. S'il y a 2 symboles ou plus, NevDay() retournera des valeurs incorrectes. Mon conseiller expert est multi-devises ... :(

Voici une autre option utilisant la classe

//+------------------------------------------------------------------+
//|                                                         тест.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");
     }

//---

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

Résultat du test

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