【超入門】MQL5 EA講座 第23回「タイプキャスト(型変換)」【EAの作り方】

MQL5でEA作ろう講座

前回 は 構造体 について解説しました。

改めて前回の内容をおさらいをしておくと、

ということをお伝えしました。

今回は タイプキャスト型変換 について解説していきたいと思います。

MQL5で自動売買プログラム作るにあたっては、MT5メタエディター5がお使いのパソコンにインストールされている必要があります。

もし、まだメタトレーダー5のダウンロードが完了していない方は、

こちらからデモ口座の開設とMT5のダウンロード・インストールを完了して頂ければと思います。

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

タイプキャスト(型変換) とは?

タイプキャスト型変換とは、

あるデータ型の値を、異なるデータ型に変換するプロセスのことです。

もっと具体的に言えば、例えば最初は整数型(int型)だった値を実数型(double型)にしたり、逆に実数型(double型)を 整数型(int型)にしたり・・・

といった処理のことを指します。

・・・例によって「何を言っているんだコイツは( 一一)」

と思われる方もいるかもしれません。

順を追って説明していきます。

データ型って何だっけ?という方はコチラ

タイプキャスト(型変換)を行う意味

そもそも

最初は整数型(int型)だった値を実数型(double型)にしたり、逆に実数型(double型)を 整数型(int型)にしたりする処理

をなぜしなければいけないのでしょうか?

現実の世界でも、モノを動かすときに気を付けないと破損したり、紛失したりすることがありますよね?

それと同じで、MQL5においてもデータ型をコピーしたり、変数に格納したりするときに、データ型に気を配らないとデータ自体が一部ロストしてしまったり、コピーができなかったりする事が発生します。

タイプキャスト型変換はそういったことを防ぐために行われます。

例えば、↓の記事で過去に「int以外の整数型」について書きました。

この記事の中では、同じ整数型でも格納できる範囲によって、int以外に、char,short,long などの データ型が使われる、ということを解説しているのですが、

void OnStart()
  {
     
     //ucharをデータ型にした変数「charInteger」を宣言
      uchar charInteger;
      
      //変数「charInteger」に「300」を代入
      charInteger=300;
      
      //ログ出力
      Print(charInteger);
  }

ucharは整数型ではありますが、0 から 255 までの値しか格納できません。

このコードをコンパイルすると↓

「truncation of constant value」

という警告(warning)がでます。意味としては

定数値の切り詰めが発生しています」

ということです。有り体に言えば

「正しい数値じゃなくなっている可能性あるよー」と言っているんですね。

警告(warning)は、コンパイルエラーではないので、MQL5 Program Fileは生成されるものの、プログラムが意図した動作をしない可能性がある記述をしているときにメタエディター側で発するメッセージです。

このコードを実行してみると・・・

本来「300」という数値だったのに、ログ出力してみたら44になってしまいました。

これは格納レンジの小さいデータ型に、それを超える大きい整数値を代入しようとしたときの例です。他にも異なるデータ型変数に、値を代入しようとしても起こります。

void OnStart()
  {
     
     //intをデータ型にした変数「Integer」を宣言
      int Integer;
      
      //変数「Integer」に「145.6」を代入
      Integer=145.6;
      
      //ログ出力
      Print(Integer);
  }

変数「Integer」はint型ですが、代入しようとしている値「145.6」は小数点以下の値を持つ実数なので、本来はdouble型変数を用意しなければいけません。

このコードをコンパイルするとやはり、

「truncation of constant value」

という警告(warning)がでてしまいます。

プログラムを実行すると・・・

本来「145.6」だった数値が、少数点以下が切り捨てられて「145」という形で、ログ出力されました。

int型変数なので、小数点以下の値を保有することはできない、という訳です。

じゃあ、こんな場合はどうでしょう?

void OnStart()
  {
     //intをデータ型にした変数「intInteger」を宣言
     int intInteger;
     intInteger=100;
     
     //ucharをデータ型にした変数「ucharInteger」を宣言
      uchar ucharInteger;
      
      //変数「ucharInteger」に「intIntegerすなわち100」」を代入
      ucharInteger=intInteger;
      
      //ログ出力
      Print(charInteger);
  }

先述した通り、uchar整数型でかつ、0-255までの値を格納できるので、int型変数「intInteger」の持つ値「100」を代入しても、なにも問題ない様に思えます。

コンパイルしてみましょう。

コンパイルエラーは発生しませんでしたが、

「possible loss of data due to type conversion from’int’ to ‘uchar’」

という警告(warning)がでてきました。これは

int変数のデータをuchar変数に入れてしまっているから、データを失ってしまうかもしれません」

ということを言っています。

プログラムを実行すると・・・

特に問題なく、「100」がログ出力されていますね。

つまり

「pssible loss of data due to type conversion from’int’ to ‘uchar’」

の警告は、「必ず起こるわけではないけど、構造的に起こりうる問題点」

を指摘しているわけです。そしてその構造的に起こり得る問題点を解消する為にタイプキャスト型変換)という処理が存在します。

話が長くなりましたが、次はタイプキャスト型変換のやり方をみていきましょう。

タイプキャスト(型変換)のやり方

タイプキャスト型変換のやり方の基本は以下のようになります。


      
      //int型変数に入っていたデータをuchar型にキャストする
      ucharInteger=(uchar)intInteger;
     

手順を文章にすると、

データ変換したい変数や、値、数式の前に()で括った変換先のデータ型を記述する

ということになります。

このコードをコンパイルすると・・・

先ほど出ていた警告が消えました。

double型に格納されている値をint型代入する場合もみてみましょう↓

void OnStart()
  {
     //intをデータ型にした変数「intInteger」を宣言
     int intInteger;
     
     
     //realNumをデータ型にした変数「realNum」を宣言
      double realNum=100;
      
      //変数「realNum」に「intIntegerすなわち100」」を代入
      intInteger=realNum;
      
      //ログ出力
      Print(intInteger);
  }

異なるデータ型に値を代入しようとしているので、この場合もpssible loss of data~警告がでてしまいます。

タイプキャストして修正するには・・・

 //double型変数に入っていたデータをint型にキャストする
     intInteger=(int)realNum;

データ変換したい変数「realNum」の前に()で括った変換先のデータ型int)を記述しました。

これでコンパイルすると警告は消えます。

これがタイプキャスト型変換の基本なのですが、MQL5にはタイプキャスト型変換を行ってくれる関数もあらかじめ用意されいます。

第21回の「Enum列挙型」について解説した記事の中に、

EnumToString関数という関数が出てきました。この関数タイプキャスト型変換を行ってくれる関数の1つで、Enum列挙型から文字列型へのタイプキャスト型変換が行われていたのです。

まだ関数についての本格的な説明をしていないので、タイプキャスト型変換を行ってくれる関数についての詳細は折に触れてこの先紹介していきたいと思います。

関数とは・・・「より簡単、かつ効率的にプログラムを動かす記述」で掃除機や電気炊飯器のような家電みたいなもの、と今はお考え下さい。

関数についてより詳しく先に知りたい方は↓の記事をご覧ください。

EnumToString関数については↓の記事をご参照ください

まとめ

今回はタイプキャスト型変換 について解説しました。

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

データ型の種類ってどんなものがあったっけ?」という方は↓のリンクで確認・復習ができます。

整数型(int型)

整数型(int型以外)

文字列型

Bool型

Color型

DateTime型

Enum列挙型

構造体

※なおタイプキャストについてはこの先、以下の講座記事群でもサンプルコード内に登場するので、参考にして頂ければと思います。

第14.5回「Bool(ブール)型について補足」

第45回「関数のオーバーロード」

第64回「ポジションをクローズする」

第66回「待機注文の注文修正」

第77回「固定SLTPを計算する関数を実装する」

第96回「トレーリングストップクラスを作る1」

第100回「ブレイクイーブンストップ関数を作る」

第111回「カスタムインジケ-タについての基本を知る」

<その他参照>

EnumToString関数

DoubleToString関数

今回は以上になります。

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

【超入門】MQL5 EA講座 第22回「構造体」【EAの作り方】

         →【超入門】MQL5 EA講座 第24回「Input変数」【EAの作り方】

コメント

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