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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Serhii Shevchuk
6428
Serhii Shevchuk  
Здравствуйте!

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

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
6428
Serhii Shevchuk  
Неужели никто не сталкивался с данной ситуацией?
Evgeny Belyaev
132965
Evgeny Belyaev  
Serhii Shevchuk:
Неужели никто не сталкивался с данной ситуацией?
Некоторые параметры графиков нельзя изменять. Какой терминал, 4 или 5?
Serhii Shevchuk
6428
Serhii Shevchuk  
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 при перемещении объекта "График" (какая вообще связь?) в документации ничего не нашёл.


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

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

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

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

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

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

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