【超入門】MQL5 EA講座 第22.5回「構造体について補足」

MQL5でEA作ろう講座

-<PR>-

※【おススメのMT5MQL5対応のFX業者】

MQL5にて開発した、MT5EAを実運用するにあたり、

当サイトでは以下のFX業者をおススメいたします。

外為ファイネスト

EAの利用制限なし。スキャルピングもOK

外為ファイネストに関する記事はコチラ

アヴァトレードジャパン

自動売買界最狭スプレッド水準

アヴァトレードジャパンに関する記事はコチラ

—————————————————————

MQL5 EA講座 第22回にて 「構造体」 について取り上げました。↓

この記事を読んでもらえば、ひとまず構造体に関する知識は十分なのですが、

今回は、もう一歩先に進んだ人向けの、構造体に関する補足事項について書いてみたいと思います。

今回の記事の内容を、頻繁に使うかどうかは微妙ですが、より複雑なプログラムを組みたいという時には役立つかもしれませんし、MQL5リファレンスの中にある膨大なソースコード群の恩恵を受けるためには、いずれは理解したほうが良い部分かと思います。

プログラミング初心者の方は、今回の記事は飛ばして、第23回に進んでもらって一向にかまいません。

折に触れて、思い出して立ち寄ってくれる機会があることを祈ります♪

スポンサーリンク
スポンサーリンク

構造体補足その1 -構造体のデータ型定義と構造体変数(インスタンス)の同時宣言-

構造体データ型定義と構造体変数(インスタンス)の宣言は、同時に行えます。

構造体の実体化したものをオブジェクトと言ったり、インスタンスと言ったりします。

//「tradeSetting」という名前の構造体を作る。
struct tradeSetting
{
   int slippage;
   double price;
   double stopLoss;
   double takeProfit;
   string comment;
 };

//構造体「tradeSetting」をもとにした、インスタンス「setting」を作る
      tradeSetting setting;

MQL4やMQL5において「オブジェクト」というと、チャートの描画物の事を想起しがちなので、このサイトで、構造体変数のことを意味する際は、なるべくインスタンスという言葉を使いたいと思います。インスタンスについては講座記事第54回で、1つのトピックとして解説しております↓)

方法としては、

構造体メンバ定義が終わった後の
};

の後ろにインスタンス名を記述します。
インスタンスが複数ある場合はカンマで区切って記述します。

//構造体の宣言
struct structExample
{
  int ex1;
  double ex2;
  string ex3;
 
// ↓example1,example2というインスタンスを同時に宣言した
}example1,example2;

オーソドックスなやり方は↓

//構造体の宣言
struct structExample
{
  int ex1;
  double ex2;
  string ex3;
};

/*↓「structExample」というカスタムデータ型を記述の上
example1,example2というインスタンスを同時に宣言した*/
structExample example1,example2;

という形で、いったん構造体の宣言をしてから、グローバル領域(関数の外の領域)や、関数内に、

カスタムデータ型(=自作した構造体名) →  インスタンス名;

という記述手順を踏みます。

あらかじめ使うべきインスタンスの数が明確に決まっている場合などは、同時に作ることもできる、という訳です。

↓の動画は、グローバル領域にインスタンスを生成するオーソドックスな記述をコメントアウトして、構造体宣言とインスタンス生成を同時に行うやり方にしたものです。

特に問題なく、OnStart関数内でメンバを呼び出せていますね。

この後、追加したいインスタンス名、(例えばexample3が必要だった!)という場合は、

カスタムデータ型(=自作した構造体名) →  インスタンス名;

という、通常の記述方法で追加することは可能です。

構造体補足その2 -初期値をまとめて代入する-

構造体の各メンバを呼び出して、値を代入する方法は構造体の講座記事で取り上げました。↓

 //インスタンスである「setting」内にある、変数値「slippage」に「20」を代入
      setting.slippage=20;
 //インスタンスである「setting」内にある、変数値「stopLoss」に「500」を代入
      setting.stopLoss=500;
//インスタンスである「setting」内にある、変数値「takeProfit」に「500」を代入
      setting.takeProfit=500;

上記のサンプルコードのように、インスタンスの後ろにドット(.)をつけて、その後に呼び出したい個別変数(メンバ)の名前を記述することで達成できました。

でも、それではせっかく構造体を作って変数をまとめたのに、個別に変数を作っているのと変わりがない、とも言えますよね。

構造体には、初期値をまとめて代入する仕組みが存在します。

//構造体の宣言
struct strucExample
{
  int ex1;
  double ex2;
  string ex3;
  
};

//インスタンスの生成
 strucExample example={1,0.5,"初期値"};


void OnStart()
{
//ログ出力
printf("ex1=%d ex2=%f ex3=%s",example.ex1,example.ex2,example.ex3);

//ex1には、「1」が、ex1には、「0.5」が、ex1には、「初期値"」がそれぞれ代入されログ出力される。

}

初期値は、

{}

の中にカンマで、区切って記述していきます。

配列のやり方と同じですね。

※ちなみに↓

//インスタンスの生成
 strucExample example={};

のように代入する{}内になにも値が入っていない場合は、メンバ初期値は全てゼロでリセットされます。また、ZeroMemory関数引数インスタンスを記述しても同様に初期値は全てゼロでリセットされます。

{}内に書かれた値の順番と、構造体宣言で記述されている各メンバの順番は対応しています。

{}の中に、最初に書かれている値「1」は、int型の変数「 ex1」に代入され、

次に書かれている値「0.5」は、double型の変数「 ex2」に代入され、

最後に書かれている「初期値」は、string型の変数「ex3」に代入される

そんな関係になっています。

↓の動画は、実際にプログラムを挿入した時のログ出力の様子です。

構造体補足その3 -構造体 の 配列化-

構造体の記事の中で、

構造体は 「変数をまとめて扱う事ができるカスタムデータ型」であることを書きました。

変数配列化できる様に構造体配列化できます。

これは異なるデータ型

多次元配列のようにテーブル化して扱える事を意味しています。

//構造体の宣言
struct structExample
{
  int ex1;
  double ex2;
  string ex3;
  
};

//インスタンスの生成
 structExample example1[3];

void OnStart()
{

      example1[0].ex1=1;
      example1[0].ex2=0.8;
      example1[0].ex3="ex3の1番目";
}

上のコードにて、

ex1、ex2、ex3 

というそれぞれのインスタンスの1番目に初期値代入されました。

構造体補足その4 -配列化した構造体への初期値代入-

配列宣言したインスタンスにおいて、

それぞれの配列要素メンバにまとめて初期値代入したい時は

{}の中に{}を入れ子状(ネスト)に記述して実現します。

{}の中に{}が入っていたり、()の中に()が入っているような入れ子構造の記述をネスト(nest)と言います。ネスト(nest)とは、「巣」という意味を持つ英単語です。

[0]には1番上の{}、[1]にはその次の{}…といった様に対応しています。

//構造体の宣言
struct strucExample
{
  int ex1;
  double ex2;
  string ex3;
  
};

//インスタンスの生成
 strucExample example[3]=
 {
   {1,0.1,"例1"},//配列[0]に代入される値
   {2,0.2,"例2"},//配列[1]に代入される値
   {3,0.3,"例3"} //配列[2]に代入される値
 
 };

void OnStart()
{
   //配列の1番目から3番目までをチェック
  for(int i=0; i<3 ;i++)
  {
      //ログ出力
      printf("ex1=%d ex2=%f ex3=%s",example[i].ex1,example[i].ex2,example[i].ex3);

  }

}

順にみていきましょう。

構造体strucExampleには

int型の変数 ex1
double型の変数 ex2
string型の変数 ex3

という3つのメンバが用意されています。

strucExample example[3]

という記述は、

構造体strucExample の「example」という名前のインスタンスを用意し、そこには3つ分の配列を用意しました。”

という意味になります。

ここから、代入する値を書き込んでいきます。

まず全体をくくる{}を記述し、

その後、各配列(1番目から3番目)に代入する値をこれまた{}で括って記述していきます。

配列[0]に代入される値→ex1には1、ex2には0.1、ex3には”例1″が代入

配列[1]に代入される値→ex1には2、ex2には0.2、ex3には”例2″が代入

配列[2]に代入される値→ex1には3、ex2には0.3、ex3には”例3″が代入
こんな感じですね。

配列[0]配列[1]配列[2]
ex1123
ex20.10.20.3
ex3“例1”“例2”“例3”

値が、ちゃんと格納されているかどうか

for文を使って、printf関数でログ出力してみます。

for文については、講座記事第40回で解説予定ですが、プログラムに「繰り返し処理」を命令するための記述です。現段階では、用意している3つの配列全てに対して処理を行うのに必要な記述と考えておいてください。

ちゃんと格納されているようですね。

まとめ

今回は構造体に関するいくつかの補足事項 について解説しました。

今回の記事では以下のことを学びました

  • {}のなかに、入れ子状に{}を作り、そこに代入したい値を記述することによって、配列化した構造体へまとめて初期値代入することも可能。

今回は以上になります。

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

MQL5 EA講座 第22回「構造体」

                  →MQL5 EA講座 第23回「タイプキャスト」

—————————————————————

-<PR>-

※【おススメのMT5MQL5対応のFX業者】

MQL5を使って自作したEAシステムトレードに利用するには、取引プラットフォームとしてMT5を提供しているFX会社に口座を開設しなくてはいけません。

当サイトでは以下のFX会社での口座開設・EA運用をおススメしています。

おススメする理由の詳細につきましては、各FX会社について解説する記事を書いておりますので、下記のリンク記事を参考にしていただければと思います。


外為ファイネスト

EAの利用制限なし。スキャルピングもOK

外為ファイネストに関する記事は↓をご覧ください。

アヴァトレードジャパン

自動売買界最狭スプレッド水準

アヴァトレードジャパンに関する記事は↓をご覧ください。

コメント

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