L'EOP pour les écoliers. - page 16

 

Je demande aux modérateurs de placer toutes les discussions dans un fil séparé. Il existe probablement des dizaines de fils de discussion sur les avantages de la POO.

 
Alexey Viktorov:

Une autre question : quelle est la différence entre déclarer une variable, obtenir/créer un pointeur, créer une instance d'objet. Il ne s'agit pas de la différence, mais de savoir dans quels cas il est préférable de l'utiliser. Par exemple, il suffit de déclarer une variable pour ouvrir une position.

Et dans quels cas il est préférable d'utiliser le pointeur, et dans quels cas on ne peut pas se passer de l'instance de l'objet.

Quels sont les avantages et les inconvénients d'une méthode ou d'une autre ?

1. Si un objet se trouve dans la portée globale, il s'agit d'un objet statique. Il est placé dans la mémoire statique et existe aussi longtemps que le programme existe.

Son constructeur est appelé avant l'appel de la première fonction du programme. Le destructeur est appelé après OnDeinit().

2. Les objets déclarés à l'intérieur de la fonction sont des objets locaux. Ils sont placés dans la pile. Ils sont détruits à la sortie de la fonction.
Vous pouvez déclarer un objet local entre accolades.


Par exemple, comme ceci :

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

Ou même comme ça :

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

Il sera détruit à la sortie du bloc. Lorsqu'il est détruit, le destructeur est appelé.

La taille de la pile étant généralement limitée, il est impossible d'y placer des objets de très grande taille.

3. Les objets créés par le nouvel opérateur sont dans la mémoire dynamique (heap).
Ils existent jusqu'à ce qu'ils soient explicitement éliminés par l'opérateur delete.


Exemple :

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

Dans cet exemple, deux variables sont créées. Un objet de la classe MyClass dans le tas.

Et la variable pObject est un pointeur vers MyClass. Cette variable se voit attribuer l'adresse de l'objet dans la mémoire dynamique.

En sortant de la fonction, la variable pObject sera détruite, mais l'objet restera dans la mémoire dynamique.

Pour pouvoir le supprimer, son adresse doit être stockée quelque part.

Lorsqu'ils sont créés et détruits, le constructeur et le destructeur sont également appelés.

L'accès aux variables dynamiques est généralement plus long que celui aux variables locales.


Vous devez prendre tout cela en compte lorsque vous créez un objet.


 
Koldun Zloy:

1. Si un objet se trouve dans la portée globale, il s'agit d'un objet statique. Il est placé dans la mémoire statique et existe aussi longtemps que le programme existe.

...

Et personne ne dira rien, pas même ZyXpert.
 
Koldun Zloy:

Ai-je raison de supposer qu'avec cette option

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

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

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

sans tenir compte de l'avertissement du compilateur, la position peut s'ouvrir avec un nombre magique non égal à 123 ?

C'est-à-dire qu'un nouvel objet sera créé dans la fonction OnTick et le magicien ne sera pas égal à 123 dans celui-ci.

 
Alexey Viktorov:

Ai-je raison de supposer qu'avec cette option

sans tenir compte de l'avertissement du compilateur, la position peut s'ouvrir avec un nombre magique autre que 123 ?

C'est-à-dire qu'un nouvel objet sera créé dans la fonction OnTick et le magicien ne sera pas égal à 123 dans celui-ci.

SetExpertMagicNumber

 
Alexey Viktorov:

Ai-je raison de supposer qu'avec cette option

sans tenir compte de l'avertissement du compilateur, la position peut s'ouvrir avec un not 123 magique ?

C'est-à-dire qu'un nouvel objet sera créé dans la fonction OnTick et qu'il n'aura pas un MagicNumber de 123.

Oui, c'est exact. Ce sont deux objets différents. Comme l'objet local dans OnTick a le même nom que l'objet global, on ne peut accéder qu'à lui dans la fonction OnTick. L'objet global est hors de portée. Par conséquent, pour l'objet commercial local, le MagicNumber n'a pas encore été défini.

 
Alexey Viktorov:

Ai-je raison de supposer qu'avec cette option

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

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

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

sans tenir compte de l'avertissement du compilateur, la position peut s'ouvrir avec un not 123 magique ?

C'est-à-dire qu'un nouvel objet sera créé dans la fonction OnTick et le magicien n'y sera pas 123.

C'est exactement la même chose qu'avec les variables.

Et se concentrer :

#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);
}
 
Pourquoi ceSetExpertMagicNumber est-il nécessaire en premier lieu?
 
Сергей Таболин:
Pourquoi ceSetExpertMagicNumber est-il nécessaire en premier lieu?

Il fixe un nombre magique à l'objet de la classe de commerce. Il peut y avoir plus d'un objet de classe CTrade pour l'ensemble du programme, comme cela se fait maintenant dans kodobase. C'est un objet. Cet objet est utilisé pour effectuer desopérations de trading. Il n'est pas nécessaire de créer un objet pour l'ensemble du programme et de le réinitialiser à chaque fois qu'un nouveau magicien, le glissement et d'autres paramètres définis lors de l'initialisation doivent être modifiés. Il est possible de créer un objet de négociation distinct pour chaque symbole négocié, de lui attribuer les paramètres nécessaires en fonction des propriétés du symbole, auquel appartient cet objet spécifique de la classe CTrade, et de négocier facilement en obtenant un pointeur vers l'objet nécessaire de la classe de négociation nécessaire à partir du symbole nécessaire, sans remplacer les paramètres définis à ce moment-là.
Pour travailler avec un autre magicien, on peut définir un objet commercial distinct avec les paramètres appropriés. Il peut y avoir plusieurs assistants dans un même EA.

Tout dépend de la compréhension de ce que nous utilisons et de la manière dont nous l'utilisons.

 
Artyom Trishkin:

Il définit un magik pour un objet de la classe commerce. Il ne peut pas y avoir un seul objet de la classe CTrade pour l'ensemble du programme, comme cela se fait habituellement dans kodobase. C'est un objet. Cet objet est utilisé pour effectuer des opérations de trading. Il n'est pas nécessaire de créer un objet pour l'ensemble du programme et de le réinitialiser à chaque fois qu'un nouveau magicien, le glissement et d'autres paramètres définis lors de l'initialisation doivent être modifiés. Il est possible de créer un objet de négociation distinct pour chaque symbole négocié, de lui attribuer les paramètres nécessaires en fonction des propriétés du symbole, auquel appartient cet objet spécifique de la classe CTrade, et de négocier facilement en obtenant un pointeur vers l'objet nécessaire de la classe de négociation nécessaire à partir du symbole nécessaire, sans remplacer les paramètres définis à ce moment-là.
Pour travailler avec un autre magicien, on peut définir un objet commercial distinct avec les paramètres appropriés. Il peut y avoir plusieurs assistants dans un même EA.

Tout dépend de la compréhension de ce que nous utilisons et de la manière dont nous l'utilisons.

Dans ce cas, est-ce que

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

description incorrecte ?

J'ai cru comprendre que si elle est définie pour EA, tous les ordres/positions devraient avoir cette magie. ((

Raison: