初心者の方からの質問 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();
  }

本質:Expert Advisorは、ある時間枠から別の時間枠に切り替えるとクラッシュします。mt5では、そのような問題はありません。

解決策はあるのでしょうか?あるいは、mt4のPanelのことは忘れたほうがいい :)

 
Vjacheslav Lapaev:

解決策はすでに掲示板のどこかにあったのですが、答えが見つかりません。

これに対する "解毒剤 "を見つけたのは誰なのか。


コードは標準的なものです。

本質:Expert Advisorは、あるタイムフレームから別のタイムフレームに切り替えるとクラッシュします。mt5では、そのような問題はありません。

解決策はあるのでしょうか?あるいは、mt4のPanelのことは忘れたほうがいい :)

もしかしたら、誰かが使ってくれるかもしれない。結論から言うと、Expertがあり、Indicatorとして保存し、すべてがうまくいきました。Panelのコードという意味です。

 

こんにちは。

配列を表示するだけでも可能だと思ったのですが、思い出せず、やり方がわかりません。どうやって?

 
Nauris Zukas:

こんにちは。

配列を表示するだけでも可能だと思ったのですが、思い出せず、やり方がわかりません。どうやって?

アレイプリント
 
Vladislav Andruschenko:
アレイプリント

あ、MQL5であったんですね!はっきり言ってありがとうございます。

 

何をどうすれば直るのか理解できない。

4030は「チャートが応答しません」です。

昨日はうまくいきました :( MT5が並列で最適化 されている(タイマーも使っている)のが唯一の違いですが、空きリソースが ありますね。このExpert Advisorを使ったチャートは全く「きれい」で、何も付いていません。

 
Igor Zakharov:

唯一の違いは、MT5は並列で最適化されている(タイマーも使用する)ことですが、空きリソースが あります。このExpert Advisorのチャートは「クリーン」であり、何も添付されていません。

5で最適化を止めたので、効果があります。何か繋がりがあってはいけないのでしょうか?

 
ここで、Unicodeについて質問させていただきました。なぜ揉み消されたのか?
 
secret:
Unicodeについての質問はこちらでした。なぜ削除されたのですか?

少し背景を説明します。

質問の表現をもう少し少なくすれば、削除されることはない。単純な話、質問をすることは、自分のネガティブな気持ちを他人にぶつけることではないのです。コミュニティーの中にいるんですね。
質問をする場所を尊重し、モデレーターの反応ではなく、回答が得られることを期待する。