Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1334

 
Artyom Trishkin:
Fue Alexey quien rehízo algo en el código que di. O tal vez lo subestimé, lo escribí "de rodillas" como un simple ejemplo para aclarar lo que ya no recuerdo.

Tal vez Alexei pueda decírnoslo).

 
Valeriy Yastremskiy:

La iteración del ciclo no terminará y no comenzará una nueva, sino que pasará al siguiente Si. La lógica cambiará.

No. La condición allí se establece originalmente para que si el puntero se crea con éxito, entonces añadirlo a la lista. El soporte de la curva está cerrado y si se produce un fallo, la adición no se ejecutará. La lógica es un poco diferente con el operador continue, pero el resultado es el mismo.
 

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, ¿por qué se utiliza aquí la palabra clave this? Sin ella los métodos funcionarán con los miembros de la clase...

 
Mikhail Tkachev:

Alexey, gracias por una respuesta tan detallada.
El propósito de la variable ret en el fragmento de código dado no está claro...
¿Por qué se calcula si el método devuelve array[0] de todos modos?
P.D.
¿Por qué usar esto en un método de clase? Estamos trabajando con miembros de esta clase particular...


  1. Como la función CopyTime devuelve un valor, déjalo en una variable, no empeorará las cosas... En caso de depuración, puedes comprobar lo que tienes.
  2. esto fue escrito por Artyom. Aparentemente, se trata de preferencias personales. Algunos lo escriben si quieren o no quieren ::
ps; Acabo de darme cuenta de que el tipo de variable ret datetime... Por supuesto debería ser de tipo int. Oh, bueno, tendré que arreglar eso también...
 
Alexey Viktorov:
  1. Como la función CopyTime devuelve un valor, que vuelva a una variable, no lo hará peor... En caso de depuración, puedes comprobar lo que tienes.
  2. esto fue escrito por Artyom. Aparentemente, se trata de preferencias personales. Algunas personas, es necesario - no es necesario escribir ::

1. ¿para qué sirve la función CopyTime aquí?

2. Tal vez Artem responda sobre esto: ¿es una preferencia personal o es necesario?

 
Mikhail Tkachev:

1. ¿Para qué sirve la función CopyTime?

2. Tal vez Artem responda sobre esto - ¿es una preferencia personal o es necesario?

Si no te gusta CopyTime(), sustitúyelo por iTime(). No hay ninguna diferencia, lo principal es obtener el tiempo de la barra actual.

En mi cabeza recuerdo vagamente cuándo se escribió. Creo que yo también hice esta pregunta... Y si no me equivoco, esto asegura que la referencia es sólo a métodos locales en caso de que haya otros similares en otras clases. Y por supuesto, Artyom lo aclarará.

 
Alexey Viktorov:
No. La condición allí se establece originalmente así, si el puntero se crea con éxito, entonces añadirlo a la lista. El soporte curvo está cerrado y si hay un fallo, la adición no se ejecutará. La lógica es un poco diferente con el operador continue pero el resultado es el mismo.

Sí, el resultado es el mismo, el interior es diferente. Creo que es más rápido con la continuación, aunque es el color y la lógica ....

 
Mikhail Tkachev:


Artem, ¿por qué se utiliza aquí la palabra clave this? Porque incluso sin ella, los métodos funcionarán con los miembros de la clase...

Lo harán. Lo uso porque quiero que lo hagan :) Indica explícitamente qué métodos de la clase se utilizan.

Si tienes dos clases, una como padre y otra como descendiente, y tienes dos métodos con el mismo nombre, pero no son virtuales por alguna razón, tienes que especificar explícitamente cuál usar.

Supongamos que la clase padre es CParent y la clase heredada es CInheritedy ambas tienen el método Method().

En este caso, si llamamos a un método Method() de una clase CParent, se llamará explícitamente a un método de la clase CParent - esto no es necesario aquí. Podemos llamar al método con o sin él.

Sillamamos a un métodoMethod() en una clase heredada de CInherited,también se llamará al métodode esa clase, ya que primero buscamos un método perteneciente a la clase desde la que lo llamamos.

Sillamamos a CParent::Method() en una clase CInherited, es el método de la clase padre el que será llamado de esta manera, porque hemos especificado explícitamente un método que pertenece a la clase padre mediante el operador de resolución de contexto.

Pero aún así, yo llamaría método Method() en una clase heredada CInherited con this - para estar seguro de que esta (this == "this") clase heredada sería llamada.

Hay otras explicaciones para usar esto. Tal vez alguien más experimentado en OOP nos pueda decir.

 
Valeriy Yastremskiy:

Sí, el resultado es el mismo, el interior es diferente. Creo que es más rápido con la continuación, aunque es el color y la lógica ....

No debería haber ninguna diferencia. A mí me parece más bonito: menos paréntesis y sangrías.

 
Alexey Viktorov:
  1. Como la función CopyTime devuelve un valor, que vuelva a una variable, no lo hará peor... En caso de depuración, puedes comprobar lo que tienes.
  2. esto fue escrito por Artyom. Aparentemente, se trata de preferencias personales. Algunos lo escriben, yo no lo necesito ::
ps; Acabo de darme cuenta de que el tipo de variable ret datetime... Por supuesto que debería ser de tipo int. Pero no importa, tendré que arreglarlo también...

Pues sí, yo soy uno de esos "algunos", sobre todo cuando llamo a la función estándar desde la clase, siempre especifico el contexto global. Sólo porque se me ocurre escribir en esta clase un método con el mismo nombre que la función estándar, para no olvidar nunca lo que hace. Y ahí es donde :: es útil para llamar a la función estándar y esto es útil para llamar a mi método del mismo nombre.

Razón de la queja: