CHART_SHOW_OHLC для OBJ_CHART - страница 2

 
fxsaber:
Не, тут косяка с моей стороны никакого. Баг там.
Читаем справку по MQL5 и никуда больше не смотрим :). Шаг влево, шаг вправо - расстрел.
 
Karputov Vladimir:

Добавлено:

#define CHARTNAME 0"ObjChart"

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

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

string name_chart="ObjChart";
Так идентично - не будет удалять.
 
fxsaber:
Так идентично - не будет удалять.
Пишите без #define - не Ваше это.
 
Karputov Vladimir:
Читаем справку по MQL5 и никуда больше не смотрим :). Шаг влево, шаг вправо - расстрел.
Работает в режиме советника и работает в режиме индикатора
fxsaber:

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

А вот так, как представил - нет.
 
Karputov Vladimir:
Пишите без #define - не Ваше это.
Ага, не мое. Вот теперь мое
#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots 0

void OnInit()
{
  ObjectCreate(0, "ObjChart", OBJ_CHART, 0, 0, 0);
}

void OnDeinit( const int Reason )
{
  ObjectDelete(0, "ObjChart");
}

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);
}
Не удаляется объект - баг.
 
fxsaber:
Работает в режиме советника и работает в режиме индикатораА вот так, как представил - нет.

Задаём имя объекта в виде переменной:

string CHARTNAME="ObjChart";

далее везде по коду не забываем про "0" и главное: Вы удаляете с графика объект - то есть Вы изменяете графическую информацию - значит нужно обновлять график:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#define INDICATOR // закомментировать, если нужно запускаться в режиме эксперта

string CHARTNAME="ObjChart";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ObjectCreate(0,CHARTNAME,OBJ_CHART,0,0,0);

   const long Chart=ObjectGetInteger(0,CHARTNAME,OBJPROP_CHART_ID);

   ChartSetInteger(Chart,CHART_SHOW_OHLC,false);

   ChartRedraw(Chart);
  }
//+------------------------------------------------------------------+
//| OnDeinit function                                                |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   ResetLastError();
   if(!ObjectDelete(0,CHARTNAME))
      Print("Error #",GetLastError());
   ChartRedraw();
  }

#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
//+------------------------------------------------------------------+

 


 

 
Karputov Vladimir:

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

А теперь прикол. После ChartRedraw объект, действительно, удаляется. А если ChartRedraw не делать - не удаляется!

Для подтверждения нажмите CTRL+B и выберите "Все". Объект можно даже поредактировать, чтобы убедиться, что это не фантом.

 
fxsaber:

А теперь прикол. После ChartRedraw объект, действительно, удаляется. А если ChartRedraw не делать - не удаляется!

Для подтверждения нажмите CTRL+B и выберите "Все". Объект можно даже поредактировать, чтобы убедиться, что это не фантом.

Подождите пока откроются рынки. Потом в моём коде закомментируйте ChartRedraw и проверьте работоспособность.
 
Karputov Vladimir:
Подождите пока откроются рынки. Потом в моём коде закомментируйте ChartRedraw и проверьте работоспособность.

Ну так тогда ChartRedraw будет происходить на каждом тике.

В Справку надо добавить, что после ObjectDelete удаление происходит только после явного или неявного вызова ChartRedraw.

Грубо говоря, ObjectDelete не удаляет объект, а устанавливает флаг "убиться" на следующем ChartRedraw (верно для индикаторов).

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

Ну так тогда ChartRedraw будет происходить на каждом тике.

В Справку надо добавить, что после ObjectDelete удаление происходит только после явного или неявного вызова ChartRedraw.

Грубо говоря, ObjectDelete не удаляет объект, а устанавливает флаг "убиться" на следующем ChartRedraw.

Слово "закомментируйте" означает следующее:

//+------------------------------------------------------------------+
//| OnDeinit function                                                |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   ResetLastError();
   if(!ObjectDelete(0,CHARTNAME))
      Print("Error #",GetLastError());
   //ChartRedraw();
  }

Удаление объекта и графическое изображение - это две разные сущности. Все команды к графикам - это асинхронные операции: это команды в один конец. То есть объект удалится, а вот чтобы ПЕРЕРИСОВАТЬ изображение графика нужно или дождаться обновления графика (нужны тики) или нужно принудительно ПЕРЕРИСОВАТЬ график.