【超入門】MQL5 EA講座 第126回「EA開発用のテンプレートを作る-その2-」【EAの作り方】

MQL5でEA作ろう講座
スポンサーリンク
スポンサーリンク

前回行った作業

前回EA開発用テンプレート作成の第1回目でした。

【発展編】で作ってきたインクルードファイルを取り込み、必要なインスタンスinput変数グローバル変数を宣言するところまでを行いました。

※各工程の詳細については前回記事の↓

・「必要なインクルードファイルを読み込み、インスタンスを設定する

・「必要なinput変数を設定する

・「必要なグローバル変数を設定する

セクションをそれぞれご確認ください。

前回時点でのテンプレートファイル記述は以下のようになっています↓

//+------------------------------------------------------------------+
//|                                    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関数に必要な設定を行う

という作業工程を解説していきたいと思います。

OnInit関数に必要な記述を行う

OnInit関数におこなう記述は以下の通りです。

//+------------------------------------------------------------------+
//| OnInit関数                                                        |
//+------------------------------------------------------------------+

int OnInit()
  {
// フィルポリシーを取得する
   ENUM_ORDER_TYPE_FILLING filltype = FillPolicy();

// EAのマジックナンバーを設定する
   Trade.SetMagicNumber(MagicNumber);

// 注文実行時の許容スリッページを設定する
   Trade.SetDeviation(Slippage);

// 取得したフィルポリシーを設定する
   Trade.SetFillType(filltype);

// 初期化が完了したことを示す(0 = 成功)
   return(0);
  }

順を追って1つ1つ見ていきましょう。

OnInit関数の中その1:フィルポリシーを取得する

// フィルポリシーを取得する
   ENUM_ORDER_TYPE_FILLING filltype = FillPolicy();

フィルポリシーとは、

流動性が極端に低下する等の事情で、発注した量のロット数では約定できないときの対応方法

を指します。

フィルポリシーについての詳細は↓の記事をご参照ください。

現象としては滅多に発生しない状況なのですが、現状MQL5ではこのフィルポリシーを適切に指定しないと売買自体も正常に行われなくなってしまいます。

従って、初期化を行うOnInit関数内でフィルポリシーに関する設定を行います。

OriginalTrade.mqhファイルファイル内にFillPolicy関数を作っているので、FillPolicy関数戻り値を、データ型ENUM_ORDER_TYPE_FILLINGを指定したローカル変数「filltype」に格納します。

FillPolicy関数がどのような処理を行っているのか、という事については講座記事第68回

フィルポリシーを設定する関数を作り、メンバ変数.type_fillingに代入する」セクションをご覧ください

OnInit関数の中その2:EAのマジックナンバーを設定する

// EAのマジックナンバーを設定する
   Trade.SetMagicNumber(MagicNumber);

続いてマジックナンバーの設定を行います。

マジックナンバーEA固有の識別番号です。

1つのMT5で複数のEAを運用する時などに、保有しているポジションやオーダーがどのEAからのものかを判別する為の番号となります。

OriginalTrade.mqhファイルファイル内の「OriginalCTradeクラスSetMagicNumber関数というメンバ関数があります。

SetMagicNumber関数引数に任意の数字を入れると、発注時に自動的にマジックナンバーを指定できるように設定されています。

ここではinput変数「MagicNumber」を引数に指定しています。

SetMagicNumber関数についての詳細は講座記事第74回の「マジックナンバーを返す関数」セクションをご覧ください。

OnInit関数の中その3:スリッページを設定する

// 注文実行時の許容スリッページを設定する
   Trade.SetDeviation(Slippage);

続いてはスリッページを設定します。

スリッページとは、発注後に激しく価格が変動した局面において、現在値と発注前のレートとの乖離がどれくらいまでなら取引を許容するか、という設定値です。

OriginalTrade.mqhファイルファイル内の

OriginalCTradeクラスSetDeviation関数というメンバ関数があります。

SetDeviation関数引数に任意の数字を入れると、発注時に自動的にスリッページを指定できるように設定されています。ここではinput変数「Slippage」を引数に指定しています。

 SetDeviation関数についての詳細は講座記事第74回の「スリッページを返す関数」セクションをご覧ください。

OnInit関数の中その4:取得したフィルポリシーを設定する

// 取得したフィルポリシーを設定する
   Trade.SetFillType(filltype);

今回の記事の「OnInit関数の中その1:フィルポリシーを取得する」セクションで取得したフィルポリシーOriginalCTradeクラスメンバ関数であるSetFillType関数を使い設定します。

ローカル変数「filltype」にはFillPolicy関数を使って取得したフィルポリシーの値が格納されています。

SetFillType関数引数に「filltype」を指定する事によってフィルポリシーの設定は完了です。

SetFillType関数の詳細については講座記事第74回の「フィルポリシーを返す関数」セクションをご覧ください

OnTick関数に必要な設定を行う

OnInit関数の設定が終わったので、次はOnTick関数の設定です。

OnTick関数の中その1:新しいバーでの取引に関する設定

// 新しいバーがあるかどうかの初期状態をtrueと仮定し、バーシフトを0に設定
   bool newBar = true;
   int barShift = 0;

// 新しいバーでの取引を行う場合の処理
   if(TradeOnNewBar == true)
     {
      // 現在のシンボルと期間で新しいバーが始まったかどうかをチェック
      newBar = NewBar.CheckNewBar(_Symbol,_Period);

      // 新しいバーが確認された場合、バーシフトを1に設定
      barShift = 1;
     }

OnTick関数の冒頭には「新しいバーでの取引に関する設定」が記述されています。

bool型ローカル変数「newBar」は新しいバーがオープンしたかどうかのフラグ判定に使います。

初期値はtrueとしておきます。

int型ローカル変数「barShift」はバーシフト値、すなわち直近のバーを0としたとき、そこからどれくらい過去の足にずらしたバーを指定するか?という情報を格納します。

初期値は0としておきます。

if(TradeOnNewBar == true)、すなわちinput変数である「TradeOnNewBar 」がtrueの時は、新しいバーが生成された瞬間のみ取引を行うモードになっている、という事を意味します。

その場合、OriginalCNewBarクラスメンバ関数であるCheckNewBar関数戻り値ローカル変数「newBar」に代入します。

CheckNewBar関数は新しいバーがオープンしたかどうかをチェックするメンバ関数になります。

CheckNewBar関数についての詳細は講座記事第115回の「CheckNewBar関数について」セクションをご覧ください。

そして、ローカル変数「barShift」に1を代入します。

ローカル変数「barShift」に1を代入する事の意味については、これも講座記事第115回の「BasedOnNewBarがtrueの場合に行う処理を記述する。」セクションをご覧ください。

OnTick関数の中その2:トレードタイマーに関する設定

/ トレードタイマーの設定
   bool timerOn = true;
// トレードタイマーを使用する場合の処理
   if(UseTimer == true)
     {
      // 指定された時間内で取引が許可されているかどうかをチェック
      timerOn = Session.DailySessionTimer(StartHour, StartMinute, EndHour, EndMinute, UseLocalTime);
     }

続いてトレードタイマーに関する設定を行っていきます。

まずbool型ローカル変数「 timerOn」を宣言します。この変数は取引が可能かどうかを管理するフラグに用います。初期値はtrueとします。

これでトレードタイマーがOnの時はtrueとfalseが入れ替わり、トレードタイマーがOffの時は常時trueとなるようにしておきます。

if(UseTimer == true)

という記述は「もしトレードタイマーを使うなら」という意味になりますので、{}内の処理記述で、ローカル変数「 timerOn」にDailySessionTimer関数戻り値代入するようにします。

DailySessionTimer関数は指定した同じ時間帯に取引をできるようにする、「CTradeSessionクラスメンバ関数となります。

DailySessionTimer関数の詳細については講座記事第120回の「DailySessionTimer関数について」セクションをご覧ください。

OnTick関数内の記述はまだ続くのですが、長くなりそうなので続きは次回解説したいと思います。

まとめ

今回は前回から引き続きEA開発用テンプレート作りを行いました。

今回はOnInit関数内にフィルポリシーマジックナンバースリッページに関する設定を行い、OnTick関数内には「新しいバーでの取引に関する設定」やトレードタイマーに関する設定を行いました。

※詳細は当記事内の

OnInit関数に必要な記述を行う」セクション及び「OnTick関数に必要な設定を行う」セクションをご覧ください。

現時点でのテンプレートファイル記述は以下のようになっています↓

//+------------------------------------------------------------------+
//|                                    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関数                                                        |
//+------------------------------------------------------------------+

int OnInit()
  {
// フィルポリシーを取得する
   ENUM_ORDER_TYPE_FILLING filltype = FillPolicy();

// EAのマジックナンバーを設定する
   Trade.SetMagicNumber(MagicNumber);

// 注文実行時の許容スリッページを設定する
   Trade.SetDeviation(Slippage);

// 取得したフィルポリシーを設定する
   Trade.SetFillType(filltype);

// 初期化が完了したことを示す(0 = 成功)
   return(0);
  }

//+------------------------------------------------------------------+
//| OnTick関数                                                        |
//+------------------------------------------------------------------+

void OnTick()
  {
// 新しいバーがあるかどうかの初期状態をtrueと仮定し、バーシフトを0に設定
   bool newBar = true;
   int barShift = 0;

// 新しいバーでの取引を行う場合の処理
   if(TradeOnNewBar == true)
     {
      // 現在のシンボルと期間で新しいバーが始まったかどうかをチェック
      newBar = NewBar.CheckNewBar(_Symbol,_Period);

      // 新しいバーが確認された場合、バーシフトを1に設定
      barShift = 1;
     }

// トレードタイマーの設定
   bool timerOn = true;
// トレードタイマーを使用する場合の処理
   if(UseTimer == true)
     {
      // 指定された時間内で取引が許可されているかどうかをチェック
      timerOn = Session.DailySessionTimer(StartHour, StartMinute, EndHour, EndMinute, UseLocalTime);
     }

次回も引き続きEA開発用テンプレートを作る工程を解説していきます。

次回予定している作業は、

・注文関連の記述(資金管理・ロット調整/買い注文/売り注文)

となっております。

今回は以上とさせて頂きます。最後までお読みいただきありがとうございました。

MQL5 EA講座 第125回「EA開発用のテンプレートを作る-その1-」

           →MQL5 EA講座 第127回「EA開発用のテンプレートを作る-その3-」

コメント

タイトルとURLをコピーしました