自作サインツール|ストキャスティクスを使用したサインツールを作ってみよう!サンプルプログラムあり

皆さん、ミーでございます。

自作サインツールの作り方をサンプルプログラムを含めて配信しておりますが、今回は、ストキャスティクス(以降:ストキャス)を使用したサインツールを皆様と一緒に作成してみようと思います。

サインツールの作成が初めてという方は、以下の記事を読んでから見ていただけると更に分かり易いです。

自作サインツールの作り方|環境準備とサンプル動作の確認を初心者にも分かり易く説明

2021年12月21日

ストキャスとは

まず、ストキャスとは何かについて説明します。(ご存じの方が多いと思いますが)

ストキャスは一定期間の一番高かった値段と安かった値段の値幅に対して、現在の株価が、どのくらいの位置いるのかということを数値化したもので、「売られすぎ」なのか「買われすぎ」なのかを知りたいときに役立ちます。RSIと同じく“逆張り指標”として横ばい相場のときに使います。

ストキャスは値動きに対して反応が早いのも特徴ですが、その分、ダマシも多いです。なのが、あまり過剰にストキャスの値だけで、逆張りや順張りを行う手法にはオススメできません。

サインツールに導入する観点としては、%K期間を「5」に設定することで、0~100のストキャスの値が良い感じに変動するため、CCIと同様、細かな設定幅を指定できますので、サインツールを作成されている方の多くが使用しているものだと思います。

ストキャスのゴールデンクロス、デッドクロスのポイントをサインツール化されている方も多いのではと思います。(単純にそれだけでは、勝率高いサインツールは作れませんが・・・)

ストキャスは、サインツールには非常に組み込みやすいですね。

ストキャスをサインツールに組み込む方法

ストキャスをサインツールに組み込む方法ですが、【iStochastic】という関数を使用します。

【iStochastic】の関数をMQLのソースプログラムから呼び出すことで、ストキャスの値を取得することができます。

iStochasticの使い方

// iStochasticの関数定義

double  iStochastic(
   string       symbol,        // 通貨ペア
   int          timeframe,     // 時間軸
   int          Kperiod,       // %K期間
   int          Dperiod,       // %D期間
   int          slowing,       // スローイング
   int          method,        // 平均化メソッド
   int          applied_field, // 価格(Low/HighまたはClose/Close)
   int          mode,          // ラインインデックス
   int          shift          // シフト
   );

使い方は、以下のような感じです。

double iResultStoc = iStochastic(NULL,0,5,3,2,MODE_SMA,0,MODE_MAIN ,0);

iResultStoc には、通貨ペア、時間軸は現在表示されているものを対象とし、%K期間(5)、%D期間(3)、スローイング(2)、平均化メソッド(MODE_SMA)、価格(0設定時:Low/High、1設定時:Close/Close)、ラインインデックス(MODE_MAIN)の値で計算された、最新のローソク足の情報が設定されます。

iStochasticのパラメーターは、赤枠の部分を指定するものです。

 

ストキャスを使用したサインツール

早速、ストキャスを使用したサインツール(サンプル)のご紹介をします。

今回作成するのは、

1.単純なストキャスの上限/下限でサイン表示するもの

2.最新+1つ前のローソク足でサイン表示するもの

の2つになります。

単純なストキャスの上限/下限でサイン表示するもの

まずは、実際に動作するサンプルコードを記載しますので、XXX.mq4(XXXの名前は何でも良い)を作成し、コンパイルの実行をお願いします。

手順が分からない方は、
https://rpa-affiliate.com/2021/09/24/self-made-signtool-base/
の記事を参照してください。

#property indicator_chart_window
#property indicator_buffers 2

extern int Stoc_K_Period = 4;
extern int Stoc_D_Period = 2;
extern int Stoc_Slowing  = 1;

extern double Stoc_High = 80.0;
extern double Stoc_Low = 20.0;

double DrawReverseLowBuffer[];
double DrawReverseHighBuffer[];


int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars=IndicatorCounted(); 
   int limit = Bars - counted_bars;
   double iResultStoc_main;
  
   for (int i=limit-1;i>=0;i--){
      if(i == 0){
         DrawReverseLowBuffer[i] = EMPTY_VALUE;
         DrawReverseHighBuffer[i] = EMPTY_VALUE;
      }
      iResultStoc_main        = iStochastic(NULL,0,Stoc_K_Period,Stoc_D_Period,Stoc_Slowing,MODE_SMA,0,MODE_MAIN  ,i);
      if(iResultStoc_main >= Stoc_High){
         DrawReverseLowBuffer[i]=High[i];
      }
      else if(iResultStoc_main <= Stoc_Low){
         DrawReverseHighBuffer[i]=Low[i];
      }
   }

   return(0);
}

 

実行結果のイメージ

比較的サイン数は多いですが、騙しも多いことが分かりますよね!

 

サンプルコードの解説

それでは、サンプルコードで重要な部分の解説をしていきますね。

#property indicator_chart_window
#property indicator_buffers 2

extern int Stoc_K_Period = 4;
extern int Stoc_D_Period = 2;
extern int Stoc_Slowing  = 1;

extern double Stoc_High = 80.0;
extern double Stoc_Low = 20.0;

#property indicator_chart_window は、チャートウィンドウにサインを出すことを明示します。
#property indicator_buffers 2 は、使用するインジケーターの数で、HighのサインとLowのサインの2つであることを意味します。

”Stoc_K_Period”は%K期間、”Stoc_D_Period”は%D期間、”Stoc_Slowing”はスローイングとなります。

判定する条件ですが、Stoc_High はHighエントリーの値(80を超えたら)、Stoc_Low はLowエントリーの値(20を下回ったら)を定義しています。

このStoc_High 、Stoc_Low の値を変更することにより、サイン数やサインの勝率が変わります。

また、先頭に”extern”が記載されておりますが、これを付けると、以下の画像のように、ユーザーがMT4から値を変えられるようになります。ユーザーの利便性が向上しますので、適切に使い分けを行いたいですよね。逆に、ユーザーに変更して欲しくない値には、”extern”は使用しません。

int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

上記は、MT4起動時や呼ばれる特殊な関数(init)です。その関数の中に、サイン表示に必要なサインの太さ、アイコンの種類、そして、表示するサインの配列を設定します。これは、こういうものだと覚えておく程度で構いません。

   for (int i=limit-1;i>=0;i--){
      if(i == 0){
         DrawReverseLowBuffer[i] = EMPTY_VALUE;
         DrawReverseHighBuffer[i] = EMPTY_VALUE;
      }
      iResultStoc_main        = iStochastic(NULL,0,Stoc_K_Period,Stoc_D_Period,Stoc_Slowing,MODE_SMA,0,MODE_MAIN  ,i);
      if(iResultStoc_main >= Stoc_High){
         DrawReverseLowBuffer[i]=High[i];
      }
      else if(iResultStoc_main <= Stoc_Low){
         DrawReverseHighBuffer[i]=Low[i];
      }
   }

for文の中がロジックの処理となります。

ループ変数(i)の値が、limit-1から、0の間ループすることになり、初回は全てのローソク足、2回目以降は最新のローソク足が再計算されます。

次に、サイン表示配列に”EMPTY_VALUE”(空の値)を設定していますが、最新のローソク足はストキャスの値が変動する可能性がありますので、一旦サイン表示なしに設定しています。

その後、ストキャスの値が80以上(Stoc_Highで指定した値)、20以下(Stoc_Lowで指定した値)になった場合に、HighまたはLowのサインを表示する処理となります。

最新+1つ前のローソク足でサイン表示するもの

次に、”最新+1つ前のローソク足でサイン表示するもの”について、サンプルコードを記載します。

なぜ、1つ前のローソク足を見るサインツールのサンプルをご紹介するか?ですが、より勝率が高いサインを出すためです。条件を複数指定することで、より勝率が期待できるエントリーポイントでサインを出すことが出来ます。

きっと、この記事を見られている皆様は、勝率が高いところでサインを出したい!って思われてますよね(笑)

#property indicator_chart_window
#property indicator_buffers 2

extern int Stoc_K_Period = 4;
extern int Stoc_D_Period = 2;
extern int Stoc_Slowing  = 1;

extern double Stoc_High = 80.0;
extern double Stoc_High_prev= 20.0;
extern double Stoc_Low = 20.0;
extern double Stoc_Low_prev= 80.0;

double DrawReverseLowBuffer[];
double DrawReverseHighBuffer[];


int init()  {
   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta);
   SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed);
   SetIndexArrow(0,234);
   SetIndexArrow(1,233);
   SetIndexBuffer(0,DrawReverseLowBuffer);
   SetIndexBuffer(1,DrawReverseHighBuffer);
   return(INIT_SUCCEEDED);
}

int start() {
   int counted_bars=IndicatorCounted(); 
   int limit = Bars - counted_bars;
   double iResultStoc_main,iResultStoc_main_prev;
  
   for (int i=limit-1;i>=0;i--){
      if(i == 0){
         DrawReverseLowBuffer[i] = EMPTY_VALUE;
         DrawReverseHighBuffer[i] = EMPTY_VALUE;
      }
      iResultStoc_main        = iStochastic(NULL,0,Stoc_K_Period,Stoc_D_Period,Stoc_Slowing,MODE_SMA,0,MODE_MAIN  ,i);
      iResultStoc_main_prev   = iStochastic(NULL,0,Stoc_K_Period,Stoc_D_Period,Stoc_Slowing,MODE_SMA,0,MODE_MAIN  ,i+1);
      if(iResultStoc_main_prev < Stoc_High_prev && iResultStoc_main >= Stoc_High){
         DrawReverseLowBuffer[i]=High[i];
      }
      else if(iResultStoc_main_prev > Stoc_Low_prev && iResultStoc_main <= Stoc_Low){
         DrawReverseHighBuffer[i]=Low[i];
      }
   }

   return(0);
}

 

実行結果のイメージ

条件が増えましたので、サイン数は減りましたが、勝率は高くなってますよね。こうして、サインツールと呼ばれるものは、条件を組み合わせることで、サインを出しています。言い換えれば、この条件が【企業秘密】ってことですよね。

サンプルコードの解説

それでは、サンプルコードで重要な部分の解説をしていきますね。

”単純なストキャスの上限/下限でサイン表示するもの”のサインツールと重複する部分が多々ありますので、異なる部分のみ解説します。

extern double Stoc_High = 80.0;
extern double Stoc_High_prev= 20.0;
extern double Stoc_Low = 20.0;
extern double Stoc_Low_prev= 80.0;

条件の変数が2つ増えています。これは判断する条件として1つ前のローソク足のストキャスが加わったためです。

      iResultStoc_main        = iStochastic(NULL,0,Stoc_K_Period,Stoc_D_Period,Stoc_Slowing,MODE_SMA,0,MODE_MAIN  ,i);
      iResultStoc_main_prev   = iStochastic(NULL,0,Stoc_K_Period,Stoc_D_Period,Stoc_Slowing,MODE_SMA,0,MODE_MAIN  ,i+1);
      if(iResultStoc_main_prev < Stoc_High_prev && iResultStoc_main >= Stoc_High){
         DrawReverseLowBuffer[i]=High[i];
      }
      else if(iResultStoc_main_prev > Stoc_Low_prev && iResultStoc_main <= Stoc_Low){
         DrawReverseHighBuffer[i]=Low[i];
      }

そして、判定ロジックの部分が変わっております。

一つ前のローソク足のストキャスが、Stoc_High_prevの値より小さいことに加え、最新のローソク足のストキャスが、Stoc_Highの値より大きい場合に、Lowエントリーのサイン。

一つ前のローソク足のストキャスが、Stoc_Low_prevの値より大きいことに加え、最新のローソク足のストキャスが、Stoc_Lowの値より小さい場合に、Highエントリーのサイン。

を出すサインツールとなります。

サインツール作成の記事一覧はこちら

Sponsor Link








コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です