Mt4 Fim do apoio. - página 25

 
Artyom Trishkin:

Basta escrever uma função onde o usuário pergunta: "há um novo bar no M5?" e recebe uma resposta de sim/não.

Por exemplo:

Aqui está sua função IsNewBar() e nós a desenvolveremos e a giraremos ainda mais com uma extensão adicional da tarefa


Parece-me que este não é um bom exemplo para demonstrar a utilidade do OOP.
Aqui, por exemplo, é uma variante que utiliza apenas uma função:

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
   IsNewBar(0,false); // режим сбора информации
   if(IsNewBar()) Print("Пришел новый бар текущего ТФ");  // режим считывания информации
   if(IsNewBar(PERIOD_H4)) Print("Пришел новый бар H4");  // режим считывания информации
   if(IsNewBar(PERIOD_D1)) Print("Пришел новый бар D1");  // режим считывания информации
   
  }
bool IsNewBar(ENUM_TIMEFRAMES tf=PERIOD_CURRENT,bool out=true)
  {
   static const ENUM_TIMEFRAMES TF[22]=
     {
      PERIOD_CURRENT,PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
     };
   static bool newbar[22];
   static bool FirstTime=true;
   static int acb[22]; // array of current bars
   if(FirstTime)
     {
      for(int i=0;i<22;i++) acb[i]=Bars(Symbol(),TF[i]);
      FirstTime=false;
      return(false);
     }
   int curtf=0;
   while(TF[curtf]!=tf) curtf++;
   if(out) return (newbar[curtf]);
   for(int i=0;i<22;i++)
     {
      int CurBars=Bars(Symbol(),TF[i]);
      if(acb[i]<CurBars)
        {
         acb[i]=CurBars;
         newbar[i]=true;
        }
      else newbar[i]=false;
     }
   return(false);
  }

você pode, naturalmente, removê-lo doOnTick e inseri-lo noOnTimer

 
Реter Konow:

Sobre esta questão, eu acho que você está errado. Favor verificar com o Service Desk. Deixe-os responder à pergunta: se novas barras são formadas na plataforma, independentemente da chegada das citações, ou não. Se não, então, no caso de um novo bar, verifique se havia uma citação nele. Se foi, a nova barra foi formada. Podemos fazê-lo desta forma. Não há muito a mudar.

Oh mama mia... Basta ler as informações já. Estou muito surpreso que você não saiba disso, e quando eles lhe falam sobre isso, você também tem dúvidas. Eu não vou nem olhar na direção do Service Desk para tais perguntas infantis - eles vão rir de você. Então pergunte a eles você mesmo - você tem um link para Servicedesk em seu perfil.
 
Nikolai Semko:

Parece-me que este não é um bom exemplo para demonstrar a utilidade do OOP.
Aqui está, por exemplo, uma variante que utiliza apenas uma função:

você pode, é claro, removê-lo doOnTick e inseri-lo noOnTimer

Não olhou para a lógica, bem, vamos supor que, hipoteticamente, ela funciona corretamente.

E por algum personagem aleatório?

Imagine que o programa usa uma lista de símbolos da janela Visão Geral do Mercado, e o usuário pode alterar os conjuntos de símbolos a qualquer momento.

 
Eu pessoalmente não vi o código OOP de @Nikolai Semko.


Respeitosamente.

 

Artyom está um pouco atrasado em sua pergunta, mas a questão é a seguinte: escreva-a em estilo processual para que funcione corretamente

void OnTick()
 {
 
  if(IsNewBar("AUDCAD",PERIOD_H1)) {
   // задача №1
  }
 
  if(IsNewBar("GBPJPY",PERIOD_M15)) {
   // задача №2
  }
 
  if(IsNewBar("EURUSD",PERIOD_H4)) {
   // задача №3
  }

 }

// Функция "Новый бар"
bool IsNewBar(....) {
 здесь код, который нужно написать
}
 
Реter Konow:

Sim em um temporizador. Uma nova barra aparece sem uma citação. Estamos interessados exatamente no caso de aparecimento no bar, enquanto podemos corrigir a cotação em Optisk();

Em qualquer caso, aparecerá uma barra.


Aqui temos a explicação dos bares:

O tempo[i] de abertura do bar não costuma coincidir com o tempo de chegada do tick. O tempo de abertura de um bar para qualquer período de tempo é sempre um múltiplo do período de tempo. Qualquer primeiro tique que ocorrer dentro de um período de tempo é uma barra formando uma barra; se nenhum tique chegar dentro do período de tempo, nenhuma barra será formada dentro do período de tempo.

 
Vitaly Muzichenko:

Artyom não cobriu realmente a questão, mas a questão é esta: escreva-a em estilo processual, para que ela funcione corretamente

Eu queria adicionar gradualmente tarefas para que fosse rápido, conveniente, fácil e simples para as pessoas implementarem a tarefa. Para mostrar mais tarde como isso é feito facilmente usando o OOP.

Mas o principal rejeitador do próprio OOP se afastou da solução do problema :)

 
Artyom Trishkin:

Eu queria adicionar gradualmente tarefas para que fosse rápido, conveniente, fácil e simples para as pessoas implementarem a tarefa. Para mostrar então como é fácil fazer isso com o OOP.

Mas o principal rejeitador do próprio OOP rejeitou a solução da tarefa :)

Sim, eu mesmo não disse isso, vou parafrasear:

Artem não abriu um pouco a questão, e a questão é esta: escrever em estilo processual que funciona corretamente

Talvez ele volte e prove que é muito fácil e simples

 
Vitaly Muzichenko:

Eu mesmo não o disse, por isso vou reformular a frase:

Artyom não cobriu realmente a questão, e a questão é esta: escrever em estilo de procedimento, para que funcione corretamente

Talvez ele volte e prove que é muito fácil e simples.

Eu tinha o objetivo de fazer com que seu código de estilo de procedimento funcionasse em tal laço no final:

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }
 
Artyom Trishkin:

Eu tinha o objetivo de que o resultado final seria que seu código de estilo de procedimento funcionasse em tal laço:

O loop de símbolos, verificando a abertura de uma nova barra quando uma cotação chega e assim por diante, poderia facilmente ser adicionado à minha solução. E o que o OOP tem a ver com isso?

Você escolheu um exemplo errado. Pense em outra coisa a seu bel-prazer.