2007年12月12日

MQL4入門(2) - 文字列の連結

前回データ型の説明の中で string(文字列)型を説明しました。そこで、文字列の連結として、「+」でつなぐ方法と、StringConcatenate()関数を使う方法を紹介しました。

違いはStringConcatenate()の方が高速で省メモリだと説明しましたが、色々と試してみるとそれだけはありませんでした。

どちらの方法でも、文字列だけでなく、整数や実数の数値もそのまま書くだけで連結されるのですが、実数の場合、ちょっと結果が違うようです。

StringConcatenate()のように、複数のパラメータをいくつでもコンマ「,」で区切って指定する関数は、他にもAlert()、Comment()、Print()などがあります。

例えば「FXメタトレーダー入門」の190ページで紹介した Comment()関数を使って、

Comment("Bid=", Bid);

と書くと、チャートがEUR/USDの場合だと、

Bid=1.4717

と表示され、チャートがUSD/JPYの場合だと、

Bid=111.93

と表示されます。特にそのままで問題ないように見えます。
276ページで説明した Alert()も同様で、Ask をそのまま指定するだけで、買値がそのままの形式で表示されます。

しかし、

double x=0.123456789;
Comment("x=", x);

のように小数点以下9桁もある実数を同じように表示させると、

x=0.1235

と四捨五入されて小数点以下4桁までしか表示されません。

一方、281ページで説明した SendMail()では、文字列を予め「+」で連結したものをパラメータとして指定します。このような関数は他にも MessageBox()などがあります。

この場合、

SendMail("Subject","Ask="+Ask);

と書くと、メールの内容を表す部分が、

Ask=111.93000000

と小数点以下8桁までが0を含めて強制的に表示されます。

このように、同じ文字列の連結でも、実数に関しては、

・StringConcatenate()で連結する場合、小数点以下4桁まで0を切り捨てて変換
・「+」で連結する場合、小数点以下8桁まで0を含めて変換

という違いがあるのです。

FXレートのような数値データの場合、どちらかというとStringConcatenate()の方が扱いやすいので、

SendMail("Subject",StringConcatenate("Ask=",Ask));

と書くと、

Ask=111.93

のように変換され、小数点以下の0はカットされます。

あるいは、小数部の桁数を明確に指定したい場合は、278ページでの説明のように小数部の桁数を指定して文字列に変換するDoubleToStr()という関数を使って

SendMail("Subject","Ask="+DoubleToStr(Ask, Digit));

と書くこともできます。

文字列の連結に関してはいくつかの方法があるので、色々と試してみて自分の好みの方法を見つけてください。

最後に文字列に関連するMQL4の関数を挙げておきます。これらの関数を駆使すれば、さらに複雑な文字列の操作を行うことができます。(今回は詳細は省略します)

文字列関数
string StringConcatenate( ...) 文字列の結合
int StringFind(text, matched_text, start) 文字列の検索
int StringGetChar(text, pos) 文字列中の文字コード
int StringLen(text) 文字列長
string StringSetChar(text, pos, value) 文字列の変更
string StringSubstr(text, start, length) 部分文字列の抽出
string StringTrimLeft(text) 文字列の左詰め
string StringTrimRight(text) 文字列の右詰め

変換関数
string CharToStr(char_code) 文字から文字列へ変換
string DoubleToStr(value, digits) 実数から文字列へ変換
double NormalizeDouble(value, digits) 実数の正規化
double StrToDouble(value) 文字列から実数へ変換
int StrToInteger(value) 文字列から整数へ変換
datetime StrToTime(value) 文字列から時間へ変換
string TimeToStr(value, mode) 時間から文字列へ変換

にほんブログ村 為替ブログへ上位ランキングのブログ記事はこちら
マネポケ金融投資ブログランキングここにも為替ブログ記事が満載!