English Русский 中文 Español Deutsch Português
ユニバーサルEA:グループでの取引とストラテジーのポートフォリオを管理する(その4)

ユニバーサルEA:グループでの取引とストラテジーのポートフォリオを管理する(その4)

MetaTrader 5 | 27 7月 2016, 16:23
709 0
Vasiliy Sokolov
Vasiliy Sokolov

目次

 

イントロダクション

しばしば、アルゴリズムの動作を同時に行い、他のアルゴリズムの行動によって影響されるべきではない、アルゴリズムを作成する必要があります。実行可能EX5モジュールに、いくつかのアルゴリズムを組み合わせる必要がある場合に、この状況が発生します。取引ストラテジーのエンジンを構築するときに考慮しなければならないアルゴリズムの特徴として - その見かけのシンプルさにもかかわらず、これらのタスクは、いくつかの重要な"落とし穴"があることです。

CStrategy取引エンジンは、2つ以上のトレーディングストラテジーの共同動作を実現するアルゴリズムが含まれています。このシリーズの第4部で詳細に説明します。同時に取引のリスクを多様化するために、EAの取引のグループ - また、<I0>トレーディング・プロファイルを作成します。CStrategyListクラス - CStrategy型のコンテナは - ストラテジーの同時動作を提供するアルゴリズムに属します。ストラテジー工場 - は、ストラテジーのXMLベースのプレゼンテーションをアップロードするだけでなく、動的に対応するメソッドを使用して作成できます。

添付のビデオでは、MT5のストラテジーテスターで複数のストラテジーをテストするプロセスを示しています。取引エンジンに基づいて、すべてのストラテジーは、チャートから独立したストラテジーを制御するのに役立つ、デフォルトのカスタムパネルがあります。

 

CStrategyListストラテジーマネージャー

「ユニバーサルEA」シリーズの第2の記事では、CStrategyクラスとその主なモジュールを説明しました。モジュールに実装され、このクラスおよびその機能を使用することにより、すべての継承されたストラテジーは、統一された取引ロジックで維持されます。しかし、ロボットを使用して取引プロセスを整理することは、要求以上のものです。EX5モジュール内のいくつかのアルゴリズムの動作を確保することが重要です。

CStrategyListクラスは、この目的のために使用されます。その名前から推測できるように、このクラスは、CStrategy型ストラテジーのリストを提供していますが、通常のデータコンテナの操作よりもやや複雑です。モジュールは、次のタスクを解決します。

  • いくつかの取引ストラテジーの同時動作を保証します。
  • 各ストラテジーのインスタンスにトレードイベントを配信します。
  • ストラテジー(データデシリアライズ)のXMLリストからストラテジーオブジェクトを作成します。
  • EAの設定に使用されるカスタムパネルとの相互作用。

CStrategyListクラスのヘッダは、次のとおりです。

//+------------------------------------------------------------------+
//| Containerクラスは、CStrategy型のストラテジーを管理します|
//+------------------------------------------------------------------+
class CStrategyList
  {
private:
   CLog*       Log;                 //ログ
   CArrayObj   m_strategies;        // CStrategy型のストラテジー
   CLimits*    m_limits;
   void        ParseStrategies(CXmlElement* xmlStrategies, bool load_curr_symbol);
   void        ParseLimits(CXmlElement* xmlLimits);
   CStrBtn     StrButton;   
public:
   CStrategyList(void);
   ~CStrategyList(void);
   void LoadStrategiesFromXML(string xml_name, bool load_curr_symbol);
   bool AddStrategy(CStrategy* strategy);
   int  Total();
   CStrategy* At(int index);
   void OnTick();
   void OnTimer();
   void OnBookEvent(string symbol);
   void OnDeinit(const int reason);
   void OnChartEvent(const int id,
                     const long &lparam,
                     const double &dparam,
                     const string &sparam);
                     

  };

ご覧の通り、提示される方法のほとんどは、トレードのイベントのハンドルです。同じタイプの内容を有しています。そのうちの一つ、OnBookEventを分析してみましょう:

//+------------------------------------------------------------------+
//| | OnBookEventは、リストされたすべてのストラテジーに送信します
//+------------------------------------------------------------------+
void CStrategyList::OnBookEvent(string symbol)
  {
   for(int i=0; i<m_strategies.Total(); i++)
     {
      CStrategy *strategy=m_strategies.At(i);
      strategy.OnBookEvent(symbol);
     }
  }

内容からわかるように、リスト内のストラテジーを検索し、ストラテジーのそれぞれに適切なイベントを呼び出します。他のイベントメソッドの動作は同様です。

イベントの通過に加えて、CStrategyListは、XMLファイルから特別な手順でローディングストラテジーを実行します。どのように動作するかの詳細については、次のセクションをお読みください。

 

XMLリストから読み込むストラテジー。ストラテジーのポートフォリオ

EX5モジュールは、複数の取引アルゴリズムが含まれている場合、ストラテジーポートフォリオを生成するツールが必要です。異なるパラメータを持つ2つのアルゴリズムがモジュールで取引したとします。どのようにこれらのパラメータを設定すればよいでしょうか?最も簡単な方法は、出力にEAのプロパティウィンドウ内の各ストラテジーのパラメータを用いることです。多くのストラテジーに、多くのパラメータがあり、それぞれが何をするでしょう?この場合、異なるフラグ、文字列やコメントをパラメータのリストは巨大になります。つまり、EAの取引のパラメータウィンドウの3つのストラテジーは、次のようになります:

図1。EAの取引のパラメータ3つのストラテジーのリスト

EAは、さらに多くのストラテジーを使用することができます。この場合、パラメータのリストは想像を絶する大きさを有することができます。ポートフォリオの第2の重要な側面は、フローのストラテジーの作成です。パラメータの異なる2組と同じストラテジーを実行するとします。何をすべきでしょう?明らかに、パラメータは異なるセットにもかかわらず、これらの2つのストラテジーは、同じストラテジーです。手動での各ストラテジーを作成する代わりに、別のクラスにこの作業を委託することができます。自動的にストラテジーオブジェクトを作成し、それを適切に設定することができます。

「フローのストラテジー」を作成する前に、その説明をすることが必要です。以下の詳細を含める必要があります。

  • ストラテジーの名前。
  • ユニークなストラテジーIDまたはそのマジックナンバー。
  • ストラテジーが実行されているシンボル。
  • ストラテジーの時間枠。
  • ストラテジーのユニークなパラメータのリスト(各ストラテジーのための個々のリスト)。

ストラテジーの詳細は、上記のリストに加えて他の特性を含んむ可能性があります。このような記述を提供する最良の方法は、XMLを使用することです。この言語は特別な記述ツールとして作成されています。取引ストラテジーのオブジェクトがXMLドキュメントに変換することができるように、複雑なオブジェクトを記述することができ、ストラテジーに変換することができます。例えば、XMLドキュメントに基づいて、ストラテジーを作成し、適切にそのパラメータを設定することができます。MQL5からドキュメントのこのタイプで作業するために、コードベースで利用可能な XML-パーサーライブラリを使用する必要があります。

ここでは、異なるパラメータを持つ3つの移動平均のストラテジーをロードし、ポートフォリオのXML記述の例を示します。

<Global>
        <Strategies>
                <Strategy Name="MovingAverage" Magic="100" Timeframe="PERIOD_M1" Symbol="Si">
                        <TradeStateStart>Stop</TradeStateStart>
                        <Params>
                                <FastMA>1</FastMA>
                                <SlowMA>3</SlowMA>
                                <Shift>0</Shift>
                                <Method>MODE_SMA</Method>
                                <AppliedPrice>PRICE_CLOSE</AppliedPrice>
                        </Params>
                </Strategy>
                <Strategy Name="MovingAverage" Magic="101" Timeframe="PERIOD_M5" Symbol="SBRF">
                        <TradeStateStart>BuyOnly</TradeStateStart>
                        <Params>
                                <FastMA>15</FastMA>
                                <SlowMA>21</SlowMA>
                                <Shift>0</Shift>
                                <Method>MODE_SMA</Method>
                                <AppliedPrice>PRICE_CLOSE</AppliedPrice>
                        </Params>
                </Strategy>
                <Strategy Name="MovingAverage" Magic="102" Timeframe="PERIOD_M15" Symbol="GAZR">
                        <TradeStateStart>BuyAndSell</TradeStateStart>
                        <Params>
                                <FastMA>12</FastMA>
                                <SlowMA>45</SlowMA>
                                <Shift>1</Shift>
                                <Method>MODE_EMA</Method>
                                <AppliedPrice>PRICE_CLOSE</AppliedPrice>
                        </Params>
                </Strategy>
        </Strategies>
</Global>

ストラテジーの各<ストラテジー>ユニットを形成します。次の属性はシンボル、時間枠、マジックとストラテジーの名前が指定されています。上記の例から、3つのストラテジーのそれぞれが、独自のシンボル、マジックナンバーと時間枠を持っています。これらの必要なパラメータに加えて、他のストラテジーのプロパティは、XMLリストで指定されています。セクション<TradeStateStart>は、ストラテジーの立ち上げ時の取引モードを指定します。セクション<params>は、ストラテジーのパラメータが含まれています。

取引エンジンは、起動時に上記のXMLファイルからの取引ストラテジーをロードしようとします。ストラテジーがロードされ、LoadStrategiesFromXMLメソッドで、CStrategyListクラス内で、このドキュメントに基づいて作成します。すべての関連するメソッドは、以下のとおりです。

//+------------------------------------------------------------------+
//|渡されたXMLファイルの「xml_name」|
//|load_curr_symbolフラグをtrueに設定すると、ロードします|
//||シンボル内のストラテジーは現在に対応します
//| symbol CurrentSymbol()                                           |
//+------------------------------------------------------------------+
void CStrategyList::LoadStrategiesFromXML(string xml_name,bool load_curr_symbol)
  {
   CXmlDocument doc;
   string err;
   bool res=doc.CreateFromFile(xml_name,err);
   if(!res)
      printf(err);
   CXmlElement *global=GetPointer(doc.FDocumentElement);
   for(int i=0; i<global.GetChildCount(); i++)
     {
      CXmlElement* child = global.GetChild(i);
      if(child.GetName() == "Strategies")
         ParseStrategies(child,load_curr_symbol);
     }
  }
//+------------------------------------------------------------------+
//|| XMLストラテジーを解析
//+------------------------------------------------------------------+
void CStrategyList::ParseStrategies(CXmlElement *xmlStrategies,bool load_curr_symbol)
  {
   CParamsBase *params=NULL;
   for(int i=0; i<xmlStrategies.GetChildCount(); i++)
     {
      CXmlElement *xStrategy=xmlStrategies.GetChild(i);
      if(CheckPointer(params)!=POINTER_INVALID)
         delete params;
      params=new CParamsBase(xStrategy);
      if(!params.IsValid() || (params.Symbol()!=Symbol() && load_curr_symbol))
         continue;
      CStrategy *str=CStrategy::GetStrategy(params.Name());
      if(str==NULL)
         continue;
      str.ExpertMagic(params.Magic());
      str.ExpertSymbol(params.Symbol());
      str.Timeframe(params.Timeframe());
      str.ExpertName(params.Name());
      string name=str.ExpertName();
      CXmlElement *xml_params=xStrategy.GetChild("Params");
      if(xml_params!=NULL)
         str.ParseXmlParams(xml_params);
      CXmlElement *xml_mm=xStrategy.GetChild("MoneyManagment");
      if(xml_mm!=NULL)
        {
         if(!str.MM.ParseByXml(xml_mm))
           {
            string text="Strategy "+str.ExpertName()+" (Magic: "+(string)str.ExpertMagic()+") load MM from XML failed";
            CMessage *msg=new CMessage(MESSAGE_WARNING,__FUNCTION__,text);
            Log.AddMessage(msg);
           }
        }
      CXmlElement *xml_regim=xStrategy.GetChild("TradeStateStart");
      if(xml_regim!=NULL)
        {
         string regim=xml_regim.GetText();
         if(regim=="BuyAndSell")
            str.TradeState(TRADE_BUY_AND_SELL);
         else if(regim=="BuyOnly")
            str.TradeState(TRADE_BUY_ONLY);
         else if(regim=="SellOnly")
            str.TradeState(TRADE_SELL_ONLY);
         else if(regim=="Stop")
            str.TradeState(TRADE_STOP);
         else if(regim=="Wait")
            str.TradeState(TRADE_WAIT);
         else if(regim=="NoNewEntry")
            str.TradeState(TRADE_NO_NEW_ENTRY);
         else
           {
            string text="For strategy "+str.ExpertName()+" (Magic: "+(string)str.ExpertMagic()+
                        ") set not correctly trade state: "+regim;
            CMessage *msg=new CMessage(MESSAGE_WARNING,__FUNCTION__,text);
            Log.AddMessage(msg);
           }
        }
      AddStrategy(str);
     }
   if(CheckPointer(params)!=POINTER_INVALID)
      delete params;
  }

メソッドの中で最も興味深い部分は、特別な静的メソッドのストラテジーです。::CStrategyを使用したストラテジーの作成です。ストラテジーの名前がパラメータとして渡されるべきです。このメソッドは、この名前に関連付けられたストラテジーの特定のインスタンスを返します。このメソッドは、ストラテジーのオブジェクトが作成される前に、アクセスを可能にするために、静的にされています。GetStrategyがあるため、それに新しいストラテジーを追加する時から編集する必要があります。取引エンジンの他の部分とは異なり、個別のヘッダファイルに記述されて取得します。ストラテジーをXMLからロードする場合は、その作成手順は、このメソッドに直接追加する必要があります。このヘッダファイルのソースコードは、次のとおりです。

//+------------------------------------------------------------------+
//|                                              StrategyFactory.mqh |
//|                                 Copyright 2015, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
/*
   GetStrategyは、ストラテジーの工場です。特定の名前に対応するストラテジーオブジェクトを作成します。
   このメソッドは、オートメーションの目的で使用する別のファイルに含まれています。
*/
#include <Strategy\Strategy.mqh>
#include <Strategy\Samples\MovingAverage.mqh>
#include <Strategy\Samples\ChannelSample.mqh>

CStrategy *CStrategy::GetStrategy(string name)
  {
   if(name=="MovingAverage")
      return new CMovingAverage();
   if(name=="BollingerBands")
      return new CChannel();
   CLog *mlog=CLog::GetLog();
   string text="Strategy with name "+name+" not defined in GetStrategy method. Please define strategy in 'StrategyFactory.mqh'";
   CMessage *msg=new CMessage(MESSAGE_ERROR,__FUNCTION__,text);
   mlog.AddMessage(msg);
   return NULL;
  }

ストラテジーが作成されると、<params>セクションから必要なパラメータで初期化する必要があります。各ストラテジーのパラメータが一意であるため、取引エンジンのレベルでこれらのパラメータを初期化することは不可能です。代わりに、ストラテジーの基本クラスが仮想メソッド ParseXmlParamsを呼び出すことができます。戦略がこのメソッドをオーバーライドしてXMLノードなどのパラメータのリストを解析した場合、それ自身のパラメータに必要な値を指定することができるようになります。例として、 CMovingAverageのParseXmlParamsメソッドを見てみましょう。(このアルゴリズムは、この記事の最初の章で説明されている2つの移動平均値に基づいたトレードストラテジーです)。

//+------------------------------------------------------------------+
//|2つの移動平均に基づいた古典的なストラテジーの例。 |
//|短期MAが長期MAを横切る場合|
//|買いを実行 逆の場合売り                      |
//+------------------------------------------------------------------+
class CMovingAverage : public CStrategy
  {
   ...
public:
   virtual bool      ParseXmlParams(CXmlElement *params);
  };
//+------------------------------------------------------------------+
//||ストラテジーの具体的なパラメータは、それの内側に渡されます
//|CStrategyからオーバーライドされたメソッド|
//+------------------------------------------------------------------+
bool CMovingAverage::ParseXmlParams(CXmlElement *params)
  {
   bool res=true;
   for(int i=0; i<params.GetChildCount(); i++)
     {
      CXmlElement *param=params.GetChild(i);
      string name=param.GetName();
      if(name=="FastMA")
        {
         int fastMA=(int)param.GetText();
         if(fastMA == 0)
           {
            string text="Parameter 'FastMA' must be a number";
            CMessage *msg=new CMessage(MESSAGE_WARNING,SOURCE,text);
            Log.AddMessage(msg);
            res=false;
           }
         else
            FastMA.MaPeriod(fastMA);
        }
      else if(name=="SlowMA")
        {
         int slowMA=(int)param.GetText();
         if(slowMA == 0)
           {
            string text="Parameter 'SlowMA' must be a number";
            CMessage *msg=new CMessage(MESSAGE_WARNING,SOURCE,text);
            Log.AddMessage(msg);
            res=false;
           }
         else
            SlowMA.MaPeriod(slowMA);
        }
      else if(name=="Shift")
        {
         FastMA.MaShift((int)param.GetText());
         SlowMA.MaShift((int)param.GetText());
        }
      else if(name=="Method")
        {
         string smethod=param.GetText();
         ENUM_MA_METHOD method=MODE_SMA;
         if(smethod== "MODE_SMA")
            method = MODE_SMA;
         else if(smethod=="MODE_EMA")
            method=MODE_EMA;
         else if(smethod=="MODE_SMMA")
            method=MODE_SMMA;
         else if(smethod=="MODE_LWMA")
            method=MODE_LWMA;
         else
           {
            string text="Parameter 'Method' must be type of ENUM_MA_METHOD";
            CMessage *msg=new CMessage(MESSAGE_WARNING,SOURCE,text);
            Log.AddMessage(msg);
            res=false;
           }
         FastMA.MaMethod(method);
         SlowMA.MaMethod(method);
        }
      else if(name=="AppliedPrice")
        {
         string price=param.GetText();
         ENUM_APPLIED_PRICE a_price=PRICE_CLOSE;
         if(price=="PRICE_CLOSE")
            a_price=PRICE_CLOSE;
         else if(price=="PRICE_OPEN")
            a_price=PRICE_OPEN;
         else if(price=="PRICE_HIGH")
            a_price=PRICE_HIGH;
         else if(price=="PRICE_LOW")
            a_price=PRICE_LOW;
         else if(price=="PRICE_MEDIAN")
            a_price=PRICE_MEDIAN;
         else if(price=="PRICE_TYPICAL")
            a_price=PRICE_TYPICAL;
         else if(price=="PRICE_WEIGHTED")
            a_price=PRICE_WEIGHTED;
         else
           {
            string text="Parameter 'AppliedPrice' must be type of ENUM_APPLIED_PRICE";
            CMessage *msg=new CMessage(MESSAGE_WARNING,SOURCE,text);
            Log.AddMessage(msg);
            res=false;
           }
         FastMA.AppliedPrice(a_price);
         SlowMA.AppliedPrice(a_price);
        }
     }
   return res;
  }

このストラテジーの詳細については、カスタムストラテジーの一連の3番目の記事に記載されています。

ストラテジー作成のメカニズムを使用して、毎回ストラテジーのセットを設定し、ファイルからロードすることが可能です。XMLファイルにその実行パラメータのセットを保存する自己最適化アルゴリズムを書くことができます。取引エンジンは、起動時にこのファイルを読み込み、ストラテジーのセットを形成します。

 

カスタムパネルを使用したストラテジーを管理

ユーザの視点から見ると、ストラテジーはカスタムパネルを使用して制御することができます。このパネルには、EAのローンチ後、チャート上に表示される取引アルゴリズムの簡単な操作を実行することができます:

  • ストラテジーの取引モードを変更します。
  • 要求のボリュームの買いか売り・

EAが何らかの理由で適切なアクションの実行に失敗した場合、後者のオプションは有用であり、その状態を同期する必要があります。

カスタムパネルの作成とクラスとダイアログボックスは、議論の対象の範囲を超えています。パネル接続に関する基本的な側面を記述します。

EAのコントロールパネルは、別々に実装されている CPanelのようなリスト、ボタンやテキストラベルなどの各種制御を含みます。GUIを作成するためのすべてのクラスは、<data_folder>\MQL5\Include\Panelでご利用いただけます。パネル操作を確保するためには、EAのmq5ファイルに直接OnChartEventイベントを処理させる必要があります。チャートイベントのハンドラは、CStrategyListクラスにあるので、OnChartEventでこのハンドラを呼び出します。

CStrategyListのマネージャ。
...

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   Manager.OnChartEvent(id,lparam,dparam,sparam);
  }

CStrategyListで、これらのイベントのハンドラは、パネルに直接送信します。

パネル上のボタンをクリックすると、アクションが実行されます。ストラテジーのリストからストラテジーを選択した場合、現在のストラテジーのインデックスは1に等しくなり、さらに取引のアクションを実行することができます。たとえば、ストラテジーモードのドロップダウンリストから適切なオプションを選択することによって、選出されたストラテジーの取引モードを変更することができます。

図2。選択されたストラテジーのモードのリスト

図2。選択されたストラテジーのモードのリスト

選択したストラテジーに代わって、買いと売りが同じように行われます。CStrategyへのポインタがBuyとSellを呼び出します。これらのメソッドは、渡されたボリュームを買ったり売ったりします。この場合は、マジックナンバーは、ストラテジーのマジックナンバーに対応して行われ、EAからの取引を区別することは不可能です。

ユーザによって開かれたすべてのポジションは、その後、通常モードでEAによって管理され、EAの取引ロジックが実装されていることに留意すべきです。これは、自動的に開いたポジションと同じようにポジションを管理するということです。

 

グループ内のEAの取引

取引ストラテジーのポートフォリオを組み立てることができます。このストラテジーは、ParseXmlParamsメソッドをオーバーライドする必要があり、担当のメソッドが含まれている必要があります。CStrategyメソッド::ストラテジーメソッドのストラテジーの適切なタイプの作成を追加することも必要です。最後に、ストラテジーとそのパラメータのリストを含むXMLファイルを作成する必要があります。その後、CStrategyListクラスは、ストラテジーのインスタンスを作成し、ストラテジーのリストに追加します。カスタムパネルは、その後、これらのストラテジーを表示します。

上記のEAからなるストラテジーのポートフォリオを作成してみましょう。CMovingAverageとCChannelのストラテジーのXML設定の構文解析は、セクション3.5および4.3で利用可能です。

GetStrategyの内容は次のようになります。:

//+------------------------------------------------------------------+
//|                                              StrategyFactory.mqh |
//|                                 Copyright 2015, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
/*
   GetStrategyは、ストラテジーの工場です。特定の名前に対応するストラテジーオブジェクトを作成します。
   このメソッドは、オートメーションの目的で使用する別のファイルに含まれています。
*/
#include <Strategy\Strategy.mqh>
#include <Strategy\Samples\MovingAverage.mqh>
#include <Strategy\Samples\ChannelSample.mqh>

CStrategy *CStrategy::GetStrategy(string name)
  {
   if(name=="MovingAverage")
      return new CMovingAverage();
   if(name=="BollingerBands")
      return new CChannel();
   CLog *mlog=CLog::GetLog();
   string text="Strategy with name "+name+" not defined in GetStrategy method. Please define strategy in 'StrategyFactory.mqh'";
   CMessage *msg=new CMessage(MESSAGE_ERROR,__FUNCTION__,text);
   mlog.AddMessage(msg);
   return NULL;
  }

最後の仕上げとして、EAのフルネームを担当するメソッドをオーバーライドします。CMovingAverageのオーバーライドを実行します。

