Errori, bug, domande - pagina 2297

 
Nikolai Semko:

Grazie, ma non ho visto nessuna risposta alle mie domande.
Non capisco perché il distruttore non viene chiamato quandoA *a= new A;

https://www.mql5.com/ru/docs/basis/variables/object_live

Tutti gli oggetti creati dall'espressione pointer_object=newClass_name devono essere distrutti successivamente dall'operatore delete(pointer_object). Se, per qualche motivo, questa variabile non è stata distruttadall'operatore di cancellazione, il messaggio relativo apparirà nel giornale "Experts". È possibile dichiarare diverse variabili e assegnarle tutte allo stesso puntatore all'oggetto.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
После загрузки на исполнение mql5-программы каждой переменной выделяется память в соответствие с типом переменной. Переменные делятся на два типа по уровню доступа - глобальные переменные и локальные переменные, и по классам памяти: входные параметры mql5-программы, статические и автоматические. Каждая переменная при необходимости...
 

Chiedo a MQL di controllare la funzione OnTimer().

Per qualche motivo non funziona in strategy tester per MT4 (nessun errore, solo niente all'interno di questa funzione viene eseguito), mentre online è OK.

Per MT5 la funzione funziona sia nel tester che online.

Grazie!

 
Si passa molto tempo su Incorrect-Init
Core 1  pass 114 tested with error "incorrect input parameters" in 0:00:00.218

In OnInit vengono confrontati solo due numeri, e ci vuole più tempo per un passaggio errato che per un passaggio completo! Come mai?


Eseguiamo questo Expert Advisor in piena ottimizzazione

input int Range = 0; // задать Оптимизацию 1 .. 10000

int OnInit() { return(INIT_PARAMETERS_INCORRECT); }


Otteniamo il risultato del lavoro di 8 agenti

Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 24 seconds


Ecco il nostro Expert Advisor ora

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() {}
Tester  optimization finished, total passes 10000
Statistics      optimization done in 0 minutes 31 seconds


Finalmente, come questo

input int Range = 0; // задать Оптимизацию 1 .. 10000

void OnInit() { ExpertRemove(); }
Tester  optimization finished, total passes 10000
Statistics      optimization done in 2 minutes 19 seconds


Due uscite

  1. Incorrect-Init e ExpertRemove sono uguali in termini di velocità.
  2. Una corsa a vuoto è ~5 volte più veloce di un'uscita da OnInit.


Sul secondo punto, c'è chiaramente una sorta di errore. È più vantaggioso in termini di tempo eseguire una corsa a vuoto, piuttosto che uscire da OnInit. Per favore correggetelo, perché i vantaggi di Incorrect-Init e ExpertRemove saranno quasi completamente persi.

 

Lascheda dei preferiti con EAs/indicatori/scripts e conti viene ricordata solo dopo l'uscita dal terminale. Per questo motivo, un'uscita anomala (spegnimento) resetta questa scheda. È possibile salvarlo quando lo si cambia?

A volte si capisce che sarebbe molto utile se le cartelle potessero essere aggiunte ai preferiti.

 
A100:
Allora provate così:

Risultato:

1:PUNTATORE_AUTOMATICO
1:PUNTATORE_DINAMICO
2:PUNTATORE_DINAMICO
2:PUNTATORE_AUTOMATICO

Grazie! Una bella soluzione.

Ma probabilmente è meglio che il compilatore non giuri:

class B  { public:
                     B(void *b) {d=b;}
                    ~B() { delete d; }
   void             *d; };

È un bug o cosa?
Quando si crea un'istanza di una classe tramite new , non si chiama il distruttore.

È l'unica soluzione per creare una classe speciale per chiamare il distruttore? O possiamo farne a meno?

 
Andrey Barinov:

Creare con new e cancellare con delete

La questione è mettere la cancellazione in un distruttore, ma quando si crea un'istanza di una classe tramite new (A *a=newA ;) il distruttore non viene chiamato.

 
aleger:

È possibile, e se sì, come, ricavare in qualsiasi indicatore ZigZag i valori corrispondenti degli estremi di prezzo High e Low,

assicurando il loro legame stabile e la loro vicinanza alle cime e ai fondi formati?

Vedi esempio daOBJ_TEXT

 

Grazie.
È esattamente quello che c'è scritto qui.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). 
Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". 
Можно объявить несколько переменных и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, 
то деструктор будет вызван в момент выполнения оператора delete.

Quindi non è un bug, è una caratteristica che si traduce in un circolo vizioso.
Se voglio automatizzare il processo di cancellazione di un oggetto dinamico, il distruttore viene chiamato solo alla cancellazione, quindi è inutile mettere la cancellazione nel distruttore stesso.
Ma l'automazione può essere implementata attraverso un'altra istanza di un'altra classe, come @A100 ha suggeritoqui.

 
aleger:

Grazie per il suggerimento. Sono già esausto di leggere e provare e provare e leggere. Mi piacerebbe vedere un esempio funzionante dello ZigZag...

Come nel mio avatar con uno zigzag, ma con una legatura GIUSTA degli estremi superiori, perché la legatura degli estremi inferiori è OK!

Il modo di legare con k=(WindowPriceMax()-WindowPriceMin())/30 non funziona quando la dimensione della finestra cambia molto, vorrei qualcos'altro...


Nell'esempioOBJ_TEXT si legano sia in alto che in basso. Seguire il link, eseguire l'esempio ...

 
Nikolai Semko:

Quindi non è un bug, ma una caratteristica, con il risultato di un circolo vizioso.

Vi è già stato detto in precedenza che il modo per risolvere il controllo delle risorse allocate non gestibili è quello di utilizzare puntatori intelligenti. L'analogia completa con C++.
Forse il problema è che la soluzione non è stata presentata su un piatto d'argento, scusate.


Tutti possono digitare "shared_ptr" nella ricerca del sito e seguire il primo risultato, non è difficile, consiglio vivamente di provare.