Errori, bug, domande - pagina 2296

 
A100:

Non c'è nessun problema... c'è un errore. Inoltre non capisco perché cerchi di tirare fuori la spiegazione dalla tua testa. La stampa di default ha la seguente firma:

E può anche scontrarsi con altre funzioni (se necessario)

La firma di stampa è fuori dalla portata del linguaggio MQL5. Se MQL5 proibisce del tutto il sovraccarico di stampa, non sarà un bug.

Spero che questo "bug" non vi impedisca di creare TS e non richieda stampelle di scrittura.

 

Ho misurato le prestazioni del Tester. Per fare questo, ho aperto e chiuso una posizione su ogni tick. Ho misurato il tempo di esecuzione di 100 tick. L'ho fatto passare attraverso 100.000 ticks. Ho misurato un totale di 1000 zecche. Ho questo grafico

Ci sono picchi di rallentamento a distanze quasi uguali tra loro. L'ho misurato in modalità Ottimizzazione. Se ignoro questi picchi, la prestazione del tester varia del 25% invece del valore costante. Forse sono di nuovo i trucchi di misurazione della velocità di Windows.


ZZZ Lo stesso codice è in esecuzione su MT4

In media, MT4 Tester impiega 1,5-2 volte meno tempo per elaborare un tick rispetto a MT5.

File:
Tester.mq5  2 kb
 

Possibilmente le impennate attraverso l'uso di un algoritmo di ottimizzazione genetica.


... Su ogni tick aperto e chiuso una posizione. <br / translate="no">
In media, MT4-Tester impiega 1,5-2 volte meno tempo per elaborare un tick rispetto a MT5.
E questa è pura manipolazione e inganno.
 
Sergey Dzyublik:

Possibilmente le impennate attraverso l'uso di un algoritmo di ottimizzazione genetica.

Nessun GA. Ottimizzazione da due passaggi su un agente.

E questa è già pura manipolazione e inganno.

Il codice sorgente è a posto.

 

In un caso un avvertimento, nell'altro un errore

void f()
{
    for ( int i = 0;; )
    {
        Print( i );
        int    i = 5; //Warning: declaration of 'i' hides local declaration
        Print( i );
        break;
    }
}
void For( int i = 0 )
    {
        Print( i );
        int    i = 5; //Error: redefinition of formal parameter 'i'
        Print( i );
    }

Qual è la differenza fondamentale? In C++, per esempio, c'è un errore in entrambi i casi

 

Sto chiedendo aiuto a persone competenti per capire il problema dei puntatori alle istanze di classe. Non lo capisco.

Ecco un esempio di script:

class A
  {
public :
                     A() { Print("Start"); };
                    ~A() { 
                     Print("End"); 
                     Print(EnumToString(CheckPointer(GetPointer(this)))); 
                     if (CheckPointer(GetPointer(this))!=POINTER_DYNAMIC) 
                     delete GetPointer(this);};
  };
  
A a;

void OnStart()
  {
  }

Quando lo si esegue abbiamo, come previsto:

2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:56:20.574 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC


se un'istanza di una classe è dichiarata come:

A *a= new A;

poi all'esecuzione abbiamo:

2018.09.23 21:46:42.960 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:46:42.961 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory

cioè il distruttore non viene nemmeno avviato e quindi la memoria non viene liberata.


Ma se un'istanza di una classe è dichiarata come:

A a= new A;

il costruttore viene lanciato due volte, il distruttore - una volta, ma la memoria non viene liberata e abbiamo il tipo di puntatore dell'oggettoPOINTER_AUTOMATIC, anche se doveva esserePOINTER_DYNAMIC

2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   Start
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   End
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   POINTER_AUTOMATIC
2018.09.23 21:54:24.844 Test_CheckPointer (EURUSD,M1)   1 undeleted objects left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   1 object of type A left
2018.09.23 21:54:24.845 Test_CheckPointer (EURUSD,M1)   32 bytes of leaked memory


Come eseguire sempre il distruttore ed eseguire correttamente la cancellazione

 

Как добиться всегда выполнения деструктора и правильного выполнения delete.


Vedi da C++ l'argomento dei puntatori intelligenti e adattati per MQL(https://habr.com/post/140222/).
Forse c'è qualcosa in kodobase...

 
Sergey Dzyublik:


Vedi da C++ l'argomento dei puntatori intelligenti e adattati per MQL(https://habr.com/post/140222/).
Forse c'è qualcosa in kodobase...

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

 
Nikolai Semko:

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

Allora provate così:
class A { public:
         A() { Print( 1, ":", EnumToString(CheckPointer(GetPointer(this)))); }
        ~A() { Print( 2, ":", EnumToString(CheckPointer(GetPointer(this)))); }
};
class B { public:
         B( void *b ) : b( b ) {}
        ~B() { delete b; }
        void *b;
};
A a1;
A *a2 = new A;
B b( a2 );
void OnStart() {}

Risultato:

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

 
Nikolai Semko:

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

Creare con new e cancellare con delete

Motivazione: