MT5 インディケータの作り方 その4

indicator

今回の投稿は、気分転換でインディケータの作り方の解説したいと思います。

バンドワイズチャート

計 算用 の 配列( INDICATOR_ CALCULATIONS) ボリンジャーバンド は バンド 幅 が 狭く
なっ て いる ところ( スクイーズ) から 広がり 始める( エクスパンション) と トレンド が 始まり ます。
しかし、 ロー ソク 足 と からまっ て、 実際 に 広がり 始める 場所 が 見にくかっ たり、
逆 に 閉じ 始める ところ を 見落とし たり し がち です。
それ を 視覚 的 に とらえる のが バンドワイズ( BandWidth) チャート です。

バンドワイズチャート の 式 は 次 の よう になり ます

BandWidth =(+ σ – -σ) ÷ ミッドバンド

バンドワイズチャート は MT 5 に 標準 では 搭載 さ れ て い ませ ん ので、自分で作ります。
ボリンジャーバンドのハンドルを使います。
ファイル名をBandWidthとして作成します。

property 部分

property indicator_buffers 4

property indicator_plots 1

今までとの違いに注目ください。 今までは計算に使う配列 と、描画 される配列の数が同じでした。 今回は異なっ ています。
計算に使う配列が4 つ、描画に使われるのがそのうち の 1 つ だけということになります。
indicator_ width は 見やすさを考えて2を基本とします。 そうすると indicator_ style は 自動的 に STYLE_ SOLID( 実線) に
なるので今後は原則 として省略 し ます。
必要 に 応じて各自で 加えてください。 ボリンジャーバンドのパラメータ は 期間 が 20、シフトはし ない、偏差 は 2. 0です。

OnInit関数

SetIndexBuffer( 0, IndBuffer, INDICATOR_ DATA);
SetIndexBuffer( 1, BB_ MLBuffer, INDICATOR_ CALCULATIONS);
SetIndexBuffer( 2, BB_ TLBuffer, INDICATOR_ CALCULATIONS);
SetIndexBuffer( 3, BB_ BLBuffer, INDICATOR_ CALCULATIONS);

SetIndexBuffer 関数ですが、 配列の順番の付け方は今までと同じ要領です。
IndBufferを0番目としてインデックスしていき ます。 第三パラメータに注目してください。
IndBuffer の INDICATOR_ DATA は 今まで通りです。
したがって、 IndBuffer が チャート に 描画 さ れる 配列 に なる という こと です。
その他 の 3 つ の 配列 は INDICATOR_ CALCULATIONS と なっ て い ます。
これは、 文字通り、 計算のための配列であるということを意味 します。
計算のためだけに使われて、 描画はされない配列 はこのうにINDICATOR_ CALCULATIONSで指定 します。
SetIndexBuffer 関数の第三 パラメータは INDICATOR_ DATA、
INDICATOR_ CALCULATIONSともう 一つ INDICATOR_ COLOR_ INDEX という3つ が あり ます。
INDICATOR_ COLOR_ INDEX につきましては 後章 で 解説 し ます。
この 3 つ は 優先 順位 が あり、必ずINDICATOR_ DATAを最初に指定 します。
今はこれ だけを覚えておいてください。

PlotIndexSetInteger( 0, PLOT_ DRAW_ BEGIN, BandsPeriod-1);

新しい 項目です。 PLOT_ DRAW_ BEGIN というところ から、 描画される開始 位置という意味はわかるかと思いますが、
詳しいことは OnCalculateのところで説明 し ます。

IndicatorSetString( INDICATOR_ SHORTNAME, short_ name);

新しい項目です。 PLOT_ DRAW_ BEGIN という ところ から、 描画される開始位置という 意味はわかる かと思いますが、
詳しいことは OnCalculate のところで説明 し ます。

IndicatorSetString( INDICATOR_ SHORTNAME, short_ name);

インディケータ の ラベル です。 インディケータ の 名前 は、前もって 文字列 を 作成 し てから IndicatorSetString に いれる 方法 が あり ます。
そうすれ ば、 関数はすっきりとしますね。

OnCalculate関数

ロー ソク 足 の 4 本 値( 始値、 終値、 高値、 安値) や、 移動平均線、 ボリンジャーバンド などは 各 時間 足 で MT 5 が 値 を 持っ て い ます。
その 値 を そのまま 使う( 描画 する) 場合 には、 途中 の 計算 は MT 5 に 任せ て、 結果 だけを CopyBuffer で ひとまとめ に コピー する こと が でき ます。
しかし バンドワイズチャート の よう に、 MT 5 に 入っ て い ない もの に関して は、自分 で 計算 する 必要 が あり ます。
この 部分 は、 値 の 計算 を し て いる ところ になり ます。 計算 は バー を 1 本 ずつ for ループ で 計算 を すれ ば いい の です が、 毎回 毎回 値 が 動く
たび に 全部 の バー の 計算 を する のは 無駄 です。 これ は CopyBuffer の ところ と 同じ 考え です。
どこ から どこ まで 計算 する かを limit という変数で決定 し ます。

int limit;
if( prev_ calculated == 0)
limit = 0;
else
limit = prev_ calculated-1;

まず、インディケータ が 適用 さ れ た 瞬間 は 全部 の バー の 計算 を し なけれ ば なら ない ので、 prev_ calculated が 0 の とき は limit を 0 に し ます。
それ 以外 の とき は、 最新 の バー の 計算 を する の です が、 それ が limit = prev_ calculated-1 という こと に なる わけ です。

イメージ する のが 難しかっ たら 具体的 な 数字 を いれ て みる と いい でしょ う。 例えば rates_ total を 10 と し ます。

for( int i = limit; i < rates_ total && !IsStopped(); i ++)

インディケータ を 適用 し た とき limit は 0 なので0から9までということになります。配列は0から始まりますので10番目の配列はIndBuffer[9]というわけです。
次の瞬間prev_calculatedは10になります。したがってforループは9から9までの計算、つまり最新のバーだけを計算することになります。最後に新しいバーができた
瞬間、rates_totalが11になります。しかしprev_caculatedは10のままです。するとforループは9から10までの計算となります。そして次の瞬間にはprev_caculated
は11になりますので、また最新のバーの計算だけすることになるわけです。

IsStoppedというのは、プログラムが強制的に終了させる命令をうけているかどうかをチェックする関数です。
!IsStopped()と否定になっているので、強制的に終了させる命令がないときということになります。

IndBuffer[i]=(BB_TLBuffer[i]-BB_BLBuffer[i])/BB_MLBuffer[i];

forループの中でバンドワイズチャートの計算式

BandWidth =(+ σ – -σ) ÷ ミッドバンド

を計算しているというわけです。その前のif(BB_MLBuffer[i])ですが、変数で割り算をするときは0で割ることがないように注意します。
if文は中が真のときに実行されますが、BB_MLBuffer[i]が0のときは偽になりますので0以外なら実行されるということです。そして0
のときはindBufferを0にしておきます。バンドの上下がまじわることはないので、理論的には0にはならないのですが、例えばすべての
値がということもあり、そのときに問題になります。

続く。。。

ブログランキング・にほんブログ村へ

TRADERS-pro【トレプロ】

コメント

タイトルとURLをコピーしました