Возвращается разная ширина графика.

 

Добрый день.

Столкнулся с тем, что CHART_WIDTH_IN_PIXELS возвращает разные значения, в зависимости от того, находится ли в фокусе чарт или нет. Вот простейший проверочный код в виде индикатора:

//+------------------------------------------------------------------+
//|                                            Test Width Pixels.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

long width_pixels;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
   
//---
   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);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Print("width pixels = ", width_pixels = ChartGetInteger(0, CHART_WIDTH_IN_PIXELS));
  }
//+------------------------------------------------------------------+

Допустим имеем несколько открытых графиков. На один из них вешаем индикатор, который выводит в лог ширину в пикселях. 


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


Кто подскажет, это решаемо или нет. МТ4 билд 1090.

p.s. Сейчас проверил в МТ5 (1940) тоже самое...

 
Ну если он не в фокусе значит мы его не наблюдаем. Тогда какие проблемы мы его не видим так пусть будет там что угодно. 
 
Evgeny Raspaev:
Ну если он не в фокусе значит мы его не наблюдаем. Тогда какие проблемы мы его не видим так пусть будет там что угодно. 

Если мы ошибку не видим, значит ошибки нет. Замечательно!

 

Попробуйте закрыть окна слева, "Обзор рыка" и второе, не понятно какое открыто. И после этого проверьте.

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

 
Alexey Kozitsyn:

Если мы ошибку не видим, значит ошибки нет. Замечательно!

А существует ли пока не в фокусе? может пока окошко не наблюдаем она в памяти принимает дефолтовое значение для экономии памяти? конечно это как бы ошибка. Но она не как не влияет на работоспособность. При открытии графика значение становятся актуальными, и соответственно все производные от нее тоже. ИМХО

 

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


Именно этот размер возвращается когда окно неактивно. А "неактивно" - это означает не развёрнуто на весь экран.

 
Alexey Viktorov:

Попробуйте закрыть окна слева, "Обзор рыка" и второе, не понятно какое открыто. И после этого проверьте.

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

Попробовал, закрыл все окна слева, результат тот же.

Vladimir Karputov:

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

Именно этот размер возвращается когда окно неактивно. А "неактивно" - это означает не развёрнуто на весь экран.

Да, проверил, действительно если окно не в фокусе, то возвращается размер свернутого окна (и по ширине тоже).

Но ведь это же не правильно. Когда окно развёрнуто и пользователь щёлкает по вкладкам открытых окон, он думает(и видит) что развернуты все окна графиков, а тут бац и с того окна где он только что был, и окно было развёрнуто идёт сообщение что размеры изменились, хотя он ничего для этого не делал...Кто-то скажет - так его всё равно не видно, какие проблемы? Особых проблем нет но всё же... Обнаружилось это, когда в индикаторе для построения графики нужно было использовать значения ширины графика, и соответственно отслеживать изменения его размеров. В результате получается эффект "плавающей" графики при переключении между окнами: смотришь на график с индикатором, вроде всё нормально отрисовано, переключаешься на другой график, а потом обратно на "свой", и видишь, что вся графика сместилась влево. Потом, с приходом нового события всё конечно восстанавливается на место, но ощущение что что-то не правильно остаётся...На пятёрке кстати наблюдается тоже самое, но там есть соответствующий инструментарий, и думаю(не проверял) этого "эффекта" можно избежать, на четвёрке так не получится...  

 
Sergey Kolemanov:

Попробовал, закрыл все окна слева, результат тот же.

Да, проверил, действительно если окно не в фокусе, то возвращается размер свернутого окна (и по ширине тоже).

Но ведь это же не правильно.***

Абсолютно правильно. Истинный размер окна в состоянии "Свернуть в окно". 

Когда Вы работаете в развёрнутом на весь экран окне Вы просто ВРЕМЕННО увеличиваете размеры окна, но истинный размер окна при этом не меняется. Истинный размер можно изменить только в режиме "Свернуть в окно".

Так было всегда и так будет.

 

Я тоже наблюдал такой эффект. 

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