ストキャスティクスとは?
ストキャスティクスはというのはオシレーター系の指標の一つです。
RSIなどと同じように相場の過熱感をはかる類の指標です。
先日記事にした、オーサムオシレーターもオシレーター系指標です。↓
オーサムオシレーターは表示するバッファ(=インジケータの計算式の結果)が一つだけの、シングルバッファインディケータですが、
ストキャスティクスは0~100の間で、「%K」「%D」という2本の線を表示するマルチバッファインジケータです。
「%K」は一定期間の値幅を100として現在どの水準にいるかという数値になります。
一定期間の最高値と最安値、現在の価格を用いて算出します。
「%D」は「%K」を移動平均化したものです。
MT5に内蔵されているストキャスティクスの初期値パラメーターでは、
%Kを算出する期間=5
%Dを算出する期間=3
スローイング(=%Dを移動平均化する計算に用いる期間)=3
となっています。
一般的に「定石」と言われる買いサイン、売りサインは
買いサイン:ストキャスティクスが20%以下の状態で、%Kが%Dを下から上にクロスしたとき
売りサイン:ストキャスティクスが80%以上の状態で、%Kが%Dを上から下にクロスしたとき
というのがよく言われています。
この↑定石と言われるシグナルが有効かどうかはさておき、MQL5のプログラムにはどうやって落とし込めばいいか、それを今回はやっていきます。
ストキャスティクスの売買シグナル取得のロードマップ
以下の手順でコードを記述していきます
- シグナルを受信する文字列型の変数を宣言
- ストキャスティクスの値を格納する変数を宣言
- 配列を時系列にセット
- ストキャスティクスのハンドル(ストキャスティクスの値を取得する鍵のようなもの)を取得
- ストキャスティクスの値を配列・変数に格納
- 売買シグナルの定義
シグナルを受信する文字列型変数を宣言
文字列型の変数signalをOnTick関数内冒頭に宣言します。
void OnTick()
{
//シグナルを受信する文字列型変数を宣言
string signal="";
ストキャスティクスの値を格納する変数配列を宣言
ストキャスティクスは%Kと%Dという二つのバッファを持つので、格納する配列も2つ用意します。
//ストキャスティクスの値を格納する変数を宣言
double percentK[];
double percentD[];
配列を時系列にセット
ストキャスティクスの値を格納する配列を時系列にセットします。
この作業はArraySetAsSeries関数を使って行います。
//配列を時系列にセット
ArraySetAsSeries(percentK,true);
ArraySetAsSeries(percentD,true);
ArraySetAsSeries関数についてはこちらをご覧ください↓
ストキャスティクスのハンドルを取得
MQL4とは違い、MQL5ではストキャスティクスの値の取得がiStochastic関数だけでは完結しません。
↑以上の工程をたどる必要があります。
//ストキャスティクスのハンドルを取得
int stochasticHandle=iStochastic(_Symbol,//通貨ペア
_Period,//時間軸
5,//%Kの計算期間
3,//%Dの計算期間
3,//最終平滑(スローイング)の計算期間
MODE_SMA,//平滑化の種類
STO_LOWHIGH//計算に用いる価格の種類
);
ストキャスティクスの値を配列・変数に格納
ストキャスティクスは2つのバッファをもつ、マルチバッファインジケータなので、事前に用意した配列にコピーをするときにも注意が必要です。
CopyBuffer関数の第2引数に適切な番号を入力しないと、正しい値が取得できません。
%Kの値を取得するにはバッファ番号0、
%Dの値を取得するにはバッファ番号1
をあてがう必要があります。
CopyBuffer関数を使って、無事に配列にコピーができたら、変数に値を格納します。
記事の冒頭に書いた、
買いサイン:ストキャスティクスが20%以下の状態で、%Kが%Dを下から上にクロスしたとき
売りサイン:ストキャスティクスが80%以上の状態で、%Kが%Dを上から下にクロスしたとき
↑をコードに落とし込むためには、最新足と一本前の足における値データが必要になります。
それを考慮して記述すると、↓
//%K(バッファ番号0)の値を配列に格納
CopyBuffer(stochasticHandle,0,0,3,percentK);
//%D(バッファ番号1)の値を配列に格納
CopyBuffer(stochasticHandle,1,0,3,percentD);
//最新足の%Kの値を変数に格納
double valueK_0=percentK[0];
//最新足の%Dの値を変数に格納
double valueD_0=percentD[0];
//一本前の%Kの値を変数に格納
double valueK_1=percentK[1];
//一本前の%Dの値を変数に格納
double valueD_1=percentD[1];
売買シグナルの定義
最後にif文と、比較演算子を用いて買いシグナル、売りシグナルを定義し、シグナルをComment関数にてコメント出力します。
//%Kと %Dいずれも20より下の時
if(valueK_0<20 && valueD_0<20)
{
//%Kが%Dを下から上へクロスしたとき
if(valueK_0>valueD_0 && valueK_1<valueD_1)
{
signal="買いチャンス";
}//if(valueK_0>valueD_0 && valueK_1<valueD_1)
}//if(valueK_0<20 && valueD_0<20)
//%Kと%Dいずれも80より上の時
if(valueK_0>80 && valueD_0>80)
{
//%Kが%Dを上から下へクロスしたとき
if(valueK_0<valueD_0 && valueK_1>valueD_1)
{
signal="売りチャンス";
}// if(valueK_0>valueD_0 && valueK_1<valueD_1)
}//if(valueK_0<20 && valueD_0<20)
//コメント出力
Comment("signal: ",signal);
}//void OnTick()
全体のプログラムコード
全体のプログラムコードは以下のようになります。
#property copyright "MQL5ssei"
#property link "https://mqlinvestmentlab.com/"
#property strict
//+------------------
void OnTick()
{
//シグナルを受信する文字列型変数を宣言
string signal="";
//ストキャスティクスの値を格納する変数を宣言
double percentK[];
double percentD[];
//配列を時系列にセット
ArraySetAsSeries(percentK,true);
ArraySetAsSeries(percentD,true);
//ストキャスティクスのハンドルを取得
int stochasticHandle=iStochastic(_Symbol,//通貨ペア
_Period,//時間軸
5,//%Kの計算期間
3,//%Dの計算期間
3,//最終平滑(スローイング)の計算期間
MODE_SMA,//平滑化の種類
STO_LOWHIGH//計算に用いる価格の種類
);
//%K(バッファ番号0)の値を配列に格納
CopyBuffer(stochasticHandle,0,0,3,percentK);
//%D(バッファ番号1)の値を配列に格納
CopyBuffer(stochasticHandle,1,0,3,percentD);
//最新足の%Kの値を変数に格納
double valueK_0=percentK[0];
//最新足の%Dの値を変数に格納
double valueD_0=percentD[0];
//一本前の%Kの値を変数に格納
double valueK_1=percentK[1];
//一本前の%Dの値を変数に格納
double valueD_1=percentD[1];
//%Kと %Dいずれも20より下の時
if(valueK_0<20 && valueD_0<20)
{
//%Kが%Dを下から上へクロスしたとき
if(valueK_0>valueD_0 && valueK_1<valueD_1)
{
signal="買いチャンス";
}//if(valueK_0>valueD_0 && valueK_1<valueD_1)
}//if(valueK_0<20 && valueD_0<20)
//%Kと%Dいずれも80より上の時
if(valueK_0>80 && valueD_0>80)
{
//%Kが%Dを上から下へクロスしたとき
if(valueK_0<valueD_0 && valueK_1>valueD_1)
{
signal="売りチャンス";
}// if(valueK_0>valueD_0 && valueK_1<valueD_1)
}//if(valueK_0<20 && valueD_0<20)
//コメント出力
Comment("signal: ",signal);
}//void OnTick()
//+------------------------------------------------------------------+
サンプルコードの挙動は以下のようになります。
最後までお読みいただきありがとうございました<(_ _)>
※↓こちらの記事では、今回のように売買シグナルをメインプログラム内で記述するのではなく、関数内で生成する方法を書いています。よろしければご覧ください<(_ _)>
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
※今回の記事に関連する講座記事でいえば、
・MQL5 EA講座 第108回「インジケータを使ってエントリーシグナルを生成する」
も参考になるかと思います。
そもそもインジケータとは何か?という所から始まり、シングルバッファインディケータ、マルチバッファインディケータなどの説明を踏まえた上でインジケータをトレードシグナル(=エントリー条件)として具体的なコード記述に落とし込む方法を丁寧に解説しています。
コメント