FXピンバーが発生した時に矢印サインが現れるインジケーターを自作しよう!

ザフナーラボブログ

ピンバー(Pin Bar)とは、以下の図に示すように、足の実体が短いのに対して、ヒゲが長い足のことをいいます。

Explanation-of-Pin-Bar

ピンバー

このようなピンバーが、相場が継続的に上昇(下降)した後に出現すると、そこが相場の転換点になる場合が多くあります。

そこで、以下では、一定の条件を満たしたピンバーが出現した場合に、チャート上にサインを出すインジケーター(Pin-Bar Sign.mq4)の作成方法について解説します。

Pin-Bar-Sign

Pin-Bar Sign

1.全体像

MT4でインジケーターを作成するには、以下の手順に従ってプログラムを書いていくことになります。

  1. #property命令を記述する。
  2. インジケーターバッファーの宣言を行う。
  3. 変数の宣言を行う。
  4. 関数の定義を行う。
  5. init()関数内にインジケーターの基本的な設定を記述する。
  6. start()関数内に具体的な処理内容を記述する。

以下のサンプルコードをダウンロードして記事を読み進めてください。

Pin-Bar-Sign

2.#property命令の記述

#property命令とは、インジケーターの色、ラインの太さ、インジケーターを表示する場所などの、プログラム全体にかかわる設定を行うものです。

#property命令の詳細については「こちら」を参照してください。

「Pin-Bar Sign.mq4」における、#property命令を記述した部分の解釈を示すと、以下のようになります。

property_Pin-Bar

 

⑴ チャートウィンドウに表示させる

#property indicator_chart_window命令によって、「Pin-Bar Sign.mq4」は、チャートウィンドウに表示されます。

⑵ 2種類のデータを表示させる

「Pin-Bar Sign.mq4」では、以下の2つのデータを表示させます。

  • 買いのピンバーが出現したことを表す上矢印
  • 売りのピンバーが出現したことを表す下矢印

したがって、#property indicator_buffers命令には、「2」を指定します。

⑶ 色を指定する

「Pin-Bar Sign.mq4」で表示される2つのデータの表示色を指定します。

  • #property indicator_color1 Magenta
    1番目のインジケーターとして買いのピンバーの出現を示す上矢印を指定する(後述の5.⑵を参照)ので、#property indicator_color命令には「1」を指定し、表示色を「Magenta」に指定しています。
  • #property indicator_color2 Aqua
    2番目のインジケーターとして売りのピンバーの出現を示す下矢印を指定する(後述の5.⑵を参照)ので、#property indicator_color命令には「2」を指定し、表示色を「Aqua」に指定しています。

3.インジケーターバッファーの宣言

インジケーターバッファーとは、インジケーターの計算に使用するデータを格納しておく配列のことをいいます。

配列の詳細については「こちら」を参照してください。

「Pin-Bar Sign.mq4」における、インジケーターバッファーを宣言した部分の解釈を示すと、以下のようになります。

Indicator-Buffer-Pin-Bar

 

⑴ double Arrow_Up[];

上矢印の値を格納していく配列です。

⑵ double Arrow_Down[];

下矢印の値を格納していく配列です。

⑶ double Real_Body[];

ローソク足の実体の値を格納していく配列です。

⑷ double Upper_Shadow[];

上ヒゲの値を格納していく配列です。

⑸ double Lower_Shadow[];

下ヒゲの値を格納していく配列です。

4.変数の宣言

「変数」の詳細については「こちら」を参照してください。

「Pin-Bar Sign.mq4」においては、以下の項目をパラメーターとして指定します。

  • 現在の足の高値が、過去の一定期間における最高値より上にブレイクしたかどうか
  • 現在の足の安値が、過去の一定期間における最安値より下にブレイクしたかどうか
  • 上(下)ヒゲが、ローソク足の実体の何倍以上あることを要するか
  • 上(下)ヒゲが、何pips以上あることを要するか

上記の項目は、インジケーターをチャートに適用した際に任意の値に設定することができるようにするため、以下に示すように「外部変数」(詳細については「こちら」を参照してください。)として宣言します。

  • extern int Highest_Period
    現在の足の高値が、高値ブレイクしたかどうかの判定期間
  • extern int Lowest_Period
    現在の足の安値が、安値ブレイクしたかどうかの判定期間
  • extern int Magnification
    ピンバーと認められる上(下)ヒゲの長さを判定するための、ローソク足の実体の長さに対する掛け率
  • extern int Minimum_Length
    上(下)ヒゲの最低限の長さ(単位:pips)

5.関数の定義

「Pin-Bar Sign.mq4」では、ピンバーと認められるかどうかを判定するために、上(下)ヒゲの最低限の長さをpips単位でパラメーターとして設定できるようにしています。

そこで、「Pin-Bar Sign.mq4」では、AdjustPoint()関数を定義しています。

AdjustPoint()関数の詳細については「こちら」を参照してください。

6.基本設定の記述

「Pin-Bar Sign.mq4」におけるinit()関数内に記述したコードについて解説します。

init-Pin-Bar

 

⑴ IndicatorBuffers()とは

IndicatorBuffers()は、MQL4であらかじめ定義されている関数で、インジケーターの計算に使用するバッファーの個数を指定するものです。

IndicatorBuffers()関数の詳細については「こちら」を参照してください。

⑵ SetIndexBuffer()とは

setIndexBuffer()とは、MQL4であらかじめ定義されている関数で、各インジケーターバッファーを、インジケーターバッファー領域(データを一時的に蓄えるデータ領域)に割り当てるものです。

SetIndexBuffer()関数の詳細については「こちら」を参照してください。

⑶ SetIndexLabel()とは

SetIndexLabel()とは、MQL4であらかじめ定義されている関数で、データウィンドウにインジケーターの描画線の説明を表示させるものです。

SetIndexLabel()関数の詳細については「こちら」を参照してください。

⑷ SetIndexStyle()及びSetIndexArrow()とは

SetIndexStyle()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画スタイル(線orヒストグラム、色など)を設定するものです。

SetIndexStyle()関数の詳細については「こちら」を参照してください。

SetIndexArrow()とは、MQL4であらかじめ定義されている関数で、インジケーターに記号を表示させるものです。

SetIndexArrow()関数の詳細については「こちら」を参照してください。

⑸ PointとPipsの調整とは

「Pin-Bar Sign.mq4」は、一定の条件を満たしたピンバーの安(高)値の1pips下(上)に上(下)矢印を描画させます。

また、ピンバーと認められるための、最低限の上(下)ヒゲの長さをpips単位で設定します。

そこで、提示レートの小数点以下の桁数が「3」又は「5」桁の業者においても、定義済み変数「Point」(詳細は「こちら」を参照してください。)で取得される値に「10」を掛けるという処理を行うことなく、pips単位で矢印の描画位置や最低限のヒゲの長さを指定できるように、AdjustPoint()関数(詳細は「こちら」を参照してください。)を用いています。

7.具体的な処理内容

「Pin-Bar Sign.mq4」のstart()関数内に記述したコードについて解説します。

start-Pin-Bar

 

⑴ int limit=……について

「limit」という変数を、「Bars-IndicatorCounted()」を初期値として宣言しています。

当該コードの詳細については「こちら」を参照してください。

⑵ 最低計算期間の設定

「Pin-Bar Sign.mq4」は、現在の足の高(安)値が、一定期間の最高(安)値をブレイクしたかどうかどうかを判定して矢印を表示させるようにしているので、一定期間分のバーがチャートウィンドウ上に存在しない場合には、インジケーターを稼働させる意味がありません。

そこで、チャートウィンドウ上のバーの本数が、パラメーターとして設定した「Highest_Period」若しくは「Lowest_Period」の数値よりも少ない場合には、以降の計算が行われないようにしています。

  • Barsの詳細については「こちら」を参照してください。

⑶ 実体の計算

ア 始値と終値の差を算出する

ローソク足の実体とは、以下の部分を指します。

Real-Body

ローソク足の実体

したがって、ローソク足の実体の長さは、「始値と終値の差」として算出されます。

ただし、単純にローソク足の長さを「始値-終値」としてコードを記述してしまうと、バーが陰線であれば当該値は「正」の値となりますが、バーが陽線であれば当該値は「負」の値となります。

そして、バーがピンバーかどうかを判定する際に問題とするローソク足の実体の長さの値は、正負は問題となりません。

そこで、「Pin-Bar Sign.mq4」においては、MathAbs()関数(詳細は「こちら」を参照してください。)を使用して、「始値と終値の差」の絶対値を算出し、ローソク足の実体の長さを取得するようにしています。

イ 十字線等の場合の対応

ローソク足の実体の長さは、「始値と終値の差の絶対値」として算出されますが、始値と終値の値が等しい十字線や同時線の場合は、当該値は「0」として算出されます。

しかし、「Pin-Bar Sign.mq4」においては、バーがピンバーかどうかを判定する際に、上(下)ヒゲがローソク足の実体の何倍以上あるかを条件として設定しています。

そうすると、上記アの部分のコードのみであれば、バーが十字線や同時線の場合には、上(下)ヒゲが十分に長く形成されていたとしても、当該バーはピンバーとは判定されないということになります。

そこで、「Pin-Bar Sign.mq4」においては、「始値と終値の差の絶対値」が「0」であった場合には、ローソク足の実体が「1pips」あるものと設定しています。

⑷ 上ヒゲの計算

ローソク足の上ヒゲとは、以下の部分を指します。

Upper-Shadow

ローソク足の上ヒゲ

したがって、ローソク足の上ヒゲの長さは、以下のようにして算出されます。

  • 陽線の場合
    高値 - 終値
    (この値は「高値 - 始値」よりも小さい(上図参照)。)
  • 陰線の場合
    高値 - 始値
    (この値は「高値 - 終値」よりも小さい(上図参照)。)

つまり、ローソク足の上ヒゲの長さは、陽線・陰線を問わず、

「高値 - 始値」の値と「高値 - 終値」の値の小さい方

ということになります。

そこで、「Pin-Bar Sign.mq4」においては、MathMin()関数(詳細は「こちら」を参照してください。)を使用して、「高値 - 始値」の値と「高値 - 終値」の値を比較し、小さい方の値をローソク足の上ヒゲの長さとして取得するようにしています。

⑸ 下ヒゲの計算

ローソク足の下ヒゲとは、以下の部分を指します。

Lower-Shadow

ローソク足の下ヒゲ

したがって、ローソク足の下ヒゲの長さは、以下のようにして算出されます。

  • 陽線の場合
    始値 - 安値
    (この値は「終値 - 安値」よりも小さい(上図参照)。)
  • 陰線の場合
    終値 - 安値
    (この値は「始値 - 安値」よりも小さい(上図参照)。)

つまり、ローソク足の下ヒゲの長さは、陽線・陰線を問わず、

「始値 - 安値」の値と「終値 - 安値」の値の小さい方

ということになります。

そこで、「Pin-Bar Sign.mq4」においては、MathMin()関数(詳細は「こちら」を参照してください。)を使用して、「始値 - 安値」の値と「終値 - 安値」の値を比較し、小さい方の値をローソク足の下ヒゲの長さとして取得するようにしています。

⑹ 矢印の設定

ア 上矢印の設定

買いのピンバーが出現した場合に上矢印を表示させる部分のコードの解釈を、以下に示します。


if(
//もし、

Real_Body[i] * Magnification <= Lower_Shadow[i] &&
//下ヒゲの長さが「実体×掛け率」以上で、かつ、

Minimum_Length * Pips <= Lower_Shadow[i] &&
/*下ヒゲの長さがピンバーと認められる最低限の長さ以上で、かつ、*/

Low[i] < Low[iLowest(NULL,0,MODE_LOW,Lowest_Period,i+1)])
/*安値が「Lowest_Period」で設定した期間の最安値よりも安かったら*/

{
 Arrow_Up[i] = Low[i] – Pips;
 //上矢印を高値よりも1Pips下に表示させる
}
  • iLowest()関数の詳細については「こちら」を参照してください。
イ 下矢印の設定

売りのピンバーが出現した場合に下矢印を表示させる部分のコードの解釈を、以下に示します。


if(
//もし、

Real_Body[i] * Magnification <= Upper_Shadow[i] &&
//上ヒゲの長さが「実体×掛け率」以上で、かつ、

Minimum_Length * Pips <= Upper_Shadow[i] &&
/*上ヒゲの長さがピンバーと認められる最低限の長さ以上で、かつ、*/

High[i] > High[iHighest(NULL,0,MODE_HIGH,Highest_Period,i+1)])
/*高値が「Highest_Period」で設定した期間の最高値よりも高かったら*/

{
 Arrow_Down[i] = High[i] + Pips;
 //下矢印を高値よりも1Pips上に表示させる
}
  • iHighest()関数の詳細については「こちら」を参照してください。