Erreurs, bugs, questions - page 2296

 

J'ai mesuré les performances du Testeur. Pour ce faire, j'ai ouvert et fermé une position sur chaque tick. J'ai mesuré le temps d'exécution de 100 ticks. Je l'ai testé sur 100 000 ticks. J'ai mesuré un total de 1000 tics. J'ai obtenu ce tableau

Il y a des pics de ralentissement à des distances presque égales entre eux. Je l'ai mesuré en mode Optimisation. Si j'ignore ces pics, les performances du testeur varient de 25 % au lieu de la valeur constante. C'est peut-être encore un truc de mesure de la vitesse de Windows.


ZZZ Le même code est exécuté sur MT4.

En moyenne, il faut au testeur MT4 1,5 à 2 fois moins de temps pour traiter un tick que le testeur MT5.

Dossiers :
Tester.mq5  2 kb
 

Éventuellement des surcharges par l'utilisation d'un algorithme d' optimisation génétique.


... A chaque tick, on ouvre et ferme une position. <br / translate="no">
En moyenne, le MT4-Tester prend 1,5 à 2 fois moins de temps pour traiter un tick que le MT5.
Et c'est de la pure manipulation et de la tromperie.
 
Sergey Dzyublik:

Éventuellement des surcharges par l'utilisation d'un algorithme d' optimisation génétique.

Pas d'AG. Optimisation à partir de deux passages sur un agent.

Et c'est déjà de la pure manipulation et de la tromperie.

Le code source est en place.

 

Dans un cas un avertissement, dans l'autre une erreur

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 );
    }

Quelle est la différence fondamentale ? En C++, par exemple, il y a une erreur dans les deux cas

 

Je demande l'aide de personnes compétentes pour comprendre le problème des pointeurs vers les instances de classe. Je ne le comprends pas.

Voici un exemple de 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()
  {
  }

En l'exécutant, nous avons, comme prévu :

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


si une instance d'une classe est déclarée comme :

A *a= new A;

puis sur l'exécution, nous avons :

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

c'est-à-dire que le destructeur n'est même pas lancé et que la mémoire n'est donc pas libérée.


Mais si une instance d'une classe est déclarée comme :

A a= new A;

le constructeur est lancé deux fois, le destructeur - une fois, mais la mémoire n'est pas libérée et nous avons le type de pointeur d'objetPOINTER_AUTOMATIC, alors qu'il devait êtrePOINTER_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


Comment toujours exécuter le destructeur et exécuter correctement le delete ?

 

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


Voir en C++ le sujet des pointeurs intelligents et adapter pour MQL(https://habr.com/post/140222/).
Peut-être qu'il y a quelque chose dans kodobase...

 
Sergey Dzyublik:


Voir en C++ le sujet des pointeurs intelligents et adapter pour MQL(https://habr.com/post/140222/).
Peut-être qu'il y a quelque chose dans kodobase...

Merci, mais je n'y ai pas trouvé de réponses à mes questions.
Je ne comprends pas pourquoi le destructeur n'est pas appelé lorsqueA *a= new A ;

 
Nikolai Semko:

Merci, mais je n'y ai vu aucune réponse à mes questions.
Je ne comprends pas pourquoi le destructeur n'est pas appelé lorsqueA *a= new A ;

Alors essayez comme ceci :
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() {}

Résultat :

1:POINTEUR_AUTOMATIQUE
1:POINTEUR_DYNAMIQUE
2:POINTEUR_DYNAMIQUE
2:POINTEUR_AUTOMATIQUE

 
Nikolai Semko:

Merci, mais je n'y ai vu aucune réponse à mes questions.
Je ne comprends pas pourquoi le destructeur n'est pas appelé lorsqueA *a= new A ;

Créer avec nouveau et supprimer avec supprimer

 
Nikolai Semko:

Merci, mais je n'y ai vu aucune réponse à mes questions.
Je ne comprends pas pourquoi le destructeur n'est pas appelé lorsqueA *a= new A ;

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

Tous les objets créés par l'expression pointer_objet=nouvelleClasse_nom doivent être détruits par l'opérateur delete(pointer_objet) par la suite. Si, pour une raison quelconque, cette variable n'a pas été détruitepar l'opérateur de suppression, un message à ce sujet apparaîtra dans le journal "Experts". Il est possible de déclarer plusieurs variables et de les affecter toutes au même pointeur d'objet.

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