2016年1月12日火曜日

[MQL超入門] その010 本格的にインジケータを作ってみよう。その2 TICKの更新回数を描画する。

前回の続きです。

[MQL超入門] その009 本格的にインジケータを作ってみよう。その1 セパレート型インジケータ作成
http://mt4program.blogspot.com/2016/01/mql-009.html

前回、チャートとは別に表示するセパレート型インジケータの基本形ができました。
そこに実際の処理を埋め込みしていきたいと思います。

今回はすでに処理を組み入れたプログラムを見ながら解説します。ですので、先に結果から。このようなチャートが描画されます。なんとなく、価格が大きく動いているときに飛び出ている感じですよね。

・図010.01 価格の更新回数を描画する。


//+------------------------------------------------------------------+
//|                                                   TickVolume.mq4 |
//|                                         Copyright 2016, Daisuke. |
//|                                   http://mt4program.blogspot.jp/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

//インジケータで使用するバッファの数を指定する。
#property indicator_buffers 1

//描画する線の情報を指定する。
#property indicator_label1  "TickVolume"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

// 表示バッファ
double tickVolume[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,tickVolume);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   for( int i = rates_total - prev_calculated - 1; i >= 0; i-- )
   {
      tickVolume[i] = (double)tick_volume[i];
   }
//--- return value of prev_calculated for next call
   return(rates_total - 1);
  }
//+------------------------------------------------------------------+

赤字の部分が、今回追加した部分です。一つずつ説明したいと思います。
#property indicator_buffers 1
まず、この一文です。これは、インジケータ内で使用するバッファと呼ばれる物の数を指定しています。ここでは、インジケータ内で描画したい線の数を指定します。
(※正確ではありませんが、超入門ということで、まずは、線の数を指定するということで理解していただければと思います。)
#property indicator_label1  "TickVolume"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
ここは、インジケータ内で描画する線の形式を指定しています。

indicator_label1の1の部分は1番目の・・という意味を示しています。もし線が二つ以上ある場合は、ここが2,3...と番号を指定した分だけ増えた内容を定義します。それぞれの意味は次の通りです。
[indicator_label?]は、線の名前を指定します。自由な文字列を入力可能です。
[indicator_type?]は、線の種別を指定します。DRAW_LINEは直線という意味です。
[indicator_color?]は、線の色を指定ます。clrAquaは水色です。
[indicator_style?]は、線の見た目を指定します。STYLE_SOLIDは実線という意味です。
[indicator_width?]は、線の太さを指定します。整数値を指定可能です。

どのような値が指定可能かは、別の機会にということで、次に移ります。
double tickVolume[];
ここで、double型の配列を定義します。このように{}で囲われていない場所に書かれた変数をグローバル変数と呼びます。
インジケータでは、最低線の数分だけ、このdoubleで定義したグローバル変数を定義する必要があります。それぞれ違う名前を付ける必要があります。
ここでは、Tickの更新回数を表示する変数としてtickVolumeという名前のdouble配列を定義しました。
   SetIndexBuffer(0,tickVolume);
OnInit()と書かれた{}内に記載されている上記の文ですが、これは、「このdoubleの配列をチャートの描画に使いますよ」という宣言になります。先ほど定義した[tickVolume]を指定します。初めに0という数字も一緒に記載されていますが、「1番目に描画する線として指定します。」という意味になります。ここで0と指定したものが、[indicator_type1]と指定したものと一致します。
OnInit()は、インジケータが起動する最初に呼び出される処理を記載する場所です。

少々面倒な話になるのですが、MQLの元となっているC言語では配列の一番最初の要素は0と指定します。MQLもこのルールに従ってプログラム内では1番目の要素のことを0と指定します。
   for( int i = rates_total - prev_calculated - 1; i >= 0; i-- )
   {
      tickVolume[i] = (double)tick_volume[i];
   }
さて、次の部分は、実際の処理です。[OnCalculate]という{}の中に含まれています。[OnCalculate]はTickの更新があるたび呼び出される処理です。ここに具体的にチャートを描画する処理を記述していくことになります。

for文の内容を、もう少し詳しく、解説します。
まず[rates_total]という変数には、バーの本数が入っています。[prev_calculated]という変数には、すでに処理済みのバー本数が入っています。(※こちらも、この説明ではあまり正確ではありませんが、超入門ということでお許しを・・・・。)
つまり[rates_total - prev_calculated]は未処理のバー本数を示しています。
先ほど説明した通り、C言語の流儀に従って、配列の指定は0から始まりますので、-1として数字調整をしています。例えば、全部でバーの数が10本あるとすると、配列で指定する数字は0~9までとなります。そのため最大値-1を初期値としています。

あと、今回[i--]という文が出てきます。これは[i=i-1]と同じ意味です。省略形です。

もう一点、インジケータのデフォルトでは、配列の0番目の要素が、チャート右端のデータ(最新のデータ)になります。このforループでは、過去のデータから先に値を生成するために、大きい数字から小さい数字へループさせながら計算しています。

forの中ではグローバル変数として定義した[tickVolume]のi番目に[tick_volume]のi番目の値を入れています。[tick_volume]はMT4が自動的にバーごとの更新回数を入れてくれる変数としてとりあえず覚えておきましょう。
   return(rates_total - 1);
[return]を話そうと思うと、今まで避けていた関数という考え方を学習する必要が出てきます。ここではとりあえず、このように書くということだけで、次に進みましょう。

さて、実行してみましょう!図010.01のようなチャートが表示された成功です。

うーん。これだけだと、基準値が無いため活発なのかどうか判別がつきませんよね。そこで、基準値として平均値を表示するように変更したいと思います。
続きはまた明日!

次の回へ


ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ

2016年1月8日金曜日

[MQL超入門] その009 本格的にインジケータを作ってみよう。その1 セパレート型インジケータ作成

プログラムは習うより慣れろが基本です。

そこで、本格的なちゃんと使える(?)インジケータを確認しながら作成していきたいと思います。

MT4では、通常見えている価格の情報以外に価格の更新回数という情報も保持しています。更新回数が多いほど活発に取引されていることを示しています。値段が動きやすいタイミングというのがデータで判別可能です。

これは通常の価格チャートでは表示されていません。MT4には、この情報を表示するためのVolumesというデフォルトのインジケーターが存在しますが、基準値が表示されおらず、で?って感じのインジケータとなってしまっています。
そこで、インジケータの現在値と平均値を同時に表示して活発に取引されているかどうかを判定するインジケータを作成したいと思います。


まず、新しいインジケータを作成してみてください。

[MQL超入門] その005 とりあえずやってみよう!簡単インジケータ作成1
http://mt4program.blogspot.jp/2015/12/mql-005.html

を、参考にTickVolumeという名前のインジケータを作成します。
 ・図005.03 MQLウィザード 名前の決定
にてTickVolumeという名前を入力した後「 ・図005.04 MQLウィザード カスタムイベントハンドラの選択」以降の作業は無視して、すべて[次へ(N)]ボタンを押してウィザードを終了してください。

そうすると次のようなファイルが出来上がります。
これがインジケータ最小限のひな型となります。

//+------------------------------------------------------------------+
//|                                                   TickVolume.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

インジケータウィザード 生成コードを見てみよう
http://mt4program.blogspot.jp/2015/10/blog-post_95.html
時間足の中央値を描画するサンプル
http://mt4program.blogspot.jp/2015/10/blog-post_79.html

でも少し書いてありますが、もう一度、重要な部分だけおさらいしたいと思います。

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
まず、上から4行ですが、これはプログラムに関する情報です。動作には大きく影響しません。気になる方は修正しましょう。外部に向けて公開するときなどは、著作権情報などを入力します。

#property strict
この一行は、あたらしいMQL形式に対応するという文言ですが、特に気にせず付けます。

#property indicator_chart_window
この一行は、重要です。
indicator_chart_windowは、価格が表示されているチャートの上に描画されるインジケータのことを示しています。
[MQL超入門] その006 とりあえずやってみよう!簡単インジケータ作成2
http://mt4program.blogspot.jp/2015/12/mql-006-2.html

で作成したような形のものです。

さて、TickVolumeというのは価格情報とは異なる値ですので、分割したインジケータとして表示したい情報です。
そこで、ここの値を次のように変更します。
#property indicator_separate_window

この状態で、一度実行してみましょう。

・図009.01 分割したインジケータ
価格情報が表示されている場所とは別の場所に枠が表示されました。これがセパレート型インジケータとなります。

さて、次回は、このチャート上に、価格の更新回数を描画したいと思います。

次の回へ


ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ

2016年1月7日木曜日

[雑記]思えばたくさん作ったものです。無料公開中のインジケータ追加

FX-ONにて公開している無料インジケータを更新しました。
ブログ左にある豚さんリンクからダウンロードできます。

現在 下記のインジケータが含まれています。

自分で言うのもなんですが、いっぱい作りましたね^^;;;

役に立っていると思うのは、S/RオシレータとTEMA関係でしょうか?
TEMAかい離率なんかも1時間足では、なかなか役に立っています。

・ゼロラグMA
実行ファイル:ZEMA.ex4
ソースコード:ZEMA.mp4
http://mt4program.blogspot.jp/2015/10/mt4-ema_8.html 

・ウィドナー博士のS/Rオシレータ
実行ファイル:WidnerSRO.ex4
ソースコード:WidnerSRO.mq4
http://mt4program.blogspot.jp/2015/10/sr_8.html
http://mt4program.blogspot.jp/2015/10/mt4-ea-sr_8.html 

・ウェーブレットエネルギー解析
実行ファイル:WaveletEnagy.ex4
http://mt4program.blogspot.jp/2015/10/mt4_34.html 

・各国の取引時間を表示する。

実行ファイル:TimeRectangle.ex4
ソースコード:TimeRectangle.mq4
http://mt4program.blogspot.jp/2015/10/mt4_59.html 

・移動平均移動平均
実行ファイル:MAMA.ex4
ソースコード:MAMA.mq4
http://mt4program.blogspot.jp/2015/10/blog-post_71.html

・状況に応じて色が変わるボリンジャーバンド
実行ファイル:colorfulMTBB.ex4
ソースコード:colorfulMTBB.mq4
http://mt4program.blogspot.jp/2015/10/mt4_22.html 

・二つのMA間に雲を描画する。
実行ファイル:MACloudObject.ex4
ソースコード:MACloudObject.mq4
http://mt4program.blogspot.jp/2015/10/mt4ma_8.html 

・なめらか&追従よく トリプルEMA (TEMA)
実行ファイル:TEMA.ex4
ソースコード:TEMA.mq4
http://mt4program.blogspot.jp/2015/10/mt4_38.html 

・21本高値安値には意味がある?周期高値安値インジケータ
実行ファイル:HighLow.ex4
ソースコード:HighLow.mq4
http://mt4program.blogspot.jp/2015/10/mt421_8.html http://mt4program.blogspot.jp/2015/10/mt413_8.html 

・[MT4インジケータ&プログラム]TEMAに標準偏差バンドをつけてみた。
実行ファイル:TEMABB.ex4
ソースコード:TEMABB.mq4
http://mt4program.blogspot.jp/2015/10/mt4tema_15.html 

・[MT4インジケータ]13本高値安値にトレンド成分を追加してみた。
実行ファイル:HIghLowTrend.ex4
ソースコード:HIghLowTrend.mq4
http://mt4program.blogspot.jp/2015/11/mt413.html

 ・心理の揺れ動きをみる! MT4インジケータ 移動平均かい離率
実行ファイル:Kairiritsu.ex4
ソースコード:Kairiritsu.mq4
http://mt4program.blogspot.com/2015/10/mt4_5.html 

・レンジ・エクスパンション・インデックス(REI)を作ってみた。
実行ファイル:RangeExpansionIndex.ex4
ソースコード:RangeExpansionIndex.mq4
http://mt4program.blogspot.jp/2015/10/rei_8.html 

・シンプルだけど効果あり!MT4でDrawSimpleLineインジケータを作ってみた。
実行ファイル:DrawSimpleLine.ex4
ソースコード:DrawSimpleLine.mq4 http://mt4program.blogspot.jp/2015/10/mt4drawsimpleline_8.html 

・[MT4インジケータ]S/RオシレータをTEMAで平滑化してみる。
実行ファイル:TemaWidnerSRO.ex4
ソースコード:TemaWidnerSRO.mq4
http://mt4program.blogspot.jp/2015/12/mt4srtema.html 

#2015/12/11追加
・ATR君・・ほしい値はそこじゃない!複数バーを使ったATRを表示する。
実行ファイル:MultiBarAtr.ex4
ソースコード:MultiBarAtr.mq4
http://mt4program.blogspot.jp/2015/12/mt4atratr.html 

#2016/01/07追加
・[MT4インジケータ]TEMAかい離率 瞬間的かい離で利食い&逆張りタイミング?
実行ファイル:TemaKairiritsu.ex4
ソースコード:TemaKairiritsu.mq4
http://mt4program.blogspot.jp/2015/12/mt4tema.html 

・[MT4インジケータ]平均足を漸進計算で上位足を表示する。チャート版
実行ファイル:VMTHeikinAshiOnChart.ex4
ソースコード:VMTHeikinAshiOnChart.mq4
http://mt4program.blogspot.jp/2016/01/mt4.html 

ブログにてコードもアップしているものはソースコードも含めています。 詳細は各記事をご確認ください。

プロぐランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログへ