post

RSIに移動平均線を適用させる~その2

前回は、RSIに移動平均線を適用させるプログラムの骨格の部分を解説しました。骨格だけでも十分使うことができますが、オシレーター系のインジケーターは、「レベル」とセットで使われる事が多いです。

RSIでは70,30というのが一つの目安になっていますよね。70以上で買われすぎ、30以下で売られ過ぎというように(厳密に言うとこの考え方は良くないらしいですが、ここでは触れません)。RSIを適用するときに70,30のラインを入れて使う人が多いと思いますし、MT5に最初から入っているRSIにも70,30のラインはあらかじめ入っています。

今回は最初から70,30のレベルに線を入れる2つの方法についての内容になります。

1.#propertyで指定する方法。

#property indicator_level1 30
#property indicator_level2 50
#property indicator_level3 70
#property indicator_levelcolor clrOrange
#property indicator_levelwidth 1
#property indicator_levelstyle STYLE_DASHDOT

(1)property indicator_level1 30
赤字はレベル線の数だけ必要。これは1番目のレベルが30ということ

(2)property indicator_levelcolor
レベル線の色、指定しない場合はデフォルトのsilver

(3)property indicator_levelwidth
レベル線の太さ、指定しない場合はデフォルトの1

(4)property indicator_levelstyle
レベル線の形、指定しない場合はデフォルトのSTYLE_DOT(点線)なお、指定しても線の太さが2以上になると自動的にSTYLE_SOLID(実線)になる

なお、(2)(3)(4)はレベル線が何本あっても一括でしか指定できない

#propertyで指定するメリット

・プログラムが簡単
・ユーザーでの変更も容易

この画面から変更も新しいレベル線の追加も容易にできます。

#propertyで指定するデメリット

・色、太さ、形状は一括指定なので、きめ細かい指定はできない

2.IndicatorSetInteger、 IndicatorSetDouble関数で指定

//(1)レベル線の数を指定する
IndicatorSetInteger(INDICATOR_LEVELS,3);

//(2)レベル線の数字を指定する
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,30.0);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,50.0);
IndicatorSetDouble(INDICATOR_LEVELVALUE,2,70.0);

//(3)レベル線の色を指定する
IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,lclrRed);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrYellow);
IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrLime);

//(4)レベル線の太さを指定する
IndicatorSetInteger(INDICATOR_LEVELWIDTH,0,1);
IndicatorSetInteger(INDICATOR_LEVELWIDTH,1,3);
IndicatorSetInteger(INDICATOR_LEVELWIDTH,2,3);

//(5)レベル線の種類を指定する
IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_DOT);
IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID);
IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DASHDOTDOT);

(1)はレベル線を何本指定するかを表します。ここに指定した数以上のものを以下の関数で書いても表示されません。

(2)はレベルの数字の指定です。最初の線の順番は0番目になります。

(3)(4)(5)は省略可能です。省略するとデフォルトのsilver、太さ1,STYLE_DOTが適用されます。

関数で指定するメリット

・レベル線一本ずつ指定できる。

関数で指定するデメリット

・プログラムが複雑になる
・ユーザーが変更できない

レベル線を一本ずつ細かく指定できるので、より直感的にわかりやすいインジケーターになります。一方で、ユーザーがレベル線を増やそうとしても、反映されません。(時間足を変えただけで消えてしまいます)。また、プログラムコードが長くなります。サンプルコードでは、直接数字を関数内に埋め込んでいますが、実際は変数にしてinputで指定するのがプログラムの作法ですが、そうすると、

この部分が増えて面倒くさくなります。ここはインジケーター本体の変数をいれるべきところで、レベル線で複雑にしたくないところです。

ですので、どちらを採用するかは、プログラムの使われ方で判断してください。#propertyで指定するのは、他の人にも使ってもらうインジケーター用、関数で指定するのは自分専用などという感じです。

プログラムはこちらからダウンロードしてください

RSIに移動平均線を追加(#propertyでレベル線を指定)
RSIに移動平均線を追加(関数でレベル線を指定)

post

RSIに移動平均線を適用させる

なれRSIはギザギザしたラインなので意外に見にくかったりしませんか?もし、RSIに移動平均線がついていたら便利ではないでしょうか?

などと書いてみましたが、実際ストキャスティクスではKラインに対してDラインで滑らかにしています。DラインはKラインの移動平均線なんですよね。だからおかしな考え方ではないと思います。まあ、ゴールデンクロス、デッドクロスが売買タイミングになるかどうかはわかりませんが。

同じようにビルWilliamsの%Rオシレーターも同じように移動平均線をつけてみてはいかがでしょう?

RSIに移動平均線をつけた

RSIに移動平均線をつけた(クリックするともとの大きさで見られます)

プログラムはこちらからダウンロードしてください。

RSIに移動平均線を適用(プログラムソース)

ナレーションでSラインとか言ってしまいました(笑)

post

移動平均大循環分析

今日はプログラムの説明は一休みして自作インジケーターの紹介です。

小次郎講師とは

今日は小次郎講師の移動平均大循環分析について簡単に解説いたします。小次郎講師はご存じの方も多いかと思われますが、ラジオNIKKEIでパーソナリティを務められています。また、

このような本も執筆されております。そのなかで、小次郎講師の今一番のウリが移動平均大循環分析というものです。移動平均大循環分析などに詳しい解説がありますが、ざっくりいいますと、3本の移動平均線の並び順で現在のフェーズを把握して、相場状況をとらえるというものです。また、中期移動平均線と長期移動平均線の間を着色して(小次郎講師はこれを【帯】と名付けています)、ローソク足の反転や突破でエントリーや手仕舞いの判断をしているようです。詳しくは上記書籍や小次郎講師のサイトをご覧ください。

移動平均大循環分析のインジケーター

今回はその移動平均大循環分析をMT5のインジケーターにしてみたということです。プログラムの中身自体はそんなに難しくないのですが、今までの説明からは少し飛躍するので、今回はインジケーターの実行ファイルだけダウンロードできるようにしてあります。いずれプログラムの解説もしますのでお楽しみに。

(クリックするともとの大きさで見られます)

これが移動平均大循環分析のインジケーターです。中期移動平均線が長期移動平均線の上にあるとき(上昇トレンド)に帯が赤く、逆のときが青くなっています。また、右下にある数字が現在のフェーズです。『循環』とあるので、本来は前のフェーズから今のフェーズにどのように移ったのかというのも知りたいでしょうから、プログラムの解説のときにはもう少し手を入れる予定ですが、これでも使えるかと思います。移動平均線の期間も色も変えることができます。また、フェーズを顕す文字も移動させたり色を変えたり、フォントの大きさを変えたりできます。ダウンロードは下のリンクからできます。

移動平均大循環分析インジケーター

post

一番カンタンな移動平均線

では、実際のプログラムを作ってみましょう。今回は移動平均線を作る・・・というか、すでにあるテクニカル指標関数の使い方を説明します。既存のインジケーターの改造をするにはこれが一番手っ取り早いです。mq4(MT4)にもありましたが、ちょっと使い方が違うところがあります。

ソースファイルはこちらからダウンロードしてください(右クリックで保存)。

https://1klab.com/mt5/wp-content/uploads/2018/01/MA_Vol1.mq5

ーーーーーーーーーーーーーーーーーーーーーーー

#property indicator_buffers 1                         ・・・指標計算に使用されるバッファ数
#property indicator_plots 1                                     ・・・画面に描画されるものの数
#property indicator_type1 DRAW_LINE  ・・・描画されるものの種類(移動平均線なのでLINE)
#property indicator_color1 clrDeepPink  ・・・描画される線の色
#property indicator_width1 2   ・・・描画される線の太さ

int hMA;  ・・・ハンドル→これがMT5(mql5)のキモ
double buf[];   ・・・バッファ(この値が描画される)

input ENUM_MA_METHOD InpMAMethod=MODE_SMA;  ・・・移動平均線種別
input ENUM_APPLIED_PRICE InpMAApply=PRICE_CLOSE;  ・・・適用価格
input int InpMaPeriod=20;  ・・・期間

ーーーーーーーーーーーーーーーーーーーーーー

mql5で特に変わったのが#property indicator_plotsのところとハンドルの概念です。詳しくは
https://www.mql5.com/ja/docs/basis/preprosessor/compilation
を参照してください

続いてOnInit関数です。OnInit関数は、インジケーターが起動したとき最初に呼ばれる関数です。

ーーーーーーーーーーーーーーーーーーーーーーー

//移動平均線のテクニカル指標関数に接続
hMA=iMA(NULL,0,InpMaPeriod,0,InpMAMethod,InpMAApply);

//正しいインデックス作成と適切な配列とを関連付ける
SetIndexBuffer(0,buf,INDICATOR_DATA);

//データウィンドウに表示する指標グラフィカルシリーズの名称
PlotIndexSetString(0,PLOT_LABEL,”MA Vol.1(“+string(InpMaPeriod)+”)”);

ーーーーーーーーーーーーーーーーーーーーーーー

mql5ではこの方法でテクニカル指標関数に接続します。詳しくは
https://www.mql5.com/ja/docs/indicators
を参照してください。続いてOnCalculateですOnCalculateはローソク足が動くたびに呼ばれる関数です。

ーーーーーーーーーーーーーーーーーーーーーーー

//— データが全て計算されたかをチェックする
if(BarsCalculated(hMA)<rates_total)
return(0);

int to_copy;

//最初はprev_calulated==0なので、すべてのデータがコピーされる
to_copy=rates_total-prev_calculated;

//一度計算されるとrates_total==prev_calculatedになるので、最新のバーだけ計算するようにする
if(to_copy==0)
to_copy++;

// 指標バッファのコピー
if(CopyBuffer(hMA,0,0,to_copy,buf)<=0)
return(0);

ーーーーーーーーーーーーーーーーーーーーーーー

最後にハンドルを開放します。この関数は自動で生成されないので自分で作る必要があります。

void OnDeinit(const int reason)
{
IndicatorRelease(hMA);
}

コンパイルして実際に動かしてみましょう。おそらく最初は

こんな風に変数名がそのままでているかと思います。これだと混乱する可能性もあるので、コメントを入れます。コメントはC++と同じ要領です。そうすると

このようにわかりやすくなります。同じ期間、同じ種別、同じ適用価格でMT5に最初から入っている移動平均線と比べてみてください。当然同じ値になっているはずです。データウィンドウで確認します。

このような要領で、既存のインジケーターの改造から始めましょう。

post

MT5の優位性

MT4とMT5の比較ですが、機能の面からすれば圧倒的にMT5の方が有利です。基本的にソフトウェアというものはバージョンが上がるほど高機能かつバグも少なくなるものですからね。その中でも特に

(1)使える時間足が増えた
(2)多色インジケーターが使える

この2つは大きなメリットです。

時間足が増えた

MT4では1分、5分、15分、30分、60分、1時間、4時間、日足、週足、月足が使えましたが、MT5ではそれに加えて、2,3,4,6,10,12,20分、2,3、6,8、12時間足が使えるようになりました。全部が必要とは思いませんが、2分足10分、20分足は私もよく使っていますし、8時間足12時間足を使うトレーダーも多いと聞きます。機能はなくて困ることがあっても、あって困ることはないので、時間足が増えたのはありがたいことです。

多色インジケーター

もう一つ大きな機能アップが多色インジケーターが使えるということです。

上図では、移動平均線とVolumeインジケーターを表示していますが、移動平均線の傾きがプラス(上昇トレンド)のときは赤、マイナス(下降トレンド)のときは青で描かれています。Volumeインジケーターでは、Volumeの段階によって色が変わっていきます。MT4でも実現できたのかもしれませんが、MT5では簡単に実現することができます。

移動平均線の傾きで色を分ける、RSIの30以下、70以上で色を分けるなどができれば、より直感的にインジケーターの見分けがつくようになります。

私としては一刻も早く、国内の業者もMT5が使えるようになって欲しいと思います。せめてMT4と共存させてほしいです。

post

MT5プログラム

MT5の現実

MT5(MetaTrader 5)とは、メタトレーダー社(https://www.metatrader5.com/ja)のFXやCDFなどの取引ソフトです。このソフトで様々な分析をしたり、実際にトレードをすることができます。しかし、FXをやられている方は、MT4(MetaTrader 4)の方が圧倒的に有名でシェアも5を圧倒していることはご存じでしょう。MT5が登場してもう7年目になります(2011年に登場)。それでも普及が進んでいません。

普及が進まないには理由があり、その主な原因がプログラムに互換性がなく、MT4のインジケーターやエキスパートアドバイザー(EA)がそのまま流用できないということにあります。今日現在、MT4のインジケーターやEAはものすごい数があります。その膨大な資産がそのまま使えないのでは、MT5の普及が進まないのは仕方ないでしょう。

もう一つ、日本人には特に重要ですが、MT5を採用している日本のブローカがないというのもあります。MT5を使うには、海外のブローカーを使うしかないのです。

それでもなぜMT5?

ならば、MT4をそのまま使えばいいのではないか?もちろん、そうです。しかし、MT5にいつでも移れる準備も必要かと思わされることも起きています。

(1)MetaTrader社からはMT4はダウンローできない
(2)MT4のマイナーバージョンアップが止まった

現在、MetaTrader社からダウンロードすると、必ずMT5がダウンロードされます。MT4をダウンロードしたくてもできません。MT4をダウンロードしたい場合は、MT4でトレードできるブローカーからダウンロードするしかありません。ブローカーからダウンロードすると、ブローカー用のカスタマイズがされていたり、ブローカーのアイコンが設定されています。とはいえ、運用には問題はないでしょう。しかし、本家からダウンロードできないということは、いつMT4の終了がアナウンスされるかわからないですね。

もう一つ、マイナーバージョンアップが止まったというのも重要です。本家がもうMT4のメンテナンスは行わないということです。また、MetaTraderは将来的にはMT5へ全面移行するということも言っています。ですからMT5の準備をすることは無駄にはならないはずです。

プログラミングの必要性

現状、MT5の普及が進まず、インジケーターなどもあまり出回っていない現状では、自分で作るしかないという場面がかなり出てきます。多くの方はトレーダーであってプログラマーではないので、このハードルは高いです。しかし、インジケーターの改造など、簡単なものは思った以上に簡単にできますので、それを紹介したいと思います。本ブログはYou Tubeとも連動しようと思っていますので、よりわかりやすく紹介できればと思います。