Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1334

 
Artyom Trishkin:
Foi o Alexey que rediscutiu algo no código que eu dei. Ou talvez o tenha subestimado - escrevi-o "de joelhos" como um simples exemplo para esclarecer aquilo de que já não me lembro.

Talvez Alexei nos possa dizer).

 
Valeriy Yastremskiy:

A iteração do ciclo não terminará e não iniciará um novo ciclo, mas passará para o próximo Se. A lógica irá mudar.

Não. A condição lá está originalmente definida de modo a que se o ponteiro for criado com sucesso, então acrescente-o à lista. O suporte da curva é fechado e se ocorrer uma falha, a adição não será executada. A lógica é um pouco diferente com o operador contínuo, mas o resultado é o mesmo.
 

Artyom Trishkin:
Это Алексей что-то переделывал в том коде, который я давал. А может и я недоглядел - писал "на коленке" в качестве простого примера для пояснения уже не помню чего.

//+------------------------------------------------------------------+
//| CNewBar Time Возвращает время нулевого бара                      |
//+------------------------------------------------------------------+
datetime CNewBar::Time(void)
  {
   datetime array[1], ret;
   ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0;
   return(array[0]);
 }
//+------------------------------------------------------------------+
//| CNewBar IsNewBar Основная функция класса                         |
//+------------------------------------------------------------------+
bool CNewBar::IsNewBar(void)
  {
   datetime tm = this.Time();
   if(tm == 0)
      return false;
   if(tm != this.m_time)
     {
      this.m_time = tm;
      return true;
     }
   return false;
  }


Artem, porque é que esta palavra-chave é usada aqui? Sem ela, os métodos funcionarão com os membros da classe...

 
Mikhail Tkachev:

Alexey, obrigado por uma resposta tão detalhada.
A finalidade da variável ret no fragmento de código dado não é clara...
Porque é calculado se o método retorna matriz[0] de qualquer maneira?
P.S.
E porquê utilizá-lo num método de classe? Estamos a trabalhar com membros desta classe em particular...


  1. Como a função CopyTime devolve um valor, deixe-o regressar a uma variável, não a vai piorar... Em caso de depuração, pode verificar o que tem.
  2. isto foi escrito por Artyom. Aparentemente, trata-se de preferências pessoais. Algumas pessoas escrevem, devem - não devem escrever ::
ps; reparei agora mesmo que a variável ret datetime tipo... Claro que deve ser int type. Bem, também terei de resolver isso...
 
Alexey Viktorov:
  1. Uma vez que a função CopyTime devolve um valor, deixe-o regressar a uma variável, não a vai piorar... Em caso de depuração, pode verificar o que tem.
  2. isto foi escrito por Artyom. Aparentemente, trata-se de preferências pessoais. Algumas pessoas, é necessário - não é necessário escrever ::

1. Para que serve aqui a função CopyTime?

2. Talvez a Artem responda sobre isto - é uma preferência pessoal ou é necessária?

 
Mikhail Tkachev:

1. Para que serve a função CopyTime?

2. Talvez a Artem responda sobre isto - é preferência pessoal ou é necessário?

Não gosto de CopyTime(), substitua-o por iTime(). Não há diferença, o principal é obter a hora do bar actual.

Na minha cabeça lembro-me vagamente de quando foi escrito. Penso que também fiz esta pergunta... E se não me engano, isto assegura que a referência é apenas a métodos locais, no caso de haver métodos semelhantes noutras classes. E, claro, Artyom irá esclarecer.

 
Alexey Viktorov:
Não. A condição lá é originalmente definida como esta, se o ponteiro for criado com sucesso, então adicione-o à lista. O suporte curvo está fechado e se houver uma falha, a adição não será executada. A lógica é um pouco diferente com o operador contínuo, mas o resultado é o mesmo.

Sim, o resultado é o mesmo, por dentro é diferente. Penso que é mais rápido com a continuação, embora seja a cor e a lógica ....

 
Mikhail Tkachev:


Artem, porque é que esta palavra-chave é usada aqui? Porque mesmo sem ela, os métodos funcionarão com os membros da classe...

Eles irão. Utilizo-o porque quero que eles :) Indica explicitamente que métodos de classe são utilizados.

Se tem duas classes, uma como pai e outra como descendente, e tem dois métodos com o mesmo nome, mas não são virtuais por alguma razão, tem de especificar explicitamente qual deles utilizar.

Suponha que a classe pai é CParent e a classe herdada é CInheritede ambas têm método().

Neste caso, se designarmos um método Método() de uma classe CParent, este chamará explicitamente um método da classe CParent - isto não é necessário aqui. Podemos chamar o método com ou sem ele.

Sechamarmos método() a um método numa classe CInherited herdada, o métododessa classe também será chamado, uma vez que primeiro procuramos um método pertencente à classe da qual o chamámos.

Sechamarmos CParent::Method() numa classe CInherited, é o método da classe pai que será chamado desta forma, porque especificámos explicitamente um método que pertence à classe pai por operador de resolução de contexto.

Mas mesmo assim, eu chamaria método Método() numa classe CInherited herdada com isto - para ter a certeza de que esta (isto == "isto") classe herdada seria chamada.

Existem outras explicações para a sua utilização. Talvez alguém mais experiente no OOP nos possa dizer.

 
Valeriy Yastremskiy:

Sim, o resultado é o mesmo, por dentro é diferente. Penso que é mais rápido com a continuação, embora seja a cor e a lógica ....

Não deve haver qualquer diferença. Parece-me apenas mais agradável - menos parênteses e recuos.

 
Alexey Viktorov:
  1. Uma vez que a função CopyTime devolve um valor, deixe-o regressar a uma variável, não a vai piorar... Em caso de depuração, pode verificar o que tem.
  2. isto foi escrito por Artyom. Aparentemente, trata-se de preferências pessoais. Alguns deles escrevem-no, eu não preciso dele ::
ps; reparei agora mesmo que a variável ret datetime tipo... Claro que deve ser int type. Mas não importa, também terei de o arranjar...

Bem, sim. Eu sou um desses "alguns", especialmente quando chamo função padrão da classe, especifico sempre o contexto global. Só porque consigo pensar em escrever nesta classe um método com o mesmo nome da função padrão - por isso nunca esquecerei o que ele faz. E é aí que :: é útil para chamar a função padrão e isto é útil para chamar o meu método com o mesmo nome.