【MQL5】StringFind関数の使い方と自動売買実装コード

1. StringFind関数の概要と実務での活用法

MQL5のStringFind関数は、ある文字列の中から指定した「部分文字列」を検索し、その開始位置をインデックス(0から始まる整数)で返す関数です。

実務レベルの開発では、単に文字列を探すだけでなく、以下のようなシーンで頻繁に利用されます。

  • 通貨ペア名の判定: 業者によって異なるサフィックス(例:EURUSD.pro の “.pro” 部分)の有無を判別し、ロジックを切り替える。
  • 注文コメントの解析: EAが出力した注文コメントから特定の識別子(マジックナンバーの代替など)を抽出する。
  • 外部ファイル・Webレスポンスのパース: WebRequestで取得したデータやCSVファイルから、特定のタグや項目を探し出す。

初心者が特につまずきやすいのは、「見つからなかった場合の挙動」と「大文字・小文字の区別」です。これらを正しく理解していないと、意図しない条件分岐が発生し、誤発注の原因にもなりかねません。

2. 構文と戻り値

StringFind関数の基本構文は以下の通りです。

int StringFind(
   string  string_value,        // 検索対象の文字列
   string  match_substring,     // 検索したい文字列
   int     start_pos=0          // 検索開始位置(デフォルトは0)
);

パラメーター

  1. string_value: 検索の対象となる元の文字列です。
  2. match_substring: 探し出したい文字列です。
  3. start_pos: 検索を何文字目から開始するかを指定します。デフォルトの「0」は先頭から探すことを意味します。

戻り値

  • 発見された場合: 最初に見つかった位置のインデックス(0以上の整数)を返します。
  • 発見されなかった場合: -1 を返します。

3. 具体的な使い方・実践サンプルコード

以下は、EA(エキスパートアドバイザー)が特定の通貨ペアのみで動作するように制限したり、コメントに含まれるキーワードを判定したりする実践的な例です。

void OnStart()
{
    // 例1: 通貨ペア名に "JPY" が含まれているか確認する
    string currentSymbol = Symbol(); // 例: "USDJPY" や "EURJPY.m"
    int jpyPos = StringFind(currentSymbol, "JPY", 0);

    if(jpyPos != -1)
    {
        Print("この通貨ペアは日本円関連です。位置: ", jpyPos);
    }
    else
    {
        Print("この通貨ペアにJPYは含まれていません。");
    }

    // 例2: 注文コメントから特定の戦略コードを探す
    string orderComment = "Strategy_A_Breakout";
    string target = "Breakout";

    // 文字列が含まれているかどうかの判定(実務で最も多いパターン)
    if(StringFind(orderComment, target) != -1)
    {
        Print("ブレイクアウト戦略の注文であることを確認しました。");
    }
}

このコードのように、戻り値が -1 かどうかをチェックするのが基本の型となります。

4. 使用上の注意点とよくあるエラー

① 「0」の扱いによる論理エラー

もっとも多いミスは、if(StringFind(str, target)) と記述してしまうことです。
MQL5(C++ベース)では、数値の 0false と判定されます。もし検索対象が文字列の先頭(0番目)に見つかった場合、0 が返され、if文の中身が実行されないという致命的なバグが発生します。
必ず if(StringFind(...) != -1) と記述してください。

② 大文字・小文字の厳密な区別

StringFind は大文字と小文字を区別します。
例えば、”USDJPY” に対して “jpy” を探しても -1(見つからない)が返されます。
実務では、比較前に StringToUpper(すべて大文字化)や StringToLower(すべて小文字化)を使用して、表記の揺れを吸収するのがセオリーです。

③ インデックスの数え間違い

プログラミング全般に言えることですが、位置は「1」からではなく「0」から数えます。
“ABC” という文字列で “A” を探すと、戻り値は 0 になります。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、StringFind などの関数を駆使して高度なロジックを組み上げることは重要ですが、それ以上に収益に直結するのが「実行環境」です。どれほど優れたEAを開発しても、自宅のPCや一般的なネットワーク環境から注文を出している限り、物理的な距離に起因するネットワーク遅延(レイテンシ)からは逃れられません。

FX市場はミリ秒単位で価格が変動します。自宅PCからの発注では、証券会社のサーバーに注文が届くまでに数十から数百ミリ秒のラグが発生し、その間に有利な価格が逃げてしまう「スリッページ」が頻発します。このコンマ数秒の遅延が、年間を通すと致命的な損失の差となって現れます。プロのクオンツエンジニアが極限まで約定スピードを高めるために、証券会社のデータセンターに近い専用のVPS(仮想専用サーバー)を利用するのは、もはや業界の常識です。安定した24時間の稼働と、機関投資家に肉薄する超低遅延な取引環境を手に入れることこそが、システムトレーダーとしての第一歩となります。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました