MQL5におけるOOPに関する質問 - ページ 35

 
Roman:

もし、そのオブジェクトがタスクを完了したのなら、なぜそれをメモリに残すのでしょうか?
メモリリークが発生しないか?

特にOnDeinitでも削除されない場合は、そうなります。
本当に不要になったものは、メモリに保存する必要はないのです。しかし、1回のイテレーションでオブジェクトを作成し、使用することの方が多いのですが...。そして、2回目の繰り返しで......。といった具合に。そして、ある条件下で同じクラスの別のオブジェクトが作成され、すでにこのクラスの2つ以上のオブジェクトで作業し、それぞれがEAのライフサイクルを通じて必要とされるのです。

 
BlackTomcat:

特にOnDeinitでも削除されないと発生します。
本当に不要になったものは、メモリに保存する必要はないのです。しかし、1回のイテレーションでオブジェクトを作成し、使用することの方が多いのですが...。そして、2回目の繰り返しで......。といった具合に。そして、ある条件下で同じクラスの別のオブジェクトが作成され、すでにこのクラスの2つ以上のオブジェクトで作業し、それぞれがEAのライフサイクルを通じて必要とされるのです。

つまり、制御されたメモリーリークは、オブジェクトを再作成するよりも優れていると言いたいのですか?
つまり、制御されたデーモンと引き換えに、時間を節約すること?
後で失くさないようにするのは危険です。

 

専門家のテンプレートhttps://www.mql5.com/ru/forum/85652/page24#comment_13054686 を使って書きました。

非常に柔軟なテンプレートで、「2クリック」でさまざまな「プラス」を追加でき、コードも読みやすく論理的なものに仕上がりますが、しかし......。私は、良いクラスは静的メソッドを持つべきではないという、議論されたパラダイムに戻りました。

理屈はいいんだけど、実際は...。少なくともMQLの問題については、私の意見ではそうではありません。

テンプレートに従ってEAクラスを作成し、OnTick()で1つのパブリックメソッドを起動しました。 しかし、EAの初期化時に、オープンオーダーの有無を確認してピックアップしたいのです。

1. OnTick()の下に、ウィザード経由でオープンオーダーを見つけたらEAオブジェクトを作成し、オーダーが見つからなかったら基本ロジックに従ってEAオブジェクトを初期化する関数を書く - EAオブジェクトは取引時間内にのみ作成し、将来的にはTSのロジックを実装します。

2.項目1を実装した静的クラスをEAで作成する。


基本的に1と2は同じですが、違いはステップ1で、EAの初期化(最初の実行)時にのみ意味のある関数を追加していることです。

このメソッドは初期化にのみ必要で、EAオブジェクトが生成される瞬間を定義します。このメソッドにはマジックナンバーのみを渡してください。


静的なメソッドを使うのは、便利なんだけど......」というのが、私の考えです。というのは、大げさな話です。

 
Igor Makanu:

静的メソッドは、関数とスコープが異なるだけです。


このやり方は危険です

input int inInput = 0;

const bool Init = EventSetTimer(1);

void OnTimer()
{
  static int Input = inInput;
  
  Print(Input);
}


EA実行中に入力を変更しても、Inputは変更されません。

従って、この製品は

input long inMagic = 0;

void OnTick()
{
  static ORDER Orders[]; // Список ордеров по мэджику или что-то подобное, зависящая от входных.
}
 
fxsaber:

EA実行中に入力を変更しても、Inputは変更されません。

私のTSでは、EAが動作している間は入力パラメータを変更することはできません。

私の質問は純粋に理論的なもので、私はコードをオーバーロードしたくないので、私はどこかでクラッシュした後にTSを復元する可能性を探しています、今のところ私はこのように見ています。

input int EAMagicNumber = 12345;
class CEA
{
public:
   static bool       NeedRecovery(int magic_)            {   return(true);    }
   bool              Recovery(int magic_,int inputparam) {   return(true);    }
                     CEA()                               {                    }
                     CEA(int inputparam)                 {                    }
                    ~CEA()                               {                    }
};

CEA *ea;

void OnStart()
{
   if(CheckPointer(ea)==POINTER_INVALID)
   {
      if(CEA::NeedRecovery(EAMagicNumber))   //если нашли открытые ордера с магиком
      {
         ea = new CEA();         // создали объект
         ea.Recovery(EAMagicNumber,11111);   // запустили восстановление ТС
      }else ea = new CEA(2222222);           //обычный запуск
   }
 
Igor Makanu

このロジックをコンストラクタに押し込む方が理にかなっています。

 
fxsaber:

静的メソッドは、関数とスコープが異なるだけです。

また、クラスの非公開メンバーやメソッドへのアクセスも可能です。
 
TheXpert:
は、クラスの非公開メンバやメソッドにもアクセスできます。

ここで、用語の誤解があります。"見える範囲 "とは、誰がその方法を見るかということだけではありません。しかし、同時に彼自身が見ているものも。

 
fxsaber:

ここで、用語の誤解があります。

結局のところ、可視性とアクセスは異なる概念であり、混同しない方が良いのです
 
fxsaber:

このロジックをコンストラクタに入れる方が理にかなっています。

そうです、その方が良い解決策です!つまり、方法が1つ減るわけです。

そうあるべきなのです。

input int EAMagicNumber = 12345;
class CEA
{
public:
   static bool       NeedRecovery(int magic_)            {   return(true);    }  //тут проверки
                     CEA(int magic_)                     {                    }  //это обычный запуск если все ОК
                     CEA(int magic_, int recoveryparam)  {                    }  //тут аварийное восстановление
                    ~CEA()                               {                    } };

CEA *ea;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
{  if(CheckPointer(ea)==POINTER_INVALID)
   {  if(CEA::NeedRecovery(EAMagicNumber))   //если нашли откртые ордера с магиком
      {  
         ea = new CEA(EAMagicNumber,11111);  // запустили востановление ТС
      }
      else ea = new CEA(EAMagicNumber);      //обычный запуск
   } 
}
TheXpert です。
可視性とアクセスは異なる概念であり、混同しない方が良い。
そこで質問なのですが、最後の実行がクラッシュしたことを検出する方法をどこに置けばいいのでしょうか。現在、私のコード構造はコンパクトで、すべて私が上で示したパターンに明確に沿っています。