ChartNavigate pendant l'initialisation - page 6

 
Alexey Viktorov:

J'ai dans ce post: https://www.mql5.com/ru/forum/260815/page4#comment_7890492 détaillé les conditions dans lesquelles le problème peut être reproduit. Cela a pu être reproduit sur la base de vos affirmations. Ce que j'ai écrit ici

C'est-à-dire qu'une légère modification des conditions a conduit à une reproduction régulière du problème.

Vous n'avez pas remarqué ceci

 
Alexey Viktorov:

P./S. : Imprimer au lieu de Commenter dans votre code ne serait pas seulement une procédure plus douce. Les résultats de l'impression dans OnInit() sont plus faciles à comparer, copiez-les et attachez-les ici.

 
Alexey Viktorov:

J'ai suggéré une mise à jour non pas dans l'espoir que tout se mette en place, mais pour que les constructions soient les mêmes.

Igor, faites-vous vos expériences sur la version complète de l'indicateur ou sur la version expérimentale ?

A la fois là et là. Mais je ne peux toujours pas dire avec certitude quel est le problème : s'il s'agit d'un bug ou non. Je dois trouver des conditions suffisamment reproductibles.

 
Alexey Viktorov:

Comment faire ?

Selon la description dans le premier message du fil de discussion, il s'agit d'un indicateur, il s'accroche à un graphique ouvert - ce qui signifie que l'historique est déjà chargé. N'est-ce pas ? Accrocher l'indicateur, fermer le terminal, démarrer le terminal, --- où peut aller l'histoire ? Si c'était déjà là...

Deuxièmement, j'ai ouvert le symbole EURMXN. Sans regarder dans le terminal, pouvez-vous dire ce que c'est ? )))

C'est facile :

  1. Un modèle avec l'indicateur est enregistré sous default.tpl.
  2. Le symbole graphique est ouvert, qui n'a jamais été ouvert auparavant.
Par conséquent, l'indicateur démarre d'abord, puis les données sont chargées. J'ai rassemblé tous les événements en un seul paquet.

 
Ihor Herasko:

A la fois là et là. Mais je ne peux toujours pas dire avec certitude si c'est un bug ou non. Nous devons trouver des conditions suffisamment reproductibles.

Votre formulation est un peu malheureuse. Ce que j'ai cité concerne les conditions reproductibles.

Une autre chose est que oui, probablement ce que j'ai décrit dans les blocs I et II n' est pas un bug, mais des particularités du chargement des données lorsque le terminal est redémarré .

Et dans la construction de la 1870e, il y avait des différences de relecture par rapport à ce que j'ai obtenu dans la 1861e.

Les combinaisons de messages (succès et erreur 4111) ont un peu changé. Par exemple, si auparavant il y avait une telle reproduction stable :

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

Maintenant, avec le même code, les messages d'erreur semblent être plus prononcés :

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


Et le bloc IIIde ce post n'est plus reproductible dans le 1870e.

Il n'a pas non plus pu reproduire dans les années 1870 ce qui est décrit ici: https://www.mql5.com/ru/forum/260815/page5#comment_7901728 Dernière - peut-être cela dépend-il d'une manière ou d'une autre du système d'exploitation (à titre d'hypothèse). Par exemple, ce code de Vladimir fonctionne bien pour moi, sans aucun problème.

 
Ihor Herasko:

J'ai rencontré un problème avec la fonction ChartNavigate. Je fais quelque chose de mal ou il y a vraiment un problème avec la fonction. Répondez si vous l'avez utilisé assez souvent.

Donc, le cœur du problème : ChartNavigate ne déplace pas le graphique. Lors du démarrage du terminal Si vous appelez cette fonction dans OnInit(). Surtout plusieurs fois que j'ai lu la documentation. Il n'est dit nulle part que la fonction ne peut pas être appelée à l'initialisation.

Code indicateur pour la lecture :

Étapes pour jouer :

  1. Désactiver la lecture automatique des graphiques.
  2. Fixez l'indicateur au tableau. ChartNavigate se déclenchera en déplaçant le graphique à la position souhaitée.
  3. Déchargez le terminal.
  4. Chargez le terminal. ChartNavigate ne fonctionnera pas en affichant le graphique sans décalage.
OK, si la fonction donnait une erreur. Mais ce n'est pas le cas. Tous les appels sont réussis, mais c'est lorsque le terminal est rechargé que le graphique n'est pas décalé.

Essayez les trois variantes de l'indicateur et voyez le résultat de chacune d'elles.

1. ChartNavigate à la fin des autres commandes graphiques

//+------------------------------------------------------------------+
//|                              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 - aucune autre commande vers le graphique

//+------------------------------------------------------------------+
//|                              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 avant les autres commandes du graphique

//+------------------------------------------------------------------+
//|                              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:

Et essayez trois variantes de l'indicateur, voyez le résultat de chacune d'elles.

1. ChartNavigate à la fin des autres commandes de graphiques

  1. Attaché au graphique M1 avec le défilement automatique activé. L'autoscroll est désactivé, le graphique s'est déplacé de 1000 barres vers la gauche.
  2. J'ai rechargé le terminal sans déconnecter l'indicateur du tableau. Le graphique montre la bougie actuelle, sans décalage de 1000 barres vers la gauche. Le défilement automatique reste indisponible.
  3. J'ai répété l'étape 2 7 fois de suite. 3 fois, la transition vers la gauche de 1000 bougies est complète, 4 fois - la transition n'est pas complète.
Dans ces cas, j'ai remarqué le message "Waiting for refresh". On peut donc en conclure que le terminal fait défiler de force le graphique vers les dernières cotations lors du chargement de l'historique. Et comme cela se produit après OnInit(), nous obtenons un résultat inattendu.

2. ChartNavigate seul - aucune autre commande vers le graphique

  1. Comme le défilement automatique n'est pas automatiquement désactivé dans cette version, je l'ai désactivé manuellement et j'ai connecté l'indicateur. Le graphique s'est déplacé de 1000 barres vers la gauche.
  2. J'ai redémarré le terminal sans déconnecter l'indicateur du tableau.
  3. Dans 2 cas sur 7, le défilement a été effectué. Et dans l'un d'eux, cela s'est produit en trois étapes : affichage de l'historique attendu, affichage de la bougie actuelle et affichage de l'historique attendu. Il semble que OnInit() ait été exécuté deux fois : une fois avant le chargement de l'historique et la seconde fois - après.

3. ChartNavigate avant les autres commandes du graphique.

  1. J'ai activé le défilement automatique et j'ai joint l'indicateur. Le graphique s'est mis à trembler et est revenu à la bougie actuelle. Comme on pouvait s'y attendre, l'autoscrolling est désactivé après une commande de déplacement de 1000 barres.
  2. Redémarrer le terminal sans déconnecter l'indicateur du graphique (le graphique affiche la bougie actuelle).
  3. Dans les 7 cas, le graphique a affiché la bougie actuelle, le défilement n'a même pas clignoté.
Si nous redémarrons le terminal sans aucun indicateur sur le graphique, avec le défilement automatique désactivé et l'affichage quelque part dans les profondeurs de l'histoire, alors à chaque redémarrage nous obtenons l'affichage de l'endroit où le terminal a été éteint. Il s'avère que quelque part pendant l'exécution des commandes de navigation, il y a un déplacement vers la bougie actuelle.
 
Ihor Herasko:

  1. Ci-joint le graphique M1 avec autoscroll activé. Le défilement automatique a été désactivé, le graphique s'est déplacé de 1000 barres vers la gauche.
  2. J'ai rechargé le terminal sans déconnecter l'indicateur du tableau. Le graphique montre la bougie actuelle, sans décalage de 1000 barres vers la gauche. Le défilement automatique reste indisponible.
  3. J'ai répété l'étape 2 7 fois de suite. 3 fois, la transition vers la gauche de 1000 bougies est complète, 4 fois - la transition n'est pas complète.
Lorsque je n'ai pas perfectionné la commande "Waiting for refresh" apparaît. On peut donc en conclure que le terminal fait défiler de force le graphique vers les dernières cotations lors du chargement de l'historique. Et comme cela se produit après OnInit(), nous obtenons un résultat inattendu.

J'oublie toujours que votre message/suggestion est lu à l'envers. C'est comme dans une vieille blague :

1917, octobre. Une dame, la petite-fille de
le décembriste, est assise dans sa propre maison sur Nevsky. Entendant un bruit dans la rue, elle demande à son concierge de découvrir ce qui se passe sur
.
- Jeune fille, la révolution est là ! - Le concierge revient.
-Oh, c'est merveilleux ! - Mon grand-père rêvait d'une révolution !
Allez découvrir ce que veulent les révolutionnaires, mon cher ami !
- Ils ne veulent pas d'hommes riches, madame", dit le concierge à son retour.
- C'est étrange, dit la dame pensivement, mais mon grand-père voulait qu'il n'y ait pas de pauvres !

Je pensais que vous alliez changer les propriétés de l'horaire avant de redémarrer le terminal.
 
Rashid Umarov:

J'oublie toujours que votre message/suggestion sera lu à l'envers.

Qu'est-ce que tu veux dire ? Vous avez écrit que vous devez tester le fonctionnement des trois indicateurs. Puisque le sujet porte sur le rechargement du terminal et l'utilisation de ChartNavigate, ce sont les tests qui ont été effectués.

Je pensais que vous alliez modifier les propriétés du graphique avant de redémarrer le terminal.

Pourquoi, si le problème est que ChartNavigate ne fonctionne pas toujours au démarrage du terminal ? C'est exactement ça.

 
Ihor Herasko:

le problème est exactement que ChartNavigate ne se déclenche pas toujours au démarrage du terminal? C'est là le problème.

Et aussi lorsque je modifie mon profil. En outre, si le ChartNavigate( chart_id, CHART_BEGIN, shift ) obtient par exemple CHART_FIRST_VISIBLE_BAR, alors le résultat sera comme si ChartNavigate avait fonctionné. Si le conseiller expert est supprimé, alors la prochaine fois que vous démarrez le conseiller expert (celui-ci ou un autre), le résultat de l'obtention de CHART_FIRST_VISIBLE_BAR dans ce graphique ressemblera à CHARTNavigate failed.

Le résultat : un fonctionnement extrêmement incohérent de ChartNavigate déjà en combinaison avec CHART_FIRST_VISIBLE_BAR

Raison: