iCustom関数は、カスタムインジケ-タの値を特定して、その値を取得する為に使われる関数である、という前提をまずお伝えした上で、iCustom関数の引数と戻り値について解説しました。
iCustom関数を使うにあたり、特に注意を払いたいのが
第3引数に、カスタムインジケ-タの名前を「正確に」記述する必要がある点と、
第4引数以降には「使おうとしているカスタムインジケ-タに設定されているinput変数に従った情報」を順番通りに記述する必要がある点
です。
この部分に記述ミスがあると、カスタムインジケ-タの読み込みが正しく行われない可能性があるので、注意しましょう。
詳しくは、前回の記事における、
『第3引数「name」にはカスタムインジケータの名前を正確に設定する。』セクション
及び
『第4引数以降にはカスタムインジケータに設定されているinput変数に従った情報を順番通りに設定する。』セクションを確認して頂ければと思います。
そして最後に、iCustom関数をメインプログラムでどのように使っていくのか、という点について説明をしました。基本的には他の組み込みインジケータ用の関数と同じように、
iCustom関数を使ってハンドル値を取得
↓
値を格納する配列を用意
ArraySetAsSeries関数を使って配列を時系列セット
↓
CopyBuffer関数を使って、値を配列にコピー
という手順を踏みます。
詳しくは
前回の記事における『iCustom関数を使ってカスタムインジケータの値を取得する具体的な手順』セクションをご覧ください。
今回は、これまで数回にわたって解説してきた内容を踏まえ、インジケータを使ってエントリーシグナルを作る方法を具体的に解説していきたいと思います。
そもそも、インジケータは過去相場の検証、および未来相場の予測の為に用いられるものです。
従って、インジケータの値をEAの売買条件に自由自在に取り込めるようなMQL5のプログラミング技術を身につける事は大きなアドバンテージになります。
今回の内容を理解する事によって、EA開発で大きなウェイトを占める、エントリー条件発案に大きな手助けとなるでしょう。
是非今回も楽しみながら学んで頂ければと思います。
※なお今回紹介するエントリー条件は、いずれもMQL5を理解する上で、網羅的に知識を身につけてもらう、という趣旨の元紹介しているものであり、紹介しているエントリー条件を使ってEAを作る事を推奨しているものではありません。
ここで紹介している条件を用いて作ったEAを実運用に回して、損失を被った場合でも当サイトで責任を請け負う事は出来かねます。
また、記事中のサンプルコードはインジケータのエントリー条件に絞って記述しているので、ポジション管理その他の、EAを正常に動かすための記述は省略したり厳密さを欠いている部分があります点をご了承ください。
インジケータを使ったエントリー条件の種類は実は多くない
インジケータは実に数多くの種類があります。そう考えると、それを用いたエントリー条件も無数にあるような気がしてきます。
ですが、実はインジケータを使ったエントリー条件というのは、概ね以下の5パターンに分けられます。
1:為替価格とインジケ-タ値との関係性から作るパターン
2: インジケータの複数のラインの位置関係で考えるパターン
3:時間経過に伴うインジケータの変化具合で考えるパターン
4:特定の基準となる数値に対する、インジケータの値との関係性で考えるパターン
5:上記のパターンを組みあせたもの
1つ1つ順を追って見ていきましょう。
1:為替価格とインジケ-タ値との関係性でエントリシグナルを発動する
まず最初は、為替価格とインジケータ値との関係性でエントリシグナルを発動するパターンです。
第107回「価格情報からトレードシグナルを生成する」で解説したエントリーシグナルも、現在足の1本
前と2本前の確定足と単純移動平均(SMA)との位置関係からエントリーシグナルを発出するものであり、このカテゴリーに属します↓
サンプルコード等含め、詳しくは講座記事第107回をご覧ください。
また前回解説したボリンジャーバンドを使ったエントリー条件も、価格とインジケータラインとの位置関係でエントリーするパターンに当てはまるかと思います。
例えば
ボリンジャーバンドの上バンドを上抜いたら、上昇トレンドが発生したとみなし、買いエントリーする
ボリンジャーバンドの下バンドを下抜いたら、下降トレンドが発生したとみなし、売りエントリーする
という条件でエントリーシグナルを記述しようとする場合、以下のような形になります↓
if(Price.Close()>bbUpper[1] && PositionType(ポジション番号)!=POSITION_TYPE_BUY)
{
Trade.Buy(_Symbol,0.1);
}
else if(Price.Close()>bbLower[1] && PositionType(ポジション)!=POSITION_TYPE_SELL)
{
Trade.Sell(_Symbol,0.1);
}
※配列「bbUpper[]」にはボリンジャーバンドの上バンドの値、配列「bbLower[]」にはボリンジャーバンドの下バンドの値が格納されている想定です。
インジケータの値を取得するプロセスについては、↓の記事をご参照ください。
・MQL5 EA講座 第108回「インジケータを使ってエントリーシグナルを生成する」
※Close関数に関しては、第104回で取り上げているので↓の記事をご参照ください。
・MQL5 EA講座 第104回「価格とバーに関するデータへのアクセス:その2バー情報」
※PositionType関数を始めとするポジション情報取得関数については第84回にて解説を行っていますので、詳しくは↓の記事をご参照ください。
・MQL5 EA講座 第84回「ポジション情報を取得する独立関数を作る」
※Trade.Buy、Trade.Sellについては↓の記事をご参照ください。
・MQL5 EA講座 第73回「Buy関数とSell関数を実装」
2:インジケータの複数のラインの位置関係でエントリシグナルを発動する
続いては、インジケータの複数のラインの位置関係でエントリシグナルを発動するパターンです。
移動平均線のゴールデンクロス、デッドクロスなどもこのパターンに当てはまります。
ゴールデンクロスとは?
ゴールデンクロスは、期間の異なる移動平均線が、2本チャート上に描画されている時に、そのうちの短い期間の移動平均線が長い期間の移動平均線を下から上に抜けた瞬間の事を指します。
デッドクロスとは?
デッドクロスはゴールデンクロスの逆で、短い期間の移動平均線が長い期間の移動平均線を上から下に抜けた瞬間の事を指します。
ゴールデンクロスは上昇トレンドの始まりを、
デッドクロスは下降トレンドの始まりを予見している、とされています。
例えば15期間の移動平均線が30期間の移動平均線を上抜いた時をゴールデンクロス発生として、買いエントリー、逆に下抜いた時をデッドクロス発生として売りエントリーするする条件式を記述しようととする場合、以下のような形になります。
if(fastMA[2]<=slowMA[2]&& fastMA[1]>slowMA[1])
{
Trade.Buy(_Symbol,0.1);
}
else if(fastMA[2]>=slowMA[2]&& fastMA[1]<slowMA[1])
{
Trade.Sell(_Symbol,0.1);
}
※配列fastMA[]には15期間の短期移動平均線の値が、配列slowMA[]には30期間の長期移動平均線の値が格納されている、という想定です。
現在足のオープン価格でエントリーする事を想定した場合、ゴールデンクロスは2本前の足と1本前の足の段階における短期移動平均線と長期移動平均線の位置関係で考えれば良いです。
この場合、
2本前の足の段階では短期移動平均線の値は移動平均線の値以下だったのが、
1本前の足の段階では短期移動平均線の値は長期移動平均線の値より大きくなっていれば、ゴールデンクロスを表現できます。それをコード記述にすると
fastMA[2]<=slowMA[2]&& fastMA[1]>slowMA[1]
になる訳です。
デッドクロスについては、それをそのまま逆に考えれば良いので、
2本前の足の段階では短期移動平均線の値は長期移動平均線の値以上だったのが、
1本前の足の段階では短期移動平均線の値は長期移動平均線の値より小さくなっている状態
をコード化すればよいという事になります。すなわち、
fastMA[2]>=slowMA[2]&& fastMA[1]<slowMA[1]
という記述になります。
※移動平均線をはじめとしたインジケータ値取得の基本については↓の記事をご参照ください。
・MQL5 EA講座 第108回「インジケータを使ってエントリーシグナルを生成する」
※また、移動平均線自体の詳しい解説は↓の記事で行っていますので、宜しければご覧ください。
ゴールデンクロス・デッドクロスを移動平均線以外のインジケータにも適用する
また、ゴールデンクロス・デッドクロスの概念は、移動平均線以外のインジケータにも適用する事ができます。
例えば、ストキャスティクスのメインラインとシグナルラインのゴールデンクロス・デッドクロスを売買条件にするような手法も考えられます。
その場合以下のようなコード記述になります。
if(stoch[2]<=signal[2]&& stoch[1]>signal[1])
{
Trade.Buy(_Symbol,0.1);
}
else if(stoch[2]>=signal[2]&& stoch[1]<signal[1])
{
Trade.Sell(_Symbol,0.1);
}
配列stoch[]にはストキャスティクスのメインライン値が、配列signal[]にはシグナルライン値が格納さされている、という想定です。
メインラインがシグナルラインを上抜いた時は、上昇トレンドの開始と判断して買いエントリーを発動します。
逆にメインラインがシグナルラインを下抜いた時は、下降トレンドの開始と判断して売りエントリーを発動します。
移動平均線の時と同じように、現在足のオープン価格でエントリーする事を想定した場合、ゴールデンクロスは2本前の足と1本前の足の段階におけるメインラインとシグナルラインの位置関係で考えてコード記述を行えば大丈夫です。
つまり、
2本前の足の段階ではメインラインの値はシングルラインの値以下だったのが、
1本前の足の段階ではメインラインの値はシングルラインの値より大きくなっていれば、ゴールデンクロスを表現できます。それをコード記述にすると
stoch[2]<=signal[2]&& stoch[1]>signal[1]
となります。
デッドクロスは、それが逆になるので、
2本前の足の段階ではメインラインの値はシングルラインの値以上だったのが、
1本前の足の段階ではメインラインの値はシングルラインの値より小さくなっている状態
をコード化すればよいという事になります。すなわち、
stoch[2]>=signal[2]&& stoch[1]<signal[1]
という記述になります。
※ストキャスティクスについての詳細はこちらのリンクをご参照ください。
時間経過に伴うインジケータの変化具合でエントリシグナルを発動する
3つめは、時間経過に伴うインジケータの変化具合でエントリシグナルを発動するパターンです。
トレンド発生状況を推し量るようなインジケータに対して適用できるエントリー条件になります。
色んな考え方ができると思いますが、1つの案として、移動平均線の傾き具合で、トレンドの発生状況を確認し、エントリーシグナルを発出する方法があります。
例えば、現在足から数えて1本前、3本前、5本前の確定足時点の移動平均線値を比較して、
5本前移動平均線値より3本前移動平均線値の方が大きく、かつ3本前移動平均線値より1本前移動平均線値の方が大きい状態の時は上昇トレンドと判断し買いエントリー、
逆に5本前移動平均線値より3本前移動平均線値の方が小さく、かつ3本前移動平均線値より1本前移動平均線値の方が小さい状態の時は、下降トレンドと判断し売りエントリーするような条件です。
※確定足については↓の記事をご参照ください。
・MQL5 EA講座 第107回「価格情報からトレードシグナルを生成する」
画像にすると以下のような局面です↓
【買いエントリーの局面】
【売りエントリーの局面】
どちらの画像も、厳密に言えばもっと前の段階からエントリー条件が成立している局面はあるのですが、直近から遡ってみた場合、このような形の時にエントリが可能となっています。
これをコードにすると、以下のような形になります。
if(MA[1]>MA[3]&& MA[3]>MA[5])
{
Trade.Buy(_Symbol,0.1);
}
else if(MA[1]<MA[3]&& MA[3]<MA[5])
{
Trade.Sell(_Symbol,0.1);
}
現在足から数えて1本前の移動平均線値はMA[1]に、3本前の移動平均線値はMA[3]に、5本前の移動平均線値はMA[5]にそれぞれ格納されている想定です。
この、傾きでトレンドを判定する方法も、移動平均線に限らず、RSIやMACDなど他のインジケータに取り入れる事が可能です。
特定の基準となる数値に対する、インジケータの値との関係性でエントリシグナルを発動する
4つ目は特定の基準となる数値に対する、インジケータの値との関係性でエントリシグナルを発動するパターンです。オシレータ系のインジケータでは特によく使われるエントリーシグナルパターンです。
例えばオシレータ系の代表インジケータの1つであるRSIは、最小値が0、最大値が100となるような計算設計がされており、その間を行き来するような指標です。
RSIとは?
RSI(Relative Strength Index/相対力指数)とは投資対象が、近い未来に上がるか、下がるかのヒントを与えてくれるオシレーター系指標の一つです。数値として0から100までの間の値を示します。
RSIの計算式は
N期間の値上がり幅合計/N日間の値上がり幅合計 +N期間の値下がり幅合計)×100
で表されます。期間Nには14を用いることが多いです。
要するに指定期間の全値幅に対する、上げ幅が占める割合を示したものです。
従って、RSIの数字が大きければそれだけ指定期間に占める上昇時間が長かった事を示します。
逆に数字が小さければ指定期間に占める下降時間が短かった事を意味します。
一般にRSIの数値が30以下の時に、「売られすぎ」
70以上の時に「買われすぎ」とされ、相場が反転する目安とされています。
30や70という数字は、マラソンランナーが平坦な道が少ない坂道をずっと登ってきた状態に近いですから、そろそろペースが落ちるのではないか?という見通しに基づく理屈です。
もっとも30や70という数字は強いトレンドが発生していることを示すものでもありますから、そのまま下がり続けたり、上がり続けたりする場合も少なからずあります。
RSIの基準値をもとにエントリーシグナルを発出する
ともあれ、通説に基づき特定の基準となる数値といえる、RSIが30を切った時に買いエントリー、逆に70を上回った時に売りエントリーという条件を記述しようとした場合、あくまで一例ですが以下のような形になります↓
if(rsi[1]<30 && PositionType(ポジション番号)!=POSITION_TYPE_BUY)
{
Trade.Buy(_Symbol,0.1);
}
else if(rsi[1]>70 && PositionType(ポジション番号)!=POSITION_TYPE_SELL)
{
Trade.Sell(_Symbol,0.1);
}
※配列rsi[1]には、現在足から数えて1つ前の確定足におけるRSIの値が格納されている、という想定です。
以下のような局面で売買をしていく事になります。
もう一つMACDという指標を取り上げて考えてみましょう。
MACDとは?
MACD(Moving Average Convergence Divergence/移動平均収束拡散)は、テクニカル分析で使用される指標の一つであり、トレンドの方向性とその強さを評価するために用います。
計算式はシンプルで、
つまり、MACDとは長期移動平均線と短期移動平均線の乖離差を表したものになる訳です↓
長期移動平均線と短期移動平均線の差を表したもの、ということは
MACDの値が0ラインを上抜けた時は、ゴールデンクロスを表しており、
逆にMACDの値が0ラインを下抜けた時は、デッドクロスを意味します。
MACDにはシグナルラインというもう一つのラインが用意されています。
これは先述したMACDライン、すなわち(長期移動平均線と短期移動平均線の差)のN期間分(期間Nには「9」が用いられることが多いです)における指数平滑移動平均(EMA)値を描画したものになります。
MACDがシグナルラインを上抜けるときは買いのサインと解釈され、下抜けるときは売りのサインと解釈されることが多いです。
※MQL5ではiMACD関数を使ってMACDの指標ハンドルを取得します。
iMACD関数についての詳細は↓の記事をご参照ください。
※2つの期間が異なる移動平均線における乖離度合いを使ったインジケータでいうと、オーサムオシレーターというものがあります。詳しくは↓の記事をご参照ください。
※移動平均線自体の詳しい解説は↓の記事で行っていますので、移動平均線の理解を深めたい方はご覧ください。
MACDの基準値をもとにエントリーシグナルを発出する
MACDの値が0ライン以上にある時というのは、長期移動平均線より短期移動平均線が上に来ている状態であり、上昇トレンドという見方もできます。
一方でMACDの値が0ライン以下にある時というのは、長期移動平均線より短期移動平均線が下に来ている状態であり、下降トレンドという見方もできます。
例えば、MACDの値が0ラインを上抜けた時に、エントリーしたい場合は↓以下のような記述をすればよいです
if(macd[1]<=0 && MAmacd[0]>0)
{
Trade.Buy(_Symbol,0.1);
}
else if(macd[1]>=0 && MAmacd[0]<0)
{
Trade.Sell(_Symbol,0.1);
}
※配列macd[0]には現在足におけるMACD値が、配列macd[1]には、現在足から数えて1本前におけるMACD値が格納されているという前提です。
5:これまでのパターンをAND条件やOR条件を使って複合させる
これまでに挙げてきた1-4までのインジケータを使ったエントリーシグナルパターンをAND条件やOR条件を使って、連結させていくことによって、エントリー条件のバリエーションを増やすことができます。
例えば、価格がボリンジャーバンドの下バンドを下回る水準で推移しており、なおかつRSIが30を下回っている状況になった時に買いエントリーする、逆にボリンジャーバンドの上バンドを上回る水準で推移しており、なおかつRSIが70以上状況になった時に売りエントリーする、といった条件を考えてみます。(画像の垂直線があるような局面です↓)
エントリー条件を記述しようとする場合、以下のような形になります↓
if(Price.Close(1)<bbLower[1] && rsi[1]<30 )
{
Trade.Buy(_Symbol,0.1);
}
else if(Price.Close(1)>bbUpper[1] && rsi[1]>70)
{
Trade.Sell(_Symbol,0.1);
}
このように、複数の条件を組み合わせていく事で、エントリーポイントをより絞る事ができます。
(エントリーポイントを絞る事を一律に推奨しているわけではありません。MT5のストラテジーテスター機能を使って、自作したEAの性能を過去相場で検証する際、あまりにエントリー条件を絞ると過去相場に合わせた過剰最適化(オーバーフィッティング)されたEAが出来上がってしまう可能性があります。過剰最適化されたEAは実運用に回した途にボロボロの成績をたたき出すことがよくあります。これらの事はまた別の機会に記事にしたいと思います)
・MQL5 EA講座 第33回「AND条件、OR条件の記述(論理積・論理和)」
※過剰最適化(オーバーフィッティング)については↓の記事をご参照ください。
まとめ
今回はインジケータの値をトレードシグナルに使う具体的な方法について解説しました。
インジケータを利用したトレード条件の設定パターンには主に
・特定の基準となる数値に対する、インジケータの値との関係性で考えるパターン
に分類できる事をお伝えし、それぞれのパターンの具体例を示しながら解説を行いました。
今回は以上とさせていただきます。
次回は、開発するEAに、インジケータによるトレードシグナルにON/OFF機能を実装する方法について解説していきたいと思います。
最後までお読みいただきありがとうございました。