Особенности работы OBJ_CHART

 
Здравствуйте!

Столкнулся с неприятными явлениями при работе с объектом "График".

1. При попытках скрыть шкалу цены и/или шкалу времени, это ни к чему не приводит. Шкала продолжает присутствовать.
//--- скроем шкалу времени
   ObjectSetInteger(0,name,OBJPROP_DATE_SCALE,false);
//--- скроем шкалу цены
   ObjectSetInteger(0,name,OBJPROP_PRICE_SCALE,false);
2. Если график был смещён при помощи ChartNavigate(), то после изменения координат объекта смещение сбрасывается, как если бы была включена автопрокрутка. Хотя, автопрокрутка была выключена.

Привожу полный код скрипта.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string name="Chart";
   int x=100;
   int y=100;
   int width=320;
   int height=240;
   int shift=-200;
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим объект "График"
   if(!ObjectCreate(0,name,OBJ_CHART,1,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать объект \"График\"! Код ошибки = ",GetLastError());
      return;
     }
//--- установим координаты объекта
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер объекта
   ObjectSetInteger(0,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,height);  
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
//--- установим символ
   ObjectSetString(0,name,OBJPROP_SYMBOL,_Symbol);
//--- установим период
   ObjectSetInteger(0,name,OBJPROP_PERIOD,_Period);
//--- скроем шкалу времени
   ObjectSetInteger(0,name,OBJPROP_DATE_SCALE,false);
//--- скроем шкалу цены
   ObjectSetInteger(0,name,OBJPROP_PRICE_SCALE,false);
//--- отобразим на переднем плане
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
//--- отключим режим перемещения метки мышью
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
//--- перерисуем график и подождем 1 секунду
   ChartRedraw();
   Sleep(1000);
//--- получим ID графика "Chart"
   long chart_id = 0;
   ResetLastError();
   if(ObjectGetInteger(0,name,OBJPROP_CHART_ID,0,chart_id)==false)
     {
      Print(__FUNCTION__,
            ": не удалось получить ID графика \"Chart\"! Код ошибки = ",GetLastError());
      return;
     }
//--- отключим отступ правого края графика
   ChartSetInteger(chart_id,CHART_SHIFT,false);    
//--- отключим автопрокрутку
   ChartSetInteger(chart_id,CHART_AUTOSCROLL,false);  
//--- перерисуем график  
   ChartRedraw();
//--- сдвинем график на заданное число баров  
   if(!ChartNavigate(chart_id,CHART_END,shift))
      Print(__FUNCTION__+", Error Code = ",GetLastError());
//--- перерисуем график  
   ChartRedraw();        
//--- задержка в 2 секунды
   Sleep(2000);
//--- изменение координат объекта
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x+1);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y+2);
   ChartRedraw();
//--- задержка в 4 секунды
   Sleep(3000);
//--- удаление объекта
   ObjectDelete(0,name);
  }
Ситуация со шкалами непонятная, но не критичная.

А вот со смещением хотелось бы разобраться. Что я не так делаю? Как переместить объект "График", чтобы смещение в барах этого самого графика осталось прежним?
 
Неужели никто не сталкивался с данной ситуацией?
 
Serhii Shevchuk:
Неужели никто не сталкивался с данной ситуацией?
Некоторые параметры графиков нельзя изменять. Какой терминал, 4 или 5?
 
Evgeny Belyaev:
Некоторые параметры графиков нельзя изменять. Какой терминал, 4 или 5?
Терминал 5.

Все ньюансы, описанные в документации, учтены.

Здесь указано, что для объекта "График" не работают свойства CHART_SHOW_DATE_SCALE и CHART_SHOW_PRICE_SCALE. Но я вместо них использую:
   ObjectSetInteger(chart_ID,name,OBJPROP_DATE_SCALE,false);
   ObjectSetInteger(chart_ID,name,OBJPROP_PRICE_SCALE,false);
Собственно, так и показано в примере. Это что касается осей.

