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

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

MQL4 文字列関数 リファレンスカード
目次

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 %sn",
           DoubleToStr(AccountBalance(), 2), AccountCurrency());
   info += StringFormat("Equity:   %s %sn",
           DoubleToStr(AccountEquity(), 2), AccountCurrency());
   info += StringFormat("Spread:   %d ptsn",
           (int)MarketInfo(Symbol(), MODE_SPREAD));
   info += StringFormat("Positions: %dn", 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()をDoubleToString()に一括置換するだけで大半のコンパイルエラーが解消できました。確認しておきたいポイントは以下の通りです。

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

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

MQL4文字列関数 よくある質問

MQL4の文字列関数の特徴は?

StringLen()で長さ取得、StringSubstr()で部分文字列抽出、StringFind()で文字列検索、StringReplace()で置換が基本です。StringConcatenate()で効率的な結合、StringFormat()でC言語スタイルのフォーマット出力も可能です。

MQL4でStringFormat()を使う方法は?

StringFormat(“%.2f pips”, pips)のようにC言語形式でフォーマットします。Print()やComment()と組み合わせてログメッセージを整形するのに便利です。MQL4 Build 600以降で使用可能です。古いビルドではprintf的な書き方が制限されます。

MQL4でシンボル名や時刻を文字列に変換する方法は?

Symbol()でシンボル名を取得(既に文字列)、TimeToStr(TimeCurrent())で現在時刻を文字列化します。DoubleToStr(Ask, Digits())で価格を指定桁数の文字列に変換します。MQL5ではTimeToString()と関数名が変わっています。

MQL4で文字列を数値に変換する方法は?

StrToDouble(str)で文字列をdoubleに、StrToInteger(str)でintに変換します。MQL5ではStringToDouble()/StringToInteger()と名前が変わりました。変換失敗時は0を返すため、入力値の検証が必要です。

MQL4で文字列を分割する方法は?

MQL4にはStringSplit()がないため、StringFind()とStringSubstr()を組み合わせて手動で実装します。デリミタ位置をStringFind()で探し、StringSubstr()でその前後を取り出す方法が一般的です。MQL5ではStringSplit()が標準搭載されています。

MQL4の文字列比較の方法は?

StringCompare(str1, str2)で文字列比較(0=等しい、正=str1>str2、負=str1

MQL4リファレンス 関連記事

シストレ.COM編集部|200種類以上のEAをフォワード計測する運営3年の検証メディア。MetaTrader (MT4/MT5) を実運用してきた編集部が監修・執筆しています。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

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

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

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

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次