Неправильное значение высоты чарта в пикселях

 

Доброго времени суток, прошу подсказать с проблемой.

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

ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result)

Проблема возникает преимущественно после перезагрузки ВПС сервера (на операционке Windows server 2012), например, высота в пикселях до перезагрузки и после перезагрузки неизменна, 340 пикселей, но до перезагрузки функция возвращает 340 пикселей, а после перезагрузки 282 пикселя, зайдя на ВПС сервер после его перезагрузки, функция начинает возвращать истинные 340 пикселей.

Почему функция возвращает неправильную высоту чарта в пикселях? От чего это зависит? Можно ли добиться возврата правильного значения всегда?

 
Проверяете ли результат выполнения функции? Я так понимаю, что нет.
 
Вы неправильно понимаете, возврат значения отличных от нуля из этой функции говорит о том что она выполняется
 
Vladimir Smorodintsev:
возврат значения отличных от нуля из этой функции говорит о том что она выполняется

Документация говорит совсем другое:

ChartGetInteger

возвращает true, если данное свойство поддерживается и значение было помещено в переменную long_var, иначе возвращает false. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().


Документация по MQL5: Операции с графиками / ChartGetInteger
Документация по MQL5: Операции с графиками / ChartGetInteger
  • www.mql5.com
Возвращает значение соответствующего свойства указанного графика. Свойство графика должно быть типов datetime, int или bool. Существует 2 варианта функции. 2. Возвращает true или false в зависимости от успешности выполнения функции.  В случае успеха значение свойства помещается в приемную переменную, передаваемую по ссылке последним параметром...
 
Ну да все правильно, как я и говорю, логично если функция возвращала бы false, значит значение не помещено в переменную long_var, а значит я бы на выходе получал бы 0 (то значение, которое было при инициализации), т.к. я получаю отличное от 0 значение, значит, функция вернула true
 

Отмечу еще, я пробовал использовать WinApi функцию, чтобы узнать высоту чарта в пикселях:

int handle = (int)ChartGetInteger(0,CHART_WINDOW_HANDLE);

GetWindowRect(handle,r);

Проверял ею параллельно, в результате все тоже самое, как и с помощью функции MQL.

Такая штука происходит не всегда, т.е. может пройти 3-4 перезагрузки ВПС сервера и проблем не будет

 

окно может быть:

  • развернуто в полный размер терминала
  • развернуто не в полный размер
  • свернуто
  • создано, но еще не рассчитаны размеры.
 

Проблема не с тем в каком состоянии окно, с этим проблем абсолютно никаких нет (свернуто, развернуто, закрыто или создается), а с тем что функция может вернуть неверное значение. Окно развернуто в полный размер терминала, удаленно запрашиваю график, вижу он корявый, вижу что по высоте размер выдает меньше на пикселей 20, захожу на ВПС сервер и затем выхожу и после данной магии функция выдает адекватные значения.

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

 
Vladimir Smorodintsev:

Проблема не с тем в каком состоянии окно, с этим проблем абсолютно никаких нет (свернуто, развернуто, закрыто или создается), а с тем что функция может вернуть неверное значение. Окно развернуто в полный размер терминала, удаленно запрашиваю график, вижу он корявый, вижу что по высоте размер выдает меньше на пикселей 20, захожу на ВПС сервер и затем выхожу и после данной магии функция выдает адекватные значения.

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

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

#property indicator_chart_window
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
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(rates_total);
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
    static long h = 0 ;
    long h_cur=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);
    if (h!=h_cur) Print(h_cur);
    h=h_cur;
  }
//+------------------------------------------------------------------+
я у себя на ВПС такого не встречал. 
код не предоставили, поэтому сложно судить. 
По опыту - чудес не бывает, а просто косяки в коде.
 
Vladimir Smorodintsev:

Доброго времени суток, прошу подсказать с проблемой.

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

ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result)

Проблема возникает преимущественно после перезагрузки ВПС сервера (на операционке Windows server 2012), например, высота в пикселях до перезагрузки и после перезагрузки неизменна, 340 пикселей, но до перезагрузки функция возвращает 340 пикселей, а после перезагрузки 282 пикселя, зайдя на ВПС сервер после его перезагрузки, функция начинает возвращать истинные 340 пикселей.

Почему функция возвращает неправильную высоту чарта в пикселях? От чего это зависит? Можно ли добиться возврата правильного значения всегда?

340 пикселей - максимизированный график. Тот, который наверху.

282 пикселя - график в обычном состоянии (normal) не максимизированный, либо не наверху. Приколы Windows и MFC. Многократно обсуждали

PS Обращение "доброго времени суток" должно означать, что вы в теме тонкостей программирования. А нельзя сказать просто: "Здравствуйте"?

 
Nikolai Semko:

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

я у себя на ВПС такого не встречал. 
код не предоставили, поэтому сложно судить. 
По опыту - чудес не бывает, а просто косяки в коде.

Назвал индикатор var_36, после перезагрузки когда захожу на ВПС сервер и тыкаю в соответствующее окно где расположен индикатор, значение становится истинным, в данном случае - 476 пикселей, повторил два раза:

1-ый случай

2-ой случай

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