Проблема с ChartTimePriceToXY

 

Всем привет, 


проблему нашел только в терминале МТ4 - в МТ5 все нормально работает, написал в сервисдеск

 

есть на графике линия, эта линия имеет координаты - Цена

при изменении масштаба графика по идее цена не изменяется, но изменяется координаты Y данной линии.

для этого есть функция ChartTimePriceToXY - которая преобразует цену в координаты Y

так вот мне кажется она не работает, ибо код:

      int newx,newy;
      ChartRedraw();
      ChartTimePriceToXY(0,0,ObjectGetInteger(0,"targetmouseline",OBJPROP_TIME1),ObjectGetDouble(0,"targetmouseline",OBJPROP_PRICE1),newx,newy);
      Comment(TimeCurrent()+"=newx="+newx+" newy="+newy);

 

 при нанесении линии на график - меняется newY а вот при изменении масштаба - эта цифра не меняется 

 при чем в нижнем положении графика эта цифра равна 110

а в верхнем цифра равна 150  

 

 

 

 

 

 

 

Кто работал с этой функцией? были ли у Вас траблы?  

Файлы:
08.09111.jpg  80 kb
08.092222.jpg  54 kb
 

обнаружил, что все время возвращается ошибка 4051 при использовании кода:

ChartTimePriceToXY(0,0,ObjectGetInteger(0,"targetmouseline",OBJPROP_TIME1),ObjectGetDouble(0,"targetmouseline",OBJPROP_PRICE1),newx,newy);
 
Недавно порешил проблему с масштабированием заменой ChartRedraw на задержку в 3 сек по таймеру - попробуйте, может и вам поможет
 

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

проблему нашел только в терминале МТ4 - в МТ5 все нормально работает, написал в сервисдеск

 
Vladislav Andruschenko:

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

И я о том же - пока пытасло как белый человек использовать (ChartRedraw + OnChartEvent), получал для построения фигуры дефективные координаты. А когда как абизяна вставил тупую задержку в 3 сек по OnTimer, получил нормально отмасштабированные координаты
 
:) спасибо попробую. 
 
Vladislav Andruschenko:
Вы не корректно наносите объекты, не учитываете точку привязки, ну а второе и самое важное, эта функция ассинхронная и разработчик менять ее не будет.
 
Konstantin Karpov:
Вы не корректно наносите объекты, не учитываете точку привязки, ну а второе и самое важное, эта функция ассинхронная и разработчик менять ее не будет.
Как можно неправильно нанести линию ? Проблема в функции мт4. В мт5 все ок. Менять ее не надо ее надо правильно сделать.
 

Вот код советника в котором есть обработка события OnChartEvent:

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   int newx,newy;
      ChartTimePriceToXY(0,0,ObjectGetInteger(0,"targetmouseline",OBJPROP_TIME1),ObjectGetDouble(0,"targetmouseline",OBJPROP_PRICE1),newx,newy);
      Comment(TimeCurrent()+"=newx="+newx+" newy="+newy);

  }
//+------------------------------------------------------------------+

изменяется как координата Х, так и координата Y.

 
При использовании этой функции нужно следить, чтобы объект был в пределах видимости экрана. Иначе функция возвращает ошибку. Или, чтобы не заморачиваться, можно просто по факту обрабатывать полученную ошибку после преобразования. Хотя, на мой взгляд, лучше проверить нахождение передаваемых цены и времени в пределах экрана перед вызовом функции, чтобы избежать лишних вычислений.
 
Игорь Герасько:
При использовании этой функции нужно следить, чтобы объект был в пределах видимости экрана. Иначе функция возвращает ошибку. Или, чтобы не заморачиваться, можно просто по факту обрабатывать полученную ошибку после преобразования. Хотя, на мой взгляд, лучше проверить нахождение передаваемых цены и времени в пределах экрана перед вызовом функции, чтобы избежать лишних вычислений.
Совершенно правильно. А ещё - функция корректно отрабатывает и в МТ4 и в МТ5. Бывают, конечно, пограничные случаи, но это относится к особенностям устройства операционной системы Windows: изменение размера окна при сворачивании/раскрытии.