![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не, тут косяка с моей стороны никакого. Баг там.
Добавлено:
прежде чем такое писать, хотя бы проверяли, ЧТО ИМЕННО Вы делаете.
Не увлекайтесь #define - пишите явно:
Так идентично - не будет удалять.
Читаем справку по MQL5 и никуда больше не смотрим :). Шаг влево, шаг вправо - расстрел.
При этом, если сделать indicator_separate_window и объект засунуть в подокно - удаляется.
Пишите без #define - не Ваше это.
#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);
}
Работает в режиме советника и работает в режиме индикатораА вот так, как представил - нет.
Задаём имя объекта в виде переменной:
далее везде по коду не забываем про "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
//+------------------------------------------------------------------+
главное: Вы удаляете с графика объект - то есть Вы изменяете графическую информацию - значит нужно обновлять график:
А теперь прикол. После ChartRedraw объект, действительно, удаляется. А если ChartRedraw не делать - не удаляется!
Для подтверждения нажмите CTRL+B и выберите "Все". Объект можно даже поредактировать, чтобы убедиться, что это не фантом.
А теперь прикол. После ChartRedraw объект, действительно, удаляется. А если ChartRedraw не делать - не удаляется!
Для подтверждения нажмите CTRL+B и выберите "Все". Объект можно даже поредактировать, чтобы убедиться, что это не фантом.
Подождите пока откроются рынки. Потом в моём коде закомментируйте ChartRedraw и проверьте работоспособность.
Ну так тогда ChartRedraw будет происходить на каждом тике.
В Справку надо добавить, что после ObjectDelete удаление происходит только после явного или неявного вызова ChartRedraw.
Грубо говоря, ObjectDelete не удаляет объект, а устанавливает флаг "убиться" на следующем ChartRedraw (верно для индикаторов).
Ну так тогда ChartRedraw будет происходить на каждом тике.
В Справку надо добавить, что после ObjectDelete удаление происходит только после явного или неявного вызова ChartRedraw.
Грубо говоря, ObjectDelete не удаляет объект, а устанавливает флаг "убиться" на следующем ChartRedraw.
Слово "закомментируйте" означает следующее:
//| OnDeinit function |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
{
ResetLastError();
if(!ObjectDelete(0,CHARTNAME))
Print("Error #",GetLastError());
//ChartRedraw();
}
Удаление объекта и графическое изображение - это две разные сущности. Все команды к графикам - это асинхронные операции: это команды в один конец. То есть объект удалится, а вот чтобы ПЕРЕРИСОВАТЬ изображение графика нужно или дождаться обновления графика (нужны тики) или нужно принудительно ПЕРЕРИСОВАТЬ график.