Fehler, Irrtümer, Fragen - Seite 2296

 
A100:

Es gibt kein Problem... Es liegt ein Fehler vor. Ich verstehe auch nicht, warum Sie versuchen, sich die Erklärung aus dem Kopf zu schlagen. Der Standarddruck hat die folgende Signatur:

Und sie kann auch mit anderen Funktionen kollidieren (falls erforderlich)

Die Drucksignatur liegt außerhalb des Bereichs der MQL5-Sprache. Wenn MQL5 das Überladen von Print überhaupt verbietet, ist das kein Fehler.

Ich hoffe, dass dieser "Fehler" Sie nicht daran hindert, TS zu erstellen, und dass Sie keine Schreibkrücken benötigen.

 

Ich habe die Leistung des Testers gemessen. Zu diesem Zweck habe ich bei jedem Tick eine Position eröffnet und geschlossen. Ich habe die Ausführungszeit von 100 Ticks gemessen. Ich habe 100 000 Ticks durchlaufen lassen. Ich habe insgesamt 1000 Ticks gemessen. Ich habe diese Tabelle

Es gibt Spitzen der Verlangsamung in fast gleichen Abständen zwischen ihnen. Ich habe sie im Optimierungsmodus gemessen. Wenn ich diese Spitzen ignoriere, schwankt die Leistung des Testers um 25 % anstelle des konstanten Wertes. Vielleicht liegt es wieder an den Tricks der Windows-Geschwindigkeitsmessung.


ZZZ Derselbe Code läuft auch auf MT4

Im Durchschnitt benötigt der MT4 Tester 1,5-2 mal weniger Zeit für die Verarbeitung eines Ticks als der MT5.

Dateien:
Tester.mq5  2 kb
 

Möglicherweise durch den Einsatz eines genetischen Optimierungsalgorithmus.


... Bei jedem Tick wird eine Position geöffnet und geschlossen. <br / translate="no">
Im Durchschnitt benötigt MT4-Tester 1,5-2 mal weniger Zeit für die Verarbeitung eines Ticks als MT5.
Und das ist reine Manipulation und Irreführung.
 
Sergey Dzyublik:

Möglicherweise durch den Einsatz eines genetischen Optimierungsalgorithmus.

Keine GA. Optimierung von zwei Durchgängen an einem Agenten.

Und dies ist bereits reine Manipulation und Irreführung.

Der Quellcode ist vorhanden.

 

Im einen Fall eine Warnung, im anderen ein Fehler

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

Was ist der grundlegende Unterschied? In C++, zum Beispiel, gibt es in beiden Fällen einen Fehler

 

Ich bitte um Hilfe von sachkundigen Personen, um das Problem von Zeigern auf Klasseninstanzen zu verstehen. Ich kann das nicht verstehen.

Hier ist ein Beispiel für das Skript:

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()
  {
  }

Bei der Ausführung haben wir, wie erwartet:

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


wenn eine Instanz einer Klasse als deklariert ist:

A *a= new A;

dann haben wir bei der Ausführung:

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

d.h. der Destruktor wird nicht einmal gestartet und daher wird der Speicher nicht freigegeben.


Aber wenn eine Instanz einer Klasse deklariert ist als:

A a= new A;

der Konstruktor wird zweimal gestartet, der Destruktor einmal, aber der Speicher wird nicht freigegeben und wir haben den ObjektzeigertypPOINTER_AUTOMATIC, obwohl er eigentlichPOINTER_DYNAMIC sein sollte

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


Wie man den Destruktor immer ausführt und das Löschen korrekt ausführt

 

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


Sehen Sie sich in C++ das Thema Smart Pointer an und passen Sie es für MQL an(https://habr.com/post/140222/).
Vielleicht gibt es etwas in kodobase...

 
Sergey Dzyublik:


Sehen Sie sich in C++ das Thema Smart Pointer an und passen Sie es für MQL an(https://habr.com/post/140222/).
Vielleicht gibt es etwas in kodobase...

danke, aber ich habe dort keine Antworten auf meine Fragen gefunden.
Ich verstehe nicht, warum der Destruktor nicht aufgerufen wird, wennA *a= new A;

 
Nikolai Semko:

Danke, aber ich habe dort keine Antworten auf meine Fragen gefunden.
Ich verstehe nicht, warum der Destruktor nicht aufgerufen wird, wennA *a= new A;

Dann versuchen Sie es so:
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() {}

Ergebnis:

1:ZEIGER_AUTOMATISCH
1:ZEIGER_DYNAMISCH
2:ZEIGER_DYNAMISCH
2:ZEIGER_AUTOMATISCH

 
Nikolai Semko:

Danke, aber ich habe dort keine Antworten auf meine Fragen gefunden.
Ich verstehe nicht, warum der Destruktor nicht aufgerufen wird, wennA *a= new A;

Anlegen mit Neu und Löschen mit Löschen