Mt4 Fim do apoio. - página 20

 
Alexey Viktorov:
É melhor não começar por aí. Isto é o que o afugenta. Até eu, um apoiante do OOP que o conhece muito mal, tropeçei por causa deste texto... ...não entendeu nada. É por isso que eu estou tentando explicar a diferença no nível mais baixo.

Também pode ser mais simples.

OOP - permite que você defina uma única interface. Depois disso, todas as coisas específicas da plataforma "escondem-se" e não interferem com o trabalho.

É claro que você pode fazer isso numa abordagem puramente processual. Mas, a variante processual de apoio será mais complicada, devido ao fato de que em cada função teremos que lidar com todas as plataformas ao mesmo tempo.

 

Peço desculpas pelo pequeno atraso.

Aqui está a primeira versão da função. Você pode refiná-lo e desenvolvê-lo ainda mais. Se alguém notar um erro, por favor, comente.

//+------------------------------------------------------------------+
//|                                                    Новый бар.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 mesmo sem OOP, você pode facilitar, pensar e experimentar.

Respeitosamente.
 
Assim que o usuário chamar a função New_bar(), ele receberá uma resposta da mesma sobre o evento de um novo bar no prazo solicitado. Ao mesmo tempo, depois que a função é chamada, se um novo evento de bar tiver ocorrido - a bandeira do evento é apagada. Ou seja, a notificação de uma nova barra com o prazo desejado pode ser recebida apenas uma vez por barra. Após receber a notificação de um novo bar, este bar não é mais novo.
 
Реter Konow:

Aqui está a primeira versão da função. Você pode refiná-lo e desenvolvê-lo ainda mais. Se alguém notar um erro, por favor, comente.

À primeira vista, tudo parece estar bem. Eu não escavei muito.

Eu, pessoalmente, provavelmente apenas dividiria o tempo anterior e atual pela duração da barra, e se o valor tivesse mudado, uma nova barra apareceria. Mas, também é possível fazê-lo desta forma.

Quanto ao estilo - pessoalmente estou um pouco incomodado com o fato de que não se pode dizer que tipo de variável é (estou acostumado a "notação húngara, quando o prefixo de qualquer variável é uma abreviação de seu tipo"), mas talvez isso seja desnecessário.

 
Andrey Kisselyov:
@Peter Konow mesmo sem o OOP pode ser facilitado, pense nisso e experimente.

Respeitosamente.
Claro, é possível que você possa. Eu tinha uma hora para fazer isso. Você pode pensar sobre isso e cortar algo. Tudo isso é possível.
 
Andrey Kisselyov:
@Peter Konow mesmo sem o OOP você pode simplificá-lo, pensar e tentar.

Sinceramente.

Tanto quanto eu entendi corretamente. O objetivo é fazer com que funcione. Se ele tivesse postado um arquivo protegido com esta função, você nunca teria adivinhado que ele foi escrito desta maneira.

 
George Merts:

À primeira vista, tudo parece estar bem. Ainda não escavei fundo o suficiente.

Pessoalmente, eu provavelmente apenas dividiria o tempo anterior e atual pela duração da barra, e se o valor mudou, uma nova barra chegou. Mas, também é possível fazê-lo desta forma.

Quanto ao estilo - pessoalmente estou um pouco incomodado com o fato de que não se pode dizer que tipo de variável é (estou acostumado a "notação húngara, quando o prefixo de qualquer variável é uma abreviação de seu tipo"), mas talvez isso seja desnecessário.

Bem, a percepção de estilo é uma questão de hábito. Eu também tenho dificuldade para ler códigos dados em filiais. Isso só me irrita às vezes)).

 
George Merts:

Também pode ser mais simples.

OOP - permite que você defina uma única interface. Depois disso, todas as coisas específicas da plataforma "escondem-se" e não interferem com o trabalho.

Isso pode, é claro, ser feito em abordagem puramente processual. Mas, apoiar a variante processual seria mais difícil, devido ao fato de que em cada função você teria que lidar com todas as plataformas ao mesmo tempo.

Já foi discutido que uma única interface não é aplicável à programação de nenhuma tarefa computacional... Colocar coisas boas na forma de interfaces é um procedimento puramente cosmético que se aplica apenas ao código já concluído e que dificulta ainda mais o suporte e o refinamento do código...

 
Mickey Moose:

Tanto quanto eu entendi corretamente. O objetivo é fazer com que funcione. Se ele tivesse postado um arquivo protegido com esta função, nunca teríamos adivinhado que ele foi escrito desta forma.

É desejável que não apenas funcione, mas que funcione rapidamente, com precisão, sem erros, tenha uma forma estruturada na fonte e claramente escrita.

Saudações cordiais.
Razão: