Il POF per gli scolari. - pagina 16

 

Chiedo ai moderatori di mettere tutte le discussioni in un thread separato. Ci sono probabilmente dozzine di thread di questo tipo che discutono i vantaggi di OOP.

 
Alexey Viktorov:

Un'altra domanda: qual è la differenza tra dichiarare una variabile, ottenere/creare un puntatore, creare un'istanza di un oggetto. Non è la differenza, ma in quali casi è meglio usare. Per esempio, è sufficiente dichiarare una variabile per aprire una posizione.

E in quali casi è meglio usare il puntatore, e in quali casi non possiamo fare a meno dell'istanza dell'oggetto.

Quali sono i pro e i contro di un metodo o di un altro?

1. Se un oggetto è nello scope globale, è un oggetto statico. Si trova nella memoria statica ed esiste finché esiste il programma.

Il suo costruttore viene chiamato prima della chiamata della prima funzione del programma. Il distruttore è chiamato dopo OnDeinit().

2. Gli oggetti dichiarati all'interno della funzione sono oggetti locali. Vengono messi in pila. Vengono distrutti all'uscita dalla funzione.
Potete dichiarare un oggetto locale tra parentesi graffe.


Per esempio, così:

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

O anche così:

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

Sarà distrutto all'uscita dal blocco. Quando viene distrutto, viene chiamato il distruttore.

Poiché la dimensione dello stack è solitamente limitata, oggetti molto grandi non possono essere messi nello stack.

3. Gli oggetti creati dal nuovo operatore sono in memoria dinamica (heap).
Esistono finché non vengono esplicitamente eliminati dall'operatore di cancellazione.


Esempio:

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

In questo esempio, vengono create due variabili. Un oggetto della classe MyClass nell'heap.

E la variabile pObject è un puntatore a MyClass. A questa variabile viene assegnato l'indirizzo dell'oggetto nella memoria dinamica.

Quando si esce dalla funzione, la variabile pObject viene distrutta, ma l'oggetto rimane nella memoria dinamica.

Per poterlo cancellare, il suo indirizzo deve essere memorizzato da qualche parte.

Quando vengono creati e distrutti, vengono chiamati anche il costruttore e il distruttore.

Le variabili dinamiche richiedono tipicamente più tempo per accedere rispetto alle variabili locali.


Dovreste tenere conto di tutto questo quando create un oggetto.


 
Koldun Zloy:

1. Se un oggetto è nello scope globale, è un oggetto statico. È messo in memoria statica ed esiste finché esiste il programma.

...

E nessuno dirà nulla, nemmeno ZyXpert.
 
Koldun Zloy:

È corretto supporre che con questa opzione

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

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

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

senza considerare l'avvertimento del compilatore, la posizione può aprirsi con un numero magico non uguale a 123 ?

Cioè, un nuovo oggetto sarà creato nella funzione OnTick e il mago non sarà uguale a 123 in esso.

 
Alexey Viktorov:

È corretto supporre che con questa opzione

senza considerare l'avvertimento del compilatore, la posizione può aprirsi con un numero magico diverso da 123 ?

Cioè, un nuovo oggetto sarà creato nella funzione OnTick e il mago non sarà uguale a 123 in esso.

SetExpertMagicNumber

 
Alexey Viktorov:

È corretto supporre che con questa opzione

senza considerare l'avvertimento del compilatore, la posizione può aprirsi con una magia non 123 ?

Cioè, un nuovo oggetto sarà creato nella funzione OnTick e non avrà un MagicNumber di 123.

Sì, è corretto. Sono due oggetti diversi. Poiché l'oggetto locale in OnTick ha lo stesso nome dell'oggetto globale, solo esso può essere accessibile nella funzione OnTick. L'oggetto globale è fuori portata. Pertanto, per l'oggetto commerciale locale, il MagicNumber non è ancora stato impostato.

 
Alexey Viktorov:

È corretto supporre che con questa opzione

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

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

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

senza considerare l'avvertimento del compilatore, la posizione può aprirsi con una magia non 123 ?

Cioè, un nuovo oggetto sarà creato nella funzione OnTick e il mago non sarà 123 in esso.

È esattamente lo stesso che con le variabili.

E concentrarsi:

#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);
}
 
Perché questoSetExpertMagicNumber è necessario in primo luogo?
 
Сергей Таболин:
Perché questoSetExpertMagicNumber è necessario in primo luogo?

Imposta un numero magico all'oggetto della classe commerciale. Ci può essere più di un oggetto di classe CTrade per l'intero programma come si fa ora in kodobase. Questo è un oggetto. Questo oggetto viene utilizzato per eseguireoperazioni di trading. Non c'è bisogno di creare un oggetto per tutto il programma e resettarlo ogni volta che un nuovo mago, lo slittamento e altri parametri che sono impostati durante l'inizializzazione devono essere cambiati. È possibile creare un oggetto di trading separato per ogni simbolo scambiato, impostare i parametri necessari per esso secondo le proprietà del simbolo, a cui appartiene questo specifico oggetto della classe CTrade, e scambiare facilmente ottenendo un puntatore all'oggetto necessario della classe di trading necessaria dal simbolo necessario, senza sovrascrivere i parametri impostati in quello.
Per lavorare con un altro mago, si può definire un oggetto commerciale separato con impostazioni appropriate. Ci possono essere diversi maghi in un EA.

Tutto dipende dalla comprensione di cosa e come lo usiamo.

 
Artyom Trishkin:

Imposta una magia per un oggetto della classe commerciale. Non ci può essere un solo oggetto della classe CTrade per tutto il programma come si fa di solito in kodobase. Questo è un oggetto. Questo oggetto viene utilizzato per eseguire operazioni di trading. Non c'è bisogno di creare un oggetto per tutto il programma e resettarlo ogni volta che un nuovo mago, lo slittamento e altri parametri che sono impostati durante l'inizializzazione devono essere cambiati. È possibile creare un oggetto di trading separato per ogni simbolo negoziato, impostare i parametri necessari per esso secondo le proprietà del simbolo, a cui appartiene questo specifico oggetto della classe CTrade, e negoziare facilmente ottenendo un puntatore all'oggetto necessario della classe di trading necessaria dal simbolo necessario, senza sovrascrivere i parametri impostati in quello.
Per lavorare con un altro mago, si può definire un oggetto commerciale separato con impostazioni appropriate. Ci possono essere diversi maghi in un EA.

Tutto dipende dalla comprensione di cosa e come lo usiamo.

In questo caso, è

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

descrizione errata?

La mia comprensione era che se impostato per EA, allora qualsiasi ordine/posizione dovrebbe avere questa magia. ((

Motivazione: