English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
オブジェクト指向アプローチによる EA モードのプログラミング

オブジェクト指向アプローチによる EA モードのプログラミング

MetaTrader 5 | 24 12月 2015, 16:59
1 016 0
Denis Kirichenko
Denis Kirichenko

はじめに

本稿では MQL5 EA が動作するモードのプログラミングについてお話します。本稿の目的は『モードがすべて独自の方法で実装される』考え方を説明することです。著者はこのアプローチにより EA を作成する上で異なる段階のタスクがより効果的に完了できるようになると信じています。

まず、EA 開発がどのような段階で構成されているか考察します。それからMetaTrader 5 において EA が動作するモードとそのヘルパーアプリケーションについて詳しく調査します。上述の考え方を実装するためのクラス階層の作成は本稿の終盤で行います。


1. 作成段階

売買ロボット(EA)の開発は多面的なプロセスです。ここでのキーブロックは考え方のアルゴリズムとその検証です。特に EA のトレーディング理論とコードのアルゴリズム両方が検証されます。

スキームとしてこのプロセス段階は次のように表すことができます(図1)。

図1 開発段階とEA の実装

図1 開発段階とEA の実装

第5段階『アルゴリズムトレーディング』は開発者、プログラマー、分析家、そのあtの専門家の作業を対象とします。こういった役割のすべてを1人が行うこともよくあります。それをトレーダー・プログラマーとしましょう。

スキームはアップデートされ、拡張されます。私の意見では、EAの作成においてそれはもっとも重要なポイントを説明するものです。このスキームが周期的なパターンであるため、そのライフタイムをとおして EA のコードを改善し修正することができるのです。

それぞれの段階で特定のツール、知識、技能が必要であることに留意すべきです。

私見ですが、開発者は次のようなシンプルなバリアントマトリックスに出会います(図2)。

図2 バリアントマトリックス

図2 バリアントマトリックス

ハイクオリティーなコードで勝利するトレーディング戦略を実装するロボットだけが第5段階、『アルゴリズムトレーディング』にたどりつくことは明らかです。


2. MQL5 における Expert Advisor モード

MQL5 環境により EA iが異なるモードで動作できます。モードは7種類あります。以下ではそのそれぞれについて考察します。

プログラムファイルタイプの観点から、2グループに分けられます。

  1. ソースコードファイルと実行可能なファイルを必要とするモード
  2. 実行可能なファイルのみ必要とするモード

デバッグおよびプロファイリングモードは最初のグループに入ります。

モード分類のもうひとつ別の基準は実クオートまたは履歴クオートのストリームでの EA 動作です。検証モードはすべて履歴クオートと連結しています。

プログラミングによって6モードが定義されています。EA が標準(リリース)モードまたは結果を基にすると作成されない場合の結論。既製プログラム(*.ex5 拡張子を持つファイル)。これは金融マーケットで動作するようコードされており、まさにこのモードで動作するようになっています。同時に既製プログラムではストラテジーテスタで別のモードを使用することもできます。

ENUM_MQL_MODEと呼ばれる MQL プログラムの処理モードの列挙を作成します

//+------------------------------------------------------------------+
//| MQL Mode                                                         |
//+------------------------------------------------------------------+
enum ENUM_MQL_MODE
  {
   MQL_MODE_RELEASE=0,       // Release
   MQL_MODE_DEBUG=1,         // Debugging
   MQL_MODE_PROFILER=2,      // Profiling  
   MQL_MODE_TESTER=3,        // Testing
   MQL_MODE_OPTIMIZATION=4,  // Optimization
   MQL_MODE_VISUAL=5,        // Visual testing 
   MQL_MODE_FRAME=6,         // Gathering frames
  };

のちに、これは EA が動作しているモードタイプを認識するために必要となります。


2.1. モードを特定し確認する関数

すべてのモードについて反復し、ジャーナルに情報を表示するシンプルな関数を書きます。

//+------------------------------------------------------------------+
//| Checking all MQL modes                                           |
//+------------------------------------------------------------------+
void CheckMqlModes(void)
  {
//--- if it is debug mode
   if(MQLInfoInteger(MQL_DEBUG))
      Print("Debug mode: yes");
   else
      Print("Debug mode: no");
//--- if it is code profiling mode
   if(MQLInfoInteger(MQL_PROFILER))
      Print("Profile mode: yes");
   else
      Print("Profile mode: no");
//--- if it is test mode
   if(MQLInfoInteger(MQL_TESTER))
      Print("Tester mode: yes");
   else
      Print("Tester mode: no");
//--- if it is optimization mode
   if(MQLInfoInteger(MQL_OPTIMIZATION))
      Print("Optimization mode: yes");
   else
      Print("Optimization mode: no");
//--- if it is visual test mode
   if(MQLInfoInteger(MQL_VISUAL_MODE))
      Print("Visual mode: yes");
   else
      Print("Visual mode: no");
//--- if it is frame gathering optimization result mode
   if(MQLInfoInteger(MQL_FRAME_MODE))
      Print("Frame mode: yes");
   else
      Print("Frame mode: no");
  }

各モードにおけるこの関数の動作は確認されます。それはOnInit() イベントハンドラで呼び出されます。

テストのためにTest1_Modes_EA.mq5と呼ばれる EA のテンプレートを作成します。

EA が動作することになるモードを指定するオプションは入力パラメータで有効となります。正しいモードにはかならず名前をつけることが重要です。そうしないと情報は正確でなくなります。それが以前に起こったことです。

以下はリリースモードです。

CL      0       17:20:38.932    Test1_Modes_EA (EURUSD.e,H1)     Current mode: MQL_MODE_RELEASE
QD      0       17:20:38.932    Test1_Modes_EA (EURUSD.e,H1)     Debug mode: no
KM      0       17:20:38.932    Test1_Modes_EA (EURUSD.e,H1)     Profile mode: no
EK      0       17:20:38.932    Test1_Modes_EA (EURUSD.e,H1)     Tester mode: no
CS      0       17:20:38.932    Test1_Modes_EA (EURUSD.e,H1)     Optimization mode: no
RJ      0       17:20:38.932    Test1_Modes_EA (EURUSD.e,H1)     Visual mode: no
GL      0       17:20:38.932    Test1_Modes_EA (EURUSD.e,H1)     Frame mode: no

リリースモードについては、その他モードのフラグはゼロ設定です。よって関数はそれがデバッグモード(Debug mode: no)でもプロファイリングモード(Profile mode: no)でもないことを識別しました、など。否定の方法を使い、解放モードで作業している結論に至りました。

ここでデバッグモードがどのように識別されるか確認します。

HG      0       17:27:47.709    Test1_Modes_EA (EURUSD.e,H1)     Current mode: MQL_MODE_DEBUG
LD      0       17:27:47.710    Test1_Modes_EA (EURUSD.e,H1)     Debug mode: yes
RS      0       17:27:47.710    Test1_Modes_EA (EURUSD.e,H1)     Profile mode: no
HE      0       17:27:47.710    Test1_Modes_EA (EURUSD.e,H1)     Tester mode: no
NJ      0       17:27:47.710    Test1_Modes_EA (EURUSD.e,H1)     Optimization mode: no
KD      0       17:27:47.710    Test1_Modes_EA (EURUSD.e,H1)     Visual mode: no
RR      0       17:27:47.710    Test1_Modes_EA (EURUSD.e,H1)     Frame mode: no

デバッグモードは正しく認識されました。

プログラミングに関する指導書にはすべてデバッギングが検索とコード内のエラー箇所特定を容易にするという情報があります。またプログラムの特殊な点を強調表示しています。MQL5 環境におけるデバッギングに関する詳細情報は記事"Debugging MQL5 Programs"にあります。

このモードは、公式化およびトレーディングの考え方のアルゴリズム構築段階でもっとも一般的に使用されます。

プログラミングでは、デバッギングは IS_DEBUG_MODE マクロまたはMQL_DEBUG 識別子を持つ MQLInfoInteger() 関数のどちらでも有効化されます。

プロファイリングモードに進みます。

GS      0       17:30:53.879    Test1_Modes_EA (EURUSD.e,H1)     Current mode: MQL_MODE_PROFILER
OR      0       17:30:53.879    Test1_Modes_EA (EURUSD.e,H1)     Debug mode: no
GE      0       17:30:53.879    Test1_Modes_EA (EURUSD.e,H1)     Profile mode: yes
QM      0       17:30:53.879    Test1_Modes_EA (EURUSD.e,H1)     Tester mode: no
CE      0       17:30:53.879    Test1_Modes_EA (EURUSD.e,H1)     Optimization mode: no
FM      0       17:30:53.879    Test1_Modes_EA (EURUSD.e,H1)     Visual mode: no
GJ      0       17:30:53.879    Test1_Modes_EA (EURUSD.e,H1)     Frame mode: no

この関数は正確に プロファイラ があることを推定しました。

このモードでは、プログラムがどのくらい速く動作するか確認します。プロファイラはプログラムブロックに時間支出に関する情報を渡します。このインスツルメントはアルゴリズムのボトルネックを指摘するようになっています。それらはつねに除去可能なわけではありませんが、それでもこの情報は有用です。

プロファイリングはIS_PROFILE_MODE マクロまたはMQL_PROFILER 識別子を持つ MQLInfoInteger() 関数のどちらでも有効化されます。

それではテストモードを見ましょう。この情報はストラテジーテスタの『ジャーナル』タブに表示されます。

EG      0       17:35:25.397    Core 1  2014.11.03 00:00:00   Current mode: MQL_MODE_TESTER
OS      0       17:35:25.397    Core 1  2014.11.03 00:00:00   Debug mode: no
GJ      0       17:35:25.397    Core 1  2014.11.03 00:00:00   Profile mode: no
ER      0       17:35:25.397    Core 1  2014.11.03 00:00:00   Tester mode: yes
ED      0       17:35:25.397    Core 1  2014.11.03 00:00:00   Optimization mode: no
NL      0       17:35:25.397    Core 1  2014.11.03 00:00:00   Visual mode: no
EJ      0       17:35:25.397    Core 1  2014.11.03 00:00:00   Frame mode: no

テストモードは正しく識別されました。

これはストラテジーテスタが開くとき、EA のデフォルトモードです。

このモードに対してはマクロはありません。そのため MQL5 では MQL_TESTER 識別子を持つ MQLInfoInteger() 関数によってのみ決定します。

ここで最適化に進みます。レコードを持つジャーナルはエージェントフォルダに格納されます。私の場合、そのパスは次のようなものです。:%Program Files\MetaTrader5\tester\Agent-127.0.0.1-3000\logs

OH      0       17:48:14.010    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Current mode: MQL_MODE_OPTIMIZATION
KJ      0       17:48:14.010    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Debug mode: no
NO      0       17:48:14.010    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Profile mode: no
FI      0       17:48:14.010    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Tester mode: yes
KE      0       17:48:14.010    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Optimization mode: yes
LS      0       17:48:14.010    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Visual mode: no
QE      0       17:48:14.010    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Frame mode: no

最適化モードがアクティブであれば、テストモードはデフォルトで無効です。

『最適化』フィールドが『設定』タブで無効になっていなければ、最適化モードはストラテジーテスタで有効です。

EA がMQL5において最適化モードで検証されていることを知るには、MQL_OPTIMIZATION識別子を持つ MQLInfoInteger() 関数を呼び出します。

ビジュアル化モードに進みます。

JQ      0       17:53:51.485    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Current mode: MQL_MODE_VISUAL
JK      0       17:53:51.485    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Debug mode: no
KF      0       17:53:51.485    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Profile mode: no
CP      0       17:53:51.485    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Tester mode: yes
HJ      0       17:53:51.485    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Optimization mode: no
LK      0       17:53:51.485    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Visual mode: yes
KS      0       17:53:51.485    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Frame mode: no

ここでビジュアル検証モードと標準検証モードが入っているのがわかります。

『設定』タブの『ビジュアル化』フィールドにフラグが立っていれば、 EA はストラテジーテスタ内で動作します。

MQL_VISUAL_MODE は識別子を持つ MQLInfoInteger() 関数によって、ビジュアル検証モードでプログラムの検証を確立することができます。

最後のモードはフレームを処理するモードです。

HI      0       17:59:10.177    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Current mode: MQL_MODE_FRAME
GR      0       17:59:10.177    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Debug mode: no
JR      0       17:59:10.177    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Profile mode: no
JG      0       17:59:10.177    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Tester mode: yes
GM      0       17:59:10.177    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Optimization mode: yes
HR      0       17:59:10.177    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Visual mode: no
MI      0       17:59:10.177    Test1_Modes_EA (EURUSD.e,H1)     2014.11.03 00:00:00   Frame mode: no

おもしろいことに、フレームのフラグがゼロ設定となっているため、この関数はテストと最適化モードだけ認識しました。この関数の呼び出しがOnTesterInit()ハンドラに転送されたら、『エキスパート』ジャーナルは次のエントリを持つこととなります。

IO      0       18:04:27.663    Test1_Modes_EA (EURUSD.e,H1)     Current mode: MQL_MODE_FRAME
GE      0       18:04:27.663    Test1_Modes_EA (EURUSD.e,H1)     Debug mode: no
ML      0       18:04:27.663    Test1_Modes_EA (EURUSD.e,H1)     Profile mode: no
CJ      0       18:04:27.663    Test1_Modes_EA (EURUSD.e,H1)     Tester mode: no
QR      0       18:04:27.663    Test1_Modes_EA (EURUSD.e,H1)     Optimization mode: no
PL      0       18:04:27.663    Test1_Modes_EA (EURUSD.e,H1)     Visual mode: no
GS      0       18:04:27.663    Test1_Modes_EA (EURUSD.e,H1)     Frame mode: yes

効果的にこんどはフレームモードの収集のみ検出されました。

『設定』タブで『最適化』フィールドが無効になっていなければ、このモードはストラテジーテスタで使用されます。経験から、このモードはハンドラOnTesterInit()OnTesterPass()OnTesterDeinit() の本文で定義されます。

MQL_FRAME_MODE 識別子を持つMQLInfoInteger() 関数はフレーム収集モードでの検証を識別しやすくします。

以下はサービス関数MqlMode()のコードです。これは自動で EA が動作しているモードを特定します。

//+------------------------------------------------------------------+
//| Identify the current MQL mode                                    |
//+------------------------------------------------------------------+
ENUM_MQL_MODE MqlMode(void)
  {
   ENUM_MQL_MODE curr_mode=WRONG_VALUE;

//--- if it is debug mode
   if(MQLInfoInteger(MQL_DEBUG))
      curr_mode=MQL_MODE_DEBUG;
//--- if it is code profiling mode
   else if(MQLInfoInteger(MQL_PROFILER))
      curr_mode=MQL_MODE_PROFILER;
//--- if it is visual test mode
   else if(MQLInfoInteger(MQL_VISUAL_MODE))
      curr_mode=MQL_MODE_VISUAL;
//--- if it is optimization mode
   else if(MQLInfoInteger(MQL_OPTIMIZATION))
      curr_mode=MQL_MODE_OPTIMIZATION;
//--- if it is test mode
   else if(MQLInfoInteger(MQL_TESTER))
      curr_mode=MQL_MODE_TESTER;
//--- if it is frame gathering optimization result mode
   else if(MQLInfoInteger(MQL_FRAME_MODE))
      curr_mode=MQL_MODE_FRAME;
//--- if it is release mode
   else
      curr_mode=MQL_MODE_RELEASE;
//---
   return curr_mode;
  }

標準検証は最適化モードとビジュアル化モードで特定されるため、標準検証モードは最適化モードとビジュアル化モードのあとにチェックされます。

Test2_Modes_EA.mq5 EAの2番目のテンプレートでの関数動作を見ると、テンプレートが起動するとき、新しいエントリがジャーナルに表示されているのがわかります。たとえば、プロファイリングモードについては以下のエントリが作成されました。

HG      0       11:23:52.992    Test2_Modes_EA (EURUSD.e,H1)    Current mode: MQL_MODE_PROFILER

指定のモードに対応するクラスモデルを作成するための MQL5 Expert のオプションのモデル詳細についてはお話しました。本稿の次のパートでそれを実装します。


3. 異なるモードで動作するように作成された EA のテンプレート

EA の作成段階をもう一度繰り返すことを提案します。

アルゴリズム化の段階では、ほとんどの場合プログラマーはデバッグとプロファイルを行います。履歴データの検証にはストラテジーテスタのモードすべてを試します。最後のモード(リリースモード)はオンライントレーディングに活用されます。

私の意見では、作成の要件と検証段階がコードに反映される必要があるため、EA は多面的であるべきです。

そこでメインアルゴリズムが保持され、それに続き、EA は異なるモードで異なる動作をします。オブジェクト指向プログラミングツールセットは完璧にこの考え方を実装するのに適しています。

図2 異なるモードで動作するよう作成された EA のクラス階層

図3 異なるモードで動作するよう作成された EA のクラス階層

異なるモードを実装するクラス階層は図3に示されています。

共通事項をすべてカプセル化する基本クラス CModeBaseは直接の継承クラスを2つ持ちます。CModeRelease および the CModeTester クラスです。前者はデバッギングクラスの親クラスで、後者は履歴データ上で EA の検証と連携するクラスの親クラスです。

モードのコンテキストにおいてクラスメソッドを作成するときの手続き的アプローチおよびモジュラーアプローチを組み合わせる考えを作成します。例により次のトレーディング理論を考察します。

  1. オープンポジションがなければ、シグナルによってオープンする。
  2. オープンポジションがあれば、シグナルによってクローズする。
  3. オープンポジションがあれば、トレーリングストップ。

トレードシグナルは、新規バーが生成されるとき、標準インディケータMACD によって検出されます。

メインラインが上昇し、MACD インディケータの負のゾーンでシグナル1を横切るとき、買いシグナルが現れます(図4)。

図4 買いシグナル

図4 買いシグナル

メインラインが下降し、インディケータの正のゾーンでシグナル1を横切るとき、売りシグナルが現れます(図5)。

図5 売りシグナル

図5 売りシグナル

逆シグナルが出現するか、ポジションサポートのモードが有効になる場合に出されるストップロスのどちらかでポジションはクローズされます。

そして基本クラス CModeBase の定義は以下です。

//+------------------------------------------------------------------+
//| Class CModeBase                                                  |
//| Purpose: a base class for MQL-modes                              |            
//+------------------------------------------------------------------+
class CModeBase
  {
//--- === Data members === --- 
private:
   //--- a macd object & values
   CiMACD            m_macd_obj;
   double            m_macd_main_vals[2];
   double            m_macd_sig_vals[2];

protected:
   long              m_pos_id;
   bool              m_is_new_bar;
   uint              m_trailing_stop;
   uint              m_trail_step;
   //--- trade objects
   CSymbolInfo       m_symbol_info;
   CTrade            m_trade;
   CPositionInfo     m_pos_info;
   CDealInfo         m_deal_info;
   //--- mql mode
   ENUM_MQL_MODE     m_mql_mode;

   //--- a new bar object
   CisNewBar         m_new_bar;
   //--- current tick signal flag
   bool              m_is_curr_tick_signal;
   //--- close order type
   ENUM_ORDER_TYPE   m_close_ord_type;
   
//--- === Methods === --- 
public:
   //--- constructor/destructor
   void              CModeBase();
   void             ~CModeBase(void){};
   //--- initialization
   virtual bool      Init(int _fast_ema,int slow_ema,int _sig,ENUM_APPLIED_PRICE _app_price);
   virtual void      Deinit(void){};

   //--- Modules
   virtual void      Main(void){};

   //--- Procedures
   virtual void      Open(void){};
   virtual void      Close(void){};
   virtual void      Trail(void){};

   //--- Service
   static ENUM_MQL_MODE CheckMqlMode(void);
   ENUM_MQL_MODE     GetMqlMode(void);
   void              SetMqlMode(const ENUM_MQL_MODE _mode);
   void              SetTrailing(const uint _trailing,const uint _trail_step);

protected:
   //--- Functions
   ENUM_ORDER_TYPE   CheckOpenSignal(const ENUM_ORDER_TYPE _open_sig);
   ENUM_ORDER_TYPE   CheckCloseSignal(const ENUM_ORDER_TYPE _close_sig);
   ENUM_ORDER_TYPE   CheckTrailSignal(const ENUM_ORDER_TYPE _trail_sig,double &_sl_pr);
   //---
   double            GetMacdVal(const int _idx,const bool _is_main=true);

private:
   //--- Macros
   bool              RefreshIndicatorData(void);
   //--- Normalization
   double            NormalPrice(double d);
   double            NormalDbl(double d,int n=-1);
   double            NormalSL(const ENUM_ORDER_TYPE _ord_type,double op,double pr,
                              uint SL,double stop);
   double            NormalTP(const ENUM_ORDER_TYPE _ord_type,double op,double pr,
                              uint _TP,double stop);
   double            NormalLot(const double _lot);
  };

継承クラスで使用される限り、基本クラスにはなんでもインクルードすることができます。

MACD データはプライベートメンバーで表されるため、継承者に対しては利用できません。

これらメソッドのうち、仮想のものがあることに注意が必要です。:Main()、Open()、Close()、Trail() です。その実装は EA が正しく動作しているモードに強く依存します。これらメソッドは基本クラスに対しては空のままです。

また、基本クラスはすべての MQL モードに対して同じトレーディング理論を持つメソッドを含みます。シグナルメソッドはすべてそれらに属します。

  • CModeBase::CheckOpenSignal(),
  • CModeBase::CheckCloseSignal(),
  • CModeBase::CheckTrailSignal().

本稿はすべての MQL モードタイプのコードを書くことが目的ではありません。標準およびビジュアル検証は例として提示します。


3.1. テストモード

アルゴリズムがコード化されコンパイルされたら、私は通常履歴データについてストラテジーテスタで戦略を試し、設計どおり動作するか確認します。

システムがどの程度正確にトレードシグナルを実装しているのか確認を要求されることがよくあります。どちらにせよ、この段階での EA に対する基本目標は起動しトレードを行うことです。

標準検証用のCModeTester クラスは以下のように実装されます。

//+------------------------------------------------------------------+
//| Class CModeTester                                                |
//| Purpose: a class for the tester mode                             |            
//| Derives from class CModeBase.                                    |
//+------------------------------------------------------------------+
class CModeTester : public CModeBase
  {
//--- === Methods === --- 
public:
   //--- constructor/destructor
   void              CModeTester(void){};
   void             ~CModeTester(void){};

   //--- Modules
   virtual void      Main(void);

   //--- Procedures
   virtual void      Open(void);
   virtual void      Close(void);
   virtual void      Trail(void);
  };

メインモジュールは次のように実装されます。

//+------------------------------------------------------------------+
//| Main module                                                      |
//+------------------------------------------------------------------+
void CModeTester::Main(void)
  {
//--- 1) closure
   this.Close();
//--- 2) opening
   this.Open();
//--- 3) trailing stop
   this.Trail();
  }

標準検証モードについては、トレードシグナルに関する情報をジャーナルに表示する機能を作成します。

トレードシグナルの情報源とみなされるインディケータ値を持つ文字列を追加します。

以下がポジションオープンのシグナルとそれに続くクローズするシグナルのジャーナルからの抽出です。

HE      0       13:34:04.118    Core 1  2014.11.14 22:15:00   ---=== Signal to open: SELL===---
FI      0       13:34:04.118    Core 1  2014.11.14 22:15:00   A bar before the last one, main: 0.002117; signal: 0.002109
DL      0       13:34:04.118    Core 1  2014.11.14 22:15:00   The last bar, main: 0.002001; signal: 0.002118
LO      0       13:34:04.118    Core 1  2014.11.14 22:15:00   market sell 0.03 EURUSD.e (1.25242 / 1.25251 / 1.25242)
KH      0       13:34:04.118    Core 1  2014.11.14 22:15:00   deal #660 sell 0.03 EURUSD.e at 1.25242 done (based on order #660)
GE      0       13:34:04.118    Core 1  2014.11.14 22:15:00   deal performed [#660 sell 0.03 EURUSD.e at 1.25242]
OD      0       13:34:04.118    Core 1  2014.11.14 22:15:00   order performed sell 0.03 at 1.25242 [#660 sell 0.03 EURUSD.e at 1.25242]
IK      0       13:34:04.118    Core 1  2014.11.14 22:15:00   CTrade::OrderSend: market sell 0.03 EURUSD.e [done at 1.25242]
IL      0       13:34:04.118    Core 1  2014.11.17 13:30:20   
CJ      0       13:34:04.118    Core 1  2014.11.17 13:30:20   ---=== Signal to close: SELL===---
GN      0       13:34:04.118    Core 1  2014.11.17 13:30:20   A bar before the last one, main: -0.001218; signal: -0.001148
QL      0       13:34:04.118    Core 1  2014.11.17 13:30:20   The last bar, main: -0.001123; signal: -0.001189
EP      0       13:34:04.118    Core 1  2014.11.17 13:30:20   market buy 0.03 EURUSD.e (1.25039 / 1.25047 / 1.25039)
FG      0       13:34:04.118    Core 1  2014.11.17 13:30:20   deal #661 buy 0.03 EURUSD.e at 1.25047 done (based on order #661)
OJ      0       13:34:04.118    Core 1  2014.11.17 13:30:20   deal performed [#661 buy 0.03 EURUSD.e at 1.25047]
PD      0       13:34:04.118    Core 1  2014.11.17 13:30:20   order performed buy 0.03 at 1.25047 [#661 buy 0.03 EURUSD.e at 1.25047]
HE      0       13:34:04.118    Core 1  2014.11.17 13:30:20   CTrade::OrderSend: market buy 0.03 EURUSD.e [done at 1.25047]

ストラテジーテスタにはなじみのあるジャーナルの『エキスパート』がないことにご注意ください。情報はすべて『ジャーナル』タブで見つけることができます。そこには検証と最適化中にストラテジーテスタが行った処理に関するレコードが入ってます。

必要な文字列を検索する必要があるのはそのためです。エントリ情報が分割される必要があれば、ファイルに記録されます。

標準検証のための戦略は TestMode_tester.mq5 EA のコードに実装されます。


3.2. ビジュアル検証モード

ライブチャートを参照し、EA がどのように現状を処理しているか確認する必要があることがあります。

シンプルなビジュアル化によりトレーディングシステムがティックにどのように反応しているかだけではなく、検証の最後で類似した価格モデルを比較することができます。

以下はビジュアル検証用の CModeVisual クラスの定義です。

//+------------------------------------------------------------------+
//| Class CModeVisual                                                |
//| Purpose: a class for the tester mode                             |            
//| Derived from class CModeBase.                                    |
//+------------------------------------------------------------------+
class CModeVisual : public CModeTester
  {
//--- === Data members === --- 
private:
   CArrayObj         m_objects_arr;
   double            m_subwindow_max;
   double            m_subwindow_min;
   
//--- === Methods === --- 
public:
   //--- constructor/destructor
   void              CModeVisual(void);
   void             ~CModeVisual(void);

   //--- Procedures
   virtual void      Open(void);
   virtual void      Close(void);

private:
   bool              CreateSignalLine(const bool _is_open_sig,const bool _is_new_bar=true);
   bool              CreateRectangle(const ENUM_ORDER_TYPE _signal);
   void              RefreshRectangles(void);
  };

クラスには表示のメンバーがあります。クラス m_objects_arrのメンバーがCArrayObjタイプの動的配列を実装します。グラフィカルオブジェクト、たとえば、ラインや長方形はここに属します。別の2つのクラスメンバー(m_subwindow_maxm_subwindow_min)がインディケータのサブウィンドウの最大/最小サイズを制御します。

プライベートメソッドがグラフィカルオブジェクトを処理します。

このクラスはメソッド Main()および Trail() を含みません。その親類似体CModeTester::Main() および CModeTester::Trail() がそれぞれに呼ばれます。

グラフィカルオブジェクトはビジュアル検証モードで作成されます。これはストラテジーテスタのその他モードでは行われません。

エンターシグナルが現れたらチャートに赤の縦線を描き、エグジットのシグナルが出現したらブルーの縦線を描きます。エントリーとエグジットポイントの間のスペースをインディケータのサブウィンドウ内の関連する色で塗ります。

ロングポジションであれば長方形は水色です。ポジションがショートであれば、長方形はピンクです(図6)。

図6 ビジュアル検証モードでのグラフィカルオブジェクト

図6 ビジュアル検証モードでのグラフィカルオブジェクト

長方形の高さはチャートのサブウィンドウ作成時の最大/最小値によrます。長方形すべてを同じサイズにするには、長方形座標変更のブロックをチャートのサブウィンドウの座標変更の場合に追加する必要があります。

インディケータのサブウィンドウでは、以下の領域を得ます。:着色なし(ポジションなし)、ピンク(ショートポジション)。水色(ロングポジション)。

標準検証モードのための戦略はTestMode_visual_tester.mq5 EA のコードに実装されます。


おわりに

本稿では MetaTrader 5 ターミナルと MQL5 言語のモード機能を説明しようとしてきました。トレーディングアルゴリズムをプログラミングするマルチモードアプローチにはコストがかかる一方で作成段階をひとつずつ考察する機会を得ます。オブジェクト指向プログラミングはこの場合プログラマーにとってリソースが豊富なアシスタントです。

最適化とフレーム収集モードはトレーディングシステムの統計的性質に関する今後の記事での呼びものとなることでしょう。

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

添付されたファイル |
cisnewbar.mqh (13.74 KB)
modes.mqh (62.77 KB)
test1_modes_ea.mq5 (9.43 KB)
test2_modes_ea.mq5 (10.01 KB)
モスクワ証券取引所のデリバティブ市場を例にとった取り引き価格の原則 モスクワ証券取引所のデリバティブ市場を例にとった取り引き価格の原則
本稿では取り引き価格とモスクワ証券取引所のデリバティブ市場のクリアリング詳細について説明します。本稿はデリバティブ取引で最初の為替経験をしたいと思っている初心者向けの理解しやすい内容です。また集中交換プラットフォームでの取引を検討している経験ある外為トレーダー向けでもあります。
トレーダーの統計的クックブック:仮説 トレーダーの統計的クックブック:仮説
本稿では仮説について考察します。それは数理統計学の基本的考え方のひとつです。ここでは多様な仮説が検討され、数学的手法を用いて例を挙げて検証されます。実データはノンパラメトリックな方法を用いて一般化されます。データ処理には Statistica パッケージと移植された ALGLIB MQL5 数値解析ライブラリが使用されています。
HedgeTerminalパネルを利用して MetaTrader 5 で双方向トレードとポジションヘッジを行う - パート1 HedgeTerminalパネルを利用して MetaTrader 5 で双方向トレードとポジションヘッジを行う - パート1
本稿ではポジションヘッジへの新しいアプローチについて述べ、本件に関する MetaTrader 4 および MetaTrader 5 のユーザー間のディベートに一線を画します。そのようなヘッジを信頼して行うアルゴリズムは解りやすい言葉で、またシンプルなグラフと図で説明されています。本稿は新しいパネルHedgeTerminalに特化して説明しています。これは MetaTrader 5 内で本質的に完全な機能を備えたトレードターミナルです。HedgeTerminalとそれによるトレードの仮想化でポジションは MetaTrader 4 と同じような方法で管理することができます。
MQL5 プログラミングの基礎:ターミナルのグローバル変数 MQL5 プログラミングの基礎:ターミナルのグローバル変数
本稿はターミナルのグローバル変数の処理を助けるオブジェクト作成のための MQL5 言語オブジェクト指向機能を明らかにします。実用例として私はプログラム段階実装のためのコントロールポイントとしてグローバル変数が使用される場合を考察します。