Mt4 Fin de l'assistance. - page 20

 
Alexey Viktorov:
Il est préférable de ne pas commencer par là. C'est ce qui vous fait fuir. Même moi, un partisan de la POO qui la connaît très mal, j'ai trébuché à cause de ce texte... ...n'a rien compris. C'est pourquoi j'essaie d'expliquer la différence au niveau le plus bas.

Elle peut aussi être plus simple.

OOP - permet de définir une interface unique. Après cela, toutes les choses spécifiques à la plate-forme se "cachent" et n'interfèrent pas avec le travail.

Bien sûr, vous pouvez le faire en adoptant une approche purement procédurale. Mais la prise en charge de la variante procédurale sera plus compliquée, car dans chaque fonction, nous devrons traiter toutes les plateformes à la fois.

 

Je m'excuse pour ce léger retard.

Voici la première version de la fonction. Vous pouvez l'affiner et le développer davantage. Si quelqu'un remarque une erreur, merci de la commenter.

//+------------------------------------------------------------------+
//|                                                    Новый бар.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 même sans OOP vous pouvez le rendre plus facile, pensez-y et essayez.

Respectueusement.
 
Dès que l'utilisateur appelle la fonction New_bar(), il recevra une réponse de celle-ci concernant l'événement d'une nouvelle barre sur le délai demandé. En même temps, après l'appel de la fonction, si un nouvel événement de barre s'est produit, le drapeau d'événement est effacé. En d'autres termes, la notification d'une nouvelle barre de l'horizon temporel souhaité ne peut être reçue qu'une fois par barre. Après avoir reçu la notification d'une nouvelle barre, cette barre n'est plus nouvelle.
 
Реter Konow:

Voici la première version de la fonction. Vous pouvez l'affiner et le développer davantage. Si quelqu'un remarque une erreur, merci de la commenter.

À première vue, tout semble aller bien. Je n'ai pas creusé très profondément.

Personnellement, je diviserais probablement le temps précédent et actuel par la durée de la barre, et si la valeur a changé, une nouvelle barre apparaîtrait. Mais, il est aussi possible de le faire de cette façon.

Quant au style - personnellement, je suis un peu gêné par le fait que l'on ne puisse pas savoir de quel type de variable il s'agit (je suis habitué à la "notation hongroise, où le préfixe de toute variable est une abréviation de son type), mais peut-être est-ce inutile.

 
Andrey Kisselyov:
@Peter Konow même sans OOP vous pouvez le rendre plus facile, pensez-y et essayez.

Respectueusement.
Bien sûr, il est possible que vous puissiez le faire. J'avais une heure pour le faire. Vous pouvez y réfléchir et réduire quelque chose. Tout cela est possible.
 
Andrey Kisselyov:
@Peter Konow même sans OOP vous pouvez le rendre plus simple, pensez-y et essayez.

Sincèrement.

Si j'ai bien compris. L'objectif est de faire en sorte que cela fonctionne. S'il avait publié un fichier protégé avec cette fonction, vous n'auriez jamais deviné qu'il avait été écrit de cette façon.

 
George Merts:

À première vue, tout semble aller bien. Je n'ai pas creusé assez profondément.

Personnellement, je diviserais probablement le temps précédent et actuel par la durée de la barre, et si la valeur a changé, une nouvelle barre est arrivée. Mais, il est aussi possible de le faire de cette façon.

Quant au style - personnellement, je suis un peu gêné par le fait que l'on ne puisse pas savoir de quel type de variable il s'agit (je suis habitué à la "notation hongroise, où le préfixe de toute variable est une abréviation de son type), mais peut-être est-ce inutile.

Eh bien, la perception du style est une question d'habitude. Moi aussi, je trouve difficile de lire les codes donnés dans les branches. Ça m'énerve juste parfois.))

 
George Merts:

Elle peut aussi être plus simple.

OOP - permet de définir une interface unique. Après cela, toutes les choses spécifiques à la plate-forme se "cachent" et n'interfèrent pas avec le travail.

Il est bien sûr possible de le faire selon une approche purement procédurale. Mais la prise en charge de la variante procédurale serait plus difficile, car dans chaque fonction, il faudrait traiter toutes les plates-formes à la fois.

Il a déjà été discuté qu'une interface unique n'est pas applicable à la programmation de toutes les tâches de calcul... Mettre de belles choses sous forme d'interfaces est un procédé purement cosmétique qui ne s'applique qu'au code déjà achevé et qui entrave encore plus le support et le raffinement du code...

 
Mickey Moose:

Si j'ai bien compris. L'objectif est de faire en sorte que cela fonctionne. S'il avait mis en ligne un fichier protégé avec cette fonction, nous n'aurions jamais deviné qu'il était écrit de cette façon.

Il est souhaitable qu'il ne se contente pas de fonctionner, mais qu'il fonctionne rapidement, avec précision, sans erreurs, qu'il ait une forme structurée dans la source et qu'il soit clairement rédigé.

meilleures salutations.