ども、とのです。
またまたFXの記事を書いていきますが、
今回は若干プログラムよりの話です。
といっても、俺はあまりMQLに詳しくないので、話半分に聞いてやってください。
前回の反省
さて、今週取引GBP/USDですが、利確してからまたもう少し下げてしまいました。
モメンタムが売られ過ぎになったと判断していましたが、
そもそもオシレーターの読み方が「フィボナッチブレイクアウト売買法」記載のものと異なっているっつうね。
本書ではこのように記載されています。
DTオシレーターゃストキャスティックスなどのように2本の線を使う指標では、
両方の線が買われ過ぎ・売られ過ぎゾーンに入っていなければ
買われ過ぎや売られ過ぎとはみなされない。
で、前回手仕舞い時のチャートを見てみると、
あかん、青線が売られすぎラインに入ってませんわ。
「売られすぎ」っていうのは、このチャートでは第四波の底のような状態のことを言うんでしょうね。
「買われすぎ」には第一波と第三波の頂点が該当しています。
こうやってトレードを振り返って学習していくのですなぁ。
本題: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触っていないのでリハビリにはちょうどいいか。
書いたら上げます。
コメント