Ошибки, баги, вопросы - страница 2796

 
Mihail Matkovskij:

Вам на форуме больше нечем заняться, Алексей, кроме того что, передергивать мои сообщения, чтобы они походили на претензии к разработчикам от моего имени?... Мне интересно, чем был вызван такой столь странный "энтузиазм" с вашей стороны? Лучше новичкам бы помогали с их вопросами в соответствующих ветках, чем здесь ерундой заниматься!...

Но всё же, вы чётко написали "баг". Это говорит о сообщаемой вами недоработке платформы, а не о непрочтении вами до логического конца документации.

 
Artyom Trishkin:

Но всё же, вы чётко написали "баг". Это говорит о сообщаемой вами недоработке платформы, а не о непрочтении вами до логического конца документации.

Ну да, перепутал. Примечание в описании функции ObjectDelete читал, а то что всё дело в нем как то не подумал... С кем не бывает?...

Но это всё хождение по кругу. Точнее, хождение вокруг того, что я неправильно написал или перепутал... Но о том как данный баг решить почему-то никто не сказал ни слова... Разумеется, кроме предложенной функции ObjectsDeleteAll, для которой мне придётся переделывать весь проект, чего бы мне меньше всего хотелось.

 
Mihail Matkovskij:

Ну да, перепутал. Примечание в описании функции ObjectDelete читал, а то что всё дело в нем как то не подумал... С кем не бывает?...

Бывает...

 

Mihail Matkovskij:

... О том как данный баг решить почему-то никто не сказал ни слова... Разумеется, кроме предложенной функции ObjectsDeleteAll, для которой мне придётся переделывать весь проект, чего бы мне меньше всего хотелось.

Попробуйте всё же использовать префикс для имён графических объектов - это нормальная практика идентификации своих объектов. По префиксу проверяете мусор с одновременным его удалением.

Добавление префикса к именам объектов потребует переделать весь проект?

Вы в процедурном стиле пишете? Так и в нём не так сложно изменить функции создания имён объектов.

 
Artyom Trishkin:

Попробуйте всё же использовать префикс для имён графических объектов - это нормальная практика идентификации своих объектов. По префиксу проверяете мусор с одновременным его удалением.

Добавление префикса к именам объектов потребует переделать весь проект?

Хорошо, если других вариантов нет, буду пробовать.

Artyom Trishkin:

Вы в процедурном стиле пишете? Так и в нём не так сложно изменить функции создания имён объектов.

Сизифов труд?... :)


Спасибо Рашиду Умарову за помощь в поиске причины бага моего индикатора!
 
Mihail Matkovskij:

Вам на форуме больше нечем заняться, Алексей, кроме того что, передергивать мои сообщения, чтобы они походили на претензии к разработчикам от моего имени?... Мне интересно, чем был вызван столь странный "энтузиазм" с вашей стороны? Лучше новичкам бы помогали с их вопросами в соответствующих ветках, чем здесь ерундой заниматься!...

Так вот вам и пытаюсь помочь. Вам и объясняю в чём вы не правы. Попробуйте другой вариант удаления графических объектов и у вас всё наладится. И пропадут все баги о которых вы говорили. Тут и передёргивать ничего не надо, вы сказали, я процитировал.

 
Alexey Viktorov:

Так вот вам и пытаюсь помочь. Вам и объясняю в чём вы не правы. Попробуйте другой вариант удаления графических объектов и у вас всё наладится. И пропадут все баги о которых вы говорили. Тут и передёргивать ничего не надо, вы сказали, я процитировал.

Я вам пытаюсь помочь и заодно беспочвенно обвинить, не забывайте добавлять. Я спросил, чем был вызван столь маниакальный энтузиазм, но вы мне почему-то не ответили! Почему вы уходите от ответа, Алексей?

 
Mihail Matkovskij:

Я вам пытаюсь помочь и заодно беспочвенно обвинить, не забывайте добавлять. Я спросил, чем был вызван столь маниакальный энтузиазм, но вы мне почему-то не ответили! Почему вы уходите от ответа, Алексей?

Давно-бы замолчал и я не продолжал-бы.

Вот моя откровенная попытка помочь без намёков на обвинения.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alexey Viktorov, 2020.07.11 17:12

А не может получиться так, что цикл длится дольше чем отведено времени на выполнение OnDeinit?

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

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   );

А в ответ что? Почитайте свои ответы.
 
Alexey Viktorov:

Давно-бы замолчал и я не продолжал-бы.

А... Вот она причина обвинений в мой адрес! Понятно... :)

Alexey Viktorov:
А в ответ что? Почитайте свои ответы.

Там всё в порядке. Единственное, я поначалу отказался от использования данной функции. И это вас смутило, наверное?... Ну что-ж, тогда, извините... :)

 

Подставил функцию ObjectDeleteAll сначала в свой пример:

//+------------------------------------------------------------------+
//|                                           DeleteChartObjects.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"
#property indicator_chart_window

#property indicator_plots 0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

#include <ChartObjects\ChartObjectsLines.mqh>
#include <Arrays\ArrayObj.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- input parameters
input int      nBars = 100000;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int customN_Bars = 0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CArrayObj listOfTrendLines;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  int totalBars = iBars(NULL, PERIOD_CURRENT);
  customN_Bars = (nBars < totalBars) ? nBars : totalBars;
//---
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[]
) {
  CChartObjectTrend * trend;
  int delta = rates_total - customN_Bars;
  int shift;
  int i;
  for(i = 0; i < customN_Bars; i++) {
    shift = delta + customN_Bars - i - 1;
    trend = new CChartObjectTrend();
    if(trend.Create(0, "trend"+(string)i, 0, time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
    else
      delete trend;
  }
  return(rates_total);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  
  ObjectsDeleteAll(0, "trend", 0, OBJ_TREND);
  
  CChartObjectTrend * trend;
  
  int i = listOfTrendLines.Total() - 1;
  for(; i >= 0; i--) {
    trend = dynamic_cast <CChartObjectTrend *> (listOfTrendLines.At(i));
    
    if(CheckPointer(trend) == POINTER_INVALID)
      continue;
    
    delete trend;
  }
}
//+------------------------------------------------------------------+

Затем в индикатор.

Artyom Trishkin:

Добавление префикса к именам объектов потребует переделать весь проект?

Оказалось использовать ObjectDeleteAll в моём проекте проще простого. Для удаления всех объектов достаточно было поменять префикс всего 3 раза и, соответственно, 3 раза вызвать ObjectDeleteAll. И, в результате, график чист. В языке MQL5 много тонкостей. Но вместе с тем он является очень продуманным.

Спасибо всем, кто оказывал мне помощь в решении данной проблемы!

Причина обращения: