【MQL4学習】MT4で3本のストキャスティクスインジケーターを自作する方法!サンプルコード付き!

ザフナーラボブログ

ストキャスティクス(Stochastics)とは、ジョージ・レーン(George Lane)氏が開発したインジケーターで、一定期間の最高値と最安値の範囲内における、現在のレートの最安値からの相対的な位置を見ることによって、買われすぎなのか、売られすぎなのかを見極めるために使用するものです(なお、最高値からの相対的な位置を見るインジケーターは、%Rオシレーター(詳細は「こちら」を参照してください。)となります。)。

ストキャスティクスは、%Kライン、%Dライン、SDラインの3本から構成されており、それぞれのラインは、以下の計算式により算出されます。

Formula-of-Stochastics

ストキャスティクスの計算式

ストキャスティクスは、「Stochastics Oscillator」として、MetaTrader4(MT4)でも標準で装備されていますが、MT4のストキャスティクスは、%Kライン、%Dライン、SDラインの3本表示ではなく、2本表示(また、MT4のストキャスティクスの計算式は上記のものとは異なります。詳細については「こちら」を参照してください。)となっています。

そこで、%Kライン、%Dライン、SDラインの3本を表示させるストキャスティクス(Stochastics_3Lines.mq4)の作成方法について解説します。

Stochastics-3Lines

1.全体像

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

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

完成系のMQL4のコードは以下のリンクからダウンロード可能ですので、コードを見ながら読み進めると学習がはかどります。

Stochasticsの完成コードのダウンロードはここから

2.#property命令の記述

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

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

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

property_stochastics

⑴ サブウィンドウに表示させる

#property_indicator_separate_window命令によって、「Stochastics_3Lines.mq4」は、サブウィンドウに表示されます。

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

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

  • %Kライン
  • %Dライン
  • SDライン

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

⑶ 色を指定する

「Stochastics_3Lines.mq4」で表示される3つのデータの表示色を指定します。

  • #property indicator_color1 Aqua
    1番目のインジケーターとして%Kラインを指定する(後述)ので、#property indicator_color命令には「1」を指定し、表示色を「Aqua」に指定しています。
  • #property indicator_color2 Magenta
    2番目のインジケーターとして%Dラインを指定する(後述)ので、#property indicator_color命令には「2」を指定し、表示色を「Magenta」に指定しています。
  • #property indicator_color3 Gold
    3番目のインジケーターとしてSDラインを指定する(後述)ので、#property indicator_color命令には「3」を指定し、表示色を「Gold」に指定しています。

⑷ インジケーターの最大値・最小値を指定する

「Stochastics_3Lines.mq4」で表示される3つのデータは、「0」%から「100」%の間で推移するので、#property indicator_maximum命令には「100」を指定して、最大値を「100」に設定し、また、#property indicator_minimum命令には「0」を指定して、最小値を「0」に設定しています。

⑸ レベルを設定する

ストキャスティクスは、ラインが「80」を超えたり、「20」を下回った場合を買われすぎ・売られすぎの判断の基準の1つとします。

そこで、ストキャスティクスを構成する各ラインの値が「80」と「20」を示す位置に、#property indicator_level命令によって、レベルラインを表示するように設定しています。

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

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

インジケーターバッファーの詳細については「こちら」を参照してください。

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

Buffer_stocha

⑴ double K_Line[];

%Kラインの値を格納していく配列(詳細については「こちら」を参照してください。)です。

⑵ double D_Line[];

%Dラインの値を格納していく配列です。

⑶ double SD_Line[];

SDラインの値を格納していく配列です。

⑷ double Numerator[];

上述の%Kラインの値を算出する計算式のうち、分子に相当する値を格納していく配列です。

⑸ double Denominator[];

上述の%Kラインの値を算出する計算式のうち、分母に相当する値を格納していく配列です。

4.変数の宣言

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

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

  • %Kラインの計算期間
  • %Dラインの計算期間
  • SDラインの計算期間

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

  • extern int K_Period
    %Kラインの計算期間
  • extern int D_Period
    %Dラインの計算期間
  • extern int SD_Period
    SDラインの計算期間

5.基本設定の記述

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

Initialization-Function_stochastics

⑴ IndicatorBuffers()とは

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

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

⑵ SetIndexBuffer()とは

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

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

⑶ SetIndexLabel()とは

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

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

⑷ IndicatorShortName()とは

IndicatorShortName()とは、MQL4であらかじめ定義されている関数で、データウィンドウとサブウィンドウに表示されるインジケーターの名前等を表示させるものです。

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

⑸ SetIndexStyle()とは

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

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

⑹ SetIndexDrawBegin()とは

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

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

6.具体的な処理内容

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

サンプルコード

⑴ int limit = ……について

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

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

⑵ %Kラインの計算

ア 分子の計算

%Kラインの値を算出する計算式の分子は、「最新の終値-過去n日間の最安値」で算出されます。

分子を構成するそれぞれの項は、以下のように表すことができます。

  • 最新の終値
    Close[i]
    
  • 過去n日間の最安値
    Low[iLowest(NULL,0,MODE_LOW,K_Period,i)]
    

したがって、%Kラインの値を算出する計算式の分子は、

サンプルコード


Close[i] – Low[iLowest(NULL,0,MODE_LOW,K_Period,i)]

と表すことができることになります。

そして、「Stochastics_3Lines.mq4」では、for()文を用いて、当該値を配列Numeratorに順次格納していくこととしています。

  • Close[]の詳細については「こちら」を参照してください。
  • Low[]の詳細については「こちら」を参照してください。
  • iLowest()関数の詳細については「こちら」を参照してください。
  • for()文の詳細については「こちら」を参照してください。
イ 分母の計算

%Kラインの値を算出する計算式の分母は、「過去n日間の最高値-過去n日間の最安値」で算出されます。

分母を構成するそれぞれの項は、以下のように表すことができます。

サンプルコード

//過去n日間の最高値

High[iHighest(NULL,0,MODE_HIGH,K_Period,i)]
//過去n日間の最安値

Low[iLowest(NULL,0,MODE_LOW,K_Period,i)]

したがって、%Kラインの値を算出する計算式の分母は、

サンプルコード


High[iHighest(NULL,0,MODE_HIGH,K_Period,i)] –
Low[iLowest(NULL,0,MODE_LOW,K_Period,i)]

と表すことができることになります。

そして、「Stochastics_3Lines.mq4」では、for()文を用いて、当該値を配列Denominatorに順次格納していくこととしています。

  • High[]の詳細については「こちら」を参照してください。
  • iHighest()関数の詳細については「こちら」を参照してください。
ウ 0divideの回避

%Kラインの値は、上記イの値を分母として算出されます。

したがって、分母となる上記イの値が「0」であれば、%Kラインの値を算出することはできません。

そこで、%Kラインの値の算出過程において、「0」で割る(=0divideといいます。)という場合が生じないように、if()文(詳細は「こちら」を参照してください。)を用いて「上記イの値が0でなかったら」という条件を付加しています。

エ %Kラインの値の算出

%Kラインの値は、上記アの値(=Numeratorの値)を上記イの値(=Denominatorの値)で除した値に100を乗ずることによって算出されます。

そこで、以下のように記述して、配列K_Lineに計算結果を順次格納しています。

サンプルコード


K_Line[i] = (Numerator[i] / Denominator[i]) * 100;

⑶ %Dラインの計算

ア 変数の宣言

%Dラインの値は、「上記⑵アの値のm日間の合計」を、「上記⑵イの値のm日間の合計」で除した値に100を乗ずることによって算出されます。

そこで、以下のように2つの変数を宣言しています。

  • double Sum_Numerator
    上記⑵アの値のm日間の合計を格納する変数
  • double Sum_Denominator
    上記⑵イの値のm日間の合計を格納する変数
イ m日間の合計の計算

for()文を用いて、%Dラインの値を算出する計算式の分母と分子のm日間(=Stochastics_3Lines.mq4では、D_Period)の合計を、上記アの2つの変数に、それぞれ格納しています。

ウ 0divideの回避

%Dラインの値は、「Sum_Denominator」の値を分母として算出されます。

したがって、分母となるSum_Denominatorの値が「0」であれば、%Dラインの値を算出することはできません。

そこで、%Dラインの値の算出過程において、「0」で割る(=0divide)という場合が生じないように、if()文(詳細は「こちら」を参照してください。)を用いて「Sum_Denominatorの値が0でなかったら」という条件を付加しています。

エ %Dラインの値の算出

%Dラインの値は、上記アの「Sum_Numerator」の値を、上記アの「Sum_Denominator」の値で除した値に100を乗ずることによって算出されます。

そこで、以下のように記述して、配列D_Lineに計算結果を順次格納しています。

サンプルコード


D_Line[i] = (Sum_Numerator / Sum_Denominator) * 100;

⑷ SDラインの計算

ア 変数の宣言

SDラインの値は、「%Dのy日間の単純移動平均」、すなわち、「%Dラインの値の、SDラインの計算期間における合計」を、「SDラインの計算期間」で除することによって 算出されます。

そこで、「%Dラインの値の、SDラインの計算期間における合計」を格納する変数として、変数「Sum_Numerator」を宣言しています。

イ y日間の合計の計算

for()文を用いて、%Dラインの値のy日間(=Stochastics_3Lines.mq4では、SD_Period)の合計を、上記アの変数「Sum_Numerator」に格納しています。

ウ SDラインの値の算出

SDラインの値は、上記アの「Sum_Numerator」の値を「SD_Period」の値で除することによって算出されます。

そこで、以下のように記述して、配列SD_Lineに計算結果を順次格納しています。

サンプルコード

SD_Line[i] = Sum_Numerator / SD_Period;