記事「ソフトウェア開発におけるデザインパターンとMQL5(第4回):振る舞いに関するパターン2」についてのディスカッション

 

新しい記事「ソフトウェア開発におけるデザインパターンとMQL5(第4回):振る舞いに関するパターン2」はパブリッシュされました:

デザインパターンには、創造デザインパターン、構造デザインパターン、振る舞いに関するデザインパターンの3種類があることを説明しました。オブジェクト間の相互作用の方法を、コードをクリーンにする方法で設定するのに役立つ、残りの振る舞いに関するタイプのパターンを完成させます。

メメント

このセクションでは、行動デザインパターンとしてのメメントパターンを確認します。メメントパターンは、ロールバック機能を提供するためにオブジェクトの状態を外部化するために使うことができ、トークンとしても知られています。

パターンは何をするのか

メメントパターンを使えるのは、オブジェクトの状態のスナップショットを保存して後で復元する必要があるときや、状態を取得するための直接的なインターフェイスが実行の詳細を暴露してしまい、オブジェクトのカプセル化を壊してしまうようなときです。このパターンは、オブジェクトの状態をキャプチャして外部化し、後で復元できるようにします。

メメント


作者: Mohamed Abdelmaaboud

 



戦略パターンをExpert Advisorに実装してみたが、もしかしたら違う方法かもしれない。

これは、私たちの愛する読者の心のために、より実用的な例を与えることができ、私は多分私が概念的な間違いをした場合、あなたのフィードバックを得たいと思います:


Expert自体がオブジェクトであり、Contextになる:

  • ストラテジーを選択できるようにEnumを持っています(例としてSTRATEGY_RSI, STRATEGY_MA...)。
  • OnInit()の中で、ストラテジーの列挙に対してswitch文があり、その結果に応じて、次のようにする。

switch(strategyName)
        {
         case STRATEGY_RSI :
            m_strategy = new Strategy_RSI();
            break;
         case STRATEGY_MA :
            m_strategy = new Strategy_MA();
            break;
         default:
            break;
}

  • パラメータ・オブジェクト(mqlparamsのようなもの)を使って、ストラテジーに入力パラメータを設定します。
[...]
// エキスパートメソッドを通してシグナルパラメータをストラテジーに追加する
Expert.AddParameterObject(signal_RSI_Params); // signal_RSI_Params は、入力パラメータを内部に持つパラメータオブジェクトである。

//AddParameterObjectメソッドの詳細(簡略化):
bool CExpert::AddParameterObject(CParameter & parameter)
  {
         if(!m_strategy.AddParameterObject(parameter))
           {
            return(false);
           }
     }
   return true;
  }

// 一般的なエキスパートのパラメータを追加する。
Expert.InitStrategyParameters(expert_1_Params);

//メソッドの詳細(簡略化) :
bool CExpert::InitStrategyParameters(CParameter & expertParameters)
  {
// 
   if(!m_strategy.InitStrategyParameters(expertParameters))
     {
     [...]
      return false;
     }
   return true;
  }


  • すべてのストラテジーは同じメソッドを実装している(シグナルをオープンしたり、取引を終了したり...)。
  • すべてのストラテジーはシグナルまたはカスタム・インディケータを ロードできる。

エキスパートのOnTick関数で、汎用ストラテジーのメソッドを呼び出します。

bool CExpert::CheckOpenLong(void)
  {
    [...]
    if(true == m_strategy.CheckOpenLong([...]))
     {
      [...]
     }
    [...]
}


同じエキスパートを使って複数のストラテジーや最適化をテストできるので、とてもうまくいっています。

ただ、入力パラメータを別のファイルに置く以外に、ユーザーが特定の入力パラメータ(つまりストラテジーの入力)として選択しているものに応じて、入力パラメータを動的にロードする方法については、まだわかっていません。


私が実装した方法について、ストラテジー・パターンなのか、ハイブリッドなのか、何が改善されるのか、ご意見をお聞かせください。

また、(MT5では不可能だと思いますが)動的なコンテクスト入力パラメータを持つ方法をご存知ですか?


ありがとうございました。

ディドマ

 

大変勉強になる

 

同じ機能を持つ関数の名前が異なるのはなぜか
例えば次のように。


void Memento::SetState(string state)
  {
   m_state=state;
  }
  
  
void Originator::State(string state)
  {
   m_state=state;
  }