CHART_SHOW_OHLC для OBJ_CHART

 
В эту тему были перенесены комментарии, не относящиеся к "Ошибки, баги, вопросы".
 
Не работает CHART_SHOW_OHLC для OBJ_CHART.
 
fxsaber:
Не работает CHART_SHOW_OHLC для OBJ_CHART.

Неправда, работает. 

И, пожалуйста, не экономьте чернила и бумагу - выкладывайте сразу код при помощи которого Вы проверяете, а также информацию про билд терминала и операционную систему (после перезагрузки терминала брать первый три строчки из вкладки "Журнал" терминала). 

 
Karputov Vladimir:

Неправда, работает.

Ну и зачем голословно говорить неправду? Вы бы сначала проверяли, а потом отвечали.

#define CHARTNAME 0, "ObjChart"

void OnInit()
{
  ObjectCreate(CHARTNAME, OBJ_CHART, 0, 0, 0);
  
  ChartSetInteger(ObjectGetInteger(CHARTNAME, OBJPROP_CHART_ID), CHART_SHOW_OHLC, false);
}

void OnDeinit( const int Reason )
{
  ObjectDelete(CHARTNAME);
}

2016.10.20 08:18:54.807 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.10.20 08:18:54.807 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 10494 / 16301 Mb, HDD: 4980 / 30000 Mb, GMT+02:00
2016.10.20 08:18:54.807 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)


 

 
fxsaber:
Не работает CHART_SHOW_OHLC для OBJ_CHART.
fxsaber:

Ну и зачем голословно говорить неправду? Вы бы сначала проверяли, а потом отвечали.

Вот так попробуйте (третий параметр - номер подокна):

::ChartSetInteger(sub_chart_id,CHART_SHOW_OHLC,0,false);
 
Anatoli Kazharski:

Вот так попробуйте (третий параметр - номер подокна):

::ChartSetInteger(sub_chart_id,CHART_SHOW_OHLC,0,false);

Работает, Спасибо! Только вот в Справку хочется кинуть чем-нибудь. Нет там этого.

ChartSetString и ChartSetDouble - та же фигня?

Документация по MQL5: Операции с графиками / ChartSetInteger
Документация по MQL5: Операции с графиками / ChartSetInteger
  • www.mql5.com
Операции с графиками / ChartSetInteger - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:

Ну и зачем голословно говорить неправду? Вы бы сначала проверяли, а потом отвечали.

#define CHARTNAME 0, "ObjChart"

void OnInit()
{
  ObjectCreate(CHARTNAME, OBJ_CHART, 0, 0, 0);
  
  ChartSetInteger(ObjectGetInteger(CHARTNAME, OBJPROP_CHART_ID), CHART_SHOW_OHLC, false);
}

void OnDeinit( const int Reason )
{
  ObjectDelete(CHARTNAME);
}

2016.10.20 08:18:54.807 Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
2016.10.20 08:18:54.807 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 10494 / 16301 Mb, HDD: 4980 / 30000 Mb, GMT+02:00
2016.10.20 08:18:54.807 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)


 

 После отдачи команды нужно обновить объект-чарт: 

 

