Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 172

 

Здравствуйте.

Подскажите пожалуйста как правильно сделать.

Есть глобальная коллекция объектов:

CArrayObj array;

Есть дополнительный класс, где производится множество вычислений и в том числе создаются объекты и добавляются в коллекцию:

class CCheck : public CArrayObj
  {
  }
bool CCheck::SomeMethod(void)
  {
   CSample *sample_object=new CSample();
   array.Add(sample_object);
  }

Этот дополнительный объект класса CCheck я создаю регулярно в цикле. Но уничтожать его я не могу, т.к. мне нужны объекты CSample в коллекции array. Если я уничтожу CCheck, то у меня пропадут и объекты sample_object из array.

Сейчас я эти объекты CCheck засовываю в другой массив объектов garbage, который очищаю тогда, когда мне больше не нужны соответствующие объекты в array. Но из-за этого я получаю ошибку out of memory, т.к. приходится держать множество тяжелых объектов CCheck в массиве. Хотя весь объект мне не нужен, а нужны илшь созданные в нем объекты CSample. Подскажите, как это правильно сделать, чтоб мне сохранять только объекты CSample, а CCheck я мог бы удалять. Чего-то я не разберусь.

Примерно такой код:

CArrayObj array;
CArrayObj gargage_array;

void OnTick()
  {
   for(int i=0;i<total;i++)
     {
      CCheck *check_obj=new CCheck();
      check_obj.Check();
      garbage_array.Add(check_obj);
     }
   if(..)
     {
      array.Clear();
      garbage_array.Clear();
     }
  }

class CCheck : public CArrayObj
  {
   public:
   void         Check(void);
   protected:
   bool         SomeMethod(void);
  };
void CCheck::Check(void)
  {
   ...
   SomeMethod();
  }
bool CCheck::SomeMethod(void)
  {
   CSample *sample_object=new CSample();
   array.Add(sample_object);
  }

class CSample : public CObject
  {
  };
 

Решение где-то было уже на форуме, но ответ найти не могу.

Кто нашёл "противоядие" против вот этого:

Стандартная панель

Код стандартный:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {   
//--- create application dialog
      if(!ExtDialog.Create(0,"For Example ",0,40,40,760,400))
      //return(INIT_FAILED);
      return(false);            // исключительно для того, чтобы продемонстрировать наложение "панелей"
//---
//--- run application
   ExtDialog.Run();
//--- succeed
//-----
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy dialog
   ExtDialog.Destroy(reason);
//---
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // event ID  
                  const long& lparam,   // event parameter of the long type
                  const double& dparam, // event parameter of the double type
                  const string& sparam) // event parameter of the string type
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
   ChartRedraw();
  }

Суть: вылетает Эксперт при переходе с одного таймфрейма на другой. В мт5 такой беды нет. 

Существует ли решение? ... Или лучше забыть про Панели в мт4 :)

 
Vjacheslav Lapaev:

Решение где-то было уже на форуме, но ответ найти не могу.

Кто нашёл "противоядие" против вот этого:


Код стандартный:

Суть: вылетает Эксперт при переходе с одного таймфрейма на другой. В мт5 такой беды нет. 

Существует ли решение? ... Или лучше забыть про Панели в мт4 :)

Может быть кому и пригодится. Суть, был Эксперт, сохранил как Индикатор, всё работает. Имеется ввиду код для Панели.

 

Добрый день!

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

 
Nauris Zukas:

Добрый день!

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

ArrayPrint
 
Vladislav Andruschenko:
ArrayPrint

Ах, это было в МQL5, ясно спасибо!

 

Не пойму что нужно сделать, чтоб исправить:

4030 это "график не отвечает".

Вчера работало :( Единственная разница - идёт оптимизация МТ5 параллельно (тоже использует таймер), но ресурсы свободные есть. График с этим экспертом вообще "чистый", ничего к нему не прикреплено.

 
Igor Zakharov:

 Единственная разница - идёт оптимизация МТ5 параллельно (тоже использует таймер), но ресурсы свободные есть. График с этим экспертом вообще "чистый", ничего к нему не прикреплено.

Остановил оптимизацию в пятерке - заработало. Вроде не должно быть связи?

 
Здесь был мой вопрос про юникод. Зачем его потерли?
 
secret:
Здесь был мой вопрос про юникод. Зачем его потерли?

Позволю себе небольшой ликбез:

Поменьше экспрессии в вопросах, и они не будут удалены. Всё же просто: задать вопрос - это не вылить на других свой негатив. Вы в обществе находитесь.
Уважайте место, в котором вопросы задаёте свои и ожидаете получить на них ответ, а не реакцию модератора.

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