ChartNavigate при инициализации - страница 6

 
Alexey Viktorov:

У меня в этом посте: https://www.mql5.com/ru/forum/260815/page4#comment_7890492  были подробно описаны условия, при которых проблема может воспроизводиться. Это удалось воспроизвести на основе ваших утверждений. О чём писала тут 

Т.е., небольшая модификация условий привела к устойчивому воспроизведению проблемы.

Вы это почему-то не заметили

 
Alexey Viktorov:

P./S.: Print вместо Comment в вашем коде был бы не только более щадящей процедурой. Результаты Print в OnInit() проще сравнивать, копировать и приложить здесь

 
Alexey Viktorov:

Я предложил обновиться не в надежде что всё встанет на свои места, а для того чтобы были одинаковые билды.

Игорь, а вы делаете эксперименты на полной версии индикатора или на экспериментальном?

И там, и там. Но все равно пока не могу с уверенностью сказать, в чем же дело: баг это или не баг. Нужно найти достаточно воспроизводимые условия.

 
Alexey Viktorov:

Как это сделать?

Согласно описанию в первом сообщении темы, это индикатор, вешается на открытый график- значит история уже подгружена. Так? Вешаем индикатор, закрываем терминал, запускаем терминал, --- куда история может деться? Если она там уже была...

Во-вторых открывал символ EURMXN. Не подглядывая в терминал сможешь сказать что это такое? )))

Делается просто:

  1. Шаблон с индикатором сохраняется с именем default.tpl.
  2. Открывается символ графика, который еще ни разу до этого не открывался.
В итоге сначала стартует индикатор, а потом уже начинается подкачка данных. И вот там весь букет событий в одном флаконе.

 
Ihor Herasko:

И там, и там. Но все равно пока не могу с уверенностью сказать, в чем же дело: баг это или не баг. Нужно найти достаточно воспроизводимые условия.

У вас сложилась несколько неудачная формулировка. То, что я приводила - из воспроизводимых условий.

Другое дело, что да, вероятно описываемое у меня в блоках I и II - это не баг, а особенности подгрузки данных при перезапуске терминала.

Причём в 1870-м билде появились отличия воспроизведения от того, что получалось в 1861-м.

Изменились немного и сочетания сообщений (успешности и ошибки 4111). Например, если ранее было такое устойчиво воспроизводимое: 

