MQL4 文字列関数リファレンス|StringFind・StringSubstr・DoubleToStr・StringFormat

MQL4の文字列関数を体系的にまとめました。StringLen()による文字列長取得、StringFind()による検索、StringSubstr()による部分文字列抽出、StringConcatenate()による結合、StringReplace()による置換、IntegerToString()・DoubleToStr()・StringToInteger()・StringToDouble()による型変換、StringTrimLeft/Right()によるトリミングまで、MT4 EA開発に必要な文字列処理のすべてをコード付きで解説します。

目次

MQL4とMQL5の文字列関数の違い

機能MQL4MQL5
数値→文字列DoubleToStr(), IntegerToString()DoubleToString(), IntegerToString()
文字列→数値StrToDouble(), StrToInteger()StringToDouble(), StringToInteger()
文字列結合StringConcatenate() / + 演算子StringConcatenate() / + 演算子
文字列フォーマットStringFormat()(ビルド600+)StringFormat()
文字列比較StringCompare()(ビルド600+)StringCompare()

MQL4の文字列関数はMQL5と高い互換性がありますが、いくつかの関数名が変更されています。特にDoubleToStr()→DoubleToString()StrToDouble()→StringToDouble()StrToInteger()→StringToInteger()はMQL5移植時の頻出修正箇所です。

MQL4の文字列関数はMQL5と高い互換性がありますが、いくつかの関数名が変更されています。特にDoubleToStr()→DoubleToString()StrToDouble()→StringToDouble()StrToInteger()→StringToInteger()はMQL5移植時の頻出修正箇所です。

基本文字列関数

StringLen — 文字列長

int StringLen(string str);
// 戻り値: 文字列の文字数

StringFind — 文字列検索

int StringFind(
   string str,          // 検索対象の文字列
   string match_substr, // 検索する部分文字列
   int    start_pos = 0 // 検索開始位置
);
// 戻り値: 見つかった位置(0始まり)、見つからない場合は-1

StringSubstr — 部分文字列

string StringSubstr(
   string str,        // 元の文字列
   int    start_pos,  // 開始位置
   int    length = -1 // 長さ(-1=末尾まで)
);
// 戻り値: 切り出した部分文字列
void StringBasics()
  {
   string str = "USDJPY_H1_EA";

   // 長さ
   Print("長さ: ", StringLen(str));  // 12

   // 検索
   int pos = StringFind(str, "H1");
   Print("H1の位置: ", pos);  // 7

   // 部分文字列
   string pair = StringSubstr(str, 0, 6);  // "USDJPY"
   string tf   = StringSubstr(str, 7, 2);  // "H1"
   Print("通貨ペア: ", pair, " 時間軸: ", tf);

   // 検索して通貨ペアを判定
   if(StringFind(Symbol(), "JPY") >= 0)
      Print("JPYペアです");
  }

StringConcatenate / + 演算子

void ConcatenateExample()
  {
   // + 演算子(簡単だが多数の結合では遅い)
   string msg = "Balance: " + DoubleToStr(AccountBalance(), 2)
              + " Equity: " + DoubleToStr(AccountEquity(), 2);

   // StringConcatenate(高速、多数の引数に対応)
   string result;
   StringConcatenate(result,
      "Balance: ", DoubleToStr(AccountBalance(), 2),
      " Equity: ", DoubleToStr(AccountEquity(), 2),
      " Spread: ", MarketInfo(Symbol(), MODE_SPREAD));

   Print(result);
  }

StringReplace — 文字列置換

int StringReplace(
   string& str,          // 対象文字列(書き換わる)
   string  find,          // 検索文字列
   string  replacement    // 置換文字列
);
// 戻り値: 置換した回数
void ReplaceExample()
  {
   string text = "Buy at 110.500, SL at 110.000, TP at 111.000";

   int count = StringReplace(text, "at", "=>");
   Print("置換回数: ", count);  // 3
   Print(text);  // "Buy => 110.500, SL => 110.000, TP => 111.000"
  }

型変換関数

関数変換方向MQL5対応
DoubleToStr(value, digits)double → stringDoubleToString()
IntegerToString(value)int/long → stringIntegerToString()
StrToDouble(str)string → doubleStringToDouble()
StrToInteger(str)string → intStringToInteger()
CharToStr(code)文字コード → stringCharToString()
StringGetChar(str, pos)string → 文字コードStringGetCharacter()
void ConversionExample()
  {
   // 数値 → 文字列
   string priceStr = DoubleToStr(110.523, 3);  // "110.523"
   string lotStr   = DoubleToStr(0.1, 2);      // "0.10"
   string ticketStr = IntegerToString(12345);   // "12345"

   // 文字列 → 数値
   double price = StrToDouble("110.523");  // 110.523
   int    value = StrToInteger("42");      // 42

   // 価格表示(桁数自動)
   Print("Price: ", DoubleToStr(Ask, Digits));  // "110.523" or "110.52300"
  }

StringFormat — フォーマット文字列(ビルド600+)

void FormatExample()
  {
   // printf形式のフォーマット
   string msg = StringFormat("Ticket: %d, Price: %.5f, Lots: %.2f",
                              12345, 110.52300, 0.10);
   Print(msg);  // "Ticket: 12345, Price: 110.52300, Lots: 0.10"

   // ログ出力に便利
   Print(StringFormat("[%s] %s %s %.2f lots at %.5f",
         TimeToStr(TimeCurrent(), TIME_MINUTES),
         Symbol(), "BUY", 0.1, Ask));

   // パディング
   string padded = StringFormat("%-10s %8.2f", "Balance:", AccountBalance());
   Print(padded);  // "Balance:    123456.78"
  }
文字列操作のパフォーマンス
  • + 演算子での大量結合は遅い: 毎回新しい文字列オブジェクトが生成されるため、ループ内での使用は避ける
  • StringConcatenate()は高速: 内部で効率的に結合され、引数も最大64個まで対応
  • StringFormat()は可読性が高い: printf形式で複雑なフォーマットを簡潔に書ける
  • Comment()への出力は改行に\nを使う(HTMLの<br>ではない)
文字列操作のパフォーマンス
  • + 演算子での大量結合は遅い: 毎回新しい文字列オブジェクトが生成されるため、ループ内での使用は避ける
  • StringConcatenate()は高速: 内部で効率的に結合され、引数も最大64個まで対応
  • StringFormat()は可読性が高い: printf形式で複雑なフォーマットを簡潔に書ける
  • Comment()への出力は改行に\nを使う(HTMLの<br>ではない)

トリミング・大文字小文字変換

void TrimCaseExample()
  {
   string str = "  Hello World  ";

   // トリミング
   StringTrimLeft(str);   // "Hello World  "
   StringTrimRight(str);  // "Hello World"
   Print("[", str, "]");

   // 大文字・小文字変換
   string upper = str;
   string lower = str;
   StringToUpper(upper);  // "HELLO WORLD"
   StringToLower(lower);  // "hello world"
   Print("Upper: ", upper);
   Print("Lower: ", lower);
  }
MQL4には StringSplit がない

MQL5にはStringSplit()関数がありますが、MQL4には存在しません。カンマ区切りの文字列を分割するには、StringFind()とStringSubstr()を組み合わせて自前で実装する必要があります。ただしCSVファイルの読み込みであれば、FILE_CSVモードのFileOpen()を使えば自動的に区切り文字で分割されます。

MQL4には StringSplit がない

MQL5にはStringSplit()関数がありますが、MQL4には存在しません。カンマ区切りの文字列を分割するには、StringFind()とStringSubstr()を組み合わせて自前で実装する必要があります。ただしCSVファイルの読み込みであれば、FILE_CSVモードのFileOpen()を使えば自動的に区切り文字で分割されます。

実践: ログフォーマット関数

void LogTrade(string action, int ticket, double lots, double price)
  {
   string logMsg = StringFormat(
      "[%s] %s: %s %s %.2f lots @ %s SL=%s TP=%s",
      TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS),
      action,
      Symbol(),
      (action == "BUY" || action == "BUY_LIMIT") ? "Long" : "Short",
      lots,
      DoubleToStr(price, Digits),
      DoubleToStr(OrderStopLoss(), Digits),
      DoubleToStr(OrderTakeProfit(), Digits)
   );
   Print(logMsg);
  }

// コメント表示用の情報整形
string FormatAccountInfo()
  {
   string info = "";
   info += StringFormat("Balance:  %s %s\n",
           DoubleToStr(AccountBalance(), 2), AccountCurrency());
   info += StringFormat("Equity:   %s %s\n",
           DoubleToStr(AccountEquity(), 2), AccountCurrency());
   info += StringFormat("Spread:   %d pts\n",
           (int)MarketInfo(Symbol(), MODE_SPREAD));
   info += StringFormat("Positions: %d\n", OrdersTotal());
   return info;
  }

文字列関数一覧(MQL5対応表)

MQL4関数MQL5対応説明
StringLen()StringLen()文字列長
StringFind()StringFind()文字列検索
StringSubstr()StringSubstr()部分文字列
StringConcatenate()StringConcatenate()文字列結合
StringReplace()StringReplace()文字列置換
StringTrimLeft()StringTrimLeft()左側トリミング
StringTrimRight()StringTrimRight()右側トリミング
StringToUpper()StringToUpper()大文字変換
StringToLower()StringToLower()小文字変換
DoubleToStr()DoubleToString()double→文字列
IntegerToString()IntegerToString()int→文字列
StrToDouble()StringToDouble()文字列→double
StrToInteger()StringToInteger()文字列→int
StringFormat()StringFormat()フォーマット文字列
StringGetChar()StringGetCharacter()文字コード取得
CharToStr()CharToString()文字コード→文字列
StringCompare()StringCompare()文字列比較

まとめ

MQL4の文字列関数はMQL5と高い互換性がありますが、関数名が異なるものがあります。重要なポイントは以下の通りです。

  • DoubleToStr()はMQL5ではDoubleToString()に変更 — 移植時に注意
  • StrToDouble()/StrToInteger()もMQL5で名称変更 — StringToDouble()/StringToInteger()
  • StringFormat()はprintf形式で複雑なフォーマットに便利
  • 大量の文字列結合にはStringConcatenate()が高速 — + 演算子より効率的

次のステップとして、MQLリファレンス総合ガイドで他のカテゴリも学習しましょう。

シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら
【FX自動売買】システムトレード完全ガイド|Forex Guide

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!
目次