//+------------------------------------------------------------------+
//|EAの完全な一意の名前|
//+------------------------------------------------------------------+
string CMovingAverage::ExpertNameFull(void)
  {
   string name=ExpertName();
   name += "[" + ExpertSymbol();
   name += "-" + StringSubstr(EnumToString(Timeframe()), 7);
   name += "-" + (string)FastMA.MaPeriod();
   name += "-" + (string)SlowMA.MaPeriod();
   name += "-" + StringSubstr(EnumToString(SlowMA.MaMethod()), 5);
   name += "]";
   return name;
  }

さて、ストラテジーのポートフォリオを作成するための準備ができました。このポートフォリオには、4つの取引システムが含まれます。それぞれが、独自のシンボルを交換します。2つのストラテジーは、移動平均に基づいて行われます、残りの2つは、ボリンジャーバンドを使用します。これらのストラテジーの詳細については、前回の記事にあります。:"ユニバーサルEA:カスタムストラテジーと補助トレードクラス(パート3)"。

XMLのポートフォリオは次のようになります。

<Global>
        <Strategies>
                <Strategy Name="MovingAverage" Magic="100" Timeframe="PERIOD_M1" Symbol="Si">
                        <TradeStateStart>Stop</TradeStateStart>
                        <Params>
                                <FastMA>1</FastMA>
                                <SlowMA>3</SlowMA>
                                <Shift>0</Shift>
                                <Method>MODE_SMA</Method>
                                <AppliedPrice>PRICE_CLOSE</AppliedPrice>
                        </Params>
                </Strategy>
                <Strategy Name="MovingAverage" Magic="101" Timeframe="PERIOD_M5" Symbol="SBRF">
                        <TradeStateStart>BuyAndSell</TradeStateStart>
                        <Params>
                                <FastMA>15</FastMA>
                                <SlowMA>21</SlowMA>
                                <Shift>0</Shift>
                                <Method>MODE_SMA</Method>
                                <AppliedPrice>PRICE_CLOSE</AppliedPrice>
                        </Params>
                </Strategy>
                <Strategy Name="BollingerBands" Magic="102" Timeframe="PERIOD_M15" Symbol="GAZR">
                        <TradeStateStart>BuyAndSell</TradeStateStart>
                        <Params>
                                <Period>30</Period>
                                <StdDev>1.5</StdDev>
                        </Params>
                </Strategy>
                <Strategy Name="BollingerBands" Magic="103" Timeframe="PERIOD_M30" Symbol="ED">
                        <TradeStateStart>BuyAndSell</TradeStateStart>
                        <Params>
                                <Period>20</Period>
                                <StdDev>2.0</StdDev>
                        </Params>
                </Strategy>
        </Strategies>
</Global>

このファイル Strategies.xmlは、メタトレーダープラットフォームの共通のデータフォルダを保存する必要があります。

mq5モジュールのソースコードは、次のとおりです。

//+------------------------------------------------------------------+
//|                                                       Expert.mq5 |
//|                                 Copyright 2015, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Strategy\StrategiesList.mqh>

CStrategyListのマネージャ。
//+------------------------------------------------------------------+
//|エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
  {
   Manager.LoadStrategiesFromXML(StrategiesXMLFile,LoadOnlyCurrentSymbol);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|エキスパート初期化解除関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Manager.OnTick();
  }
//+------------------------------------------------------------------+
//|ブックイベント関数|
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   Manager.OnBookEvent(symbol);
  }

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   Manager.OnChartEvent(id,lparam,dparam,sparam);
  }

カスタム変数StrategiesXMLFileLoadOnlyCurrentSymbolは、 CStrategyListクラスで定義されています。ロードするストラテジーのリストを指定するため、EAが実行されている名前と同じシンボルでストラテジーをロードします。また、OnBookEventとのOnTimerなどのいくつかのイベントが、使用されていないことに注意してください。これは、カスタムストラテジーで使用されないことを意味します。

コンパイルは成功させる必要があります。その後(Agent.ex5という名前の)EAを使用する準備ができました。チャート上でそれを実行してみましょう。その前に、使用するシンボルはメタトレーダーマーケットウォッチで利用可能であることを確認する必要があります。正常に起動した後、Expert Advisorのアイコンがチャートの右上隅に表示されます。もう一つのボタンは、チャートの左上隅に追加されます。カスタムパネルを最大化します。パネル上のEA(という名前のエージェント)のリストを選択した場合、4つのEAのリストが開きます:

図3。ロードされたEAのリスト

図3。ロードされたEAのリスト

このスクリーンショットは、Strategies.xmlによって形成されたEAのリストです。しばらくして、取引が開始されます - シンボルの各ストラテジー。

 

ストラテジーテスターでEAの動作を分析

ストラテジーのポートフォリオを生成しましたが、ストラテジーテスターでそれが正常に動作することを確認できます。ストラテジーのXMLリストが、ストラテジーテスターを介してアクセス可能なグローバルデータフォルダーにあるため、追加アクションは必要ありません。Agent.ex5 EAモジュールを起動した後、必要なすべてのシンボルが自動的にロードされます。各EAは、個々の取引ルール、次の取引操作を実行し、さらにインジケーターを描画します。下のビデオは、4つの異なる相場に適応させたストラテジーのポートフォリオを示しています。


ストラテジーテスターでのCStrategyに基づくシミュレーションは、リアルタイムの取引に似ています。ビジュアルテストオプションを使用すると、簡単にストラテジーのエントリと決済の精度を確認することができます。

 

結論

取引ストラテジーのランダムセットを作成することを可能にするアルゴリズムを検討しています。同じ実行可能モジュール内に配置された複数のトレーディングアルゴリズムを管理しながら、柔軟かつ効率的に取引プロセスを拡張することができます。このアルゴリズムは、同時に複数のトレーディングをするストラテジーに特に有用です。似たような取引アルゴリズムを作成し、提案されたアプローチを使用することで、従来の取引ストラテジーを開発するのと同じくらい簡単になります。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/2179

添付されたファイル |
strategyarticle.zip (97.88 KB)
マーケットでの公開前にトレードロボットに行うべき検査 マーケットでの公開前にトレードロボットに行うべき検査
マーケットの全ての製品は、均一な品質基準を確保する為に、公開前に事前の必須検査を受けます。この記事では、開発者が自分のテクニカルインディケータやトレードロボットで犯しがちなミスについてお話しします。また、マーケットへ提出する前の、製品の自己テストの方法もご紹介します。
MQL5の料理本 - 移動チャネルのプログラミング MQL5の料理本 - 移動チャネルのプログラミング
本稿では、等間隔チャネルシステムのプログラミング法について取り扱っています。等間隔チャネル構築の細部まで本稿で紹介します。チャネル分類について説明したのち、移動チャネルのプログラミング法について提案します。コード実行にはオブジェクト指向型プログラムを使用しています。
ユニバーサルEA:保留注文とサポートヘッジ(その5) ユニバーサルEA:保留注文とサポートヘッジ(その5)
この記事では、CStrategyの取引エンジンのさらなる詳細を扱います。多くの要望により、取引エンジンに保留中のサポート関数を追加しました。また、MT5の最新バージョンでは、ヘッジオプションを使用してアカウントをサポートしています。同じサポートがCStrategyに追加されています。この記事では、有効なヘッジオプションを持つアカウントのCStrategyと同様に、予約注文のアルゴリズムについて説明します。
ユニバーサルEA:カスタムストラテジーと補助トレードクラス(その3) ユニバーサルEA:カスタムストラテジーと補助トレードクラス(その3)
この記事では、ストラテジーの取引エンジンのアルゴリズムを分析していきます。シリーズの3番目の部分は、このアプローチを使用して、特定の取引ストラテジーを開発する方法の詳細な分析があります。特別な注意が補助アルゴリズムに必要です - EAは、従来のインデクサーを使用して、システムとデータへのアクセスをログに記録します(Close[1]、Open[0]など)