2017年5月17日水曜日

[MT4インジケータ]Stochastic Momentum Index 平滑化をガリガリかけたストキャス

あー、行き詰ったー。ネタないかなーということで、気分転換にインジケータ作ってみました。
テクニカルのインジケータはどーいう計算式で計算されているのか、何に基づいているのか?というのが、わたし、気になります!!

逆張りです。逆張り命です。どうせ作るなら逆張りに役立つインジということで、だましが多すぎるストキャスの問題を平滑化をガリガリかけることで改善した(?)Stochastic Momentum Indexを作成してみました。

知る人ぞ知るぐらいには定番だと思われるのですがMT4の標準には含まれていません。

見方としては、±40を超えたところのピークが天井、±10内でのピークが押し目、戻り目となります。

■USDJPY SMI ±40越え時のピーク

■USDJPY SMI ±10での押し目、戻り目

こうやってみると上昇トレンド時でも、小さくも確かにいったんの山は形成しているようにみえます。ただ、ストキャスやRSIと比べると反応が遅いですね。

FX-ONでのダウンロードはこちらから
平滑化をガリガリかけたストキャス
Stochastic Momentum Index (SMI)Stochastic Momentum Index (SMI) | fx-on.com

ソースコードです。

//------------------------------------------------------------------
// Stochastic Momentum Index
#property copyright "Copyright 2017,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum -70
#property indicator_maximum 70
#property indicator_level1 40
#property indicator_level2 -40
#property indicator_level3 10
#property indicator_level4 -10

//バッファーを指定する。
#property indicator_buffers 2

//プロット数を指定する。
#property indicator_plots   2

#property indicator_label1  "SMI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "SIGNAL"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_DOT
#property indicator_width2  1

input int HLPeriod = 13;   // 高値安値割り出し期間
input int M = 20;          // 平滑化指数1
input int N = 30;          // 平滑化指数2
input int S = 6;           // シグナル

// バッファー
double m_smi[];            // SMI
double m_smiSignal[];      // シグナル
double m_chlEma1[];        // 終値-HL/2 EMA1
double m_chlEma2[];        // 終値-HL/2 EMA1
double m_hlEma1[];         // H-L EMA1
double m_hlEma2[];         // H-L EMA2

//------------------------------------------------------------------
//初期化
int OnInit()
{
   // 短縮名を設定
   string shortName = "SMI (";
   shortName += 
      IntegerToString(HLPeriod) + "," + IntegerToString(M) + "," + IntegerToString(N) + ")";
   IndicatorShortName(shortName);

   IndicatorBuffers(6);
   int count = 0;
   SetIndexBuffer(count++, m_smi);
   SetIndexBuffer(count++, m_smiSignal);
   SetIndexBuffer(count++, m_chlEma1);
   SetIndexBuffer(count++, m_chlEma2);
   SetIndexBuffer(count++, m_hlEma1);
   SetIndexBuffer(count++, m_hlEma2);
   
   //初期値を0に設定
   for( int i = 0; i < count; i++)
   {
      SetIndexEmptyValue(i, 0);
   }

   //表示しない
   for( int i = 2; i < count; i++)
   {
      SetIndexStyle(i, DRAW_NONE);
   }
   return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
//計算イベント
int OnCalculate(
   const int rates_total,          //各レート要素数
 const int prev_calculated,      //計算済み要素数
 const datetime &time[],         //要素ごとの時間配列
 const double &open[],           //オープン価格配列
 const double &high[],           //高値配列
 const double &low[],            //安値配列
 const double &close[],          //クローズ価格配列
 const long &tick_volume[],      //ティック数(要素の更新回数)
 const long &volume[],           //実ボリューム(?)
 const int &spread[])            //スプレット
{
   double alfa1 = 2 / (double)(M + 1);
   double alfa2 = 2 / (double)(N + 1);
   double alfaSignal = 2 / (double)(S + 1);

   for( int i = rates_total - prev_calculated - 1 ; i >= 0; i-- )
   {
      if( i > rates_total - HLPeriod - 1) continue;
      
      //期間内高値安値の平均値(HL/2)
      double highest = high[iHighest(NULL, 0, MODE_HIGH, HLPeriod, i)];
      double lowest = low[iLowest(NULL, 0, MODE_LOW, HLPeriod, i)];
      
      //終値-HL/2のEMA1
      m_chlEma1[i] = (close[i] - (highest + lowest) / 2) * alfa1 + (1 - alfa1) * m_chlEma1[i + 1];
      //終値-HL/2のEMA2
      m_chlEma2[i] = m_chlEma1[i] * alfa2 + (1 - alfa2) * m_chlEma2[i + 1];
      
      // H-LのEMA1
      m_hlEma1[i] = (highest - lowest) / 2 * alfa1 + (1 - alfa1) * m_hlEma1[i + 1];
      //終値-H-LのEMA2
      m_hlEma2[i] = m_hlEma1[i] * alfa2 + (1 - alfa2) * m_hlEma2[i + 1];
      
      if( m_hlEma2[i] > 0 )
      {
         m_smi[i] = m_chlEma2[i] * 100/ m_hlEma2[i];
      }
      
      m_smiSignal[i] = m_smi[i] * alfaSignal + ( 1 - alfaSignal ) * m_smiSignal[i + 1];
   }

   return rates_total - 1;
}

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。