Fehler, Irrtümer, Fragen - Seite 1781

 

Instabile Leistung

  • Pfad der Indikatorposition: \Indikatoren\Test_i.ex5
  • Zielpfad des Expert Advisors: \Experts\Test.ex5
  • Pfad zum Skript: \Scripts\Test_s.ex5

Abfolge der Schritte: Verbinden Sie das Skript "Test_s.ex5" mehrmals mit dem M15-Chart (Symbol EURUSD)

Ergebnis:

2017.02.05 15:17:59.076 OnStart 1. Mal angehängt
2017.02.05 15:18:03.293 OnStart 2. Mal angehängt
2017.02.05 15:18:07.760 OnStart 3. Mal beigetreten
2017.02.05 15:18:07.778 OnInit
2017.02.05 15:18:07.781 OnDeinit:1
2017.02.05 15:18:16.891 OnStart 4. Mal beigetreten

Die Ergebnisse der Verknüpfungen sind unterschiedlich. Es wird nicht erwartet, dass sie sich unterscheiden, aber das Ergebnis ist zufällig: die Zeile mit OnInit\OnDeinit kann beim 1. oder beim 10. Mal erscheinen

//Test_i.mq5 //Индикатор
void OnInit()                    { Print( __FUNCTION__ ); }
void OnDeinit( const int reason ) { Print( __FUNCTION__, ":", reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }
//Test_s.mq5 //Скрипт
#import "..\\Experts\\Test.ex5"
        void OnInit();
#import
void OnStart()
{
        Print( __FUNCTION__ );
        OnInit();
}

Expertendatei im Anhang (eigentlich als Bibliothek verwendet), Code hier https://www.mql5.com/ru/forum/1111/page1801#comment_4059227

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
Dateien:
Test.mq5  1 kb
 

Ich weiß nicht, ob der Fehler bei mir oder beim Terminal liegt.

An der 5. Stelle
void OnStart()
  {

double A=1.11111;
double B=1.11111;
double C=1.11111;

long CalcX=
NormalizeDouble(A,Digits)*MathPow(10,(Digits+1)*3-1)+
NormalizeDouble(B,Digits)*MathPow(10,(Digits+1)*2-1)+
NormalizeDouble(C,Digits)*MathPow(10,(Digits+1)*1-1);

Print ("CalcX=",CalcX);  
  }

Druckt CalcX=111111111111111111111104 erwarteter Wert CalcX=1111111111111111111111

 
A100:

Falsche Reihenfolge der Funktionsaufrufe beim Wechsel der Diagrammperiode

  • Pfad zum Indikator: \Indikatoren\Test_i.ex5
  • Pfad der Expertenposition: {Experts\Test.ex5

Abfolge der Aktionen:

  1. Hängen Sie den Expert Advisor 'Test.ex5' an den M5-Chart an (Symbol GBPUSD)
  2. Ändern Sie den Kartenzeitraum auf M15
  3. Ändern Sie den Kartenzeitraum auf M30
  4. Entfernen Sie den Expert Advisor aus dem Diagramm

Protokolle anzeigen. Damit Sie den Zeitrahmen sehen können.

Es bleibt noch hinzuzufügen, dass das Hinzufügen eines Indikators zum Diagramm und das Entfernen eines Indikators aus dem Diagramm nicht-synchrone Operationen sind.

Darüber hinaus wird der Indikator bei einem Wechsel des Zeitrahmens nicht sofort aus diesem Zeitrahmen entladen. Und es wird eine neue Kopie des Indikators für den neuen Zeitrahmen erstellt. Ich sehe Ihre Drucke im Konstruktor-Destruktor, denken Sie, dass der Destruktor sofort aufgerufen wird? Nein, da irren Sie sich. Der Destruktor wird aufgerufen, wenn der Indikator entladen wird, und der Indikator wird erst einige Sekunden nach dem Löschen des Indikators entladen
 
Slawa:
Zeigen Sie die Protokolle an. Sie sehen also, dass das Timing stimmt.
Es bleibt noch hinzuzufügen, dass das Hinzufügen eines Indikators zu einem Diagramm und das Entfernen eines Indikators aus einem Diagramm nicht-synchrone Operationen sind.
Außerdem wird der Indikator beim Wechsel des Zeitrahmens nicht sofort von diesem Zeitrahmen entladen. Und es wird eine neue Kopie des Indikators für den neuen Zeitrahmen erstellt. Ich sehe Ihre Drucke im Konstruktor-Destruktor, denken Sie, dass der Destruktor sofort aufgerufen wird? Nein, da irren Sie sich. Der Destruktor wird aufgerufen, wenn der Indikator entladen wird, und der Indikator wird erst einige Sekunden nach dem Entfernen des Indikators entladen

Es wird davon ausgegangen, dass zwischen den Schritten genügend Zeit verstreicht (Wechsel der Diagrammperiode)

2017.02.05 19:49:49.984 I::I->M5 #Schritt 1: join
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #Schritt 2: Periodenwechsel M5 ->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #Schritt 3: Periodenwechsel M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #Schritt 4: Periodenwechsel M30->H1
2017.02.05 19:54:03.245 I::~I->M30
2017.02.05 19:54:03.286 I::I->H1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #Schritt 5: H1 ->H4 Periodenwechsel
2017.02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1

2017.02.05 19:55:50.697 I::I->D1 #Schritt 6: Periodenwechsel H4 ->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 I::~I->H4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #Schritt 7: löschen
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

Die Ungleichzeitigkeit wirkt sich nur auf die unterschiedliche Reihenfolge der Funktionsaufrufe innerhalb eines Schritts aus (wie in den Schritten #3 und #5)

Wie Sie sehen, werden alle nachfolgenden Periodenwechsel, mit Ausnahme des ersten (Schritt#2:zwei Ausgabezeilen), erwartet (ähnlich wie Schritt#3:vier Ausgabezeilen). Und warum sollte sich die erste Änderung der Diagrammperiode von allen anderen unterscheiden? Wie ist es besser/schlechter? Warum wurden die beiden fehlenden Ausgabezeilen aus Schritt Nr. 2 (und nur diese eine) nach Schritt Nr. 7 (rot hervorgehoben) verschoben?

 
-Aleks-:

Ich weiß nicht, ob der Fehler bei mir oder beim Terminal liegt.

Druckt CalcX=111111111111111111111104 erwarteter Wert CalcX=1111111111111111111111

Wenn die Anzahl der signifikanten Dezimalstellen in double > DBL_DIG=15 ist, funktionieren die normalen Regeln nicht
 
A100:

Es wird davon ausgegangen, dass zwischen den Schritten genügend Zeit verstreicht (Wechsel der Diagrammperiode)

2017.02.05 19:49:49.984 I::I->M5 #step1: join
2017.02.05 19:49:49.984 OnInit->M5

2017.02.05 19:51:39.853 I::I->M15 #Schritt 2: Periodenwechsel M5 ->M15
2017.02.05 19:51:39.853 OnInit->M15
2017.02.05 19:53:29.813 OnDeinit->M15:3 #Schritt 3: Periodenwechsel M15->M30
2017.02.05 19:53:29.813 I::~I->M15
2017.02.05 19:53:29.864 I::I->M30
2017.02.05 19:53:29.864 OnInit->M30

2017.02.05 19:54:03.245 OnDeinit->M30:3 #Schritt 4: Periodenwechsel M30->H1
2017.02.05 19:54:03.245 I::~I->M30
2017.02.05 19:54:03.286 I::I->H1
2017.02.05 19:54:03.286 OnInit->H1
2017.02.05 19:55:02.984 I::I->H4 #Schritt 5: H1 ->H4 Periodenwechsel
2017.02.02.05 19:55:02.984 OnInit->H4
2017.02.05 19:55:02.984 OnDeinit->H1:3
2017.02.05 19:55:02.984 I::~I->H1

2017.02.05 19:55:50.697 I::I->D1 #Schritt 6: Periodenwechsel H4 ->D1
2017.02.05 19:55:50.697 OnInit->D1
2017.02.05 19:55:50.697 OnDeinit->H4:3
2017.02.05 19:55:50.697 I::~I->H4
2017.02.05 19:56:11.122 OnDeinit->M5:1 #Schritt 7: löschen
2017.02.05 19:56:11.122 I::~I->M5

2017.02.05 19:56:11.122 OnDeinit->D1:1
2017.02.05 19:56:11.123 I::~I->D1

Die Ungleichzeitigkeit wirkt sich nur auf die unterschiedliche Reihenfolge der Funktionsaufrufe innerhalb eines Schritts aus (wie bei den Schritten 3 und 5).

Wie wir sehen können, erfolgen alle nachfolgenden Periodenwechsel des Diagramms, mit Ausnahme des ersten (Schritt 2), wie erwartet (ähnlich wie Schritt 3). Warum sollte die erste Periodenänderung anders sein als alle anderen? Wie ist es besser/schlechter?

Lassen Sie mich versuchen, es noch einmal zu erklären

Auf der M5-Karte gibt es eine Art Indikator. Wenn Sie den Zeitrahmen von M5 auf M15 ändern, wird eine zweite Kopie desselben Indikators erstellt. Ein Befehl wird an beide Indikatoren gesendet - der erste an M5 Deinit, der zweite an M15 Init. Gleichzeitig wissen wir nicht, welcher dieser Befehle vor dem anderen ausgeführt wird - es gibt einen klassischen Wettlauf zwischen den verschiedenen Threads.

Danach wird der Nutzungszähler des ersten Indikators verringert. Einige Sekunden nachdem der Nutzungszähler auf Null geht, wird der Indikator aus dem Diagramm entfernt. Dabei werden die Destruktoren der globalen Objekte dieses Indikators aufgerufen
 
Slawa:
Lassen Sie mich versuchen, es noch einmal zu erklären

Es gibt einen bestimmten Indikator auf der M5-Karte. Wenn Sie den Zeitrahmen von M5 auf M15 ändern, wird eine zweite Kopie desselben Indikators erstellt. Ein Befehl wird an beide Indikatoren gesendet - der erste an M5 Deinit, der zweite an M15 Init. Gleichzeitig wissen wir nicht, welcher dieser Befehle vor dem anderen ausgeführt wird - es gibt einen klassischen Wettlauf zwischen den verschiedenen Threads.

Danach wird der Nutzungszähler des ersten Indikators verringert. Einige Sekunden nachdem der Nutzungszähler auf Null geht, wird der Indikator aus dem Diagramm entfernt. Die Destruktoren der globalen Objekte dieses Indikators werden aufgerufen

Ich behaupte (und schlage vor, es zu überprüfen), dass beim Wechsel des Zeitrahmens von M5 zu M15 kein M5-Deinit-Befehl an den ersten Indikator (und nur an diesen - in diesem Fall M5) gesendet wird und er nicht aus dem Diagramm entladen wird, bis der Benutzer den EA entfernt

Wenn die Struktur I in "Test_i.ex5" ausgeschlossen wird (keine Wirkung), wird die Ausgabe vereinfacht:


2017.02.05 20:49:06.842 OnInit->M5

2017.02.05 20:49:21.253 OnInit->M15(*) Periodenwechsel M5 -> M15: M5 Indikator ist nicht entladen
2017.02.05 20:56:40.001 OnDeinit->M15:3 Periodenwechsel M15 -> M30:M15 Indikator wird sofort entladen
2017.02.05 20:56:40.132 OnInit->M30

Seit (*) sind mehr als 5 Minuten vergangen, aber der M5-Indikator ist nicht entladen

Entfernen des Expert Advisors aus dem Diagramm

2017.02.05 20:57:35.176 OnDeinit->M5:1 der M5 Indikator wird erst nach dem Entfernen des Expert Advisors entladen
2017.02.05 20:57:35.177 OnDeinit->M30:1

 
Slawa:
Lassen Sie mich versuchen, es noch einmal zu erklären

Es gibt einen bestimmten Indikator auf der M5-Karte. Wenn Sie den Zeitrahmen von M5 auf M15 ändern, wird eine zweite Kopie desselben Indikators erstellt. Ein Befehl wird an beide Indikatoren gesendet - der erste an M5 Deinit, der zweite an M15 Init. Gleichzeitig wissen wir nicht, welcher dieser Befehle vor dem anderen ausgeführt wird - es gibt einen klassischen Wettlauf zwischen den verschiedenen Threads.

Danach wird der Nutzungszähler des ersten Indikators verringert. Einige Sekunden nachdem der Nutzungszähler auf Null geht, wird der Indikator aus dem Diagramm entfernt. Dabei werden die Destruktoren der globalen Objekte dieses Indikators aufgerufen
Können Sie erklären, über welche Themen wir sprechen? Funktionieren nicht alle Indikatoren eines Symbols in einem Thread?
 
Vladimir Gribachev:

Probleme bei der Installation von Bill-Williams-Blinkern

Ich setze Fraktale ein - das tut es

AO einstellen - ADX ist eingestellt

1031 bauen

Hunderte von Jahren alter Fehler mit nicht aktualisiertem Menü bei Änderung der /MQx/Indicators-Verzeichnisstruktur :-) Der Bug ist so alt, dass er schon als Feature wahrgenommen wird, gewöhnt euch dran... die Usability wird mit einem Vierkantbolzen gehämmert, aber die Zahl Pi zählt am schnellsten :-)
 
A100:
Wenn die Anzahl der signifikanten Dezimalstellen in double > DBL_DIG=15 ist, funktionieren die normalen Regeln nicht

Welche davon funktionieren?

In der Hilfedatei steht, dass der Höchstwert für long9223372036854775807 beträgt- ich erreiche ihn offensichtlich nicht.