О самостоятельном сбросе сдвига, установленного через ChartNavigate при перемещении объекта "График" (какая вообще связь?) в документации ничего не нашёл.


 
кстати и мой камешек про граф.объекты (БАГ, по крайней мере 4-ки, о котором стоит знать)

ручная граф. разметка на понедельник сделанная например в пятницу/субботу, в понедельник-же утром обращается в тыкву ;-) Короче терминал неверно/неочевидно считает дату следующей сессии при расстановке объектов

 
 
Serhii Shevchuk:
Здравствуйте!

Столкнулся с неприятными явлениями при работе с объектом "График".

1. При попытках скрыть шкалу цены и/или шкалу времени, это ни к чему не приводит. Шкала продолжает присутствовать.
//--- скроем шкалу времени
   ObjectSetInteger(0,name,OBJPROP_DATE_SCALE,false);
//--- скроем шкалу цены
   ObjectSetInteger(0,name,OBJPROP_PRICE_SCALE,false);
Все работает, курите OBJPROP_CHART_ID.
 
Maxim Kuznetsov:
кстати и мой камешек про граф.объекты (БАГ, по крайней мере 4-ки, о котором стоит знать)

ручная граф. разметка на понедельник сделанная например в пятницу/субботу, в понедельник-же утром обращается в тыкву ;-) Короче терминал неверно/неочевидно считает дату следующей сессии при расстановке объектов

 
также и в МТ5 - это из-за отсутствия свечей на выходных... Надо заново перерисовывать. (делать проверку в рисующей программе)
 
Спасибо за обращение. С объектом чарта будем разбираться.
 

Простой скрипт. На основном графике создается объект "График" и каждые 2 секунды в нем происходит смена символа из MarketWatch.

Почему ChartRedraw(objID) по id этого объекта "График" не работает?

Вызываю ли эту функцию или она закомментирована - задержки смены символа внутри графического объекта примерно одинаковы.

Работает нормально только с ChartRedraw( ). Но мне не нужна перерисовка всего графика и всех объектов на нем.

Что не так в моем коде?

Для анимации нужно кликнуть на картинке, проблемы видны после смены 5-го символа, видно что в журнал вывод с равными интервалами, а на графике - нет ровности.



void OnStart() 
{
  long chartID = ChartID();
  string name = "objChart";
  
  ObjectCreate(0, name, OBJ_CHART, 0, 20, 20);
  ObjectSetInteger(chartID, name, OBJPROP_YDISTANCE, 30);
  
  for(int i = 0; i < 10; ++i)
  {
    string symb = SymbolName(i, true);
    long objID = ObjectGetInteger(chartID, name, OBJPROP_CHART_ID);
    ObjectSetString(chartID, name, OBJPROP_SYMBOL, symb);
    
    Print(__FUNCTION__, " chartID=", chartID,  " objID=", objID, " Symb=", symb);
    ChartRedraw(objID);
    Sleep(2000);
  }
  
  ObjectsDeleteAll(ChartID(), name);
}
 
Vasiliy Pushkaryov #:

Простой скрипт. На основном графике создается объект "График" и каждые 2 секунды в нем происходит смена символа из MarketWatch.

Почему ChartRedraw(objID) по id этого объекта "График" не работает?

Вызываю ли эту функцию или она закомментирована - задержки смены символа внутри графического объекта примерно одинаковы.

Работает нормально только с ChartRedraw( ). Но мне не нужна перерисовка всего графика и всех объектов на нем.

Что не так в моем коде?

Для анимации нужно кликнуть на картинке, проблемы видны после смены 5-го символа, видно что в журнал вывод с равными интервалами, а на графике - нет ровности.

ChartRedraw принимает айди чарта, а не объекта.

 
Andrey Khatimlianskii #:

ChartRedraw принимает айди чарта, а не объекта.

Отсюда можно понять, что должно работать



И вот исключения


Про ChartRedraw() ничего не сказано.