スパンモデルの作り方!インジケーターをMT4で自作してみよう!使い方やサンプルコードあり!

ザフナーラボブログ

スパンモデルとは、元証券ディーラーの、マーフィーこと柾木利彦氏が考案したインジケーターで、一目均衡表(詳細は「こちら」を参照してください。)をベースとし、これに変更を加えたものです。

具体的には、一目均衡表に以下のような変更を加えています。

  • 転換線と基準線を非表示とする。
  • 先行スパン1と先行スパン2で形成される雲を、26日先にずらさずに表示させる。

MetaTrader4(MT4)では、一目均衡表は「Ichimoku Kinko Hyo」として標準で搭載されています。

しかし、標準で搭載されている一目均衡表においては、転換線と基準線を非表示とすることは、各線の表示色を「None」とすることで可能ですが、雲の表示をシフト(ずらす)させるパラメーターが存在しないので、スパンモデルを表示させることができません。

そこで、MT4においてスパンモデル(Span Model.mq4)を表示させるためのプログラミング方法について解説します。

なお、一目均衡表の計算式は、以下のとおりです。

  • 転換線
    (過去9日間の最高値+過去9日間の最安値)÷2
    →過去9日間の中間値
  • 基準線
    (過去26日間の最高値+過去26日間の最安値)÷2
    →過去26日間の中間値
  • 先行スパン1
    (転換線の値+基準線の値)÷2
    →26日先に描画
    なお、MT4では、先行スパンAに相当します。
  • 先行スパン2
    (過去52日間の最高値+過去52日間の最安値)÷2
    →26日先に描画
    なお、MT4では、先行スパンBに相当します。
  • 遅行スパン
    当日の終値
    →26日前に描画

 

Span-Model

Span Model

1.全体像

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

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

以下がサンプルコードになります。ダウンロードして記事を読み進めてください。

Span-Model-Code

2.#property命令の記述

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

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

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

property_Span_Model-

 

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

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

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

「Span Model.mq4」は、以下の5つのデータを表示させます。

  • 先行スパンA(ラインで表示)
  • 先行スパンB(ラインで表示)
  • 先行スパンA(ヒストグラムで表示)
  • 先行スパンB(ヒストグラムで表示)
  • 遅行線

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

⑶ 色を指定する

「Span Model.mq4」で表示させる5つのデータの表示色を指定します。

  • #property indicator_color1 SandyBrown
    1番目のインジケーターとしてラインで表示される先行スパンAを指定する(後述の5.⑵を参照)ので、#property indicator_color命令には「1」を指定し、表示色を「SandyBrown」に指定しています。
  • #property indicator_color2 BlueViolet
    2番目のインジケーターとしてラインで表示される先行スパンBを指定する(後述の5.⑵を参照)ので、#property indicator_color命令には「2」を指定し、表示色を「BlueViolet」に指定しています。
  • #property indicator_color3 SandyBrown
    3番目のインジケーターとしてヒストグラムで表示される先行スパンAを指定する(後述の5.⑵を参照)ので、#property indicator_color命令には「3」を指定し、表示色を「SandyBrown」に指定しています。
  • #property indicator_color4 BlueViolet
    4番目のインジケーターとしてヒストグラムで表示される先行スパンBを指定する(後述の5.⑵を参照)ので、#property indicator_color命令には「4」を指定し、表示色を「BlueViolet」に指定しています。
  • #property indicator_color5 Magenta
    5番目のインジケーターとして遅行線を指定する(後述の5.⑵を参照)ので、#property indicator_color命令には「5」を指定し、表示色を「Magenta」に指定しています。

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

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

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

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

Buffer_Span_Model

 

⑴ double Span_A_L[];

ラインで表示される先行スパンAの値を格納していく配列です。

⑵ double Span_B_L[];

ラインで表示される先行スパンBの値を格納していく配列です。

⑶ double Span_A_H[];

ヒストグラムで表示される先行スパンAの値を格納していく配列です。

⑷ double Span_B_H[];

ヒストグラムで表示される先行スパンBの値を格納していく配列です。

⑸ double Delay[];

遅行線の値を格納していく配列です。

⑹ double Change[];

転換線の値を格納していく配列です。

⑺ double Standard[];

基準線の値を格納していく配列です。

4.変数の宣言

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

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

  • 転換線の計算期間
  • 基準線の計算期間
  • 先行スパンBの計算期間

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

  • extern int Change_Period
    転換線の計算期間
  • extern int Standard_Period
    基準線の計算期間
  • extern int Span_B_Period
    先行スパンBの計算期間

5.基本設定の記述

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

Initialization-Function-Span-Model

 

⑴ IndicatorBuffers()とは

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

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

⑵ SetIndexBuffer()とは

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

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

⑶ SetIndexLabel()とは

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

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

⑷ SetIndexStyle()とは

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

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

⑸ SetIndexShift()とは

SetIndexShift()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画位置のシフト(ずらす)を設定するものです。

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

⑹ SetIndexDrawBegin()とは

SetIndexDrawBegin()とは、MQL4であらかじめ定義されている関数で、インジケーターの描画を開始するバーの位置を指定するものです。

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

6.具体的な処理内容

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

Start-Function-Span-Model

⑴ int limit = ……について

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

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

⑵ カウンタ変数の宣言

for()文(詳細は「こちら」を参照してください。)を使用して転換線、基準線、雲、遅行線の計算を行うので、あらかじめカウンタ変数(for()文による繰り返し処理を行う回数を格納する変数)として、int型の変数「i」を宣言しています。

⑶ 転換線の値の計算

スパンモデルにおける雲を形成している先行スパンAの値は、以下の計算式により算出されます。

(転換線の値+基準線の値)÷2

したがって、先行スパンAの値を算出するためには、あらかじめ転換線の値を算出しておく必要があります。

そして、転換線の値は、以下の計算式により算出されます。

(過去9日間の最高値+過去9日間の最安値)÷2

ア for()文による繰り返し処理

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

イ 過去9日間の最高値の算出
  1. iHighest()関数(詳細は「こちら」を参照してください。)を使用して、過去9日間(=変数「Change_Peirod」で指定済み)の最高値を示現したバーのインデックスを取得する。
  2. 当該値を配列High[](詳細は「こちら」を参照してください。)に格納して、過去9日間の最高値を取得する。
ウ 過去9日間の最安値の算出
  1. iLowest()関数(詳細は「こちら」を参照してください。)を使用して、過去9日間(=変数「Change_Peirod」で指定済み)の最安値を示現したバーのインデックスを取得する。
  2. 当該値を配列Low[](詳細は「こちら」を参照してください。)に格納して、過去9日間の最高値を取得する。

⑶ 基準線の値の計算

スパンモデルにおける雲を形成している先行スパンAの値は、以下の計算式により算出されます。

(転換線の値+基準線の値)÷2

したがって、先行スパンAの値を算出するためには、あらかじめ基準線の値を算出しておく必要があります。

そして、基準線の値は、以下の計算式により算出されます。

(過去26日間の最高値+過去26日間の最安値)÷2

これは、転換線の値を算出する際の、「過去9日間」を「過去26日間」に変更したものにすぎません。

そこで、上記⑵と同様の処理を、iHighest()関数及びiLowest()関数の第4引数を「Change_Period」から「Standard_Period」に変更して行っています。

⑷ 雲の値の計算

ア 先行スパンAの値の計算(ライン)

先行スパンAの値は、以下の計算式により算出されます。

(転換線の値+基準線の値)÷2

そこで、上記⑵及び⑶で算出した転換線の値(配列Change[]に格納済み)と基準線の値(配列Standard[]に格納済み)を用いて、以下のように記述して、先行スパンAの値を配列Span_A_L[]に格納しています。


Span_A_L[i] = (Change[i] + Standard[i]) / 2;
イ 先行スパンBの値の計算(ライン)

先行スパンBの値は、以下の計算式により算出されます。

(過去52日間の最高値+過去52日間の最安値)÷2

そこで、上記上記⑵及び⑶と同様に、以下のように記述して、先行スパンBの値を配列Span_B_L[]に格納しています。


Span_B_L[i] = (High[iHighest(NULL,0,MODE_HIGH,Span_B_Period,i)] + Low[iLowest(NULL,0,MODE_LOW,Span_B_Period,i)]) / 2;
ウ 先行スパンAの値の計算(ヒストグラム)

上記アと同様です。

エ 先行スパンBの値の計算(ヒストグラム)

上記イと同様です。

なお、上記ウ及びエの処理を行うことによって、同一の場所に先行スパンAの値を表すヒストグラムと、先行スパンBの値を表すヒストグラムが描画されることになりますが、それによって雲が描画されることになる原理については、「こちら」を参照してください。

⑸ 遅行線の値の計算

遅行線は、各バーの終値を結んだ線を、26日分前にずらして描画しているにすぎません。

したがって、以下のように記述して、遅行線の値を配列Delay[]に格納しています。


Delay[i] = Close[i];
  • 配列Close[]の詳細については「こちら」を参照してください。