MQL5超入門(3)/データ型/構造体(struct)

私以外にもロシア語のヘルプと格闘している人がこちらに居ました。やはり、プログラマの習性というか、こういう人にどうしても親近感を覚えます。(苦笑)
EAラボラトリーさんは、開発中の優秀なEAを無料で配布するなどアクティブに活動していらっしゃるので、興味のある人は研究員になってみるとよいでしょう。



さて、本題に戻って、MQL5超入門の続きです。
これから説明する構造体とは、いくつかの関連の深いデータを1つにまとめたカタチで扱いたい時に役立つモノです。


データをまとめるという概念が無い架空の世界では、例えば、データセンターに昨日の四本値を聞こうと思ったら、

「昨日の始値を教えてください」
「昨日の高値を教えてください」
「昨日の安値を教えてください」
「昨日の終値を教えてください」

と4 回聞かないと欲しいデータが得られませんが、
始値終値を1つにまとめた"四本値" という概念のある現実の世界では、

「昨日の四本値を教えてください」

の1回の問い合わせで済みます。
この四本値という表現こそが構造体です。実は、身の回りには構造体の概念はありふれた存在で、例えば「日付」は、何月と何日という2つのデータで構成された構造体ですし、「時刻」は、何時、何分というデータの構造体です。「名刺」は、名前と連絡先から出来ています。
構造体は、まとめて扱ったほうが都合の良いデータをまとめて扱うだけの話なので、難しくありません。



さて、四本値という構造体を使いたい場合は、

struct BarPrices4    // 先頭に struct と書き、続いて適当な名前を付ける
  {
   double open;//始値 // 構造体に含めたいデータの変数名を並べる。
   double high;//高値
   double low; //安値
   double close;//終値
  };

のように定義して、

BarPrices4 a,b; // BarPrices4 構造体型の変数a,b を定義

a.open = 100; // a の構造体を構成する4 個の変数に値を代入する時は
a.high = 101; // a(ピリオド)(変数名) = 値; という書く。
a.low  =  99;
a.close=  99;

b = a; // a の四本値をb にコピーするのは1行で済む !!!

Print("b.open=",b.open); // 値を取り出す時も b(ピリオド)(変数名) と書く。
MyFunction(b); //自作の関数にデータを渡す時も構造体型変数1個渡すだけ!!!

のように使います。


実は、四本値を扱う為のレート情報構造体は、既にMQL5に用意されていて、

 struct MqlRates 
{
    datetime   time ; //オープン時刻 
    double     open ; //始値
    double     high ; //高値
    double     low  ; //安値
    double     close ; //終値
    long       tick_volume ; //Tick更新回数
    int        spread ; //スプレッド
    long       volume ; //出来高
};

と定義されています。
使い方は、

// MqlRates構造体型の配列として rates を定義
MqlRates rates[];

// 配列順序に関するひみつのおまじない..
ArraySetAsSeries(rates,true);

// サーバから取得したレート情報の0番目から100個分を配列rates にコピー
int copied=CopyRates(NULL,PERIOD_CURRENT,0,100,rates);

// 返り値の copied には実際にコピーできたデータの個数が入るので、コピーできていたらPrint
if(copied > 0) Print( rates[0].time );

といった感じです。
配列 rates[] にコピーできれば、 rates[0].time, rates[0].open, ...でMQL4 時代の Time[0], Open[0] の代わりになると妄想しています。*1



MQL5 では、レート情報をまとめたMqlRates 型、時間情報をまとめたMqlDateTime 型、板情報をまとめたMqlBookInfo 型が用意されています。
移植を前提としている人は、自分でstruct を使って構造体を定義する必要はなく、MqlRates 型だけ使いこなせればOK だと思います。

*1:注, indicator だけは、コピーしなくても Time[0], Open[0] が最初から使えそうです..