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

 
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 много тонкостей. Но вместе с тем он является очень продуманным.

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

 
Roman:

Билд 2530

На третьем вложении структуры, не появляется интеллисенс.

интеллект IntelliSense продолжает доставлять ))


т.е. одна подсказка это все, на что ты можешь рассчитывать 

 
Nikolai Karetnikov:

интеллект IntelliSense продолжает доставлять ))

т.е. одна подсказка это все, на что ты можешь рассчитывать 

Мой пост касался вложенных структур, на третьем вложении не появляется выбор интеллисенса.
Что очень печалит, так как вложенные структуры планировалось использовать как раз под выбор в интеллисенсе. 
А раз он не появляется, то нужно возвращаться в структуру, и смотреть что там за поля. Не айс. 
Хотелось бы чтоб поправили.

Что касается вашего примера, для стандартных MQL функций по моему в подсказках всё ясно.
Если не понятна подсказка, ставишь курсор на функцию и жмёшь F1

 
Mihail Matkovskij:

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

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

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

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

И опять у вас здесь:

    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;

потенциальная дырка, в которую потечёт. Посмотрите что возвращает метод Add()

(Понимаю, что тест, понимаю, что для проверки и так сойдёт, но уж коли проверять результат создания, то почему не проверять результат добавления? Дисциплинирует на будущее)
 
Artyom Trishkin:

И опять у вас здесь:

потенциальная дырка, в которую потечёт. Посмотрите что возвращает метод Add()

(Понимаю, что тест, понимаю, что для проверки и так сойдёт, но уж коли проверять результат создания, то почему не проверять результат добавления? Дисциплинирует на будущее)

Ну сделать так:

    trend = new CChartObjectTrend();
    if(trend.Create(0, "trend"+(string)i, 0, time[shift], low[shift], time[shift], high[shift])) {
      if(!listOfTrendLines.Add(trend))
        delete trend;
    }
    else
      delete trend;

Всё. Теперь нет дырки?

Это вообще тестовая программа и со своей задачей она справилась. Больше от нее мне ничего и не нужно. А если бы она была рабочей то и подход был бы другой и концепция совсем другая. Там и сообщения об ошибках идут из каждой критически важной точки с указанием строки (__LINE__) , а также имени функции (__FUNCTION__) ... Так что, иногда мне и отладкой пользоваться не обязательно. Просто смотрю, название модуля, номер строки, имя функции...

 

Всем доброго! Проблема следующая...

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

 
Artyom Trishkin:

И опять у вас здесь:

потенциальная дырка, в которую потечёт. Посмотрите что возвращает метод Add()

(Понимаю, что тест, понимаю, что для проверки и так сойдёт, но уж коли проверять результат создания, то почему не проверять результат добавления? Дисциплинирует на будущее)

А в каких случаях listOfTrendLines.Add может не сработать? Просто мне они не известны. Хоть я и придерживаюсь того принципа, где "лишних проверок не бывает" (с). Но можно гипотетически предположить , что это может дойти до паранойи. Ладно еще метод Create класса графического объекта может не сработать. Но он всегда отрабатывает чётко, если код написан грамотно и программа дает объектам нормальные имена. Но допустим, в его использовании могут быть косяки... Но как метод Add может вернуть фальшь в нормальных условиях. Или функция ArrayResize (которая, к стати, используется в данном методе), как она может вернуть результат отличный от new_size. Разве что только памяти не хватит... :) Но где вы видели современные устройства с таким большим дефицитом памяти?!... :)