前回までのおさらい
- MQL5 EA講座 第125回「EA開発用のテンプレートを作る-その1-」
- MQL5 EA講座 第126回「EA開発用のテンプレートを作る-その2-」
- MQL5 EA講座 第127回「EA開発用のテンプレートを作る-その3-」
- MQL5 EA講座 第128回「EA開発用のテンプレートを作る-その4-」
の4回を通してEA開発用テンプレートを作り終わる事ができました。
このEA開発用テンプレートを使えば、確定足に基づいたトレード、資金管理を考慮したロット調整、トレーリングストップモード、ブレイクイーブンストップモード、トレードタイマーモードなどが初めから実装された状態でEA作りをスタートする事が出来ます。
それ以外にも、スリッページやマジックナンバー、フィルポリシーなどEAを稼働させるのにあたり必要な基本設定も全て記述済みですので、EA作成の時間を大幅に短縮させる事ができます。
※EA開発用テンプレートの全体記述については↓のリンクから確認ができます。
※EA開発用テンプレートにインクルードファイルとして取り込んでいるファイルは以下のリンクからご確認いただけます。
- OriginalTrade.mqhファイル(注文関連のクラスや関数が盛り込まれているファイル)
- OriginalPrice.mqhファイル(価格情報取得・管理に関連する機能が盛り込まれているファイル)
- OriginalMoneyManagement.mqhファイル(資金管理関連の機能が盛り込まれているファイル)
- OriginalTrailingStop.mqhファイル(トレーリングストップやブレイクイーブンストップに関連する機能が盛り込まれているファイル)
- OriginalIndicators.mqhファイル(インジケータを扱う為の機能が盛り込まれているファイル)
- OriginalTimer.mqhファイル(トレードタイマーに関する機能が盛り込まれているファイル)
今回を含めた残りの数回は、EA開発用テンプレートを実際に使っていくつかEAを作成していく工程を解説していきたいと思います。
そして、それをもって長きにわたったこの「MQL5でEA作ろう講座」も一旦終了させて頂こうと思います。
今回作るEAの仕様
まずは作るEAの仕様を決めます。EA開発用テンプレートを使ったEA作りの第1弾としては手始めに短期移動平均線と長期移動平均線との位置関係で売買をするタイプのEAを作りたいと思います。
EAの仕様は以下の通りです↓
・保有ポジションは1つまで。
・売買判断には期間の異なる単純移動平均線(SMA)2本を用いる。
・短期移動平均線が長期移動平均線より値が大きく、買いポジションを持っていなければ買いエントリーする(この時、もし売りポジションを持っていれば売りポジションは決済してクローズする)
・短期移動平均線が長期移動平均線より値が小さく、売りポジションを持っていなければ売りエントリーする(この時、もし買いポジションを持っていれば買いポジションは決済してクローズする)
ロジックとしてはこれ以上ないくらいありふれたものですが、EA開発用テンプレートには既にエントリーシグナル以外の部分で様々な機能が実装されています。
トレードタイマーモード、資金管理モード、トレーリングストップモード、ブレイクイーブンストップモード、確定足モード・・・これらの機能のOn/Offを組み合わせ次第で、全く違った戦略を取れる多機能EAが出来上がる訳です。
今回行う作業はほんのわずかです。拍子抜けするほど簡単に多機能EAが作れるんだ、という事を是非今回実感して頂ければと思います。
EA作成のロードマップ
今回作るEAは以下の手順を踏んで作成していきます↓
・短期移動平均線、長期移動平均線を設定する為のインスタンスを宣言する。
・短期移動平均線、長期移動平均線のパラメータ設定用のinput変数を宣言する。
・OnInit関数にインジケータ(移動平均線)設定に必要な条件を記述する。
1つ1つ順を追って見ていきましょう。
EA開発用テンプレートから新規ファイルを作成する
まずはEA開発用テンプレートから新規ファイルを作成します。
EA開発用テンプレートのソースコードをを当ブログのリンク先記事からコピーして、コンパイルし
MQL5 Source Fileを生成しましょう。
生成したMQL5 Source Fileをたたき台にしてこれからEAを作っていく訳ですが、このファイルは今後もテンプレートとして利用したいので、メタエディターでこのEA開発用テンプレートの記述が開かれている状態で、ウィンドウ上部の「ファイル」メニューから「名前を付けて保存」を選択し、新しく作るEAの名前を付けて別ファイルを作りましょう。
※今回ファイル名は「Moving Average Example」としました。
またEA開発用テンプレートを間違って上書きしないように、EA開発用テンプレートファイルを右クリックしてプロパティ画面を開き、プロパティの全般タブ最下部にある属性箇所の「読み取り専用」という部分にチェックをつけておくことをお勧めします↓
この操作を行い読み取り専用ファイルにすることにより、もしEA開発用テンプレートから別ファイルを作らずにEAを作り始めてしまった際、コンパイルしようとすると以下のような警告メッセージを出し、別な場所にファイルを保存するよう促してくれるようになります↓
短期移動平均線、長期移動平均線を設定する為のインスタンスを宣言する
EA開発用テンプレートから別ファイルを作ったところで、今度はメインプログラムへの記述に移ります。
まずは短期移動平均線、長期移動平均線を設定する為のインスタンスを宣言します。
EA開発用テンプレート作成時、OriginalIndicators.mqhファイルをインクルードしましたが、インスタンスの宣言はしませんでした。
インジケータは無数にあるので、テンプレートの段階では特定のインジケータのインスタンスを盛り込まなかった訳ですが、今回はEAの売買条件に移動平均線を使う事が決定しています。したがって、OriginalIndicators.mqhファイルをインクルードした箇所の下にインスタンスを2つ作ります↓
// インジケータ
#include <OriginalIndicators.mqh> // インジケータを扱うためのファイルをインクルード
CDerivediMA FastMA;//短期移動平均線用のインスタンス
CDerivediMA SlowMA;//長期移動平均線用のインスタンス
データ型は移動平均線についての処理を扱う「CDerivediMA」クラスとし、短期移動平均線用のインスタンスを「FastMA」、長期移動平均線用のインスタンスを「SlowMA」としました。
※「CDerivediMA」クラスは、親クラスであるCBaseIndicatorクラスの派生クラスです。
インジケータについては、どのインジケータでも共通している処理を担うのがCBaseIndicatorクラスを元にして、各インジケータごとに派生クラスを作る仕組みになっていて移動平均線に関する処理を担う「CDerivediMA」クラスもその派生クラスの1つです。詳しくは↓
をご覧ください。また派生クラスについては↓
・MQL5 EA講座 第51回「クラスについて4 -派生クラス-」
をご覧ください。
短期移動平均線、長期移動平均線のパラメータ設定用のinput変数を宣言する
続いて、短期移動平均線、長期移動平均線のパラメータ設定用input変数を宣言します。
既にEA開発用テンプレートには各種モードごとにgroup分けされたinput変数が多数宣言されています。
文法的にはグローバル領域内であればどこでも良いのですが、使い勝手の観点から「基本取引設定」カテゴリの下に宣言します↓
input group "基本取引設定" // 基本取引設定のグループ化
input ulong Slippage = 3; // スリッページ設定
input ulong MagicNumber = 123; // EA識別番号
input bool TradeOnNewBar = true; // 新しいバーでの取引を行うかどうか
input group "短期移動平均線の設定" // 短期移動平均線設定のグループ化
input int FastMAPeriod = 10; // 短期移動平均線の期間
input ENUM_MA_METHOD FastMAMethod = 0; // 短期移動平均線の算出方法
input int FastMAShift = 0; // 短期移動平均線のシフト
input ENUM_APPLIED_PRICE FastMAPrice = PRICE_CLOSE; // 短期移動平均線の価格適用方法
input group "長期移動平均線の設定" // 長期移動平均線設定のグループ化
input int SlowMAPeriod = 20; // 長期移動平均線の期間
input ENUM_MA_METHOD SlowMAMethod = 0; // 長期移動平均線の算出方法
input int SlowMAShift = 0; // 長期移動平均線のシフト
input ENUM_APPLIED_PRICE SlowMAPrice = PRICE_CLOSE; // 長期移動平均線の価格適用方法
を設定できるようにinput変数を宣言しました。
OnInit関数にインジケータ(移動平均線)設定に必要な条件を記述する
続いてOnInit関数内にインジケータ(移動平均線)設定に必要な条件を記述していきます。
// 短期移動平均線の初期化
FastMA.Init(_Symbol, _Period, FastMAPeriod, FastMAShift, FastMAMethod, FastMAPrice);
// 長期移動平均線の初期化
SlowMA.Init(_Symbol, _Period, SlowMAPeriod, SlowMAShift, SlowMAMethod, SlowMAPrice);
「CDerivediMA」クラスのインスタンス「FastMA」「SlowMA」からメンバ関数のInit関数を呼び出します。
Init関数はiMA関数を使って移動平均線のハンドル値を呼び出す機能を担っています。
Init関数の引数には先程「短期移動平均線、長期移動平均線のパラメータ設定用のinput変数を宣言する」セクションで宣言したinput変数を記述していきます。
※ハンドル値とはインジケータの情報にアクセスする為の鍵のようなものです。
※移動平均線のInit関数については講座記事第110回の「仮想関数「Init」の仮引数と処理実装記述をCDerivediMAクラスで再定義する」セクションをご覧ください(必要に応じて→「仮想関数」もご参照ください)。
これで、メイン処理を行うOnTick関数内で移動平均線を扱う準備が出来たことになります。
OnTick関数内に売買条件に関する記述を追加する。
最後にOnTick関数内に売買条件に関する記述を追加していきます。
と言っても、OnTick関数内もすでにEA開発用テンプレートにて様々な機能に関する記述がなされているので、追加する記述は買いエントリーに関する箇所と売りエントリーに関する箇所だけです。
順番に見ていきましょう。
OnTick関数内の追加記述1:買いエントリー箇所
EA開発用テンプレートでは買い注文を出す際の記述は以下のようになっています。
// 買い注文について
if(Positions.GetBuyPosCount(MagicNumber) == 0)//買いポジションがなければ
{
//買い注文を出す
glBuyTicket = Trade.Buy(_Symbol,tradeSize);
これは日本語訳すれば「買いポジションが0なら買い注文を出す」という状態です。
この状態からEAの仕様に従った売買条件にするために、下記のように記述を追加します↓
// 買い注文について
if(//長期MAより短期MAの値が大きければ
FastMA.Main(barShift) > SlowMA.Main(barShift)
&&
Positions.GetBuyPosCount(MagicNumber) == 0)//買いポジションがなければ
{
// 売りポジションがあれば決済する
Trade.ClosePosition(glSellTicket);
// 売りポジション番号をリセット
glSellTicket = 0;
//買い注文を出す
glBuyTicket = Trade.Buy(_Symbol,tradeSize);
まずif文内に
FastMA.Main(barShift) > SlowMA.Main(barShift)
という条件文を追加し、
Positions.GetBuyPosCount(MagicNumber) == 0
と論理積(&&)で繋ぎました。
インスタンス「FastMA」「SlowMA」から呼び出したMain関数はインジケータの値(今回の場合であれば移動平均線)を取得して戻り値として返すCBaseIndicatorクラスのメンバ関数です。
引数に記述されている「barShift」には、確定足モードOnの時は「1」、確定足モードOffの時は「0」が入るようにEA開発用テンプレートで設計されています。これで
「長期MAより短期MAの値が大きければ」
という買いエントリーの条件を追加する事ができました。
※Main関数についての詳細は講座記事第109回の「メンバ関数「Main」はインジケータの値を取得して戻り値として返す」セクションをご覧ください。
そして{}内の処理にも、ClosePosition関数というメンバ関数を、Buy関数の前に今回追加しています。
ClosePosition関数は、ポジションを決済する機能を担う、OriginalCTradeクラスのメンバ関数です。
今回作るEAの仕様では、買いエントリー条件を満たしている時に売りポジションを保有している時は売りポジションをクローズ決済するという事にしている為、ClosePosition関数を追加しました。
ClosePosition関数で売りポジションをクローズ決済し、直後にglSellTicket に0を代入して売りポジション番号をリセットした上で、Buy関数による買いエントリー・・・という流れになります。
※ClosePosition関数についての詳細は
・MQL5 EA講座 第85回「ポジションを決済する関数を作る」
をご覧ください。
買いエントリーに関する追加記述は以上です。
OnTick関数内の追加記述2:売りエントリー箇所
続いては売りエントリーについて記述を追加していきます。
EA開発用テンプレートでは以下のようになっています↓
// 売り注文について
if(Positions.GetSellPosCount(MagicNumber) == 0)// 売りポジションがなければ
{
//新規売り注文を出す
glSellTicket = Trade.Sell(_Symbol,tradeSize);
この状態から下記のように記述を追加します。
// 売り注文について
if(//長期MAより短期MAの値が小さければ
FastMA.Main(barShift) < SlowMA.Main(barShift)
&&
Positions.GetSellPosCount(MagicNumber) == 0)// 売りポジションがなければ
{
//買いポジションがあれば決済する
Trade.ClosePosition(glBuyTicket);
//買いポジション番号をリセット
glBuyTicket = 0;
//新規売り注文を出す
glSellTicket = Trade.Sell(_Symbol,tradeSize);
if文内に
FastMA.Main(barShift) < SlowMA.Main(barShift)
という条件文を追加し、
Positions.GetSellPosCount(MagicNumber) == 0
と論理積(&&)で繋ぎました。
これで「長期MAより短期MAの値が小さければ」という売りエントリー条件を追加する事ができました。
{}内の処理にも、ClosePosition関数というメンバ関数を、Sell関数の前に追加します。
ClosePosition関数の追加は、売りエントリー条件を満たしている時に買いポジションを保有している時は買いポジションをクローズ決済するという事にEAの仕様でしている為です。
売りエントリーに関する追加記述は以上です。
これでEA自体も完成です。
まとめ
今回はEA開発用テンプレートを使って、実際にEAを作る過程を解説しました。
とはいっても、EA開発用テンプレートに追加した記述はほんの数行に過ぎません。
追加した記述は以下の通りです↓
・短期移動平均線、長期移動平均線を設定する為のインスタンスの宣言
・短期移動平均線、長期移動平均線のパラメータ設定用input変数の宣言
・OnInit関数内に移動平均線初期化用のInit関数の記述
・OnTick関数内に売買条件に関する記述と、反対ポジション決済用のClosePosition関数の追加
EA開発用のテンプレート作りに4回の講座を費やしたことに比べれば、拍子抜けするほど簡単にEAが作れたことがお判りいただけたのではないかと思います。
今回作ったEAの全体記述は以下の通りです。
//+------------------------------------------------------------------+
//| Moving Average Example |
//| 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> // インジケータを扱うためのファイルをインクルード
CDerivediMA FastMA;//短期移動平均線用のインスタンス
CDerivediMA SlowMA;//長期移動平均線用のインスタンス
// タイマー
#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 int FastMAPeriod = 10; // 短期移動平均線の期間
input ENUM_MA_METHOD FastMAMethod = 0; // 短期移動平均線の算出方法
input int FastMAShift = 0; // 短期移動平均線のシフト
input ENUM_APPLIED_PRICE FastMAPrice = PRICE_CLOSE; // 短期移動平均線の価格適用方法
input group "長期移動平均線の設定" // 長期移動平均線設定のグループ化
input int SlowMAPeriod = 20; // 長期移動平均線の期間
input ENUM_MA_METHOD SlowMAMethod = 0; // 長期移動平均線の算出方法
input int SlowMAShift = 0; // 長期移動平均線のシフト
input ENUM_APPLIED_PRICE SlowMAPrice = PRICE_CLOSE; // 長期移動平均線の価格適用方法
input group "資金管理" // 資金管理設定のグループ化
input bool UseMoneyManagement = false; // マネーマネジメントを使用するかどうか
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);
// 短期移動平均線の初期化
FastMA.Init(_Symbol, _Period, FastMAPeriod, FastMAShift, FastMAMethod, FastMAPrice);
// 長期移動平均線の初期化
SlowMA.Init(_Symbol, _Period, SlowMAPeriod, SlowMAShift, SlowMAMethod, SlowMAPrice);
// 初期化が完了したことを示す(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);
}
//価格情報をアップデートする
Price.Update(_Symbol,_Period);
// 注文関連の記述
// 新しいバーかつトレードタイマーが許可している時のみ注文処理を行う
if(newBar == true && timerOn == true)
{
// ロット調整
double tradeSize;
//資金管理モードONなら設定したリスクに応じたロットを算出
if(UseMoneyManagement == true)
tradeSize = MoneyRiskManagement(_Symbol,FixedVolume,RiskPercent,StopLoss);
//固定ロットを指定
else
tradeSize = VerifyVolume(_Symbol,FixedVolume);
// 買い注文について
if(//長期MAより短期MAの値が大きければ
FastMA.Main(barShift) > SlowMA.Main(barShift)
&&
Positions.GetBuyPosCount(MagicNumber) == 0)//買いポジションがなければ
{
// 売りポジションがあれば決済する
Trade.ClosePosition(glSellTicket);
// 売りポジション番号をリセット
glSellTicket = 0;
//買い注文を出す
glBuyTicket = Trade.Buy(_Symbol,tradeSize);
if(glBuyTicket > 0)
{
// 開いたポジションの価格を取得
double openPrice = PositionOpenPrice(glBuyTicket);
double buyStop = CalBuySL(_Symbol, StopLoss, openPrice); // ストップロス計算
if(buyStop > 0)
buyStop =ModifyLowerStopLevel(_Symbol, buyStop); // ストップロスの設定が有効かチェック
double buyProfit = CalBuyTP(_Symbol, TakeProfit, openPrice); // テイクプロフィット計算
if(buyProfit > 0)
buyProfit = ModifyUpperStopLevel(_Symbol, buyProfit); // テイクプロフィットの設定が有効かチェック
// ストップロスとテイクプロフィットを設定
if(buyStop > 0 || buyProfit > 0)
Trade.SetSLTP(glBuyTicket, buyStop, buyProfit);
glSellTicket = 0; // 売りポジション番号をリセット
}
}//買い注文記述の終わり
// 売り注文について
if(//長期MAより短期MAの値が小さければ
FastMA.Main(barShift) < SlowMA.Main(barShift)
&&
Positions.GetSellPosCount(MagicNumber) == 0)// 売りポジションがなければ
{
//買いポジションがあれば決済する
Trade.ClosePosition(glBuyTicket);
//買いポジション番号をリセット
glBuyTicket = 0;
//新規売り注文を出す
glSellTicket = Trade.Sell(_Symbol,tradeSize);
if(glSellTicket > 0)
{
// 開いたポジションの価格を取得
double openPrice = PositionOpenPrice(glSellTicket);
double sellStop = CalSellSL(_Symbol,StopLoss,openPrice);// ストップロス計算
if(sellStop > 0)
sellStop = ModifyUpperStopLevel(_Symbol,sellStop); // ストップロスの設定が有効かチェック
double sellProfit = CalSellTP(_Symbol,TakeProfit,openPrice);// テイクプロフィット計算
if(sellProfit > 0)
sellProfit = ModifyLowerStopLevel(_Symbol,sellProfit); // テイクプロフィットの設定が有効かチェック
// ストップロスとテイクプロフィットを設定
if(sellStop > 0 || sellProfit > 0)
Trade.SetSLTP(glSellTicket,sellStop,sellProfit);
glBuyTicket = 0;//買いポジション番号をリセット
}
}//売り注文の記述終わり
}// 注文関連の記述終わり
// ポジション番号を取得
ulong tickets[]; // チケット番号を格納するための配列
Positions.GetTotalPosNum(MagicNumber, tickets); // 全ポジションのポジション番号を取得
int numTickets = ArraySize(tickets); // 取得したポジションの数を格納
// トレーリングストップ処理
if(UseTrailingStop == true && numTickets > 0) // トレーリングストップが有効かつオープンポジションが存在する場合
{
for(int i = 0; i < numTickets; i++) // オープンポジションの数だけループ
{
// 各ポジションに対してトレーリングストップ処理を適用
Trailing.TrailingStop(tickets[i], TrailingStop, MinimumProfit, Step);
}
}//トレーリングストップ記述の終わり
// ブレイクイーブン処理
if(UseBreakEven == true && numTickets > 0) // ブレイクイーブンが有効かつオープンポジションが存在する場合
{
for(int i = 0; i < numTickets; i++) // オープンポジションの数だけループ
{
// 各ポジションに対してブレイクイーブン処理を適用
Trailing.BreakEven(tickets[i], BreakEvenProfit, LockProfit);
}
} // ブレイクイーブン処理の終わり
}//全体記述の終わり
//+------------------------------------------------------------------+
今回簡単にEAが完成したのは、単に短期移動平均線と長期移動平均線の関係性で売買する、という単純なロジックだから、というだけではありません。
第113回「インジケータの値をトレードシグナルに使う方法」でも書いた事ですが、
インジケータを使ったエントリー条件というのは、実はそんなに種類がある訳ではなく、
1:為替価格とインジケ-タ値との関係性から作るパターン
2: インジケータの複数のラインの位置関係で考えるパターン
3:時間経過に伴うインジケータの変化具合で考えるパターン
4:特定の基準となる数値に対する、インジケータの値との関係性で考えるパターン
5:上記のパターンを組みあせたもの
という概ね5つのパターンぐらいしかありません。
すでにエントリー条件以外の部分はテンプレート化している訳ですから、基本やる事はインジケータの選定とエントリー条件を上記の5つのパターンから選定し、それを売買箇所のif文に落とし込むぐらいしかない訳です。
そしてエントリー条件以外にEAに落とし込みたいシステムがあれば、これまでの講座で学んできたことを活かし、そのシステムを別ファイルにてクラス化してテンプレートにインクルードしておけば今後新しいEAを作る時にいつでも使えるようになります。
ここまで学んできた皆さんであれば、思いついたEAはどんなものでも形にできる自信が湧き上がってきているのではないでしょうか?
次回以降、あと何個か例としてEA開発用テンプレートを使ったEA作成例をお届けして講座を終了させたいと思います。
今回は以上とさせていただきます。
最後までお読みいただきありがとうございました。