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

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

前回まで行った作業

今回も引き続きEA開発用テンプレートを作成していきますが、その前に前回までの作業をおさらいしていきましょう。

まず前々回である第125回では、

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

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

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

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

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

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

そして前回第126回では、

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);
     }

インクルードファイルとしてテンプレートに取り込んでいるファイルは以下の通りです

今回は前回の作業の続きとして、

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

を片付けていきたいと思います。

OnTick関数の中その2:価格情報をアップデートする記述

//価格情報をアップデートする
   Price.Update(_Symbol,_Period);

前回最後に開設した、トレードタイマー設定に関する記述の下に、上記のコードを追加します。

Update関数は講座記事第104回で解説した、OriginalCBarsクラスメンバ関数です。

Update関数はバーデータをコピーする役割を担います。

Update関数をこの位置に配置する事によって、各バーの価格情報に自由にアクセスできるようにしておきます。

Update関数についての詳細は講座記事第104回の「バーデータをコピーするメンバ関数、Update関数」セクションをご覧ください。

OnTick関数の中その3:注文関連の記述

続いて注文関連の記述をしていきます。まず以下のようなif文を記述します。

// 注文関連の記述
// 新しいバーかつトレードタイマーが許可している時のみ注文処理を行う
   if(newBar == true && timerOn == true)
     {
      
     }// 注文関連の記述終わり

変数「newBar」「timerOn」いずれも、トレードを制御する為のフラグに使われているので、この変数いずれもがtrueの時に注文関連の処理を行います。

変数「newBar」に格納されている値に関しては「OnTick関数の中その1:新しいバーでの取引に関する設定」セクションを、変数「timerOn」に格納されている値に関しては「OnTick関数の中その2:トレードタイマーに関する設定」セクションをご確認ください。

このif文の{}内に、「資金管理に関する記述」「買い注文に関する記述」「売り注文に関する記述」を施していきます。

資金管理に関する記述

資金管理に関する記述は以下の通りです。

// ロット調整
      double tradeSize;
      //資金管理モードONなら設定したリスクに応じたロットを算出
      if(UseMoneyManagement == true)
         tradeSize = MoneyRiskManagement(_Symbol,FixedVolume,RiskPercent,StopLoss);

      //固定ロットを指定
      else
         tradeSize = VerifyVolume(_Symbol,FixedVolume);

まずdouble型ローカル変数「tradeSize」を宣言します。

input変数「UseMoneyManagement」がtrueであれば、MoneyRiskManagement関数を使って資金管理モードに則った取引ロットを算出し、その戻り値を「tradeSize」に代入します。

MoneyRiskManagement関数OriginalMoneyManagement.mqhファイル内にある独立関数で、「口座残高の何%までの損失なら許容する」という設定をEA稼働前に任意にできるようにした上で、その許容損失額を1回のトレードで超えないようにロット数を調整する役割を担っています。

MoneyRiskManagement関数の詳細につきましては講座記事第102回の「資金管理を考慮したロット数を算出する関数を追加する」セクションをご参照ください。

そして、else、すなわち「UseMoneyManagement」がfalseの場合は、資金管理モードではなく固定ロットで取引をする、という意味合いになりますのでVerifyVolume関数の第2引数input変数「FixedVolume」を記述し、その戻り値を「tradeSize」に代入するようにします。

VerifyVolume関数OriginalMoneyManagement.mqhファイル内にある独立関数です。

VerifyVolume関数は指定したロットが、各ブローカーが設定している取扱最小ロットや最大ロット、ロットのステップ幅に違反していないか?をチェック・修正する役割を担っています。

VerifyVolume関数に関する詳細は、講座記事第102回の「ロット調整を行う関数を追加する」セクションをご覧ください。

買い注文に関する記述

     // 買い注文について
      if(Positions.GetBuyPosCount(MagicNumber) == 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)
               ModifyUpperStopLevel(_Symbol, buyProfit); // テイクプロフィットの設定が有効かチェック

            // ストップロスとテイクプロフィットを設定
            if(buyStop > 0 || buyProfit > 0)
               Trade.SetSLTP(glBuyTicket, buyStop, buyProfit);
            glSellTicket = 0; // 売りチケットリセット
           }



        }//買い注文記述の終わり

続いては買い注文に関する記述です。

買い注文記述1:「買いポジションがなければ」という条件文を記述

if(Positions.GetBuyPosCount(MagicNumber) == 0)

という記述は「買いポジションがなければ」という意味になります。

GetBuyPosCount関数は、買いポジションの数を取得する、「OriginalCPositionsクラスメンバ関数です。

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

買い注文記述2:買い注文を出す

 {
         //買い注文を出す
         glBuyTicket = Trade.Buy(_Symbol,tradeSize);

続いて{}内の冒頭にて買い注文を出します。

「glBuyTicket」は講座記事第125回の「必要なグローバル変数を設定する」セクションで宣言したグローバル変数です。

同じく第125回の「必要なインクルードファイルを読み込み、インスタンスを設定する」セクションで作った「Trade」インスタンスからBuy関数を呼び出し「glBuyTicket」に代入します。「glBuyTicket」にはBuy関数戻り値であるポジション番号が格納されます。

Buy関数は「OriginalCTradeクラスメンバ関数で、買い注文処理を担っています。

Buy関数についての詳細は講座記事第73回及びその中の「Buy関数の処理実装記述」セクションをご覧ください

買い注文記述3:ストップロスとテイクプロフィットを設定する

まず以下のif文を作ります

 if(glBuyTicket > 0)
  {
  }

if(glBuyTicket > 0)の条件が成立している、という事はglBuyTicket に0より大きい数字が入っている→正常なポジション番号が格納されている→買い注文が無事に成立した事を意味します。

従って、このif文が成立する場合には{}内にストップロスとテイクプロフィットを設定する記述をしていきます。

 double buyStop = CalBuySL(_Symbol, StopLoss, openPrice); // ストップロス計算
            if(buyStop > 0)
               buyStop =ModifyLowerStopLevel(_Symbol, buyStop); // ストップロスの設定が有効かチェック

まずはストップロスの計算を行います。

double型ローカル変数「buyStop」を宣言しCalBuySL関数戻り値代入します。

CalBuySL関数は買いポジションのストップロス値を算出する、OriginalTrade.mqhファイル内に作った独立関数です。

CalBuySL関数についての詳細は講座記事第77回の「CalBuySL関数の処理実装記述」セクションをご覧ください。

if(buyStop > 0)という記述が成立している時は、無事にCalBuySL関数が算出したストップロス値が「buyStop」に格納されている事を意味します。

その場合、ModifyLowerStopLevel関数の第2引数に「buyStop」を記述し、「buyStop」に格納されている値がストップレベルに違反していないかどうか最終チェックをおこないます。

ModifyLowerStopLevel関数ストップレベルの最大値をチェック・修正する、OriginalTrade.mqhファイル内に作った独立関数です。

ModifyLowerStopLevel関数についての詳細は講座記事第80回の「ストップレベルの最大値要件を満たすよう修正する関数」セクションをご覧ください。

 double buyProfit = CalBuyTP(_Symbol, TakeProfit, openPrice); // テイクプロフィット計算
            if(buyProfit > 0)
               ModifyUpperStopLevel(_Symbol, buyProfit); // テイクプロフィットの設定が有効かチェック

続いてはテイクプロフィットの計算です。

double型ローカル変数「buyProfit」を宣言し、CalBuyTP関数戻り値代入します。

CalBuyTP関数は買いポジションのテイクプロフィット値を算出する、OriginalTrade.mqhファイル内に作った独立関数です。

CalBuyTP関数についての詳細は講座記事第77回の「CalBuyTP関数の処理実装記述」セクションをご覧ください。

if(buyProfit > 0)という記述が成立している時は、無事にCalBuyTP関数が算出したテイクプロフィット値が「buyProfit 」に格納されている事を意味します。

その場合、ModifyUpperStopLevel関数の第2引数に「buyProfit 」を記述し、「buyProfit 」に格納されている値がストップレベルに違反していないかどうか最終チェックをおこないます。

ModifyUpperStopLevel関数ストップレベルの最小値をチェック・修正する、OriginalTrade.mqhファイル内に作った独立関数です。

ModifyUpperStopLevel関数についての詳細は講座記事第80回の「ストップレベルの最小値要件を満たすよう修正する関数」セクションをご覧ください。

// ストップロスとテイクプロフィットを設定
            if(buyStop > 0 || buyProfit > 0)
               Trade.SetSLTP(glBuyTicket, buyStop, buyProfit);
            glSellTicket = 0; // 売りチケットリセット
           }



        }//買い注文記述の終わり

ストップロスとテイクプロフィットの算出が終わったので、最後に算出したストップロスとテイクプロフィットを発注します。

if(buyStop > 0 || buyProfit > 0)が成立するという事は、ストップロスあるいはテイクプロフィットに具体的な値が設定されている事を意味します。

「Trade」インスタンスから「OriginalCTradeクラスメンバ関数であるSetSLTP関数を呼び出します。

SetSLTP関数ストップロス(SL)とテイクプロフィット(TP)の設定をする役割を担っています。

SetSLTP関数についての詳細はMQL5 EA講座 第76回「SLとTPを設定する関数をクラスに追加する」をご覧ください。

買い注文のストップロスとテイクプロフィット発注が終わったら、ローカル変数「glSellTicket」に0を代入し、売りポジション番号をリセットしておきます。

買い注文に関する記述は以上になります。

売り注文に関する記述

// 売り注文について
      if(Positions.GetSellPosCount(MagicNumber) == 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;//買いチケットリセット
           }
        }//売り注文の記述終わり

     }// 注文関連の記述終わり

買い注文の記述が終わったので、次は売り注文の記述に移ります。

売り注文記述1:「売りポジションがなければ」という条件文を記述

if(Positions.GetSellPosCount(MagicNumber) == 0)// 売りポジションがなければ

という記述は「売りポジションがなければ」という意味になります。

GetSellPosCount関数は、売りポジションの数を取得する「OriginalCPositionsクラスメンバ関数です。

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

売り注文記述2:売り注文を出す

{
         //新規売り注文を出す
         glSellTicket = Trade.Sell(_Symbol,tradeSize);

続いて{}内の冒頭にて売り注文を出します。

「glSellTicket」は講座記事第125回の「必要なグローバル変数を設定する」セクションで宣言したグローバル変数です。この変数に「Trade」インスタンスからSell関数を呼び出し「glSellTicket」に代入します。

「glSellTicket」にはSell関数戻り値であるポジション番号が格納されます。

Sell関数は「OriginalCTradeクラスメンバ関数で、買い注文処理を担っています。

Sell関数についての詳細は講座記事第73回及びその中の「Sell関数の処理実装記述」セクションをご確認ください。

売り注文記述3:ストップロスとテイクプロフィットを設定する

買い注文の時と同様に、まず以下のif文を作ります

 if(glSellTicket> 0)
  {
  }

if(glSellTicket> 0)の条件が成立している、という事はglSellTicketに0より大きい数字が入っている→正常なポジション番号が格納されている→売り注文が無事に成立した事を意味します。

従って、このif文が成立する場合には{}内にストップロスとテイクプロフィットを設定する記述をしていきます。

 double sellStop = CalSellSL(_Symbol,StopLoss,openPrice);// ストップロス計算
            if(sellStop > 0)
               sellStop = ModifyUpperStopLevel(_Symbol,sellStop); // ストップロスの設定が有効かチェック

まずはストップロスの計算を行います。

double型ローカル変数「sellStop」を宣言し、CalSellSL関数戻り値代入します。

CalSellSL関数は売りポジションのストップロス値を算出する、OriginalTrade.mqhファイル内に作った独立関数です。

CalSellSL関数についての詳細は講座記事第77回の「CalSellSL関数の処理実装記述」セクションをご覧ください。

if(sellStop > 0)という記述が成立している時は、無事にCalSellSL関数が算出したストップロス値が「sellStop 」に格納されている事を意味します。

その場合、ModifyUpperStopLevel関数の第2引数に「sellStop」を記述し、「sellStop」に格納されている値がストップレベルに違反していないかどうか最終チェックをおこないます。

 double sellProfit = CalSellTP(_Symbol,TakeProfit,openPrice);// テイクプロフィット計算
            if(sellProfit > 0)
               sellProfit = ModifyLowerStopLevel(_Symbol,sellProfit); // テイクプロフィットの設定が有効かチェック

続いてはテイクプロフィットの計算です。

double型ローカル変数「sellProfit」を宣言し、CalSellTP関数戻り値代入します。

CalSellTP関数は売りポジションのテイクプロフィットを値を算出する、OriginalTrade.mqhファイル内に作った独立関数です。

CalSellTP関数についての詳細は講座記事第77回の「CalSellTP関数の処理実装記述」セクションをご確認ください。

if(sellProfit > 0)という記述が成立している時は、無事にCalSellTP関数が算出したテイクプロフィット値が「sellProfit」に格納されている事を意味します。

その場合、ModifyLowerStopLevel関数の第2引数に「sellProfit」を記述し、「sellProfit」に格納されている値がストップレベルに違反していないかどうか最終チェックをおこないます。

 // ストップロスとテイクプロフィットを設定
            if(sellStop > 0 || sellProfit > 0)
               Trade.SetSLTP(glSellTicket,sellStop,sellProfit);
            glBuyTicket = 0;//買いチケットリセット
           }
        }//売り注文の記述終わり

     }// 注文関連の記述終わり

ストップロスとテイクプロフィットの算出が終わったので、最後に算出したストップロスとテイクプロフィットを発注します。

if(sellStop > 0 || sellProfit > 0)が成立するという事は、ストップロスあるいはテイクプロフィットに具体的な値が設定されている事を意味します。

「Trade」インスタンスから「OriginalCTradeクラスメンバ関数であるSetSLTP関数を呼び出します。

売り注文のストップロスとテイクプロフィット発注が終わったら、ローカル変数「glBuyTicket」に0を代入し、買いポジション番号をリセットしておきます。

まとめ

今回も、引き続きEA開発用テンプレート作りを行いました。OnTick関数内の記述のうち、価格情報をアップデートする記述や注文関連の記述を追加しました。

詳しくは当記事の、

・「OnTick関数の中その2:価格情報をアップデートする記述」セクション

・「OnTick関数の中その3:注文関連の記述」セクションをご覧ください。

そして、注文関連の記述については多岐にわたる為、資金管理に関する記述、買い注文に関する記述、売り注文に関する記述、とさらに細かくセクションを分けてその実装過程を解説していきました。

詳しくは当記事の、

・「資金管理に関する記述」セクション

・「買い注文に関する記述」セクション

・「売り注文に関する記述」セクションをご覧ください。

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

//+------------------------------------------------------------------+
//|                                    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);
     }

//価格情報をアップデートする
   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(Positions.GetBuyPosCount(MagicNumber) == 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(Positions.GetSellPosCount(MagicNumber) == 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;//買いチケットリセット
           }
        }//売り注文の記述終わり

     }// 注文関連の記述終わり

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

ポジション番号取得に関する記述

トレーリングストップに関する記述

ブレイクイーブンストップに関する記述

となっております。

次回でテンプレート作りは完成する予定ですので、楽しみにお待ちください。

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

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

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

コメント

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