
オブジェクト指向アプローチによる EA モードのプログラミング
はじめに
本稿では MQL5 EA が動作するモードのプログラミングについてお話します。本稿の目的は『モードがすべて独自の方法で実装される』考え方を説明することです。著者はこのアプローチにより EA を作成する上で異なる段階のタスクがより効果的に完了できるようになると信じています。
まず、EA 開発がどのような段階で構成されているか考察します。それからMetaTrader 5 において EA が動作するモードとそのヘルパーアプリケーションについて詳しく調査します。上述の考え方を実装するためのクラス階層の作成は本稿の終盤で行います。
1. 作成段階
売買ロボット(EA)の開発は多面的なプロセスです。ここでのキーブロックは考え方のアルゴリズムとその検証です。特に EA のトレーディング理論とコードのアルゴリズム両方が検証されます。
スキームとしてこのプロセス段階は次のように表すことができます(図1)。
図1 開発段階とEA の実装
第5段階『アルゴリズムトレーディング』は開発者、プログラマー、分析家、そのあtの専門家の作業を対象とします。こういった役割のすべてを1人が行うこともよくあります。それをトレーダー・プログラマーとしましょう。
スキームはアップデートされ、拡張されます。私の意見では、EAの作成においてそれはもっとも重要なポイントを説明するものです。このスキームが周期的なパターンであるため、そのライフタイムをとおして EA のコードを改善し修正することができるのです。
それぞれの段階で特定のツール、知識、技能が必要であることに留意すべきです。
私見ですが、開発者は次のようなシンプルなバリアントマトリックスに出会います(図2)。
図2 バリアントマトリックス
ハイクオリティーなコードで勝利するトレーディング戦略を実装するロボットだけが第5段階、『アルゴリズムトレーディング』にたどりつくことは明らかです。
2. MQL5 における Expert Advisor モード
MQL5 環境により EA iが異なるモードで動作できます。モードは7種類あります。以下ではそのそれぞれについて考察します。
プログラムファイルタイプの観点から、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 は異なるモードで異なる動作をします。オブジェクト指向プログラミングツールセットは完璧にこの考え方を実装するのに適しています。
図3 異なるモードで動作するよう作成された EA のクラス階層
異なるモードを実装するクラス階層は図3に示されています。
共通事項をすべてカプセル化する基本クラス CModeBaseは直接の継承クラスを2つ持ちます。CModeRelease および the CModeTester クラスです。前者はデバッギングクラスの親クラスで、後者は履歴データ上で EA の検証と連携するクラスの親クラスです。
モードのコンテキストにおいてクラスメソッドを作成するときの手続き的アプローチおよびモジュラーアプローチを組み合わせる考えを作成します。例により次のトレーディング理論を考察します。
- オープンポジションがなければ、シグナルによってオープンする。
- オープンポジションがあれば、シグナルによってクローズする。
- オープンポジションがあれば、トレーリングストップ。
トレードシグナルは、新規バーが生成されるとき、標準インディケータMACD によって検出されます。
メインラインが上昇し、MACD インディケータの負のゾーンでシグナル1を横切るとき、買いシグナルが現れます(図4)。
図4 買いシグナル
メインラインが下降し、インディケータの正のゾーンでシグナル1を横切るとき、売りシグナルが現れます(図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_max、 m_subwindow_min)がインディケータのサブウィンドウの最大/最小サイズを制御します。
プライベートメソッドがグラフィカルオブジェクトを処理します。
このクラスはメソッド Main()および Trail() を含みません。その親類似体CModeTester::Main() および CModeTester::Trail() がそれぞれに呼ばれます。
グラフィカルオブジェクトはビジュアル検証モードで作成されます。これはストラテジーテスタのその他モードでは行われません。
エンターシグナルが現れたらチャートに赤の縦線を描き、エグジットのシグナルが出現したらブルーの縦線を描きます。エントリーとエグジットポイントの間のスペースをインディケータのサブウィンドウ内の関連する色で塗ります。
ロングポジションであれば長方形は水色です。ポジションがショートであれば、長方形はピンクです(図6)。
図6 ビジュアル検証モードでのグラフィカルオブジェクト
長方形の高さはチャートのサブウィンドウ作成時の最大/最小値によrます。長方形すべてを同じサイズにするには、長方形座標変更のブロックをチャートのサブウィンドウの座標変更の場合に追加する必要があります。
インディケータのサブウィンドウでは、以下の領域を得ます。:着色なし(ポジションなし)、ピンク(ショートポジション)。水色(ロングポジション)。
標準検証モードのための戦略はTestMode_visual_tester.mq5 EA のコードに実装されます。
おわりに
本稿では MetaTrader 5 ターミナルと MQL5 言語のモード機能を説明しようとしてきました。トレーディングアルゴリズムをプログラミングするマルチモードアプローチにはコストがかかる一方で作成段階をひとつずつ考察する機会を得ます。オブジェクト指向プログラミングはこの場合プログラマーにとってリソースが豊富なアシスタントです。
最適化とフレーム収集モードはトレーディングシステムの統計的性質に関する今後の記事での呼びものとなることでしょう。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1246





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索