基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2011年01月24日(月)

[MQL5]変数の型の変換 [MQL5]



しつこいようですが、もう一回、数値変数の型についてお話しします。

前回の記事で、ある変数に別の変数や関数の戻り値を代入する際、コンパイルで

possible loss of data due to type conversion

という警告が出る条件について見てみました。

警告が出れば、結果がおかしくなった場合でも、その行をチェックすることで対応できるのですが、困ったことに、何も警告が出ないのに結果がおかしくなる場合があります。

これは以前の記事でも紹介しましたが、割り算が入った計算式の結果を代入する場合などです。

例えば、
int a = 10, b = 4;
double c = a/b;

という場合です。c はちゃんとdoubleで宣言しているので、10/4=2.5が代入されると考える人は多いでしょう。

しかし実際には、aとbがintだと、a/b の結果はintとして表現されるので、小数点は切り捨てられて2になります。そして、それがcに代入されるため、c=2となるわけです。

このケースは、int から double への代入なので、代入時にデータが失われる可能性はありません。ですから、コンパイルで警告は出ません。しかし、a/bの割り算のところでデータが失われているのです。

この問題を避けるためには、MQL4の場合、a、bのどちらか、あるいは両方をdouble として宣言するしか方法はありませんでした。

MQL5では、型はそのままで解決できる方法があります。C言語をご存知の方にはなじみがあると思いますが、「キャスト」と呼ばれる型変換の方法です。

型を変換したい変数の前に(int)とか(double)のように、変換したい型の名前を()で囲ったものを付けるだけです。

例えば、a を double 型に変換したい場合、(double)a のように書きます。すると、変数a 自身はintのままですが、(double)a はdouble 型に変換されているので、
c = (double)a/b;

と書くと、ちゃんと c = 2.5 という数値が代入されるのです。念には念をということであれば、
c = (double)a/(double)b;

と書いて、a、bの両方をdoubleに変換しておいてもいいでしょう。

また、このキャストは代入時に出るコンパイルの警告を消すために利用することもできます。

例えば、
int x = AccountInfoInteger(ACCOUNT_LOGIN);

のように戻り値がlongの関数をint型の変数に代入すると、警告が出ます。ここで、関数の直前に(int)とつけて、
int x = (int)AccountInfoInteger(ACCOUNT_LOGIN);

のように書くと、戻り値の型をint に変換することができます。すると、intの値をintの変数に代入することになるので、警告は出なくなるのです。

このようにキャストを使って明示的に型変換をすれば、いちいち別の変数を宣言する必要がなくなります。覚えておくと便利でしょう。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 15時27分


ページのトップへ ページのトップへ

Sponsor AD

2011/1

            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

ランダムウォークとランダムトレード(6)

ランダムウォークとランダムトレード(6)

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.