【MQL4】文字列関数を完全マスター!StringFormat・DoubleToString・IntegerToString・StringLen・StringSubstrの使い方

【中級編】MQLプログラムの読み方・書き方

EA開発をしていると、「ログに価格やチケット番号を表示したい」「コメント欄にきれいな書式で情報を出力したい」という場面が頻繁にあります。そんなとき活躍するのが文字列関数です。

MQL4には多くの文字列関数が用意されていますが、この記事では特に使用頻度の高い5つの関数に絞って解説します。

  • DoubleToString — 実数を文字列に変換
  • IntegerToString — 整数を文字列に変換
  • StringFormat — 書式を指定して文字列を生成
  • StringLen — 文字列の長さを取得
  • StringSubstr — 文字列の一部を切り出す

すべてサンプルコード付きで、最後には5関数を組み合わせた実践例も紹介します。それでは順番に見ていきましょう!

DoubleToString — 実数を文字列に変換する

DoubleToStringは、double型の数値を指定した小数桁数の文字列に変換する関数です。価格やロット数の表示に欠かせません。

基本的な使い方

void OnStart()
{
    double price = 145.123456;

    // 小数点以下3桁で表示
    string s1 = DoubleToString(price, 3);
    Print("3桁: ", s1);  // 出力: 145.123

    // 小数点以下5桁で表示
    string s2 = DoubleToString(price, 5);
    Print("5桁: ", s2);  // 出力: 145.12346(四捨五入される)
}

実践テクニック:_Digits との組み合わせ

通貨ペアによって小数桁数は異なります(USDJPYは3桁、EURUSDは5桁など)。_Digitsを使えば、通貨ペアに応じた桁数で自動的に変換できます。

void OnTick()
{
    double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

    // 通貨ペアに合った桁数で文字列化
    string priceStr = DoubleToString(bid, _Digits);
    Print(_Symbol, " の現在価格: ", priceStr);
}

この書き方なら、どの通貨ペアのチャートにEAを適用しても正しい桁数で価格が表示されます。

IntegerToString — 整数を文字列に変換する

IntegerToStringは、整数を文字列に変換する関数です。単純な変換だけでなく、ゼロ埋め(パディング)もできるのが特徴です。

基本的な使い方

void OnStart()
{
    int ticket = 12345;

    // 単純な変換
    string s1 = IntegerToString(ticket);
    Print("チケット: ", s1);  // 出力: 12345
}

ゼロ埋め(パディング)の使い方

IntegerToStringの第2引数で桁数、第3引数で埋める文字を指定できます。ログの整形やファイル名の連番に便利です。

void OnStart()
{
    int num = 42;

    // 6桁にゼロ埋め
    string s1 = IntegerToString(num, 6, '0');
    Print("ゼロ埋め: ", s1);  // 出力: 000042

    // 8桁にスペース埋め(デフォルト)
    string s2 = IntegerToString(num, 8);
    Print("スペース埋め: [", s2, "]");  // 出力: [      42]
}

StringFormat — 書式指定で文字列を組み立てる

StringFormatはC言語のsprintfに相当する関数で、最も万能な文字列生成関数です。複数の値をひとつの文字列にまとめたいときに大活躍します。

主な書式指定子

指定子 意味
%s 文字列 “USDJPY”
%d 整数 12345
%f 実数(デフォルト6桁) 145.123000
%.Nf 実数(小数N桁) 145.12(N=2の場合)
%% %そのもの %

サンプルコード

void OnStart()
{
    string symbol = "USDJPY";
    double price  = 145.678;
    int    ticket  = 99001;
    double lots   = 0.1;

    // 書式を指定して一気に文字列生成
    string msg = StringFormat("%s | Ticket:%d | Price:%.3f | Lots:%.2f",
                              symbol, ticket, price, lots);
    Print(msg);
    // 出力: USDJPY | Ticket:99001 | Price:145.678 | Lots:0.10
}

StringFormatを使えば、文字列の連結(+演算子)を多用するよりもコードがすっきりします。特に3つ以上の値を組み合わせるときはStringFormatがおすすめです。

StringLen — 文字列の長さを取得する

StringLenは文字列の文字数を返す関数です。入力値のバリデーションや空文字チェックに使います。

基本的な使い方

void OnStart()
{
    string text = "Hello MQL4";
    int len = StringLen(text);
    Print("文字数: ", len);  // 出力: 10(スペースも1文字)

    // 空文字チェック
    string comment = "";
    if(StringLen(comment) == 0)
    {
        Print("コメントは空です");
    }
}

