はじめに~クライマックス編を開始する前にこれまでの振り返り~
前回の第124回で【発展編・MT5用EAを作る工程をカスタマイズしていく】は終了しました。
そして今回からはいよいよMQL5でEAを作ろう講座の最終章となる、
【クライマックス編・これまでにやってきたことを全て使ってEAを完成させる】
がスタートします!
皆様、本当にお疲れさまでした。そしてここまでお付き合い頂き本当にありがとうございます。
自分もこのサイトを始めた当初はここまで長く続くとは思いませんでした。
あと一息なので、もう少しがんばりましょう!
これまでにやってきた事
【クライマックス編】に入る前に、まずこれまでの講座で学んできた事の確認をしておきましょう。
MQL5やMQL4はおろか、プログラミング自体が初めての人でも取り組めるよう変数や関数を始めとして、どのプログラミング言語でも共通するような要素も一切省略せずに、丁寧な解説を心掛けました。
【クライマックス編】を読んでいる途中でもわからない要素があれば、すぐに【言語基礎編】に立ち戻って復習して頂ければと思います。
第57回–第70回までは【中級実際にEAを作ろう編】です。
【言語基礎編】で学んだMQL5の基本構造を活かして、実際に簡単なEAを作る所までを解説しています。順を追って進めていけば、MQL5でEAを作ること自体はそこまでムズカシイことではない、という事がこの編である程度実感して頂けたのではないかと思います。
第71回–第124回までは【発展編・MT5用EAを作る工程をカスタマイズしていく】です。
MQL4では扱われなかった「クラス」という概念を紹介し、EAをより簡単に便利に開発する為のオリジナルクラス・構造体などを作る様子を解説してきました。
この編で学んできた事を【クライマックス編】では実践していきます。
EA作成用テンプレートを作る
今回やる事は、EA開発用テンプレートのファイルを作る事です。
【発展編】では実に多くのクラスや関数、構造体を作ってきました。
これらを用途ごとにいくつかのインクルードファイルに分けて保存してきたわけですが、これらを効率的に使っていけば、殆どのタイプのEAはそれ程労力をかけずに作れるようになります。
今回作るEA開発用テンプレートのファイルは、そのたたき台となるものです。
今後どんなEAを作るにしても、このテンプレートファイルから開発を開始すれば大幅な時間短縮になる事でしょう。
ぜひ自分の作りたいEAを思い浮かべながら、心躍らせて今回も学習を進めていただければと思います。
EA開発用のテンプレートファイル作成のロードマップ
EA開発用テンプレートファイルは以下の手順を踏んで作成していきます。
・必要なインクルードファイルを読み込み、インスタンスを設定する
1つ1つ順を追って見ていきましょう
必要なインクルードファイルを読み込み、インスタンスを設定する
まずは必要なファイルをインクルードしていき、その中から使うクラスのインスタンスを宣言していきます。
※インクルードについては↓
・MQL5 EA講座 第56回「#include命令(#include directive)」
をご覧ください
※インスタンスについては↓
をご確認ください。
//+------------------------------------------------------------------+
//| Template For EA Creation |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
// 注文関連
#include <OriginalTrade.mqh> // 注文関連機能を提供するファイルをインクルード
OriginalCTrade Trade; // 取引のための主要インスタンス
OriginalCPositions Positions; // ポジション管理のためのインスタンス
// 価格情報の初期化
#include <OriginalPrice.mqh> // 価格データ取得のためのファイルをインクルード
OriginalCBars Price; // 価格情報を管理するインスタンス
// 資金管理
#include <OriginalMoneyManagement.mqh> // 資金管理機能を提供するファイルをインクルード
// トレーリングストップ
#include <OriginalTrailingStop.mqh> // トレーリングストップ機能を提供するファイルをインクルード
OriginalCTrailing Trailing; // トレーリングストップを管理するインスタンス
// インジケータ
#include <OriginalIndicators.mqh> // インジケータを扱うためのファイルをインクルード
// タイマー
#include <OriginalTimer.mqh> // タイマー機能を提供するファイルをインクルード
CTradeSession Session; // トレーディングセッションを管理するインスタンス
OriginalCNewBar NewBar; // 新しいバーが生成されたかを検出するインスタンス
今回インクルード命令によって取り込んだファイルは6つです
OriginalTrade.mqhファイルには注文関連の機能が盛り込まれている
// 注文関連
#include <OriginalTrade.mqh> // 注文関連機能を提供するファイルをインクルード
OriginalCTrade Trade; // 取引のための主要インスタンス
OriginalCPositions Positions; // ポジション管理のためのインスタンス
OriginalTrade.mqhファイルは注文関連のクラスや関数が盛り込まれているファイルです。
OriginalTrade.mqhファイルに盛り込んできた内容については以下の講座記事で解説してきました↓
71回、72回、73回、74回(マジックナンバー・スリッページ、フィルポリシー関連)、76回(SLTP関連)、77回(SLTP関連)、79回(ストップレベル関連)、80回(ストップレベル関連)、82回(ポジション管理)、83回(ポジション管理)、84回(ポジション管理)、85回(ポジション決済)、86回(待機注文関連)、87回(待機注文関連)、90回(待機注文関連)、91回(待機注文関連)
OriginalTrade.mqhファイルのコード全体記述については↓のリンクから確認し、各自コンパイルをしてください。
・OriginalTrade.mqhファイルのコード全体記述
OriginalCTradeは取引・発注に関する処理がまとめられたクラスとなっています。
OriginalCTradeをデータ型として「Trade」というインスタンスを宣言しました。
OriginalCPositionsはポジション情報管理に関する処理がまとめられたクラスとなっています。 OriginalCPositionsをデータ型として「Positions」というインスタンスを宣言しました。
OriginalPrice.mqhファイルには価格情報取得・管理に関連する機能が盛り込まれている
// 価格情報
#include <OriginalPrice.mqh> // 価格データ取得のためのファイルをインクルード
OriginalCBars Price; // 価格情報を管理するインスタンス
OriginalPrice.mqhファイルは価格情報取得・管理に関連する機能が盛り込まれているファイルです。
OriginalPrice.mqhファイルに盛り込んできた内容については以下の講座記事で解説してきました↓
・第103回「価格とバーに関するデータへのアクセス:その1現在値」
・第104回「価格とバーに関するデータへのアクセス:その2バー情報」
OriginalCBarsは様々な価格情報へのアクセスを可能にする機能がまとめられたクラスとなっています。
OriginalCBarsをデータ型として、「Price」というインスタンスを宣言しました。
OriginalPrice.mqhファイルのコード全体記述については↓のリンクから確認し、各自コンパイルをしてください。
・OriginalPrice.mqhファイルのコード全体記述
OriginalMoneyManagement.mqhファイルには資金管理に関連する機能が盛り込まれている
// 資金管理
#include <MoneyManagement.mqh> // 資金管理機能を提供するファイルをインクルード
OriginalMoneyManagement.mqhファイルには資金管理に関連する機能が盛り込まれています。
OriginalMoneyManagement.mqhファイルに盛り込んできた内容については以下の講座記事で解説しました↓
OriginalMoneyManagement.mqhファイルは資金管理に関する関数が詰め込まれているのですが、クラスは存在しないのでインスタンスは宣言せずインクルードするだけです。
EA開発時に必要に応じてOriginalMoneyManagement.mqhファイル内に存在する関数を使っていく、という事になります。
OriginalMoneyManagement.mqhファイルのコード全体記述については↓のリンクから確認し、各自コンパイルをしてください。
・OriginalMoneyManagement.mqhファイルのコード全体記述
OriginalTrailingStop.mqhファイルにはトレーリングストップに関連する機能が盛り込まれている
// トレーリングストップ
#include <OriginalTrailingStop.mqh> // トレーリングストップ機能を提供するファイルをインクルード
OriginalCTrailing Trailing; // トレーリングストップを管理するインスタンス
OriginalTrailingStop.mqhファイルにはトレーリングストップやブレイクイーブンストップに関連する機能が盛り込まれています。
OriginalTrailingStop.mqhファイルに盛り込んできた内容については以下の講座記事で解説しました↓
OriginalCTrailingはトレーリングストップに関する処理を行える機能がまとめられたクラスとなっています。
OriginalCTrailingをデータ型としてTrailingというインスタンスを宣言しました。
※OriginalTrailingStop.mqhファイルのコード全体記述については↓のリンクから確認し、各自コンパイルをしてください。
・OriginalTrailingStop.mqhファイルのコード全体記述
OriginalIndicators.mqhファイルにはインジケータを扱う為の機能が盛り込まれている
// インジケータ
#include <OriginalIndicators.mqh> // インジケータを扱うためのファイルをインクルード
OriginalIndicators.mqhファイルにはインジケータを扱う為の機能が盛り込まれています。
OriginalIndicators.mqhファイルに盛り込んできた内容については以下の講座記事で解説してきました↓
インジケータの数は組み込みのものだけでも無数にあるので、講座記事内でファイルとして取り込んできたものには限りがありますが、インジケータの取り込み方自体は講座記事110回の内容に従って行えば、簡単にクラス化できます。
EA開発に必要なインジケータがあれば取り込み作業をして頂ければと思います。
インスタンスもEA開発に必要なインジケータがあれば都度都度宣言していく事になりますが、EA開発用テンプレートを作る過程においてはインスタンスは作らず、ファイルをインクルードするに留めておきます。
※OriginalIndicators.mqhファイルのコード全体記述については↓のリンクから確認し、各自コンパイルをしてください。
・OriginalIndicators.mqhファイルのコード全体記述
OriginalTimer.mqhファイルにはトレードタイマーに関する機能が盛り込まれている
// タイマー
#include <OriginalTimer.mqh> // タイマー機能を提供するファイルをインクルード
CTradeSession Session; // トレーディングセッションを管理するインスタンス
OriginalCNewBar NewBar; // 新しいバーが生成されたかを検出するインスタンス
OriginalTimer.mqhファイルにはトレードタイマーに関する機能が盛り込まれています。
ファイルに盛り込んできた内容については以下の講座記事で解説しました↓
- 第118回「特定の日時を簡単に生成できる関数を実装する」
- 第119回「トレードタイマークラスを実装する-その1-」
- 第120回「トレードタイマークラスを実装する-その2-」
- 第121回「トレードタイマークラスを実装する-その3-」
- 第122回「トレードタイマークラスを実装する-その4-」
- 第123回「トレードタイマークラスを実装する-その5-」
CTradeSessionは取引可能時間帯に関連する機能が集約されたクラスとなっています。
CTradeSessionをデータ型として「Session」というインスタンスを宣言しました。
OriginalCNewBarはチャートに新しいバーが生成されたかどうかを確認するための機能が集約されたクラスとなっています。
OriginalCNewBarをデータ型として「NewBar」というインスタンスを宣言しました。
※OriginalTimer.mqhファイルのコード全体記述については↓のリンクから確認し、各自コンパイルをしてください。
・OriginalTimer.mqhファイルのコード全体記述
必要なinput変数を設定する
必要なインクルードファイルの取り込みが完了したので、次は必要なinput変数を設定していきます。
//+------------------------------------------------------------------+
//| Input変数 |
//+------------------------------------------------------------------+
input group "基本取引設定" // 基本取引設定のグループ化
input ulong Slippage = 3; // スリッページ設定
input ulong MagicNumber = 123; // EA識別番号
input bool TradeOnNewBar = true; // 新しいバーでの取引を行うかどうか
input group "資金管理" // 資金管理設定のグループ化
input bool UseMoneyManagement = true; // マネーマネジメントを使用するかどうか
input double RiskPercent = 2; // リスク許容度(%)
input double FixedVolume = 0.1; // 固定取引量
input group "ストップロスとテイクプロフィット" // ストップロスとテイクプロフィット設定のグループ化
input int StopLoss = 0; // ストップロスの設定値
input int TakeProfit = 0; // テイクプロフィットの設定値
input group "トレーリングストップ" // トレーリングストップ設定のグループ化
input bool UseTrailingStop = false; // トレーリングストップを使用するかどうか
input int TrailingStop = 0; // トレーリングストップの距離
input int MinimumProfit = 0; // トレーリングを開始する最小利益
input int Step = 0; // トレーリングのステップ
input group "ブレイクイーブン" // ブレイクイーブン設定のグループ化
input bool UseBreakEven = false; // ブレイクイーブンを使用するかどうか
input int BreakEvenProfit = 0; // ブレイクイーブンに設定する利益
input int LockProfit = 0; // 利益を確保するためのロック量
input group "トレードタイマー" // トレードタイマー設定のグループ化
input bool UseTimer = false; // トレードタイマーを使用するかどうか
input int StartHour = 0; // トレード開始時間(時)
input int StartMinute = 0; // トレード開始時間(分)
input int EndHour = 0; // トレード終了時間(時)
input int EndMinute = 0; // トレード終了時間(分)
input bool UseLocalTime = false; //ローカル時間を使うかどうか
groupキーワードを使って、カテゴリー分けを施しました。
カテゴリー別にinput変数の内訳を簡単に見ていきましょう。
基本取引設定カテゴリー
input group "基本取引設定" // 基本取引設定のグループ化
input ulong Slippage = 3; // スリッページ設定
input ulong MagicNumber = 123; // EA識別番号
input bool TradeOnNewBar = true; // 新しいバーでの取引を行うかどうか
基本取引設定設定カテゴリーでは、スリッページ、マジックナンバー、「新しいバーでの取引を行うかどうか」に関するinput変数を設定しています。
「新しいバーでの取引を行うかどうか」というトレードの考え方については↓
・第115回「チャート上に新しいバーが生成される瞬間にのみ注文できるクラスを作る」
をご覧ください
資金管理カテゴリー
input group "資金管理" // 資金管理設定のグループ化
input bool UseMoneyManagement = true; // マネーマネジメントを使用するかどうか
input double RiskPercent = 2; // リスク許容度(%)
input double FixedVolume = 0.1; // 固定取引量
資金管理カテゴリーは、その名の通り、資金管理(=ロット管理)に関する設定を行います。
資金管理についての基本的な考え方は第101回「資金管理とロット調整について」及び第102回「資金管理用のインクルードファイルを作る」を見て頂きたいのですが、このカテゴリーにあるinput変数もその時に解説した内容に準じたものになります。
bool型の「UseMoneyManagement」はそもそも資金管理モードをEAで採用するかどうか?を判定するフラグとして使います。falseであれば自動的に固定ロットモードになります。
double型の「RiskPercent」は損切ラインに達した時、資金の何%までの損失を許容するか?という事を設定する変数になります。
サンプルコードのように「2」とした場合、資金の2%までの損失(口座に仮に100万円はいっていたとしたら2万円まで)は許容する、ということになり、損切ラインに達した時に2%の損失額に収まるようなロット調整を行います。
double型の「FixedVolume」は、資金管理モードがfalseで固定ロットモードで取引する場合の固定ロット量を設定します。サンプルコードのように「0.1」とした場合、常に0.1ロットでエントリーする事になります。
「ストップロスとテイクプロフィット」カテゴリー
input group "ストップロスとテイクプロフィット" // ストップロスとテイクプロフィット設定のグループ化
input int StopLoss = 0; // ストップロスの設定値
input int TakeProfit = 0; // テイクプロフィットの設定値
「ストップロスとテイクプロフィット」カテゴリーではストップロス(SL)とテイクプロフィット(TP)に関する設定を行います。
※ストップロスとテイクプロフィットについては、76回(固定SLTP設定関数)、77回(固定SLTP設定関数)、78回(ストップレベル)、79回(ストップレベル)、80回(ストップレベル)、81回(動的トレーリングストップ)等を参考にしていただければと思います。
「トレーリングストップ」カテゴリー
input group "トレーリングストップ" // トレーリングストップ設定のグループ化
input bool UseTrailingStop = false; // トレーリングストップを使用するかどうか
input int TrailingStop = 0; // トレーリングストップの距離
input int MinimumProfit = 0; // トレーリングを開始する最小利益
input int Step = 0; // トレーリングのステップ
「トレーリングストップ」カテゴリーは言うまでもなく、トレーリングストップに関する設定を行うinput変数が集約されています。
bool型の「UseTrailingStop」はそもそもトレーリングストップモードをEAで採用するか?を判定するフラグとして使います。
int型の「TrailingStop」は基本的なトレーリングストップの値を設定するのに用います。現在値とこの「TrailingStop」で設定した値を比較して、トレーリングストップを修正していくかの判断を行います。
※詳しいことは第93回「トレーリングストップについて」をご確認ください。
int型の「MinimumProfit」は、トレーリングストップにおけるミニマムプロフィット値を設定する為に使います。
ミニマムプロフィットとはトレーリングストップを発動させるための最低利益値になります。
約定価格から、相場が当初の想定通りに動き、「MinimumProfit」で設定した値より現在値が大きくなった段階でトレーリングストップがアクティブになる仕組みです。
※詳しくは第94回「トレーリングストップにおけるミニマムプロフィットについて」をご確認ください。
int型の「Step」はトレーリングストップにおけるステップ幅を設定する為のinput変数です。
ステップ幅とは一旦トレーリングストップが発動してから、再度トレーリングストップを発動させる為の間隔値を指します。
※詳しくは第95回「トレーリングストップにおけるステップ幅について」をご覧ください
「ブレイクイーブンストップ」カテゴリー
input group "ブレイクイーブン" // ブレイクイーブン設定のグループ化
input bool UseBreakEven = false; // ブレイクイーブンを使用するかどうか
input int BreakEvenProfit = 0; // ブレイクイーブンに設定する利益
input int LockProfit = 0; // 利益を確保するためのロック量
「ブレイクイーブンストップ」カテゴリーは、ブレイクイーブン設定に関連するinput変数が集約されています。
ブレイクイーブンストップとは、注文したポジションが、想定する方向(利益を生み出す方向)にある程度向かったら、当初設定していたストップロスを1回だけ移動させる処理の事を指します(トレーリングストップは利益が伸びている限りにおいて定期的にストップロスを移動させる所に違いがあります)
※ブレイクイーブンストップについての基本的な事は第99回「ブレイクイーブンストップについて」及び第100回「ブレイクイーブンストップ関数を作る」をご確認ください。
bool型の「UseBreakEven」はそもそもブレイクイーブンモードをEAで採用するか?を判定するフラグとして使います。
int型の「BreakEven」はブレイクイーブンストップを発動させる損益ポイントを設定するのに使います。「ポジションがどれくらいの利益が出たらブレイクイーブンストップを発動させるか?」という言い換えもできます。
int型の「LockProfit」は約定値に追加するポイントを設定するのに使います。この変数の値が0の時はストップロスを約定値と同じ価格に移動させます。
「トレードタイマー」カテゴリー
input group "トレードタイマー" // トレードタイマー設定のグループ化
input bool UseTimer = false; // トレードタイマーを使用するかどうか
input int StartHour = 0; // トレード開始時間(時)
input int StartMinute = 0; // トレード開始時間(分)
input int EndHour = 0; // トレード終了時間(時)
input int EndMinute = 0; // トレード終了時間(分)
input bool UseLocalTime = false; //ローカル時間を使うかどうか
「トレードタイマー」カテゴリーはトレードタイマーに関する設定を行うinput変数を集約しています
bool型の「UseTimer」はそもそもトレードタイマーをEAで採用するか?を判定するフラグとして使います。
int型の「StartHour」はトレード開始時間(時)を指定する為に使います
int型の「StartMinute」はトレード開始時間(分)を指定する為に使います
int型の「EndHour」はトレード終了時間(時)を指定する為に使います
int型の「EndMinute」はトレード終了時間(分)を指定する為に使います
bool型の「UseLocalTime」はトレードタイマーを使う際に、その基準となる時間としてローカル時間を使うかどうかを判定します。
falseにした場合はサーバー時間をトレードタイマーの基準として使う事になります。
必要なグローバル変数を設定する
//+------------------------------------------------------------------+
//| グローバル変数 |
//+------------------------------------------------------------------+
ulong glBuyTicket, glSellTicket;//ポジション番号を格納する変数
input変数の設定が終わったので、続いてグローバル変数グローバル変数の設定に移ります。
グローバル領域にulong型で「glBuyTicket」「 glSellTicket」という2つのグローバル変数を宣言しました。これらの変数はそれぞれ買いポジションのポジション番号、売りポジションのポジション番号を格納する事を想定しています。
ここまででもだいぶ長くなってしまったので、OnInit関数やOnTick関数に関する設定は次回に回したいと思います
まとめ
今回は【クライマックス編】の初回として、EA開発用テンプレート作りに着手しました。
【発展編】で作ってきたインクルードファイルを取り込み、必要なインスタンス・input変数・グローバル変数を宣言するところまでを今回は行いました。
※各工程の詳細については当記事の↓
・「必要なインクルードファイルを読み込み、インスタンスを設定する」
セクションをそれぞれご確認ください。
今回第125回時点でのテンプレートファイル記述は以下のようになっています↓
//+------------------------------------------------------------------+
//| Template For EA Creation.mqh |
//| MQL5ssei |
//| https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
// 注文関連
#include <OriginalTrade.mqh> // 注文関連機能を提供するファイルをインクルード
OriginalCTrade Trade; // 取引のための主要インスタンス
OriginalCPositions Positions; // ポジション管理のためのインスタンス
// 価格情報
#include <OriginalPrice.mqh> // 価格データ取得のためのファイルをインクルード
OriginalCBars Price; // 価格情報を管理するインスタンス
// 資金管理
#include <OriginalMoneyManagement.mqh> // 資金管理機能を提供するファイルをインクルード
// トレーリングストップ
#include <OriginalTrailingStop.mqh> // トレーリングストップ機能を提供するファイルをインクルード
OriginalCTrailing Trailing; // トレーリングストップを管理するインスタンス
// インジケータ
#include <OriginalIndicators.mqh> // インジケータを扱うためのファイルをインクルード
// タイマー
#include <OriginalTimer.mqh> // タイマー機能を提供するファイルをインクルード
CTradeSession Session; // トレーディングセッションを管理するインスタンス
OriginalCNewBar NewBar; // 新しいバーが生成されたかを検出するインスタンス
//+------------------------------------------------------------------+
//| Input変数 |
//+------------------------------------------------------------------+
input group "基本取引設定" // 基本取引設定のグループ化
input ulong Slippage = 3; // スリッページ設定
input ulong MagicNumber = 123; // EA識別番号
input bool TradeOnNewBar = true; // 新しいバーでの取引を行うかどうか
input group "資金管理" // 資金管理設定のグループ化
input bool UseMoneyManagement = true; // マネーマネジメントを使用するかどうか
input double RiskPercent = 2; // リスク許容度(%)
input double FixedVolume = 0.1; // 固定取引量
input group "ストップロスとテイクプロフィット" // ストップロスとテイクプロフィット設定のグループ化
input int StopLoss = 0; // ストップロスの設定値
input int TakeProfit = 0; // テイクプロフィットの設定値
input group "トレーリングストップ" // トレーリングストップ設定のグループ化
input bool UseTrailingStop = false; // トレーリングストップを使用するかどうか
input int TrailingStop = 0; // トレーリングストップの距離
input int MinimumProfit = 0; // トレーリングを開始する最小利益
input int Step = 0; // トレーリングのステップ
input group "ブレイクイーブン" // ブレイクイーブン設定のグループ化
input bool UseBreakEven = false; // ブレイクイーブンを使用するかどうか
input int BreakEvenProfit = 0; // ブレイクイーブンに設定する利益
input int LockProfit = 0; // 利益を確保するためのロック量
input group "トレードタイマー" // トレードタイマー設定のグループ化
input bool UseTimer = false; // トレードタイマーを使用するかどうか
input int StartHour = 0; // トレード開始時間(時)
input int StartMinute = 0; // トレード開始時間(分)
input int EndHour = 0; // トレード終了時間(時)
input int EndMinute = 0; // トレード終了時間(分)
input bool UseLocalTime = false; //ローカル時間を使うかどうか
//+------------------------------------------------------------------+
//| グローバル変数 |
//+------------------------------------------------------------------+
ulong glBuyTicket, glSellTicket;//ポジション番号を格納する変数
次回は、今回の続きでOnInit関数及びOnTick関数の設定を行っていきます。
今回は以上とさせていただきます。最後までお読みいただきありがとうございました。