Fehler, Irrtümer, Fragen - Seite 1781
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Instabile Leistung
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
void OnInit() { Print( __FUNCTION__ ); }
void OnDeinit( const int reason ) { Print( __FUNCTION__, ":", reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }
#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
Ich weiß nicht, ob der Fehler bei mir oder beim Terminal liegt.
An der 5. Stelle{
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
Falsche Reihenfolge der Funktionsaufrufe beim Wechsel der Diagrammperiode
Abfolge der Aktionen:
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
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?
Ich weiß nicht, ob der Fehler bei mir oder beim Terminal liegt.
Druckt CalcX=111111111111111111111104 erwarteter Wert CalcX=1111111111111111111111
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?
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
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
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
Probleme bei der Installation von Bill-Williams-Blinkern
Ich setze Fraktale ein - das tut es
AO einstellen - ADX ist eingestellt
1031 bauen
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.