DT オシレーターのソースを読み解く

スポンサーリンク

ども、とのです。

またまたFXの記事を書いていきますが、
今回は若干プログラムよりの話です。

といっても、俺はあまりMQLに詳しくないので、話半分に聞いてやってください。

前回の反省

さて、今週取引GBP/USDですが、利確してからまたもう少し下げてしまいました。

モメンタムが売られ過ぎになったと判断していましたが、
そもそもオシレーターの読み方が「フィボナッチブレイクアウト売買法」記載のものと異なっているっつうね

本書ではこのように記載されています。

DTオシレーターゃストキャスティックスなどのように2本の線を使う指標では、
両方の線が買われ過ぎ・売られ過ぎゾーンに入っていなければ
買われ過ぎや売られ過ぎとはみなされない。

で、前回手仕舞い時のチャートを見てみると、

20130508_D1_A

あかん、青線が売られすぎラインに入ってませんわ。

「売られすぎ」っていうのは、このチャートでは第四波の底のような状態のことを言うんでしょうね。
「買われすぎ」には第一波と第三波の頂点が該当しています。

こうやってトレードを振り返って学習していくのですなぁ。

本題:DTオシレーターとは

さて、「フィボナッチブレイクアウト売買法」でも度々出てくる「DTオシレーター」。

なんか童貞臭いネーミングですが、ぶっちゃけこいつがどういうオシレーターなのかわからない。

本書では下記のように説明されています。

DTオシレーターはストキャステイックスとRSIを組み合わせた指標

いやこれじゃ全然分からん。

まぁネットを検索すればいくらでも情報は転がっているもので、
MT4向けのインジケーターも公開されています。

度々張り付けているチャートもそれを利用しているのですが、
せっかくコードごと公開されているので、それを読んでロジックを解読してみましょう。

コード解読

では以下DT Oscillator.mq4のコードを見ていきます。

   extern string TimeFrame  = "Current time frame";
   extern int    PeriodRSI  =13;
   extern int    PeriodStoch= 8;
   extern int    PeriodSK   = 5;
   extern int    PeriodSD   = 3;
         //    0 = SMA
         //    1 - EMA
         //    2 - SMMA
         //    3 - LWMA
   extern int MAMode=0;

extern変数宣言部です。

TimeFrameの指定ができるので、このインジケーターはマルチタイムフレームに対応しているようです。
そしてRSIの期間、ストキャスの期間、MAのモードが指定できるようになっています。

フィボナッチブレイクアウト売買法」ではRSIとストキャスには言及されていましたが、移動平均も使うのでしょうか。

   if (returnBars) { SK[0] = limit; return(0); }
   if (timeFrame != Period())
   {
      for(i=0; i<limit; i++) 
      {
      limit = MathMax(limit,MathMin(Bars,iCustom(NULL,timeFrame,IndicatorFileName,"getBarsCount",0,0)*timeFrame/Period()));
         int y = iBarShift(NULL,timeFrame,Time[i]);
            SK[i] = iCustom(NULL,timeFrame,IndicatorFileName,"",PeriodRSI,PeriodStoch,PeriodSK,PeriodSD,MAMode,0,y);
            SD[i] = iCustom(NULL,timeFrame,IndicatorFileName,"",PeriodRSI,PeriodStoch,PeriodSK,PeriodSD,MAMode,1,y);
      }               
      return(0);         
   }

ココらへんはマルチタイムフレーム用の記述ですね。タイムフレームを指定したものに変更して再帰呼び出しを行なっています。

特にロジックとは関係無いので割愛します。

   for(i=limit; i>=0; i--)
   {
      RSI[i] = iRSI(NULL,0,PeriodRSI,PRICE_CLOSE,i);
      double LLV = RSI[ArrayMinimum(RSI,PeriodStoch,i)];
      double HHV = RSI[ArrayMaximum(RSI,PeriodStoch,i)];
      if ((HHV-LLV)!=0)
            StoRSI[i] = 100.0*((RSI[i] - LLV)/(HHV - LLV));
      else  StoRSI[i] = 0;
   }   
   for(i=limit; i>=0; i--) SK[i]=iMAOnArray(StoRSI,0,PeriodSK,0,MAMode,i);
   for(i=limit; i>=0; i--) SD[i]=iMAOnArray(    SK,0,PeriodSD,0,MAMode,i);
   return(0);

ここが本丸です。

まず、144行目でRSIを算出します。
145,146行目で各足のRSIからextern変数で指定したストキャスの期間における最小値、最大値を抽出しています。
148行目でそれらを使って演算を行なっていますが、これは…

ストキャスティクスRSIじゃん!

ストキャスティクスRSIの算出方法

ストキャスティクスRSIとは、RSIの値でストキャスティクスを算出するものです。

ストキャスティクスの算出方法は

(終値-指定した期間の安値)/(指定した期間の高値-指定した期間の安値)*100

です。

これをRSIで行ったストキャスティクスRSIは、

(RSI-指定した期間のRSI最低値)/(指定した期間のRSI最高値-指定した期間のRSI最低値)*100

になります。

改めて148行目をみてみると、

100.0*((RSI[i] – LLV)/(HHV – LLV))

まんまですね。

   for(i=limit; i>=0; i--) SK[i]=iMAOnArray(StoRSI,0,PeriodSK,0,MAMode,i);
   for(i=limit; i>=0; i--) SD[i]=iMAOnArray(    SK,0,PeriodSD,0,MAMode,i);

で、151行目でストキャスティクスRSIの移動平均を%Kとして設定しており、
152行目では%Kの移動平均を%Dとしています。

DTオシレーターがストキャスティクスRSIと違うのはここです。

ストキャスティクスRSIとの違い

通常ストキャスティクスの%Dは、

(終値-指定した期間の安値)/(指定した期間の高値-指定した期間の安値)*100

における各足の(終値-指定した期間の安値)をA,B,C…
(指定した期間の高値-指定した期間の安値)をA’,B’,C’…とすると、
例えば3期間では

(A,B,C)/(A’+B’+C’)

で算出されます。

しかし、DTオシレーターの%Dは%Kの移動平均の移動平均なので、3期間では

(((A/A’)+(B/B’)+(C/C’))/3+((B/B’)+(C/C’)+(D/D’))/3+((C/C’)+(D/D’)+(E/E’))/3)/3

みたいな感じで算出されます。

結論:DTオシレーターは平滑化ストキャスティクスRSI

はい、というわけでDTオシレーターのコードを見て行きましたが、
簡潔に言ってしまえば平滑化されたストキャスティクスRSIのようなものでした。

ただ平滑化されたと言ってもスローストキャスティクスではなく、
%Kから平滑化されていたり%Dもスロー%Dと違って平滑化された%Kの移動平均である点に違いが見られます。

extern変数PeriodStoch、PeriodSK、PeriodSDを利用してまとめると、

%K=PeriodStoch期間ストキャスティクスRSIのPeriodSK期間移動平均
%D=%KのPeriodSD期間移動平均

といったところです。

まぁ、こんなこと知ってようが知っていまいが、
そのインジケーターが有効なシグナルを出してくれればそれでいいんですけどね。

ところで、こいつをFT2用に改造してくれる人はいませんかね。

…自分でやればいいですかそうですか。

まぁ最近仕事でもPascal触っていないのでリハビリにはちょうどいいか。
書いたら上げます。

スポンサーリンク