test 2018 06 26 (GBPUSD,M5)     Alert: Успешно
test 2018 06 26 (GBPUSD,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: Ошибка №4111
test 2018 06 26 (EURNZD,H1)     Alert: Ошибка №4111

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


А блок III из того моего поста у меня уже не воспроизводится в 1870-м.

Не удалось воспроизвести в 1870-м и то, что описано здесь: https://www.mql5.com/ru/forum/260815/page5#comment_7901728  Последнее - может это зависит как-то от операционной системы (как предположение). Т.е., у меня этот код Владимира срабатывает нормально, без проблем

 
Ihor Herasko:

Наткнулся на проблему при работе функции ChartNavigate. Что-то неправильно делаю или действительно есть проблема в работе функции. Отпишитесь, кто использовал достаточно часто.

Итак, суть проблемы: ChartNavigate не смещает график при старте терминала, если вызывать функцию в OnInit(). Специально несколько раз прочитал документацию. Нигде не сказано, что функцию нельзя вызывать при инициализации.

Код индикатора для воспроизведения:

Шаги для воспроизведения:

  1. Выключить автопрокуртку графика.
  2. Прикрепить индикатор к графику. ChartNavigate сработает, переместив график в нужное положение.
  3. Выгрузить терминал.
  4. Загрузить терминал. ChartNavigate не сработает, отобразив график без смещения.
Ладно, если бы функция выдавала ошибку. Но ее нет. Все вызовы проходят успешно, но именно при перезагрузке терминала смещение графика не происходит.

А попробуйте три варианта индикатора, посмотрите результат выполнения каждого

1.  ChartNavigate в конце других команд графику

//+------------------------------------------------------------------+
//|                              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 один - нет никаких других команд графику

//+------------------------------------------------------------------+
//|                              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 перед другими командами графику

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

А попробуйте три варианта индикатора, посмотрите результат выполнения каждого

1.  ChartNavigate в конце других команд графику

  1. Прикрепил к графику М1 с включенной автопрокруткой. Автопрокрутка выключилась, график переместился на 1000 баров влево.
  2. Перезагрузил терминал, не отключая индикатор от графика. График показал текущую свечу, никакого перехода на 1000 баров влево. Автопрокрутка осталась выключенной.
  3. 7 раз подряд повторил п. 2. Из них переход на 1000 свечей влево совершен 3 раза, 4 раза - переход не совершен.
В тех случаях, когда, переход не совершен, заметил, что появляется надпись "Ожидание обновления". Вроде бы напрашивается вывод, что при подгрузке истории терминал принудительно прокручивает график к последним котировкам. Ну а так как это происходит уже после выполнения OnInit(), получаем неожиданный результат. 

2. ChartNavigate один - нет никаких других команд графику

  1. Так как автопрокрутка в этой версии автоматически не отключается, то выключил ее вручную и подключил индикатор. График переместился на 1000 баров влево.
  2. Перезагрузил терминал, не отключая индикатор от графика. 
  3. В 2-ух случаях из 7-и прокрутка совершена. Причем в одном из двух случаев она произошла в три этапа: отображение ожидаемой истории, отображение текущей свечи, отображение ожидаемой истории. Такое впечатление, будто OnInit() исполнился два раза: один раз до подгрузки истории, а второй раз - после.

3. ChartNavigate перед другими командами графику

  1. Включил автопрокрутку и подключил индикатор. График дернулся и вернулся к текущей свече. Ожидаемо, т. к. автопрокрутка выключена после команды перемещения на 1000 баров.
  2. Перезагрузил терминал, не отключая индикатор от графика (график отображает текущую свечу). 
  3. Во всех 7-и случаях график отобразил текущую свечу, прокрутка даже не мелькнула.
Если перезагружать терминал без каких-либо индикаторов на графике с выключенной автопрокруткой и отображением где-то в глубине истории, то при каждой загрузке получается отображение того места, на котором был выключен терминал. Получается, что где-то при исполнении команд навигации имеется перемещение к текущей свече.
 
Ihor Herasko:

  1. Прикрепил к графику М1 с включенной автопрокруткой. Автопрокрутка выключилась, график переместился на 1000 баров влево.
  2. Перезагрузил терминал, не отключая индикатор от графика. График показал текущую свечу, никакого перехода на 1000 баров влево. Автопрокрутка осталась выключенной.
  3. 7 раз подряд повторил п. 2. Из них переход на 1000 свечей влево совершен 3 раза, 4 раза - переход не совершен.
В тех случаях, когда, переход не совершен, заметил, что появляется надпись "Ожидание обновления". Вроде бы напрашивается вывод, что при подгрузке истории терминал принудительно прокручивает график к последним котировкам. Ну а так как это происходит уже после выполнения OnInit(), получаем неожиданный результат. 

Всегда забываю, что твое послание/предложение прочитают наоборот. Как в старом анекдоте:

1917 год, октябрь. В собственном доме на Невском сидит барыня, внучка
декабриста. Услышав шум на улице просит своего дворника узнать, что там
происходит.
- Барыня, революция там! - возвращается дворник.
-О, как замечательно! - радуется барыня - мой дед мечтал о революции!
А сходите, голубчик, и узнайте чего же хотят революционеры?!
- Барыня, они хотят чтобы не было богатых - говорит вернувшись дворник.
- Странно - задумчиво произносит барыня - а мой дед хотел чтобы не было бедных!

Я то думал, что вы будете менять свойства графика перед перезагрузкой терминала.
 
Rashid Umarov:

Всегда забываю, что твое послание/предложение прочитают наоборот. 

В каком смысле? Вы написали, что необходимо проверить работу трех индикаторов. Так как тема посвящена перезагрузке терминала с последующим использованием ChartNavigate, то именно такие тесты и были сделаны.

Я то думал, что вы будете менять свойства графика перед перезагрузкой терминала.

Зачем, если проблема именно в том, что ChartNavigate не всегда срабатывает при старте терминала? Суть именно в этом.

 
Ihor Herasko:

проблема именно в том, что ChartNavigate не всегда срабатывает при старте терминала? Суть именно в этом.

А также при смене Профиля. Кроме того если после ChartNavigate( chart_id, CHART_BEGIN, shift ) получить например CHART_FIRST_VISIBLE_BAR, то результат будет как будто ChartNavigate сработал. А если удалить Эксперт, то при следующем запуске Эксперта (этого или другого) на этом графике при получении CHART_FIRST_VISIBLE_BAR результат будет как будто ChartNavigate не сработал

В итоге: крайне противоречивая работа ChartNavigate уже в сочетании с CHART_FIRST_VISIBLE_BAR

Причина обращения: