MQL5

【MQL5】 わかりにくい “構造体” の使い方を一気に解説!

MQL5 では MQL4 と異なり、多くの情報が構造体によってやり取りされます。これは MT4 との大きな違いです。
レートの取得、時間に関する情報(年・分・秒など)の取得、トレードの送信、トレード結果の受信など多岐に渡ります。

これら構造体の使い方に戸惑っている方も多いのではないでしょうか?

ここでは MQL5にて予め定義されている12個の構造体を解説し、その使い方をわかりやすく説明します。

構造体とは?

ある対象(例えば、レート情報など)に関連した、項目(レート情報なら ask や bid など)をまとめて格納するオブジェクトです。それぞれの項目は構造体の「メンバー」と呼ばれます。

以下にて解説している定義済みのデータ構造体だけでなく、自分で構造体を定義して使うこともできます。

MqlTick 構造体

最も直近のティックに関する情報を取得するための構造体です。ティック到達時間, ask, bidのほかに様々な情報が取得可能です。

struct MqlTick
  {
   datetime     time;   
   double       bid;
   double       ask;
   double       last;
   ulong        volume;
   long         time_msc;
   uint         flags;
   double       volume_real;
  };

volume はティックボリューム、volume_real は実際の取引量を指します。time_msc ではミリ秒単位のティック到達時間を取得可能、また flags では「1つ前のティックから比べてどのように変化したのか」を知ることができ、高頻度のトレードモデル作成において有益です。

この構造体に情報を格納するために以下の SymbolInfoTick()関数を呼び出す必要があります。

bool SymbolInfoTick(
 string symbol, // 銘柄名
 MqlTick& tick // 構造体への参照
);

格納した値の取り出し方としては、

「MqlTick 型」として変数として宣言する → 必要な情報をドット演算子(.)を使って呼び出す

という流れになります。例えば USDJPYの現在ティックの ask を出力したいなら

MqlTick mytick;                    // MqlTick型の変数を宣言
SymbolInfoTick("USDJPY",mytick);   // ティック情報を格納
Print(mytick.ask);                 // 呼び出し

となります。

なお、これ以外の銘柄に関する情報はすべて SymbolInfo系関数(SymbolInfoInteger(), SymbolInfoDouble(), SymbolInfoString())から取得可能です。

MqlRates 構造体

MqlTick が最新のティック情報を呼び出すための構造体であるのに対してこちらはローソク足に関する情報を呼び出すために使われます。

struct MqlRates
 {
  datetime time;         // 期間開始時間
  double   open;         // 始値
  double   high;         // 期間中の最高値
  double   low;         // 期間中の最安値
  double   close;       // 終値
  long     tick_volume; // ティックボリューム
  int     spread;       // スプレッド
  long     real_volume; // 取引高
 };

ローソク足に関する情報を格納するので、構造体の配列として宣言しておく必要がある点に注意しましょう。なお、この配列は動的配列であることが推奨されています。

CopyRates の使い方

この構造体へのデータの格納は、CopyRates() により行います。CopyRates() の使い方には以下の3つがあります。
公式サイトの日本語解説は非常にわかりにくいので、わかりやすく書き換えています。

1. datetime 形式で、 開始日時終了日時を指定する方法

int  CopyRates(
   string           symbol_name,       // 銘柄の名前
   ENUM_TIMEFRAMES  timeframe,         // ローソク足の時間枠
   datetime         start_time,        // 開始日時
   datetime         stop_time,         // 終了日時
   MqlRates         rates_array[]      // 格納する構造体
   );

2. datetime 形式で、開始日時 を指定 + そこからのローソク足の本数(=count)を指定する方法

int  CopyRates(
   string           symbol_name,       // 銘柄の名前
   ENUM_TIMEFRAMES  timeframe,         // ローソク足の時間枠
   datetime         start_time,        // 開始日時
   int              count,             // ローソク足の本数
   MqlRates         rates_array[]      // 格納する構造体
   );

3. 開始位置を現在から何本前なのか(= Shift)指定 + そこから数えるローソク足の本数(=count)を指定する方法

int  CopyRates(
  string           symbol_name,        // 銘柄の名前
  ENUM_TIMEFRAMES  timeframe,          // ローソク足の時間枠
  int              start_pos,          // 開始位置のShift数
  int              count,              // ローソク足の本数
  MqlRates         rates_array[]       // 格納する構造体
  );

注意すべきなのは、受け取り側の配列を「時系列配列」にしているかに関係なく、インデックス値が0の要素に、一番古いデータが来るように配置されることです。
つまりもし配列 MyRates[] の要素数が101個なら、一番新しいデータは MyRates[100] に格納されることになります。

MqlDateTime 構造体

MqlDateTime 型では年、月、日、時、分、秒、曜日、1年の中で何日目か、を取り出すことができます。

TimeCurrent() や TimeLocal() などの関数では引数なしの場合には mql4 と同様に datetime 形式が返ってきますが、MqlDateTime 型の変数を引数として呼び出すと、MqlDateTime 型の変数に情報が格納されます。

struct MqlDateTime
  {
   int year;           // Year
   int mon;            // Month
   int day;            // Day
   int hour;           // Hour
   int min;            // Minutes
   int sec;            // Seconds
   int day_of_week;    // Day of week (0-Sunday, 1-Monday, ... ,6-Saturday)
   int day_of_year;    // Day number of the year (January 1st is assigned the number value of zero)
  };

従来の datetime 形式と MqlDateTime構造体の変換は TimeToStruct() , StructToTime() の関数によって可能です。

MqlTradeCheckResult 構造体, MqlTradeRequest 構造体, MqlTradeResult 構造体

これらはすべてトレード注文を送信に関する構造体です。

以下の流れで使われます。

① 「MqlTradeCheckResult 構造体」で注文を出す前に取引が可能かどうかを確認をする(あくまで推奨であり必須ではない)

② 「MqlTradeRequest 構造体」にて注文を出す

③ 「MqlTradeResult 構造体」として注文の結果が返ってくるので、場合に応じてそれを確認する

※ 使い方が非常に複雑なので、「トレードの送信方法」の記事 にて個別に解説しています。

MqlBookInfo 構造体

板情報を取得するための構造体です。Mql5 では Depth of Market (DOM) と呼ばれます。

struct MqlBookInfo
  {
   ENUM_BOOK_TYPE   type;            // Order type from ENUM_BOOK_TYPE enumeration
   double           price;           // Price
   long             volume;          // Volume
   double           volume_real;     // Volume with greater accuracy
  };

板情報の取得は以下の流れで行います。

①  OnInit () 内でMarketBookAdd() を呼び出し、板情報を取得できる状態にする

MarketBookGet() により最新の板情報を取得する

OnDeInit() 内 にて MarketBookRelease() を呼び出し、 板情報へのアクセスを中止する

 

なお、OnBookEvent() 関数を使うことで、板情報が更新されるたびに特定の処理を実行することも可能です。

MqlParam 構造体

MQL5 ではインジケーターの値を取得するには handle 値をやり取りする必要があります。

handle 値の取得方法は、基本的には予め定義されているインジケーターの名前の関数(iMA() など)から取得できますが、これ以外にもう1つ方法があります。

IndicatorCreate() 使う方法です。
IndicatorCreate() から handle値を取得する際には、 input 変数(入力変数)を構造体として設定する必要があり、その際に使われるのが MqlParam 構造体です。

これら2つの方法の違いは、後者ではインジケータとその外部変数を1つの構造体としてまとめてオブジェクトに格納することにより、コンパイル時ではなく、実行時に変数の型と値を自由に変更できる点です。(前者の方法で変数の値はしか実行時に変更できない)

MqlTradeTransaction 構造体

ターミナルにてトレードの送信したり、予約注文が約定されたりすることで、取引口座の状態が変化します。
次に、その「状態の変化」の結果としてトレードリクエストの処理、トレード履歴の変化、ポジションの変更などが起きます。

この結果が変わった際には  OnTradeTransaction()  が呼び出されますが、その際の変化は MqlTradeTransaction 構造体にて確認します。
基本的には OnTradeTransaction() と合わせて使う構造体であると考えて差し支えありません。

MqlCalendarCountry 構造体, MqlCalendarEvent 構造体, MqlCalendarValue 構造体

MQL5 では経済指標カレンダーが用意されているので、経済指標の発表などを参照することが可能です。
あらかじめ予定されている経済指標の発表に関して、その時刻重要度セクター情報などを確認できます。これらは MqlCalendarValue, MqlCalendarEvent, MqlCalendarCountry 構造体によって行います。

まとめ

今回は、MQL5 にて予め定義済みの構造体を1つずつ解説し、その使い方を説明しました。

なお下記の記事ではMQL4 から MQL5 に移行する際の全体像」を網羅的に解説しています。
具体的にどういった内容をどういった順番で学習していけばよいか知りたい方はご覧ください。

⇒ MQL4(MT4) → MQL5(MT5) に移行する際に勉強すべき内容まとめ!

   

コメントを残す

*

CAPTCHA