初学者的问题 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对象。如果我销毁CCheck,我就会失去数组中的sample_objects。

我现在把这些CCheck对象推到另一个垃圾对象数组中,当我不再需要数组中的相应对象时,我就清除这些对象。但我得到了内存不足的错误,因为我必须在数组中保留大量沉重的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();
  }

本质:专家顾问在从一个时间框架切换到另一个时间框架时崩溃。在mt5中,没有这样的问题。

有什么解决办法吗?或者最好忘记mt4中的面板 :)

 
Vjacheslav Lapaev:

解决办法已经在论坛的某个地方出现了,但我找不到答案了。

谁找到了对付这个的 "解药"。


该代码是标准的。

本质:当我从一个时间框架切换到另一个时间框架时,专家顾问崩溃了。在mt5中,没有这样的问题。

有什么解决办法吗?或者最好忘记mt4中的面板 :)

可能对某人有一些用处。一句话,有一个专家,把它保存为指标,一切正常。我是指小组的代码。

 

下午好!

我以为可以直接打印一个数组,但我不记得了,也找不到怎么做。如何?

 
Nauris Zukas:

下午好!

我以为可以直接打印一个数组,但我不记得了,也找不到怎么做。如何?

阵列打印
 
Vladislav Andruschenko:
阵列打印

啊,这是在MQL5中,清楚地感谢!

 

我不明白你需要做什么来修复它。

4030是 "图形无响应"。

昨天还能用:( 唯一的区别是MT5正在进行并行优化(也使用定时器),但有空闲资源。这个专家顾问的图表根本就 "干净",没有任何东西附在上面。

 
Igor Zakharov:

唯一的区别是,MT5是并行优化的(它也使用定时器),但有免费资源。这个专家顾问的图表是 "干净的",没有任何东西附在上面。

我已经在5中停止了优化,而且很有效。难道不应该有任何联系吗?

 
这是我关于Unicode的问题。为什么它被擦掉了?
 
secret:
我关于Unicode的问题在这里。为什么会被删除?

让我给你介绍一下背景。

在问题中少一点表达,就不会被删除。这很简单:提出问题并不是要把你的消极情绪发泄在别人身上。你在一个社区里。
尊重你提出问题的地方,并期望得到一个答案,而不是主持人的反应。