前回は、トレーリングストップ専用クラスであるOriginalCTrailingクラスにおけるメンバ関数であるTrailingStop関数、その書式2について解説しました。
前回の内容をおさらいですが、
TrailingStop関数の書式1と書式2、その違いは、まず
第2仮引数が書式1はint型なのに対し、書式2はdouble型になっている点でした。
これは書式1がTrailingStop関数内でトレーリングストップ値を画一的に計算して算出するのに対し、書式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」はステップ幅に関する設定を行うために使います。
※ステップ幅に関する詳細については↓の記事をご覧ください。
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関数について
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と記述すると現在のチャートの時間軸が適用されます。
第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を利用した記事に関しては、以下の記事も参考になるかと思います。
コメント