初めてのインジケータ作成⑤スプレッドを表示するインジケーターを作る

この記事では、チャートに現在のスプレッドを表示するインジケーターの作り方を説明します。

ついでに、MQLの標準関数の使い方もあらためておさらいしていきます。

簡単なプログラムの作成を通じてコツをつかんでいきましょう!

この記事だけ読んでいただいてもOKですが、前の記事も気になる方は下記へどうぞ。

作成するインジケーター

今回作るインジケーターは、下図のように「チャートに現在のスプレッドを表示する」というものです。

スプレッドが表示されている様子

↑こんな感じでチャートの左上に小さくスプレッドが表示されます。簡単なプログラムのためとてもシンプルですが、これくらいでも十分役に立ったりします。

さて、このインジケーターは、いくつかの関数を組み合わせて作ります。今回はMQLの標準関数の使い方が説明のポイントです。

前回までにすでにいくつかの関数を使っていますが、ここで改めて関数の使い方をマスターしちゃいましょう!

関数でスプレッドを取得する

MQLには、基本的な数値演算やチャートに関する操作をする各種関数が備わっています。またMT4に特化したプログラム言語ですので、一般的なトレード指標を取得する関数も備わっています。

今回は、MarketInfo()という関数を使ってスプレッドの値を取得したいと思います。

①MQLリファレンスで調べる

実際に関数を使うにあたって、まずは関数の内容を調べましょう。

関数の機能や定義などはMQL4リファレンスに正確に記載されています。MQL4リファレンスを開くには、MetaEditorを開いた状態でF1キー押下です。

今回使用するMarketInfo()関数を調べると下図の様に記載されています。

MQLリファレンス(MarketInfo)

↑MQL4 Referenceより引用。関数の説明はどれもこの様な体裁で書かれています。各項目の意味は下記の通り。

関数名
関数名(MarketInfo)が書かれています。
機能説明
関数の機能が書かれています。MarketInfoはマーケットに関するいろいろな値を返す関数だとわかります。
定義
関数の定義が書かれています。MarketInfoが返す値はdouble型で、引数には通貨ペア名(symbol)と取得する情報のタイプ(type)の2つを使用することが分かります。
引数(パラメーター)
引数の意味や注意事項が書かれています。例えばtypeは、取得する情報を識別するためのID「identifier that defines the type」を指定するとあります。
戻り値
その関数がどのような値を返すか書かれています。MarketInfoは「Market Watch window」リスト内の各種の値を返すとあります。「Market Watch window」とはMT4の「気配値表示」ウィンドウ内で通貨ペアを右クリック→「仕様」で表示される「取引条件」のウィンドウのことです。
使用例
その関数の使用例が書かれています。実際にプログラムを書くときはここの記述を参考にすると正確です。

②関数を書いてみる

ではMarketInfo()関数でスプレッドの値を取得してみましょう。たとえばUSDJPYのスプレッドを取得するならば、以下のように書きます。

double spread = MarketInfo("USDJPY", 13);

↑上のコードで引数で指定している13はスプレッドを取得するための情報タイプidです。このコードを使いやすい形に書き直すと下記になります。

double spread = MarketInfo(Symbol(), MODE_SPREAD);

↑下線でマークした2か所変更しました。

1つ目の変更は、"USDJPY"と直接ドル円の通貨名を書いていたところを、チャートの通貨ペア名を取得するSymbol()関数に置き換えています。こうすることで、どのチャートでも使えるようになり、汎用性が上がります。このように、関数の引数にさらに別の関数を使用することができます。

2つ目の変更は、情報タイプの番号13MODE_SPREADに書き換えています。このMODE_SPREADは、MQLであらかじめ決められている固定のワードです。MODE_SPREADと記述すればMQLが勝手に情報タイプID=13のことだと解釈してくれます。ID番号(13)をそのまま書くと何を示すのかがぱっと見で分からないため、このような分かりやすい固定ワードがあらかじめMQLには用意されています。(他にどんな固定ワードがあるかはそのうち分かってきます。)

補足:機能からの逆引きは?

何か実現したい機能があって、それに使える関数が何がを調べたいことがありますよね。いわゆる関数の逆引きです。

残念ながらMQLリファレンスには関数の逆引き機能はありません。また、私の知る限り網羅性に優れた逆引きサイトはありません。ですので関数を逆引きしたい場合は、ネット検索などでがんばって探すというのが最初のステップになります。

MQLに慣れてくると、どのような関数なら用意されているのかや、関数名の付け方の法則がだいたいわかってきます。それくらいの段階になれば、MQL4リファレンスでそれっぽい名前を打ち込んで、目的の関数にたどり着くことができるようになります。また関連しそうな関数からウロウロとリンクをたどっていくと希望の関数が見つかることもあります。

はじめは関数を探すのに苦労しますが、よく使う関数はそのうち覚えてしまいます。まずは地道に使える関数を一つ一つ増やしていきましょう。

さて、関数の使い方の基本が分かったところで、ここからは実際にインジケーターの作成に取り掛かりましょう。

テンプレート作成

まずは、以前の記事で説明した要領で、MQLウィザードを使ってインジケータのテンプレートを作成してください。

テンプレートの構造

↑テンプレートです。そろそろこの辺りの説明は省略してもOKですね。

プログラムを書く

今回のインジでコードを記入する箇所は、テンプレート③のOnCalculate()の部分です。③に以下のコードを書きます。

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[])
{
  //1.スプレッドを取得(単位:point)
  double spread_point = MarketInfo(Symbol(), MODE_SPREAD);

  //2.単位をpointからpipsに変換(通貨の少数点以下が3桁または5桁表示のブローカーの場合)
  double spread_pips = spread_point / 10;

  //3.小数点以下1桁に丸めて文字列に変換
  string spread_text = DoubleToString(spread_pips, 1);

  //4.チャートにスプレッドを表示
  Comment("SP : " + spread_text);

   return(rates_total);
}

記入したコードは太字で示した4行だけです。以下内容の説明です。

1行目のコードは、先に説明したとおり、現在のスプレッドの値を取得するものです。(注意点としてはMarketInfo()で取得されるスプレッドの単位はpointだということです。一般的に使われているpipsに単位を換算する必要があります。2行目でその換算を行います。)

2行目のコードは1行目で取得したスプレッドをpointからpipsに単位換算しています。pointからpipsへの単位換算は10で割るだけですね。ちなみにこの単位換算が必要なのは、通貨の小数点以下桁数が3桁・5桁表示を採用しているブローカーの場合です。おそらくほとんどのブローカーがこれに該当します。桁数が2桁・4桁のブローカーの場合は10で割る必要はありません。

3行目のコードはスプレッドの値を少数点以下1桁で丸め(少数点第2位を四捨五入)て、文字列型に変換しています。DoubleToString()関数は数値から文字列にデータ型を変換する関数です。

4行目でチャートにスプレッドの値を表示しています。Comment()関数はチャートにコメントを表示する関数です。

以上でコードの記述は完了です。いつも通りコンパイルしてエラーが出ないことを確認してください。

チャートに適用

コンパイルができたら、実際にインジケーターをチャートに適用してみてください。

スプレッドインジケーターの動作画面

↑上図のようにスプレッドが表示されれば成功です。ティックを受信するたびにスプレッドの値が更新されることも確認してください。(市場が休みの日はスプレッドの値は変わりません、念のため)

プログラム全体

今回作ったスプレッドを表示するインジケータのプログラム全体を載せておきます。

//+------------------------------------------------------------------+
//|                                                         TEST.mq4 |
//|                                                     minagachi FX |
//|                                            https://minagachi.com |
//+------------------------------------------------------------------+
#property copyright "minagachi FX"
#property link      "https://minagachi.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   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[])
  {
   //1.スプレッドを取得(単位:point)
   double spread_point = MarketInfo(Symbol(), MODE_SPREAD);

   //2.単位をpointからpipsに変換(通貨の少数点以下が3桁または5桁表示のブローカーの場合)
   double spread_pips = spread_point / 10;

   //3.小数点以下1桁に丸めて文字列に変換
   string spread_text = DoubleToString(spread_pips, 1);

   //4.チャートにスプレッドを表示
   Comment("SP : " + spread_text);

   return(rates_total);
  }
//+------------------------------------------------------------------+

↑これをこのままコピペしていじっても良いかもしれません。

まとめ

今回はスプレッドを表示するインジケーターの作り方を説明しました。ほんのささやかですが、使い道のあるインジケーターができましたね。

あと、覚えておくと良いMQLリファレンスの便利な使い方があります。プログラム上の調べたい関数にカーソルを合わせてF1キーを押すとその関数のMQLリファレンスがダイレクトで開きます。頻繁に使う便利なTipsです。

それでは。

コメント

この記事へのコメント(0 件)