El EOP para escolares. - página 16

 

Pido a los moderadores que pongan todas las discusiones en un hilo aparte. Probablemente haya docenas de hilos de este tipo discutiendo las ventajas de la POO.

 
Alexey Viktorov:

Una pregunta más: ¿Cuál es la diferencia entre declarar una variable, obtener/crear un puntero, crear una instancia de objeto. No se trata de la diferencia, sino de en qué casos es mejor usarla. Por ejemplo, basta con declarar una variable para abrir una posición.

Y en qué casos es mejor utilizar el puntero, y en qué casos no podemos prescindir de la instancia del objeto.

¿Cuáles son los pros y los contras de un método u otro?

1. Si un objeto está en el ámbito global, es un objeto estático. Se coloca en la memoria estática y existe mientras exista el programa.

Su constructor es llamado antes de la llamada de la primera función del programa. El destructor se llama después de OnDeinit().

2. Los objetos declarados dentro de la función son objetos locales. Se colocan en la pila. Se destruyen al salir de la función.
Puedes declarar un objeto local dentro de llaves.


Por ejemplo, así:

if( ... )
{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

O incluso así:

{
  MyClass object;
  ...
}  //  Здесь вызывается деструктор.

Se destruirá al salir del bloque. Cuando se destruye, se llama al destructor.

Como el tamaño de la pila suele ser limitado, no se pueden colocar objetos muy grandes en ella.

3. Los objetos creados por el operador new están en memoria dinámica (heap).
Persistirán hasta que sean eliminados explícitamente por el operador de borrado.


Ejemplo:

void func()
{
  Myclass* pObject = new MyClass();
}

En este ejemplo, se crean dos variables. Un objeto de la clase MyClass en el montón.

Y la variable pObject es un puntero a MyClass. A esta variable se le asigna la dirección del objeto en la memoria dinámica.

Al salir de la función, la variable pObject será destruida, pero el objeto permanecerá en la memoria dinámica.

Para poder borrarlo, su dirección debe estar almacenada en algún lugar.

Cuando se crean y destruyen, también se llama al constructor y al destructor.

El acceso a las variables dinámicas suele ser más largo que el de las variables locales.


Hay que tener todo esto en cuenta a la hora de crear un objeto.


 
Koldun Zloy:

1. Si un objeto está en el ámbito global, es un objeto estático. Se coloca en la memoria estática y existe mientras el programa exista.

...

Y nadie dirá nada, ni siquiera ZyXpert.
 
Koldun Zloy:

¿Estoy en lo cierto al suponer que con esta opción

#include <Trade\Trade.mqh>
CTrade trade;

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;
 trade.Buy(0.1);
}

sin tener en cuenta la advertencia del compilador, la posición puede abrirse con un número mágico no igual a 123 ?

Es decir, se creará un nuevo objeto en la función OnTick y el mago no será igual a 123 en él.

 
Alexey Viktorov:

¿Estoy en lo cierto al suponer que con esta opción

sin tener en cuenta la advertencia del compilador, la posición puede abrirse con un número mágico distinto de 123 ?

Es decir, se creará un nuevo objeto en la función OnTick y el mago no será igual a 123 en él.

SetExpertMagicNumber

 
Alexey Viktorov:

¿Estoy en lo cierto al suponer que con esta opción

sin tener en cuenta la advertencia del compilador, la posición puede abrirse con una magia no 123 ?

Es decir, se creará un nuevo objeto en la función OnTick y no tendrá un MagicNumber de 123.

Sí, eso es correcto. Se trata de dos objetos diferentes. Como el objeto local en OnTick tiene el mismo nombre que el objeto global, sólo se puede acceder a él en la función OnTick. El objeto global está fuera de alcance. Por lo tanto, para el objeto comercial local, el MagicNumber aún no se ha establecido.

 
Alexey Viktorov:

¿Estoy en lo cierto al suponer que con esta opción

#include <Trade\Trade.mqh>
CTrade trade;   // Объект № 1 в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade trade;  // Объект № 2 в локальной области OnTick()
 trade.Buy(0.1);
}

sin tener en cuenta la advertencia del compilador, la posición puede abrirse con una magia no 123 ?

Es decir, se creará un nuevo objeto en la función OnTick y el mago no será 123 en él.

Es exactamente lo mismo que con las variables.

Y centrarse:

#include <Trade\Trade.mqh>
CTrade trade;   // Объект trade в глобальной области программы

int OnInit()
{
 trade.SetExpertMagicNumber(123);
}

void OnTick()
{
 CTrade *trade_ptr=GetPointer(trade);  // Указатель на объект trade
 trade_ptr.Buy(0.1);
}
 
¿Por qué es necesario esteSetExpertMagicNumber en primer lugar?
 
Сергей Таболин:
¿Por qué es necesario esteSetExpertMagicNumber en primer lugar?

Establece un número mágico al objeto de la clase comercial. Puede haber más de un objeto de clase CTrade para todo el programa como se hace ahora en kodobase. Esto es un objeto. Este objeto se utiliza para realizaroperaciones comerciales. No es necesario crear un objeto para todo el programa y restablecerlo cada vez que hay que cambiar un nuevo mago, el deslizamiento y otros parámetros que se establecen durante la inicialización. Es posible crear un objeto comercial separado para cada símbolo comercializado, establecer los parámetros necesarios para él de acuerdo con las propiedades del símbolo, al que pertenece este objeto específico de la clase CTrade, y negociar fácilmente obteniendo un puntero al objeto necesario de la clase comercial necesaria desde el símbolo necesario, sin anular los parámetros establecidos en él.
Para trabajar con otro mago, se puede definir un objeto comercial independiente con la configuración adecuada. Puede haber varios magos en un EA.

Todo depende de la comprensión de qué y cómo lo usamos.

 
Artyom Trishkin:

Establece un magik para un objeto de la clase comercial. No puede haber un solo objeto de la clase CTrade para todo el programa como se suele hacer en kodobase. Esto es un objeto. Este objeto se utiliza para realizar operaciones comerciales. No es necesario crear un objeto para todo el programa y restablecerlo cada vez que hay que cambiar un nuevo mago, el deslizamiento y otros parámetros que se establecen durante la inicialización. Es posible crear un objeto comercial separado para cada símbolo comercializado, establecer los parámetros necesarios para él de acuerdo con las propiedades del símbolo, al que pertenece este objeto específico de la clase CTrade, y negociar fácilmente obteniendo un puntero al objeto necesario de la clase comercial necesaria desde el símbolo necesario, sin anular los parámetros establecidos en él.
Para trabajar con otro mago, se puede definir un objeto comercial independiente con la configuración adecuada. Puede haber varios magos en un EA.

Todo depende de la comprensión de qué y cómo lo usamos.

En ese caso, ¿es

SetExpertMagicNumber
Устанавливает идентификатор эксперта

¿Descripción incorrecta?

Tenía entendido que si se establecía para EA, entonces cualquier orden/posición debería tener este magik. ((

Razón de la queja: