——–
前回は資金管理・ロット調整を容易に行うための関数を作り、その解説を行いました。
またそれらの関数を集約させるためのインクルードファイル、「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で用意されている定義済み変数については以下の記事をご参照ください。↓
※また、配列を用意して、価格情報やインジケータ情報を格納し、EA(自動売買プログラム)作成に生かす具体例については下記の記事群も参考になると思います。↓
・MQL5 EA講座 第68回「簡単な仕組みのMT5用EAを作るーその1ー」
現在値へのアクセス方法
それではまず、現在値情報へのアクセス方法から解説していきたいと思います。
先述した通り、MQL4ではあった定義済み変数「Ask」「Bid」が、MQL5ではありませんでした。
では、どうやってMQL5では現在値にアクセスするのでしょうか?
取得方法1:SymbolInfoDouble関数を使う
例えば、講座記事の
では、それまでの講座記事の内容を踏まえて、簡単な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関数の戻り値について
無事に価格情報を取得出来たらtrue、 取得に失敗したらfalseを返します。
SymbolInfoTick関数の仮引数について
第1仮引数には、取引銘柄が記述される想定です。
第2仮引数には、SymbolInfoTick関数が取得した情報を格納する、MqlTick構造体のインスタンスが記述される想定です。MqlTick構造体については次のセクションで説明します。
※インスタンスについては、↓の記事をご覧ください。
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>)
※フィルポリシーの詳細については↓の記事をご参照ください。
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」にそれぞれ代入する、といった手順です。
※構造体の使い方をちょっと忘れてしまった、という人は↓
第60回「OrderSend関数とMqlTradeRequest構造体」
などの記事群をご参照頂ければと思います。
まとめ
今回は、主に現在値情報へのアクセス方法についての解説を行いました。今回の記事で解説した方法は以下の通りです。
・取得方法3:SymbolInfoTick関数とMqlTick構造体を使って取得する
MQL4のようにAskやBidといった定義済み変数のないMQL5においては、現在値へのアクセス方法に関する基本を押さえておくことがEA(自動売買プログラム)開発において重要です。
次回は、バー情報の取得方法に関する記述について解説予定です。
今回は以上とさせていただきます。
最後までお読みいただきありがとうございました<m(__)m>
コメント