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

 
Ihor Herasko:

Нет, не возвращаю. Потому как именно в этом и суть. Расскажу чуть подробнее, для чего все это нужно. Трейдер использует график как будто тестер. Индикатор скрывает часть реального графика, находящегося справа от якобы текущего времени (на самом деле это время где-то в истории). При нажатии F12 отображается следующая свеча онлайн-графика и т. д. Так вот, именно при перезагрузке терминала с присоединенным индикатором не возвращает положение графика к тому месту, на котором закончил свои исследования трейдер. В итоге он получает пустой график, т. к. терминал переводит отображение графика к последней реальной свече. И это при том, что выгрузка терминала происходила в совершенно другом месте.

Интересное наблюдение. Проверил у себя - увы и ах, ничего не изменилось. Все равно при перезагрузке получаю самые свежие цены.

Предлагаю "сверить часы". Я все это тестирую на билде 1861. Какой у Вас?

Может впереди добавить такие строки

   ChartSetInteger(0, CHART_AUTOSCROLL, false);
   ChartSetInteger(0, CHART_SHIFT, false);
   ChartNavigate(0, CHART_END, 0);

и потом уже смещать?

Или просто никуда не смещать. Это работает тоже без проблем

ChartNavigate(0, CHART_CURRENT_POS, 0)

На каком баре закрыл терминал, на таком он и открылся.

А вот этот вариант держит график и на неактивном окне. Увы и ах. График остаётся на месте даже без этого кода.

 
Alexey Viktorov:

Может впереди добавить такие строки

и потом уже смещать?

Да, в полной версии все это есть. Если работать без перезагрузки терминала, то все отлично. А вот перезагрузка приводит к таким вот проблемам. Причем даже костыльное решение не всегда помогает. Буду дальше исследовать.

 
Ihor Herasko:

Да, в полной версии все это есть. Если работать без перезагрузки терминала, то все отлично. А вот перезагрузка приводит к таким вот проблемам. Причем даже костыльное решение не всегда помогает. Буду дальше исследовать.

Но ведь я тоже проводил эксперименты с перезагрузкой терминала. В чём может быть проблема? У меня загрузилось обновление, но пока я отменил обновление. Может вам тоже обновиться?
 
Alexey Viktorov:
Но ведь я тоже проводил эксперименты с перезагрузкой терминала. В чём может быть проблема? У меня загрузилось обновление, но пока я отменил обновление. Может вам тоже обновиться?

Обновил до 1865-го билда. Проблема осталась.

Более того, выяснилось, что даже после полной загрузки данных на графике и использовании ChartNavigate() график на некоторое время отображается, где требуется, но с новым тиком все равно возвращается к самому последнему бару. Кнопка автопрокрутка выключена, другие индикаторы не используются. 

Если же перемещать график вручную, то ничего подобного не происходит. Пока в полной растерянности. Завтра на свежую голову буду еще исследовать, может где-то начудил.

 
MetaTrader 5 x64 build 1870 started (MetaQuotes Software Corp.)
Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i3-3120M  @ 2.50GHz, Memory: 4720 / 8077 Mb, Disk: 301 / 464 Gb, GMT+2
C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Скрипт. Только при CHART_CURRENT_POS отрабатывает стабильно. При CHART_BEGIN и положительном "Shift", а также при CHART_END и отрицательном "Shift" график или не передвигается или соскакивает (перематывается самостоятельно) к самым свежим ценам: ощущение, что включена кнопка автопрокрутки.

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
#property script_show_inputs
//--- input parameters
input ENUM_CHART_POSITION  InpPosition = CHART_CURRENT_POS;    // Chart Position  
input int                  InpShift    = -1;                   // Shift
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   ResetLastError();
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   int chart_first_visible_bar=ChartFirstVisibleBar();
   if(chart_first_visible_bar==-1)
      return;
//--- 
   string comm="До: Первый бар на графике имеет номер "+IntegerToString(chart_first_visible_bar);
//--- выведем комментарий 
   Print(comm);
   if(ChartNavigate(ChartID(),InpPosition,InpShift))
      Print("ChartNavigate ",EnumToString(InpPosition),",",InpShift," успешно");
   else
      Print("Ошибка №",GetLastError(),", ",EnumToString(InpPosition));
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   chart_first_visible_bar=ChartFirstVisibleBar();
   if(chart_first_visible_bar==-1)
      return;
//--- 
   comm="После: Первый бар на графике имеет номер "+IntegerToString(chart_first_visible_bar);
//--- выведем комментарий 
   Print(comm);
  }
//+------------------------------------------------------------------------------+ 
//| Gets the index of the first visible bar on chart.                            | 
//| Indexing is performed like in timeseries: latest bars have smallest indices. | 
//+------------------------------------------------------------------------------+ 
int ChartFirstVisibleBar(const long chart_ID=0)
  {
//--- prepare the variable to get the property value 
   long result=-1;
//--- reset the error value 
   ResetLastError();
//--- receive the property value 
   if(!ChartGetInteger(chart_ID,CHART_FIRST_VISIBLE_BAR,0,result))
     {
      //--- display the error message in Experts journal 
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- return the value of the chart property 
   return((int)result);
  }
//+------------------------------------------------------------------+

1

Файлы:
 
Ihor Herasko:

Обновил до 1865-го билда. Проблема осталась.

Более того, выяснилось, что даже после полной загрузки данных на графике и использовании ChartNavigate() график на некоторое время отображается, где требуется, но с новым тиком все равно возвращается к самому последнему бару. Кнопка автопрокрутка выключена, другие индикаторы не используются. 

Если же перемещать график вручную, то ничего подобного не происходит. Пока в полной растерянности. Завтра на свежую голову буду еще исследовать, может где-то начудил.

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

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

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

Вот весь код

#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   ChartSetInteger(0, CHART_AUTOSCROLL, false);
   ChartSetInteger(0, CHART_SHIFT, false);
   ChartNavigate(0, CHART_END, 0);
   if(ChartNavigate(0, CHART_END, -100))
      Comment("Успешно");
   else
      Comment("Ошибка №", GetLastError());   
  //ChartRedraw(ChartID());
//---
   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);
  }
//+------------------------------------------------------------------+

void OnDeinit(const int reason)
{
 Comment("");
}/********************************************************************/
Почему-то я не верю в то, что один терминал отрабатывает так, а другой иначе.
 
Alexey Viktorov:

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

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

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

Вот весь код

Почему-то я не верю в то, что один терминал отрабатывает так, а другой иначе.

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

 
Artyom Trishkin:

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

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

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

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

 
Alexey Viktorov:

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

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

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

Не, не смогу...

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

Попробуй так: накинь индикатор на минутный тф, закрой терминал и открой его через часик - терминал начнёт подгружать недостающие минутки - что с графиком при этом будет? Сместится?

 

Вот это новость!!!

У меня были открыты графики периода Н1, Н4 я на них и проверял. Сейчас начал экспериментировать на М1, М5, М30... не работает!!!

Переключаюсь на Н1 или Н4 проблем не возникает даже если наступил новый час. Это проверялось либо вчера, либо сегодня пораньше или и вчера и сегодня... не суть, но попадал я на смену часа.

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