講座記事第130回で解説した、EA開発用テンプレートを利用して作った逆張りシステムEAの全体記述
は以下の通りです。
//+------------------------------------------------------------------+
//| Counter-Trend System 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> // インジケータを扱うためのファイルをインクルード
CDerivediBollinger Bollinger;//ボリンジャーバンドを扱う為のインスタンス
CDerivediRSI RSI;//RSIを扱う為のインスタンス
// タイマー
#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 BandsPeriod = 20; // ボリンジャーバンドの期間
input int BandsShift = 0; // ボリンジャーバンドのシフト
input double BandsDeviation = 2; // ボリンジャーバンドの偏差
input ENUM_APPLIED_PRICE BandsPrice = PRICE_CLOSE; // ボリンジャーバンドの価格適用
input group "RSIの設定"
input int RSIPeriod = 8; // RSIの期間
input int RSIUpperLevel=70; //RSIの上限レベル
input int RSILowerLevel=30; //RSIの下限レベル
input ENUM_APPLIED_PRICE RSIPrice = PRICE_CLOSE; // RSIの価格適用
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 = 500; // トレーリングストップの距離
input int MinimumProfit = 200; // トレーリングを開始する最小利益
input int Step = 20; // トレーリングのステップ/
input group "ブレイクイーブン" // ブレイクイーブン設定のグループ化
input bool UseBreakEven = false; // ブレイクイーブンを使用するかどうか
input int BreakEvenProfit = 300; // ブレイクイーブンに設定する利益
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;//ポジション番号を格納する変数
//+------------------------------------------------------------------+
// シグナルの列挙型 |
//+------------------------------------------------------------------+
enum Signal
{
SIGNAL_BUY, // 買いシグナル
SIGNAL_SELL, // 売りシグナル
SIGNAL_NONE, // シグナルなし
};
Signal glSignal; // グローバルシグナル変数
//+------------------------------------------------------------------+
//| OnInit関数 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
// フィルポリシーを取得する
ENUM_ORDER_TYPE_FILLING filltype = FillPolicy();
// EAのマジックナンバーを設定する
Trade.SetMagicNumber(MagicNumber);
// 注文実行時の許容スリッページを設定する
Trade.SetDeviation(Slippage);
// 取得したフィルポリシーを設定する
Trade.SetFillType(filltype);
// ボリンジャーバンドの初期化
Bollinger.Init(_Symbol, _Period, BandsPeriod, BandsShift, BandsDeviation, BandsPrice);
// RSIの初期化
RSI.Init(_Symbol, _Period, RSIPeriod, RSIPrice);
// 初期化が完了したことを示す(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);
// トレードシグナルの確認
// ボリンジャーバンドの下部にあり、かつRSIが下限レベル以下であれば買いシグナル
if(Price.Close(barShift) < Bollinger.Lower(barShift) && RSI.Main(barShift) < RSILowerLevel)
glSignal = SIGNAL_BUY;
// ボリンジャーバンドの上部にあり、かつRSIが上限レベル以上であれば売りシグナル
else
if(Price.Close(barShift) > Bollinger.Upper(barShift) && RSI.Main(barShift) > RSIUpperLevel)
glSignal = SIGNAL_SELL;
// 買い注文について
// シグナルが買いである場合
if(glSignal == SIGNAL_BUY
&&
// 現在の価格がボリンジャーバンドの下部より上にある
Price.Close(barShift) > Bollinger.Lower(barShift)
&&
// 前のバーの価格がボリンジャーバンドの下部より下にある
Price.Close(barShift + 1) <= Bollinger.Lower(barShift + 1)
&&
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);
glSignal = SIGNAL_NONE; // シグナルをリセット
}
}//買い注文記述の終わり
// 売り注文について
// シグナルが売りである場合
if(glSignal == SIGNAL_SELL
&&
// 現在の価格がボリンジャーバンドの上部より下にある
Price.Close(barShift) < Bollinger.Upper(barShift)
&&
// 前のバーの価格がボリンジャーバンドの上部より上にある
Price.Close(barShift + 1) >= Bollinger.Upper(barShift + 1)
&&
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;//買いチケットリセット
glSignal = SIGNAL_NONE; // シグナルをリセット
}
}//売り注文の記述終わり
}// 注文関連の記述終わり
// ポジション番号を取得
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開発用テンプレートの全体記述については↓のリンクから確認ができます。
※EA開発用テンプレートにインクルードファイルとして取り込んでいるファイルは以下のリンクからご確認いただけます。
- OriginalTrade.mqhファイル(注文関連のクラスや関数が盛り込まれているファイル)
- OriginalPrice.mqhファイル(価格情報取得・管理に関連する機能が盛り込まれているファイル)
- OriginalMoneyManagement.mqhファイル(資金管理関連の機能が盛り込まれているファイル)
- OriginalTrailingStop.mqhファイル(トレーリングストップやブレイクイーブンストップに関連する機能が盛り込まれているファイル)
- OriginalIndicators.mqhファイル(インジケータを扱う為の機能が盛り込まれているファイル)
- OriginalTimer.mqhファイル(トレードタイマーに関する機能が盛り込まれているファイル)