//+------------------------------------------------------------------+
//|                                                    OBJ_CHART.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- описание
#property description "Скрипт создает объект \"График\"."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string           InpName="Chart";             // Имя объекта
input string           InpSymbol="EURUSD";          // Символ
input ENUM_TIMEFRAMES  InpPeriod=PERIOD_H1;         // Период
input ENUM_BASE_CORNER InpCorner=CORNER_LEFT_UPPER; // Угол для привязки
input int              InpScale=2;                  // Масштаб
input bool             InpDateScale=true;           // Отображение шкалы времени
input bool             InpPriceScale=true;          // Отображение шкалы цены
input color            InpColor=clrRed;             // Цвет рамки при выделении
input ENUM_LINE_STYLE  InpStyle=STYLE_DASHDOTDOT;   // Стиль линии при выделении
input int              InpPointWidth=1;             // Размер точки для перемещений
input bool             InpBack=false;               // Объект на заднем плане
input bool             InpSelection=true;           // Выделить для перемещений
input bool             InpHidden=true;              // Скрыт в списке объектов
input long             InpZOrder=0;                 // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает объект "График"                                          |
//+------------------------------------------------------------------+
bool ObjectChartCreate(const long              chart_ID=0,               // ID графика
                       const string            name="Chart",             // имя объекта
                       const int               sub_window=0,             // номер подокна
                       const string            symbol="EURUSD",          // символ
                       const ENUM_TIMEFRAMES   period=PERIOD_H1,         // период
                       const int               x=0,                      // координата по оси X
                       const int               y=0,                      // координата по оси Y
                       const int               width=300,                // ширина
                       const int               height=200,               // высота
                       const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол для привязки
                       const int               scale=2,                  // масштаб
                       const bool              date_scale=true,          // отображение шкалы времени
                       const bool              price_scale=true,         // отображение шкалы цены
                       const color             clr=clrRed,               // цвет рамки при выделении
                       const ENUM_LINE_STYLE   style=STYLE_SOLID,        // стиль линии при выделении
                       const int               point_width=1,            // размер точки перемещения
                       const bool              back=false,               // на заднем плане
                       const bool              selection=false,          // выделить для перемещений
                       const bool              hidden=true,              // скрыт в списке объектов
                       const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим объект "График"
   if(!ObjectCreate(chart_ID,name,OBJ_CHART,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": не удалось создать объект \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим координаты объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим размер объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим символ
   ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol);
//--- установим период
   ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period);
//--- установим масштаб
   ObjectSetInteger(chart_ID,name,OBJPROP_CHART_SCALE,scale);
//--- отобразим (true) или скроем (false) шкалу времени
   ObjectSetInteger(chart_ID,name,OBJPROP_DATE_SCALE,date_scale);
//--- отобразим (true) или скроем (false) шкалу цены
   ObjectSetInteger(chart_ID,name,OBJPROP_PRICE_SCALE,price_scale);
//--- установим цвет рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линии рамки при включенном режиме выделения объекта
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим размер точки привязки, с помощью которой можно перемещать объект
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,point_width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);

   ResetLastError();
   if(!ChartSetInteger(ObjectChartGetID(chart_ID,name),CHART_SHOW_OHLC,false))
      Print("Error #",GetLastError());
   ChartRedraw(ObjectChartGetID(chart_ID,name));
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Устанавливает символ и таймфрейм объекта "График"                |
//+------------------------------------------------------------------+
bool ObjectChartSetSymbolAndPeriod(const long            chart_ID=0,       // ID графика (не объекта)
                                   const string          name="Chart",     // имя объекта
                                   const string          symbol="EURUSD",  // символ
                                   const ENUM_TIMEFRAMES period=PERIOD_H1) // таймфрейм
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- установим символ и таймфрейм объекта "График"
   if(!ObjectSetString(chart_ID,name,OBJPROP_SYMBOL,symbol))
     {
      Print(__FUNCTION__,
            ": не удалось установить символ для объекта \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_PERIOD,period))
     {
      Print(__FUNCTION__,
            ": не удалось установить период для объекта \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Перемещает объект "График"                                       |
//+------------------------------------------------------------------+
bool ObjectChartMove(const long   chart_ID=0,   // ID графика (не объекта)
                     const string name="Chart", // имя объекта
                     const int    x=0,          // координата по оси X
                     const int    y=0)          // координата по оси Y
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- переместим объект
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x))
     {
      Print(__FUNCTION__,
            ": не удалось переместить X-координату объекта \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y))
     {
      Print(__FUNCTION__,
            ": не удалось переместить Y-координату объекта \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Изменяет размер объекта "График"                                 |
//+------------------------------------------------------------------+
bool ObjectChartChangeSize(const long   chart_ID=0,   // ID графика (не объекта)
                           const string name="Chart", // имя объекта
                           const int    width=300,    // ширина
                           const int    height=200)   // высота
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- изменим размеры объекта
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width))
     {
      Print(__FUNCTION__,
            ": не удалось изменить ширину объекта \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height))
     {
      Print(__FUNCTION__,
            ": не удалось изменить высоту объекта \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Возвращает ID объекта "График"                                   |
//+------------------------------------------------------------------+
long ObjectChartGetID(const long   chart_ID=0,   // ID графика (не объекта)
                      const string name="Chart") // имя объекта
  {
//--- подготовим переменную для получения ID объекта "График"
   long id=-1;
//--- сбросим значение ошибки
   ResetLastError();
//--- получим ID
   if(!ObjectGetInteger(chart_ID,name,OBJPROP_CHART_ID,0,id))
     {
      Print(__FUNCTION__,
            ": не удалось получить ID объекта \"График\"! Код ошибки = ",GetLastError());
     }
//--- возврат результата
   return(id);
  }
//+------------------------------------------------------------------+
//| Удаляет объект "График"                                          |
//+------------------------------------------------------------------+
bool ObjectChartDelete(const long   chart_ID=0,   // ID графика (не объекта)
                       const string name="Chart") // имя объекта
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- удалим кнопку
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": не удалось удалить объект \"График\"! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- получим количество символов в "Обзоре рынка"
   int  symbols=SymbolsTotal(true);
//--- определим, есть ли символ с указанным именем в списке символов
   bool exist=false;
   for(int i=0;i<symbols;i++)
      if(InpSymbol==SymbolName(i,true))
        {
         exist=true;
         break;
        }
   if(!exist)
     {
      Print("Ошибка! Данный символ ",InpSymbol," не представлен в окне \"Обзор Рынка\"!");
      return;
     }
//--- проверка входных параметров на корректность
   if(InpScale<0 || InpScale>5)
     {
      Print("Ошибка! Некорректные значения входных параметров!");
      return;
     }

//--- размеры окна графика
   long x_distance;
   long y_distance;
//--- определим размеры окна
   if(!ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance))
     {
      Print("Не удалось получить ширину графика! Код ошибки = ",GetLastError());
      return;
     }
   if(!ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance))
     {
      Print("Не удалось получить высоту графика! Код ошибки = ",GetLastError());
      return;
     }
//--- установим координаты объекта "График" и его размер
   int x=(int)x_distance/16;
   int y=(int)y_distance/16;
   int x_size=(int)x_distance*7/16;
   int y_size=(int)y_distance*7/16;
//--- создадим объект "График"
   if(!ObjectChartCreate(0,InpName,0,InpSymbol,InpPeriod,x,y,x_size,y_size,InpCorner,InpScale,InpDateScale,
      InpPriceScale,InpColor,InpStyle,InpPointWidth,InpBack,InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- перерисуем график и подождем 1 секунду
   ChartRedraw();
   Sleep(1000);
//--- растянем объект "График"
   int steps=(int)MathMin(x_distance*7/16,y_distance*7/16);
   for(int i=0;i<steps;i++)
     {
      //--- изменим размеры
      x_size+=1;
      y_size+=1;
      if(!ObjectChartChangeSize(0,InpName,x_size,y_size))
         return;
      //--- проверим факт принудительного завершения скрипта
      if(IsStopped())
         return;
      //--- перерисуем график и подождем 0.01 секунды
      ChartRedraw();
      Sleep(10);
     }
//--- задержка в полсекунды
   Sleep(500);
//--- изменим таймфрейм графика
   if(!ObjectChartSetSymbolAndPeriod(0,InpName,InpSymbol,PERIOD_M1))
      return;
   ChartRedraw();
//--- задержка в три секунды
   Sleep(3000);
//--- удалим объект
   ObjectChartDelete(0,InpName);
   ChartRedraw();
//--- подождем 1 секунду
   Sleep(1000);
//---
  }
//+------------------------------------------------------------------+

Добавлено: это стандартный пример.  

Файлы:
OBJ_CHART.mq5  28 kb
 
fxsaber:

Работает, Спасибо! Только вот в Справку хочется кинуть чем-нибудь. Нет там этого.

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

Karputov Vladimir:

 После отдачи команды нужно обновить объект-чарт: 

А вот это пашет, Спасибо!

Только вот баг нарисовался в случае индикатора.

#define INDICATOR // закомментировать, если нужно запускаться в режиме эксперта

#define CHARTNAME 0, "ObjChart"

void OnInit()
{
  ObjectCreate(CHARTNAME, OBJ_CHART, 0, 0, 0);
  
  const long Chart = ObjectGetInteger(CHARTNAME, OBJPROP_CHART_ID);
  
  ChartSetInteger(Chart, CHART_SHOW_OHLC, false);
  
  ChartRedraw(Chart);
}

void OnDeinit( const int Reason )
{
  ObjectDelete(CHARTNAME);
}

#ifdef INDICATOR

#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots 0

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);
}

#endif

Не удаляется объект.

При этом, если сделать indicator_separate_window и объект засунуть в подокно - удаляется.

 
fxsaber:

Поторопился, не работает.

А вот это пашет, Спасибо!

Только вот баг нарисовался в случае индикатора.

#define INDICATOR // закомментировать, если нужно запускаться в режиме эксперта

#define CHARTNAME 0, "ObjChart"

void OnInit()
{
  ObjectCreate(CHARTNAME, OBJ_CHART, 0, 0, 0);
  
  const long Chart = ObjectGetInteger(CHARTNAME, OBJPROP_CHART_ID);
  
  ChartSetInteger(Chart, CHART_SHOW_OHLC, false);
  
  ChartRedraw(Chart);
}

void OnDeinit( const int Reason )
{
  ObjectDelete(CHARTNAME);
}

#ifdef INDICATOR

#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots 0

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);
}

#endif

 Не удаляется объект.

Вы пишите на MQL5, читайте, пожалуйста, справку:

bool  ObjectDelete(
   long    chart_id,     // идентификатор графика
   string  name          // имя объекта
   );


 Нельзя же так: не читаю справку, косячить на каждом шаге, а потом подымать пыль!

Добавлено:

#define CHARTNAME 0, "ObjChart"

прежде чем такое писать, хотя бы проверяли, ЧТО ИМЕННО Вы делаете.

Не увлекайтесь  #define - пишите явно:

string name_chart="ObjChart";
 
Karputov Vladimir:

Нельзя же так: не читаю справку, косячить на каждом шаге, а потом подымать пыль!

Не, тут косяка с моей стороны никакого. Баг там.
 
fxsaber:
Не, тут косяка с моей стороны никакого. Баг там.

Добавлено:

#define CHARTNAME 0"ObjChart"

прежде чем такое писать, хотя бы проверяли, ЧТО ИМЕННО Вы делаете.

Не увлекайтесь  #define - пишите явно:

string name_chart="ObjChart";