【超入門】MQL5 EA講座 第98回「動的トレーリングストップについて」【EAの作り方】

MQL5でEA作ろう講座

前回は、トレーリングストップ専用クラスであるOriginalCTrailingクラスにおけるメンバ関数であるTrailingStop関数、その書式2について解説しました。

前回の内容をおさらいですが、

TrailingStop関数書式1書式2、その違いは、まず

第2引数書式1int型なのに対し、書式2double型になっている点でした。

これは書式1TrailingStop関数内でトレーリングストップ値を画一的に計算して算出するのに対し、書式2ではメインプログラムで計算・用意した値をトレーリングストップ値として用いることが理由となっています。

今回は動的トレーリングストップについて解説していこうと思います。

今回の内容は、前回解説した内容に関係してきます。

スポンサーリンク

動的トレーリングストップとは?

動的トレーリングストップとは、移動平均線パラボリック、直近高安値などの指標を利用を利用して、SL値を変更していこうとする戦略、及び(MQL5においては)それを実現する為のコード記述を指します。

移動平均線を利用した記事に関しては↓の記事群も参考になるかと思います。

※直近高安値に関する記述に関しては、以下↓の記事群も参考になるかと思います。

※また、移動平均線自体の詳しい解説は↓の記事で行っていますので、宜しければご覧ください。

93回94回95回までで紹介したトレーリングストップ値は、(input変数でパラメータ化した値×_Point)にAskやBidの現在値をプラスしたりマイナスする・・・といった単純かつ画一的な計算で求めていました。(詳しいことは93回94回95回をご覧ください)

動的トレーリングストップというのは、そこからもう一歩推し進めて、トレーリングストップ値を相場の原理原則(とされるもの)に準じた値にしよう、という考えになります。

言うまでもなく、動的トレーリングストップを導入したからといって、即座に作ったEA(自動売買プログラム)の利益化に繋がる、という甘いものではありませんが、EA(自動売買プログラム)を作る上で手札が増えることは間違いないでしょう。

そして、96回97回TrailingStop関数オーバーロード関数として作ったのも、今回解説する動的トレーリングストップを実現させるのが理由でした。

オーバーロード関数については↓の記事をご参照ください。

93回94回95回までで紹介したシンプルなトレーリングストップであれば、書式1でも問題ないのですが、動的トレーリングストップを実現させるためには書式2 も必要であった訳です。

これからその点も併せて解説していこうと思います。

動的トレーリングストップに関する解説にフォーカスする為に、動的トレーリングストップ以外の記述(売買条件等)は省略させていただきます。

EAに動的トレーリングストップを導入する為のロードマップ

EA(自動売買プログラム)パラボリックSAR値による動的トレーリングストップを導入するには以下の手順を踏んで、実現していきます。

OriginalTrailingStop.mqhファイルをインクルードし、OriginalCTrailingクラスインスタンスを宣言する。

動的トレーリングストップに必要なinput変数を設定する。

・終値に関する情報を取得する記述を行う

パラボリックSARに関する情報取得記述を行う

動的トレーリングストップの発動タイミングを判断するbool型ローカル変数を宣言

動的トレーリングストップの発動タイミングに関する記述を行う

・実際に動的トレーリングストップを発動させる記述を行う。

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

OriginalTrailingStop.mqhファイルをインクルードし、OriginalCTrailingクラスのインスタンスを宣言する

まずOriginalCTrailingクラスを利用するので、OriginalTrailingStop.mqhファイルをインクルードします。

OriginalCTrailingクラスをメインプログラムで使う際のインスタンス名は「Trail」としました。

//+------------------------------------------------------------------+
//|                                           DynamicTrailExamle.mq5 |
//|                                                         MQL5ssei |
//|                                    https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"
#property version   "1.00"
//OriginalTrailingStop.mqhファイルをインクルードする
#include <OriginalTrailingStop.mqh>

//OriginalCTrailingクラスのインスタンスを宣言
OriginalCTrailing trail;

インクルード命令については↓の記事をご覧ください。

インスタンスについては↓の記事をご覧ください。

動的トレーリングストップに必要なinput変数を設定する。

まずは動的トレーリングストップに必要なinput変数を設定します。


//input変数
input bool AllowTrailingStop=false;//トレーリングストップのON/OFF
input int MinProfit=0;//ミニマムプロフィットの設定
input int Step =0;//ステップ幅の設定

//パラボリックSARに関する設定
input double ParSARStep=0.02;//ステップ幅
input double ParSARMax=0.2;//最大値

bool型のinput変数「AllowTrailingStop」

bool型input変数「AllowTrailingStop」は、トレーリングストップのON/OFFを切り替えるために使います。

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

この値がfalseの時は、そもそもトレーリングストップを発動しないようにOnTick関数内に記述します。

int型のinput変数「MinProfit」

int型input変数「MinProfit」はミニマムプロフィットの設定を行うために使います。

ミニマムプロフィットに関する詳細については↓の記事をご覧ください。

第94回「トレーリングストップにおけるミニマムプロフィットについて」

int型のinput変数「Step」

int型input変数「Step」はステップ幅に関する設定を行うために使います。

ステップ幅に関する詳細については↓の記事をご覧ください。

第95回「トレーリングストップにおけるステップ幅について」

double型のinput変数「ParSARStep」

double型input変数「ParSARStep」はパラボリックSARの計算を行うためのステップ幅設定に使います。初期値MT5パラボリックSARインディケータにおける初期値である0.02とします。

double型のinput変数「ParSARMax」

double型input変数「ParSARMax」はパラボリックSARの計算を行うための最大値設定に使います。初期値はこれも、ステップ幅と同様に、MT5パラボリックSARインディケータにおける初期値である0.2とします。

これで一通りinput変数に関する記述が終わりました。

次はOnTick関数内の記述に移ります。

94回95回の時には、この中に「TrailingStop」というinput変数がありましたが、今回は使いません。「TrailingStop」はシンプルなトレーリングストップを実現させるために、その材料として用いていたものなので、パラボリックSARトレーリングストップの値として使うと決めている今回は不要という訳です。

終値に関する情報を取得する記述を行う

続いてはOnTick関数内の記述に移ります。

まずは終値に関する情報を取得します。

void OnTick()
  {
      //終値に関する情報取得記述
      double closePrice[];
      //配列の時系列セット
      ArraySetAsSeries(closePrice,true);
      //終値情報を配列にコピー
      CopyClose(_Symbol,0,1,2,closePrice);
   
  }

終値情報を格納する配列「closePrice」を用意します。

配列については第18回「配列(Array)について」をご確認ください。

ArraySetAsSeries関数を使って配列「closePrice」を時系列にセットします

ArraySetAsSeries関数については

をご覧ください。

最後にCopyClose関数を使って、終値情報を配列「closePrice」にコピーしました。これで終値情報の取得は完了です。※CopyClose関数についてはコチラをご覧ください。

パラボリックSARに関する情報取得記述を行う

続いてはパラボリックSARに関する情報取得記述です。

//パラボリックSARに関する情報取得記述
      //パラボリックSARの値を格納する配列の用意
      double sar[];
      //パラボリックSARのハンドル値を取得
      int sarHandle=iSAR(_Symbol,0,ParSARStep,ParSARMax);
      //パラボリックSARの値を配列にコピー
      CopyBuffer(sarHandle,0,1,2,sar);

パラボリックSARの値を格納する配列「sar」を宣言します。

続いてはパラボリックSARハンドルを取得します。パラボリックSARハンドルの取得にはiSAR関数を使います。

iSAR関数について

iSAR関数引数構成と戻り値は以下のようになっています。

int  iSAR( 
   string          symbol,      // 銘柄名 
  ENUM_TIMEFRAMES  period,      // 期間 
  double          step,        // 価格増分ステップ(加速因子) 
  double          maximum      // ステップの最大値 
  );

戻り値は指標ハンドル
第1引数には銘柄を指定する

第1引数には銘柄を指定します。定義済み変数_Symbol」あるいはSymbol関数を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には時間軸を指定する

第2引数には時間軸を指定します。5分足なのか、1時間足なのか、日足なのか・・・パラボリックSARを計算するベースとなるタイムフレームの指定です。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENTと記述すると現在のチャートの時間軸が適用されます。

定義済み変数については→コチラをご覧ください。

定数については→コチラをご覧ください。

enum列挙型については→コチラをご覧ください。

第3引数にはパラボリックSARを計算するステップ幅を指定する

第3引数にはパラボリックSARを計算するステップ幅を指定します。今回のサンプルコードでは、

ここはinput変数「ParSARStep」で調整できるようにしてあるので、input変数「ParSARStep」を記述します。

第4引数にはパラボリックSARを計算するステップ最大値を指定する

第4引数にはパラボリックSARを計算するステップ最大値を指定します。ここも今回のサンプルコードではここはinput変数「ParSARMax」で調整できるようにしてあるので、input変数「ParSARMax」を記述します。

iSAR関数で取得したハンドル値を変数に格納する

iSAR関数で取得したハンドル変数「sarHandle」に格納します。変数「sarHandle」に

格納したハンドルは次のCopyBuffer関数で使います。

ハンドル値について

講座記事第68回「iMA関数について」セクションでも書いたことですが、MQL5の組み込みインジケータ 関数はこのハンドルを獲得する役割を持つ関数です。

MQL5においてハンドルはインディケータの値を取得する為のカギ、だと思ってください。

ハンドルについてもう少し詳細を知りたい方は↓の記事をご参照ください

取得したハンドルを使って、さらにCopyBuffer関数を使って、パラボリックSARの値を取得します。MQL4のiSAR関数のように直接パラボリックSARの値を取得してくれる訳ではないので注意です。

CopyBuffer関数を使って、パラボリックSARの値情報を配列にコピーする。

iSAR関数を使い、ハンドルを取得出来たら、次はCopyBuffer関数を使って、パラボリックSARの値情報を配列sar[]にコピーします。

CopyBuffer関数については詳しくは、コチラをご覧ください。

動的トレーリングストップの発動タイミングを判断するbool型の変数を宣言

終値情報とパラボリックSARの値情報の取得記述が終わりました。

続いては動的トレーリングストップの発動タイミングを判断するbool型変数を宣言します。

//動的トレーリングストップの発動タイミングを判断する変数の宣言
bool sarSignal=false;

変数名を「sarSignal」としました。

この変数を使って動的トレーリングストップの発動タイミングのON/OFFを切り替えます。どのようにON/OFFを切り替えるかはこの後説明します。

動的トレーリングストップの発動タイミングに関する記述を行う

次は動的トレーリングストップの発動タイミングに関する記述を行います。

if文を使い、「こうなったら動的トレーリングストップの発動をONにする(=変数「sarSignal」をtrueにする)」という記述を行います

//動的トレーリングストップの発動タイミングに関する記述を行う
      
      if(//買いの場合
          (PositionType(ポジション番号)/*ここは明らかに問題がある*/==POSITION_TYPE_BUY
          &&sar[1]>closePrice[1])
         ||//売りの場合
          (PositionType(ポジション番号)/*ここは明らかに問題がある*/==POSITION_TYPE_SELL
          &&sar[1]<closePrice[1])
         )
      {  //動的トレーリングストップの発動をONにする
         sarSignal=true;
      }
      

ポジションが買いの場合

講座記事85回で作ったPositionType関数を使い、ポジションタイプを取得します。POSITION_TYPE_BUYだった場合、一本前の足の終わりとパラボリックSAR値を比較し、

一本前の終値よりパラボリックSAR値の方が大きければ、動的トレーリングストップの発動をONにする{}内の執行文に移り、変数「sarSignal」にtrueを代入するようにします。

ここまでが買いの場合です。

||で論理和条件にして、続いて売り条件を記述します

論理和についてはコチラをご覧ください。

ポジションが売りの場合

逆にポジションタイプがPOSITION_TYPE_SELLだった場合、一本前の足の終わりとパラボリックSAR値を比較し、

一本前の終値よりパラボリックSAR値の方が小さければ、動的トレーリングストップの発動をONにする{}内の執行文に移り、変数「sarSignal」にtrueを代入するようにします。

実際に動的トレーリングストップを発動させる記述を行う。

動的トレーリングストップの発動タイミングに関する条件文の記述が終わったので

最後に実際に動的トレーリングストップを発動させる記述をします。

//実際に動的トレーリングストップを発動させる記述を行う
      if(AllowTrailingStop==true&&sarSignal==true)
      { 
         trail.TrailingStop(ポジション番号,sar[1],MinProfit,Step);
      }

「AllowTrailingStop」はinput変数で定めた、トレーリングストップを使うかどうかを判断するbool型変数です。パラメーター設定でここをfalseにしていた場合は、そもそもトレーリングストップ自体を行いません。

「sarSignal」は動的トレーリングストップの発動タイミングを判断するbool型変数です。

発動条件は「動的トレーリングストップの発動タイミングに関する記述を行う」セクションで記述した通りです。

ここでの条件文を満たしていれば変数「sarSignal」はtrueとなります。

あとは第97回で作った クラスメンバ関数であるTrailingStop関数書式2)を呼び出して動的トレーリングストップの処理を施します。第2引数double型変数を記述する事によって、自動的に書式2を適用したことになります。

TrailingStop関数(書式2)の詳細についてはコチラをご覧ください。

第1引数にはポジション番号、第2引数パラボリックSAR値を格納している配列「sar[1]」、第3引数にはinput変数「MinProfit」、「Step」をミニマムプロフィットステップ幅を設定する為にそれぞれ記述します。

大まかな流れは以上になります。

これでミニマムプロフィットステップ幅の条件を満たしていれば、パラボリックSAR値に合わせて動的トレーリングストップが発動するようになります。

まとめ

今回は動的トレーリングストップとは何か?という事を説明した上で、EA(自動売買プログラム)を作る際に、動的トレーリングストップを導入する記述に関する解説を行いました。

動的トレーリングストップとは、移動平均線パラボリック、直近高安値などの指標を利用を利用して、SL値を変更していこうとする戦略、及び(MQL5においては)それを実現する為のコード記述を指します。

今回動的トレーリングストップの例として取り上げたのはパラボリックSARの値だったわけですが、それ以外の値で動的トレーリングストップを実現させる場合も基本的な記述の流れは同じです。

移動平均線や直近高値安値を動的トレーリングストップとして利用するのであれば、その値計算を行い、その計算結果をTrailingStop関数(書式2)の第2引数に記述すればよいです。

今回は以上とさせていただきます。

次回ブレイクイーブンストップについて解説していこうと思います。トレーリングストップと近い概念ではありますが微妙に違います。ブレイクイーブンストップについての理解を深め、その記述方法をマスターする事によって、EA(自動売買プログラム)開発の手札もさらに増えることになりますから、次回も是非楽しみにして頂ければと思います。

最後までお読みいただきありがとうございました。

MQL5 EA講座 第97回「トレーリングストップクラスを作る2」

         →MQL5 EA講座 第99回「ブレイクイーブンストップについて」

パラボリックSARを利用した記事に関しては、以下の記事も参考になるかと思います。

コメント

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