実践テクニック:入力パラメータのチェック

input string MagicPrefix = "EA01";

int OnInit()
{
    // プレフィックスが長すぎないかチェック
    if(StringLen(MagicPrefix) > 10)
    {
        Print("エラー: MagicPrefixは10文字以内にしてください");
        return INIT_PARAMETERS_INCORRECT;
    }
    return INIT_SUCCEEDED;
}

StringSubstr — 文字列の一部を切り出す

StringSubstrは文字列から指定位置・指定長さの部分文字列を取り出す関数です。日時文字列の分解やファイル名の加工に活用できます。

基本的な使い方

void OnStart()
{
    string text = "2024.01.15 09:30:00";

    // 日付部分を取得(先頭から10文字)
    string datePart = StringSubstr(text, 0, 10);
    Print("日付: ", datePart);  // 出力: 2024.01.15

    // 時刻部分を取得(11文字目から最後まで)
    string timePart = StringSubstr(text, 11);
    Print("時刻: ", timePart);  // 出力: 09:30:00

    // 年だけ取得(先頭から4文字)
    string year = StringSubstr(text, 0, 4);
    Print("年: ", year);  // 出力: 2024
}

第2引数が開始位置(0始まり)、第3引数が切り出す文字数です。第3引数を省略すると、開始位置から末尾までの全文字が返されます。

実践テクニック:末尾N文字を切り出す関数

StringLenとStringSubstrを組み合わせると、末尾から指定文字数を取り出すユーティリティ関数が作れます。

// 末尾n文字を取得する関数
string StringRight(string text, int n)
{
    int len = StringLen(text);
    if(n >= len) return text;
    return StringSubstr(text, len - n, n);
}

void OnStart()
{
    string filename = "report_2024.csv";
    string ext = StringRight(filename, 4);
    Print("拡張子: ", ext);  // 出力: .csv
}

実践例:5つの関数を組み合わせた注文ログ出力

最後に、ここまで学んだ5つの関数を全て使った実践的なサンプルを紹介します。注文情報をきれいに整形してログ出力する関数です。

// 注文情報を整形して出力する関数
void PrintOrderInfo(int ticket)
{
    if(!OrderSelect(ticket, SELECT_BY_TICKET))
    {
        Print("チケット ", IntegerToString(ticket), " が見つかりません");
        return;
    }

    string symbol   = OrderSymbol();
    int    type     = OrderType();
    double lots     = OrderLots();
    double openPrice = OrderOpenPrice();
    string comment  = OrderComment();

    // IntegerToString: チケット番号をゼロ埋め
    string ticketStr = IntegerToString(ticket, 8, '0');

    // DoubleToString: 価格を通貨ペアに合った桁数で変換
    int digits = (int)MarketInfo(symbol, MODE_DIGITS);
    string priceStr = DoubleToString(openPrice, digits);

    // StringLen: コメントが空なら代替テキストを設定
    if(StringLen(comment) == 0)
        comment = "(コメントなし)";

    // StringSubstr: コメントが長すぎる場合は20文字に切り詰め
    if(StringLen(comment) > 20)
        comment = StringSubstr(comment, 0, 20) + "...";

    // StringFormat: 全体を整形
    string typeStr = (type == OP_BUY) ? "BUY" : "SELL";
    string log = StringFormat("[%s] %s %s %.2fLots @ %s Comment:%s",
                              ticketStr, symbol, typeStr,
                              lots, priceStr, comment);
    Print(log);
    // 出力例: [00012345] USDJPY BUY 0.10Lots @ 145.678 Comment:MyEA_Entry
}

このように、文字列関数を組み合わせることで読みやすく情報量の多いログが簡単に作れます。デバッグ効率が格段に上がるので、ぜひ活用してください。

まとめ

今回紹介した5つの文字列関数のポイントを整理します。

関数名 用途 覚えておきたいポイント
DoubleToString 実数→文字列 _Digitsと組み合わせて通貨ペア対応
IntegerToString 整数→文字列 第2・第3引数でゼロ埋め(パディング)可能
StringFormat 書式指定で文字列生成 %s%d%.Nfを使い分ける
StringLen 文字列の長さ取得 空文字チェックやバリデーションに活用
StringSubstr 部分文字列の切り出し 開始位置は0始まり、第3引数省略で末尾まで

これらの関数はEA開発のあらゆる場面で登場します。特にStringFormatは使いこなせると、Print文やComment表示が一気にスマートになります。まずはサンプルコードをコピーして動かしてみるところから始めてみてください!