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

 
Ihor Herasko:

А если тиков нет, выходные? Тогда уже таймер придется подключать.

А нужно ведь решить один-единственный вопрос: как определить факт успешной отработки ChartNavigate? То, что она возвращает true,  это просто "для галочки", реальной работе никак не помогает.

Надо код, который я выложил выше проверить в советнике...

 
Vladimir Karputov:

Надо код, который я выложил выше проверить в советнике...

Причем тут советник?

 
Ihor Herasko:

Причем тут советник?

Надо проверить...

//+------------------------------------------------------------------+
//|                                                  Test EA.mq5.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"
//--- input parameters
input bool redraw=true;
input ENUM_CHART_POSITION position=CHART_BEGIN;
//---
long count=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   count=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+
Файлы:
Test_EA.mq5  6 kb
 

Vladimir Karputov:

Вот такой индикатор - специально поставил задержу в девять тиков, два вида перемещения графика и флаг принудительной перерисовки (вкл/откл)

Вы же не новичок. Зачем вводите в заблуждение? Почему игнорируете то, что говорил Renat Fatkhullin?

У вас в коде (что здесь, что тут)  вызывается принудительная перерисовка графика на каждом тике за счёт создания комментариев на каждом тике.


Т.е., вне зависимости от того, что флаг во входных параметрах включен или отключен.


А включение вашего флага во входных параметрах, в данном случае, лишь вызывает дополнительную перерисовку через ChartRedraw().

Т.е., вместо пользы создаёт дополнительную нагрузку к уже там имеющимся за счёт создания комментариев

P./S.:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Renat Fatkhullin, 2017.12.05 02:51

...

В МТ5 функция Comment явным образом вызывает перерисовку чарта...

Разница как раз в этом.


Если в МТ4 после вызова Comment поставить принудительно ChartRedraw(), то поведение все равно не будет как в МТ5. ChartRedraw() в Метатрейдер 4 игнорирует значение коммента и сам решается, надо ли обновить чарт с последнего кадра. Конечно, при отсутствии сотен котировок в секунду, которые вызывают инвалидацию данных чарта, ChartRedraw решает "зачем отрисовать неизменный график" и пропускает отрисовку кадра.

В Метатрейдер 5 тоже действует такая же система, но гораздо больше случаев, когда отдается приоритет безусловной отрисовке.

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


Отсюда дополнительные выводы при проведении бенчмарков:

  • нельзя считать вызов ChartRedraw реальной отрисовкой чарта

  • всегда нужно знать и доказывать утверждения "почему кадр отрисуется" и "инвалидирую ли я внутреннюю картину рынка, чтобы терминал решил перерисовать кадр"

  • нельзя во время бенчмарков делать множественные выводы Comment в МТ5, всегда нужно думать о том, как вы влияете на отрисовку

  • в МТ5 более правильная система изменения объектов на чарте и нужно четко понимать последствия микса read/write команд
    рекомендуется не миксовать read/write команды, а делать раздельно массовые read и массовые write.

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

Эти ошибки постоянно совершаются всеми подряд.


 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

ChartNavigate при инициализации

Vladimir Karputov, 2018.06.25 18:52

Надо проверить...

...
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+

P./S.: В дополнение к вашему второму коду: перед тем как обновлять текстовую запись и публикацию через тот же коммент, проверьте, изменились ли данные. Если нет, оптимальнее отложить обновление текста и его публикацию.

Т.е., в данном случае - это изменился ли номер первого бара на графике

 
Vladimir Karputov:

Надо проверить...

Ммм. Не совсем понимаю, к чему это. Ну ОК. Установил. Проверил в режимах CHART_BEGIN и CHART_END. Все работает, как заявлено. После перезагрузки все ОК.

Или Вы клоните к тому, что нужно использовать костыль - проверять номер первого бара на графике после ChartNavigate и, если он не тот, который требуется запускать ChartNavigate повторно.

Да, выход, конечно, я тоже об этом думал. Но помнить постоянно о таких вот фичах терминала уже надоедает. Ведь вполне возможно, что это баг.

 
Dina Paches:

P./S.: В дополнение к вашему второму коду: перед тем как обновлять текстовую запись и публикацию через тот же коммент, проверьте, изменились ли данные. Если нет, оптимальнее отложить обновление текста и его публикацию.

Т.е., в данном случае - это изменился ли номер первого бара на графике

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

 
Ihor Herasko:

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

Пожалуйста. Но смотрите и другой мой пост, к которому цитируемый вами является постскриптумом. 

P./S.: Не обесценивайте, пожалуйста. Я у себя такие коды, зная о том, что это влечёт, уже не запущу. У меня техника - не казённая

 
Ihor Herasko:

Ммм. Не совсем понимаю, к чему это. Ну ОК. Установил. Проверил в режимах CHART_BEGIN и CHART_END. Все работает, как заявлено. После перезагрузки все ОК.

Или Вы клоните к тому, что нужно использовать костыль - проверять номер первого бара на графике после ChartNavigate и, если он не тот, который требуется запускать ChartNavigate повторно.

Да, выход, конечно, я тоже об этом думал. Но помнить постоянно о таких вот фичах терминала уже надоедает. Ведь вполне возможно, что это баг.

Раньше у меня навигация работала. Теперь вот специально приходится проверять.


ДОбавлено: про Comment внимание не обращайте :)

 
Vladimir Karputov:

Раньше у меня навигация работала. Теперь вот специально приходится проверять.


ДОбавлено: про Comment внимание не обращайте :)

Отчего же? Я написала/привела чушь?

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