【超入門】MQL5 EA講座 第103回「価格とバーに関するデータへのアクセス:その1現在値」【EAの作り方】

MQL5でEA作ろう講座

——–


前回資金管理ロット調整を容易に行うための関数を作り、その解説を行いました。

またそれらの関数を集約させるためのインクルードファイル、「OriginalMoneyManagement.mqh」ファイルを作りました。

OriginalMoneyManagement.mqh」ファイル内に作った関数は以下の通りです。

VerifyVolume関数ロット調整を行う)

MoneyRiskManagement関数資金管理を考慮したロット数を算出する)

StopPriceToPoints関数(約定価格とストップロス価格との差分をポイントに変換する)

OriginalMoneyManagement.mqh」ファイルのコード記述全体は→コチラ

さて、今回からはMQL5における、価格情報とバー情報に関するデータへのアクセス方法について解説していきたいと思います

今回の記事を読む事によって、MQL5を使って、現在値を含めた価格情報や過去~現在のバー情報を取得する記述する方法が理解できるようになります。

スポンサーリンク

価格情報とバー情報に関するデータへのアクセス方法について

前バージョンのMQL4では、バー情報にアクセスする為の、定義済み配列が用意されていました。

配列については、以下の講座記事をご参照ください。

定義済み配列とは?

定義済み配列というのは、あらかじめ、プログラミング言語側で格納される情報を設定している配列の事です。

MQL4では例えば、Close[]や Time[]などの定義済み配列が用意されています。

Close[1]という記述をすると、現在足の一本前の終値情報を取得できますし、

Time[1]という記述をすると、現在足の一本前のオープン時間情報を取得できます。

ところが!MQL4では用意されていたこれらの定義済み配列は、MQL5では軒並みなくなってしまいました。

また、MQL4ではAskやBidなどの、現在値情報を取得する定義済み変数も用意されていたのですが、定義済み変数「Ask」「Bid」も、MQL5ではなくなっています。

MQL5で用意されている定義済み変数については以下の記事をご参照ください。↓

MQL5 EA講座 第29回「定義済み変数について」

※また、配列を用意して、価格情報やインジケータ情報を格納し、EA(自動売買プログラム)作成に生かす具体例については下記の記事群も参考になると思います。↓

【MQL5】5分で作れる、トレンドフォロー型EA

ArraySetAsSeries関数について

MQL5 EA講座 第68回「簡単な仕組みのMT5用EAを作るーその1ー」

現在値へのアクセス方法

それではまず、現在値情報へのアクセス方法から解説していきたいと思います。

先述した通り、MQL4ではあった定義済み変数「Ask」「Bid」が、MQL5ではありませんでした。

では、どうやってMQL5では現在値にアクセスするのでしょうか?

取得方法1:SymbolInfoDouble関数を使う

例えば、講座記事の

第68回「簡単な仕組みのMT5用EAを作るーその1ー」

第69回「簡単な仕組みのMT5用EAを作るーその2ー」

では、それまでの講座記事の内容を踏まえて、簡単なEA(自動売買プログラム)を作る工程を解説したわけですが、その時は現在値を取得するのにSymbolInfoDouble関数を使っていました。

Ask値であれば、SymbolInfoDouble関数の第2引数定数「SYMBOL_ASK」を記述する事によって取得できます。↓

double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

Bid値であれば、SymbolInfoDouble関数の第2引数定数「SYMBOL_BID」を記述する事によって取得できます。↓

double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

取得した値を、サンプルコードのようにローカル変数「ask」や「bid」に格納すれば、現在値を使いまわすことが可能になります。

SymbolInfoDouble関数については↓の記事も参考になると思います。

しかしながら、この取得方法だと、

SymbolInfoDouble関数を使うという事

・第2引数に、定数「SYMBOL_ASK」や「SYMBOL_BID」を指定すること。

↑の知識を覚えている必要があります。

MQL4で定義済み変数「Ask」「Bid」が、使えていたことに比べると、いかにも使い勝手が悪いですね。

そこで、MQL4の定義済み変数「Ask」「Bid」のように、直感的にAsk値、Bid値を取得できるようなオリジナルの関数を作っていきます。

取得方法2:オリジナル関数を作って取得する

Ask値、Bid値を取得する関数を作るにあたって、それらを含めた価格情報・バー情報に関連する関数クラスを集約させるインクルードファイルを作ります。

価格情報・バー情報に関数・クラスを集約させるインクルードファイルを作る

//+------------------------------------------------------------------+
//|                                                OriginalPrice.mqh |
//|                                                         MQL5ssei |
//|                                    https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"

ファイル名を「OriginalPrice.mqh」ファイルとしました。

これからこのファイルに、価格情報・バー情報に関連する関数クラスを作っていきます。

Ask関数(Ask値を取得する関数)について 

まずは、「OriginalPrice.mqh」ファイル内にAsk関数を宣言します。

//Ask値を取得する関数
double Ask(string parSymbol=NULL)
{
	if(parSymbol == NULL) parSymbol = _Symbol;
	return(SymbolInfoDouble(parSymbol,SYMBOL_ASK));
}

関数名は「Ask」としました。名前からAsk値を取得する事が一目瞭然になります。

取得したAsk値を返す想定なので、戻り値データ型double型です。

string型引数「parSymbol」には、取引銘柄情報が格納される想定ですが、初期値NULLを設定しています。

※「NULL」というのは、何のデータも含まれない状態のことを指し示す用語で、MQL5においては事前定義された値を返す定数値です。定数値としては0を返します。

{}内の処理実装記述、冒頭で、

if(parSymbol == NULL) parSymbol = _Symbol;

という記述をしています。引数「parSymbol 」の値がNULLの時、即ちメインプログラムでこのAsk関数を利用しようとする際に引数を省略した場合は、定義済み変数_Symbol」が代入されます。

定義済み変数_Symbol」はEA(自動売買プログラム)を適用したチャートの銘柄情報を返します。

あとは、returnにてSymbolInfoDouble関数の第2引数定数「SYMBOL_ASK」を記述する事によって取得したAsk値を戻り値として返して、Ask関数の処理は終了です。

Bid関数(Bid値を取得する関数)について 

続いてはBid関数です。

//Bid値を取得する関数
double Bid(string parSymbol=NULL)
{
	if(parSymbol == NULL) parSymbol = _Symbol;
	return(SymbolInfoDouble(parSymbol,SYMBOL_BID));
}

関数名は「Bid」としました。Bid値を取得する関数なので、自明ですね。

Bid値を返す想定なので、戻り値データ型double型です。

string型引数「parSymbol」には、取引銘柄情報が格納される想定ですが、初期値NULLを設定しています。

{}内の処理実装記述、冒頭で、

if(parSymbol == NULL) parSymbol = _Symbol;

という記述をしています。引数「parSymbol」 の値がNULLの時、即ちメインプログラムでこのBid関数を利用しようとする際に引数を省略した場合は、定義済み変数_Symbol」が代入されます。 定義済み変数_Symbol」はEA(自動売買プログラム)を適用したチャートの銘柄情報を返します。

あとは、returnにてSymbolInfoDouble関数の第2引数定数「SYMBOL_BID」を記述する事によって取得したBid値を戻り値として返して、Bid関数の処理は終了です。

今作ったAsk関数Bid関数をメインプログラムで呼び出して、これまでSymbolInfoDouble関数を使っていた記述から、Ask関数Bid関数を使っての記述に変更すると以下のようになります。

double ask=Ask();
double bid=Ask();

Ask値を取得したいなら、Ask関数を呼び出せばよいし、Bid値を取得したいなら、Bid関数を呼び出せばよいので、記述もシンプルになったのがお分かりいただけるのではないかと思います。

取得方法3:SymbolInfoTick関数とMqlTick構造体を使って取得する

現在値の取得方法としては、SymbolInfoTick関数MqlTick構造体を使うパターンもあります。

SymbolInfoTick関数が情報を取得して、MqlTick構造体がその情報を格納するような仕組みです。

SymbolInfoTick関数について

bool  SymbolInfoTick( 
   string    symbol,    // 銘柄名 
  MqlTick&  tick       // MqlTick構造体インスタンス
  );

SymbolInfoTick関数は、特定の銘柄の最新における価格情報を取得するのに使用されます。

価格情報というのは具体的には

価格が変動した直近の時間

Ask価格

Bid価格

直近取引の価格

直近取引価格における取引量

価格情報変更の詳細

などを指します。

SymbolInfoTick関数の戻り値について

SymbolInfoTick関数戻り値bool型です。

無事に価格情報を取得出来たらtrue、 取得に失敗したらfalseを返します。

SymbolInfoTick関数の仮引数について

第1引数には、取引銘柄が記述される想定です。

第2引数には、SymbolInfoTick関数が取得した情報を格納する、MqlTick構造体インスタンスが記述される想定です。MqlTick構造体については次のセクションで説明します。

インスタンスについては、↓の記事をご覧ください。

MQL5 EA講座 第54回「インスタンスについて」

MqlTick構造体について

MqlTick構造体SymbolInfoTick関数が取得した価格情報を格納する為に用いられます。

MqlTick構造体メンバ構成は以下のようになっています。

struct MqlTick 
  { 
   datetime    time;         // 最新の価格更新の時間 
  double       bid;           // 現在のBid価格 
  double       ask;           // 現在のAsk価格 
  double       last;         // 直近取引の価格 
   ulong       volume;       // 直近取引における取引数量 
  long         time_msc;     // ミリ秒単位の最新価格更新時間 
  uint        flags;         // ティックフラグ 
  double       volume_real;   // 直近取引における正確な取引数量 
 };
メンバ「time」は 最新の価格更新の時間を格納する

メンバ「time」は 最新の価格更新の時間を格納する為に用います。時間情報を格納するので、データ型datetime型になります。

datetime型については↓の記事をご覧ください。

MQL5 EA講座 第16回「データ型その6 datetime型」

メンバ「bid」は 現在のBid価格を格納する

メンバ「bid」は 現在のBid価格を格納する為に用います。価格情報になるので、データ型double型になります。

メンバ「ask」は 現在のBid価格を格納する

メンバ「ask」は 現在のAsk価格を格納する為に用います。AskもBidと同様に価格情報になるので、データ型double型になります。

メンバ「last」は 直近取引の価格を格納する

メンバ「last」は 直近取引が行われた際の価格を格納する為に用います。価格情報につき、データ型double型になります。

メンバ「volume」は 直近取引価格の取引数量を格納する

メンバ「volume」は 直近取引が行われた際の取引数量を格納する為に用います。

データ型ulongで、「え?double型じゃないの?」と思ってしまうのですが、リファレンスでは一応そうなっています。(この後出てくるメンバ「volume_real」がdouble型となっており、より正確な取引数量を反映させているから、ということかもしれません)

メンバ「time_msc」はミリ秒単位の最新価格更新時間を格納する

メンバ「time_msc」はミリ秒単位の最新価格更新時間を格納する為に用います。

ミリ秒というのは1/1000秒のことです。

より厳密な最新価格更新時間の取得を目的としたものと思われます。データ型long型となっています。

メンバ「flag」はティックフラッグを格納する

メンバ「flag」はティックフラッグを格納する為に用います。

ティックフラッグとは何か?という事なのですが、

ティックとは価格情報の変更を時系列に集積・配置したものですから、新しいティックがどのような変化によってもたらされたものかを定数化したものと言っていいでしょう。

ティックフラグには以下の定数が定められています。

TICK_FLAG_BID –  //Bid価格の変更
TICK_FLAG_ASK  – //Ask価格の変更
TICK_FLAG_LAST – //直近取引価格の変更
TICK_FLAG_VOLUME – //取引数量の変更
TICK_FLAG_BUY – //買い取引結果の変更
TICK_FLAG_SELL – //売り取引結果の変更
メンバ「volume_real」は直近取引のより正確な取引数量を格納する

メンバ「volume_real」は直近取引のより正確な取引数量を格納する為に用います。データ型double型です。

メンバ「volume」との違いは、どのような場合に生じるのか、現状精査しきれていないのですが、

相場の流動性が極端に低下していて、トレーダーの希望取引量での取引が成立しないような局面(=フィルポリシーの違いで取引及び取引数量が変わるような局面)で生じるのではないかな?といういうのが自分の理解です・・・が、ひょっとしたら間違っているかもしれません💦(鋭意確認中です<m(__)m>)

フィルポリシーの詳細については↓の記事をご参照ください。

MQL5 EA講座 第59回「フィルポリシーについて」

SymbolInfoTick関数とMqlTick構造体を使って、Ask値とBid値を取得する具体的な方法

SymbolInfoTick関数MqlTick構造体、それぞれの概要について解説が終わったところで、具体的なAsk値とBid値を取得する記述方法についてみていきましょう。

MqlTick tick; 
    SymbolInfoTick(_Symbol,tick);
    double ask=tick.ask;
    double bid=tick.bid;

↑のような記述になります。

SymbolInfoTick関数を使って取得した価格帯情報が、第2引数で記述されてるMqlTick構造体インスタンス「tick」に格納されているので、インスタンス「tick」のメンバである「ask」「 bid」を呼び出してローカル変数「ask」「bid」にそれぞれ代入する、といった手順です。

構造体の使い方をちょっと忘れてしまった、という人は↓

第22回「構造体」

第60回「OrderSend関数とMqlTradeRequest構造体」

第61回「MqlTradeResult構造体について」

などの記事群をご参照頂ければと思います。

まとめ

今回は、主に現在値情報へのアクセス方法についての解説を行いました。今回の記事で解説した方法は以下の通りです。

取得方法1:SymbolInfoDouble関数を使う

取得方法2:オリジナル関数を作って取得する

取得方法3:SymbolInfoTick関数とMqlTick構造体を使って取得する

MQL4のようにAskやBidといった定義済み変数のないMQL5においては、現在値へのアクセス方法に関する基本を押さえておくことがEA(自動売買プログラム)開発において重要です。

次回は、バー情報の取得方法に関する記述について解説予定です。

今回は以上とさせていただきます。

最後までお読みいただきありがとうございました<m(__)m>

MQL5 EA講座 第102回「資金管理用のインクルードファイルを作る」

MQL5 EA講座 第104回「価格とバーに関するデータへのアクセス:その2バー情報」

コメント

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