ChartNavigate während der Initialisierung - Seite 6

 
Alexey Viktorov:

Ich habe in diesem Beitrag:https://www.mql5.com/ru/forum/260815/page4#comment_7890492 detailliert die Bedingungen, unter denen das Problem reproduziert werden kann. Dies konnte auf der Grundlage Ihrer Behauptungen reproduziert werden. Worüber ich hier geschrieben habe

D.h. eine geringfügige Änderung der Bedingungen führte zu einer stetigen Reproduktion des Problems.

Das haben Sie irgendwie übersehen

 
Alexey Viktorov:

P./S.: Drucken statt Kommentieren in Ihrem Code wäre nicht nur ein sanfteres Verfahren. Druckergebnisse in OnInit() sind leichter zu vergleichen, kopieren und hier anhängen

 
Alexey Viktorov:

Ich schlug eine Aktualisierung vor, nicht in der Hoffnung, dass sich alles einrenken würde, sondern damit die Builds gleich bleiben.

Igor, machst du die Experimente mit der Vollversion des Indikators oder mit der experimentellen Version?

Sowohl dort als auch dort. Aber ich kann immer noch nicht mit Sicherheit sagen, was das Problem ist: ob es ein Fehler ist oder nicht. Ich muss ausreichend reproduzierbare Bedingungen finden.

 
Alexey Viktorov:

Wie kann man das tun?

Laut der Beschreibung im ersten Beitrag des Threads handelt es sich um einen Indikator, der bei einem offenen Chart hängt - das bedeutet, dass die Historie bereits geladen ist. Oder? Hängen Sie den Indikator auf, schließen Sie das Terminal, starten Sie das Terminal, --- wohin kann die Geschichte gehen? Wenn es schon da war...

Zweitens: Ich habe das Symbol EURMXN geöffnet. Können Sie, ohne in das Terminal zu schauen, sagen, was es ist? )))

Es ist ganz einfach:

  1. Eine Vorlage mit dem Indikator wird als default.tpl gespeichert.
  2. Das Diagrammsymbol wird geöffnet, das zuvor noch nie geöffnet wurde.
Daher wird zuerst der Indikator gestartet, und dann werden die Daten geladen. Ich habe alle Veranstaltungen in einem Paket zusammengefasst.

 
Ihor Herasko:

Sowohl dort als auch dort. Aber ich kann immer noch nicht mit Sicherheit sagen, ob es ein Fehler ist oder nicht. Wir müssen ausreichend reproduzierbare Bedingungen finden.

Ihre Formulierung ist etwas unglücklich. Was ich zitiert habe, bezieht sich auf reproduzierbare Bedingungen.

Eine andere Sache ist, dass es sich bei dem, was ich in den Blöcken I und II beschrieben habe, wahrscheinlich nicht um einen Fehler handelt, sondern um Besonderheiten beim Laden von Daten , wenn das Terminal neu gestartet wird .

Und im 1870th Build gab es Unterschiede in der Wiedergabe zu dem, was ich im 1861th bekam.

Die Kombinationen der Meldungen (Erfolg und Fehler 4111) haben sich ein wenig geändert. Zum Beispiel, wenn es früher eine solche stabile Reproduktion gab:

test 2018 06 26 (GBPUSD,M5)     Alert: Успешно
test 2018 06 26 (GBPUSD,H1)     Alert: Ошибка №4111

Jetzt, mit demselben Code, scheinen die Fehlermeldungen ausgeprägter zu sein:

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

test 2018 06 26 (EURNZD,M5)     Alert: Успешно
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111


Und Block IIIaus diesem Beitrag von mir ist im 1870. nicht mehr reproduzierbar.

Auch konnte es in den 1870er Jahren nicht reproduzieren, was hier beschrieben wird:https://www.mql5.com/ru/forum/260815/page5#comment_7901728 Last - vielleicht hängt es irgendwie vom Betriebssystem ab (als Vermutung). D.h. dieser Code von Vladimir funktioniert bei mir ohne Probleme

 
Ihor Herasko:

Ich bin auf ein Problem mit der Funktion ChartNavigate gestoßen. Mache ich etwas falsch oder gibt es wirklich ein Problem mit der Funktion. Schreiben Sie zurück, wenn Sie es oft genug benutzt haben.

Der Kern des Problems: ChartNavigate verschiebt das Diagramm nicht Beim Starten des Terminals Wenn Sie diese Funktion in OnInit() aufrufen. Vor allem, wenn ich die Dokumentation mehrmals lese. Nirgendwo steht, dass die Funktion nicht bei der Initialisierung aufgerufen werden kann.

Code Anzeige für die Wiedergabe:

Die Schritte zum Spiel:

  1. Schalten Sie die automatische Wiedergabe von Diagrammen aus.
  2. Befestigen Sie den Indikator am Diagramm. ChartNavigate wird ausgelöst, indem das Diagramm an die gewünschte Position verschoben wird.
  3. Entladen Sie das Terminal.
  4. Laden Sie das Terminal. ChartNavigate funktioniert nicht, wenn das Diagramm ohne einen Offset angezeigt wird.
OK, wenn die Funktion einen Fehler verursachen würde. Aber das ist nicht der Fall. Alle Aufrufe sind erfolgreich, aber wenn das Terminal neu geladen wird, wird das Diagramm nicht verschoben.

Probieren Sie die drei Varianten des Indikators aus und sehen Sie sich das Ergebnis der einzelnen Varianten an

1. chartNavigate am Ende der anderen Grafikbefehle

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {


//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

2. ChartNavigate one - keine weiteren Befehle für das Diagramm

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
/*
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 
*/
//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


3. chartNavigate vor anderen Diagrammbefehlen

//+------------------------------------------------------------------+
//|                              TryToSetChartSettings_Indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

//--- Прокрутим от правого края графика на 1000 баров влево
   ChartNavigate(0,CHART_END,-1000);
//--- отключим автопрокрутку
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
//--- установим отступ правого края графика
   ChartSetInteger(0,CHART_SHIFT,true);
//--- отобразим в виде свечей
   ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
//--- установить режим отображения тиковых объемов
   ChartSetInteger(0,CHART_SHOW_VOLUMES,CHART_VOLUME_TICK); 

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

Probieren Sie drei Varianten des Indikators aus und sehen Sie sich das Ergebnis jeder Variante an

1. chartNavigate am Ende der anderen Diagrammbefehle

  1. Angehängt an das M1-Diagramm mit aktivierter automatischer Bildlauffunktion. Autoscroll ist ausgeschaltet, der Chart hat sich um 1000 Balken nach links bewegt.
  2. Laden Sie das Terminal neu, ohne den Indikator von der Karte zu trennen. Der Chart zeigt die aktuelle Kerze, keine Verschiebung von 1000 Balken nach links. Der automatische Bildlauf ist weiterhin nicht verfügbar.
  3. Ich habe den Schritt 2 7 Mal hintereinander wiederholt. 3 Mal davon ist der Übergang nach links von 1000 Kerzen vollständig, 4 Mal ist der Übergang nicht vollständig.
Wenn ich den Befehl nicht perfektioniert habe, erscheint "Waiting for refresh". Daraus lässt sich schließen, dass das Terminal beim Laden der Historie den Chart zwangsweise zu den letzten Kursen scrollt. Und da dies nach OnInit() geschieht, erhalten wir ein unerwartetes Ergebnis.

2. ChartNavigate allein - keine anderen Befehle für das Diagramm

  1. Da der automatische Bildlauf in dieser Version nicht automatisch deaktiviert ist, habe ich ihn manuell deaktiviert und den Indikator angeschlossen. Das Diagramm hat sich um 1000 Balken nach links verschoben.
  2. Starten Sie das Terminal neu, ohne den Indikator von der Karte zu trennen.
  3. In 2 von 7 Fällen wurde ein Bildlauf durchgeführt. In einem Fall geschah dies in drei Stufen: Anzeige des erwarteten Verlaufs, Anzeige der aktuellen Kerze und Anzeige des erwarteten Verlaufs. Es sieht so aus, als ob OnInit() zweimal ausgeführt wurde: einmal bevor der Verlauf geladen wurde und das zweite Mal danach.

3. chartNavigate vor anderen Diagrammbefehlen.

  1. Ich habe den automatischen Bildlauf aktiviert und den Indikator angehängt. Der Chart ruckelte und kehrte zur aktuellen Kerze zurück. Wie zu erwarten, wird das automatische Scrollen nach dem Befehl "1000 Takte bewegen" deaktiviert.
  2. Starten Sie das Terminal neu, ohne den Indikator vom Chart zu trennen (der Chart zeigt die aktuelle Kerze an).
  3. In allen 7 Fällen hat das Diagramm die aktuelle Kerze angezeigt, das Blättern hat nicht einmal geblinkt.
Wenn wir das Terminal ohne Indikatoren auf dem Chart neu starten, wobei das automatische Scrollen ausgeschaltet ist und irgendwo in den Tiefen der Historie angezeigt wird, dann erhalten wir bei jedem Neustart die Anzeige der Stelle, an der das Terminal ausgeschaltet wurde. Es stellt sich heraus, dass irgendwo während der Ausführung von Navigationsbefehlen eine Bewegung zur aktuellen Kerze stattfindet.
 
Ihor Herasko:

  1. Angehängt an das M1-Diagramm mit aktivierter automatischer Bildlauffunktion. Der automatische Bildlauf wurde ausgeschaltet, das Diagramm wurde um 1000 Balken nach links verschoben.
  2. Laden Sie das Terminal neu, ohne den Indikator von der Karte zu trennen. Der Chart zeigt die aktuelle Kerze, keine Verschiebung von 1000 Balken nach links. Der automatische Bildlauf ist weiterhin nicht verfügbar.
  3. Ich habe den Schritt 2 7 Mal hintereinander wiederholt. 3 Mal davon ist der Übergang nach links von 1000 Kerzen vollständig, 4 Mal ist der Übergang nicht vollständig.
Wenn ich den Befehl nicht perfektioniert habe, erscheint "Waiting for refresh". Daraus lässt sich schließen, dass das Terminal beim Laden der Historie den Chart zwangsweise zu den letzten Kursen scrollt. Und da dies nach OnInit() geschieht, erhalten wir ein unerwartetes Ergebnis.

Ich vergesse immer, dass Ihre Nachricht/Vorschlag rückwärts gelesen wird. Es ist wie in einem alten Witz:

1917, Oktober. Eine Dame, die Enkelin von
, dem Dekabristen, sitzt in ihrem eigenen Haus am Newski. Als sie ein Geräusch auf der Straße hört, bittet sie ihren Hausmeister, herauszufinden, was
los ist.
- Junge Frau, die Revolution ist da! - Der Hausmeister kommt zurück.
-Oh, wie wunderbar! - Mein Großvater träumte von einer Revolution!
Geh und finde heraus, was die Revolutionäre wollen, mein Lieber!
- Sie wollen keine reichen Männer, Ma'am", sagt der Hausmeister bei seiner Rückkehr.
- Seltsam", sagt die Dame nachdenklich, "aber mein Großvater wollte, dass es keine armen Leute gibt!

Ich dachte, Sie würden die Eigenschaften des Fahrplans ändern, bevor Sie das Terminal neu starten.
 
Rashid Umarov:

Ich vergesse immer, dass Ihre Nachricht/Vorschlag rückwärts gelesen wird.

Wie meinen Sie das? Sie haben geschrieben, dass Sie die Funktionsweise der drei Indikatoren testen müssen. Da es hier um das Nachladen des Terminals und die anschließende Verwendung von ChartNavigate geht, wurden diese Tests durchgeführt.

Ich dachte, Sie würden die Diagrammeigenschaften vor dem Neustart des Terminals ändern.

Warum, wenn das Problem darin besteht, dass ChartNavigate beim Starten des Terminals nicht immer funktioniert? Das ist genau der Punkt.

 
Ihor Herasko:

das Problem ist genau, dass ChartNavigate nicht immer ausgelöst wird , wenn das Terminal startet? Das ist der springende Punkt.

Und auch, wenn ich mein Profil ändere. Darüber hinaus, wenn die ChartNavigate( chart_id, CHART_BEGIN, shift ) erhalten zum Beispiel CHART_FIRST_VISIBLE_BAR, dann wird das Ergebnis sein, als ob ChartNavigate gearbeitet hat. Wenn der Expert Advisor entfernt wird, sieht das Ergebnis des Erhalts von CHART_FIRST_VISIBLE_BAR in diesem Diagramm so aus, dass CHARTNavigate fehlgeschlagen ist, wenn Sie den Expert Advisor das nächste Mal starten (gleich oder anders).

Das Ergebnis: extrem inkonsistenter ChartNavigate-Betrieb bereits in Kombination mit CHART_FIRST_VISIBLE_BAR

Grund der Beschwerde: