前回行った作業
前回はEA開発用テンプレート作成の第1回目でした。
【発展編】で作ってきたインクルードファイルを取り込み、必要なインスタンス・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;//ポジション番号を格納する変数
また、インクルードファイルとしてテンプレートに取り込んだファイルは以下の通りです
- OriginalTrade.mqhファイル(注文関連のクラスや関数が盛り込まれているファイル)
- OriginalPrice.mqhファイル(価格情報取得・管理に関連する機能が盛り込まれているファイル)
- OriginalMoneyManagement.mqhファイルには資金管理関連の機能が盛り込まれているファイル)
- OriginalTrailingStop.mqhファイル(トレーリングストップやブレイクイーブンストップに関連する機能が盛り込まれているファイル)
- OriginalIndicators.mqhファイル(インジケータを扱う為の機能が盛り込まれているファイル)
- OriginalTimer.mqhファイル(トレードタイマーに関する機能が盛り込まれているファイル)
今回は、前回のテンプレート作成の続きとして
という作業工程を解説していきたいと思います。
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);
続いてマジックナンバーの設定を行います。
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を代入する事の意味については、これも講座記事第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開発用テンプレートを作る工程を解説していきます。
次回予定している作業は、
・注文関連の記述(資金管理・ロット調整/買い注文/売り注文)
となっております。
今回は以上とさせて頂きます。最後までお読みいただきありがとうございました。
コメント