1. StringCompare関数の概要と実務での活用法
MQL5でプログラムを書いていると、「2つの文字列が同じかどうか」を判定する場面が多々あります。最もシンプルな方法は if(str1 == str2) という比較演算子を使うことですが、実務レベルのEA(エキスパートアドバイザー)開発では、より詳細な制御ができる StringCompare関数 の活用が欠かせません。
この関数は、単に一致・不一致を判定するだけでなく、大文字・小文字を区別するかどうかを選択できる点に最大の特徴があります。
実務での活用シーン
FXの自動売買では、外部ファイル(CSVなど)から通貨ペア名を読み込んだり、ユーザーが入力したパラメータを元に処理を分岐させたりすることがあります。
例えば、ユーザーが設定値に eurusd と小文字で入力しても、システム側で EURUSD と正しくマッチングさせる必要があります。このような「表記揺れ」を許容する柔軟なロジックを組む際に、StringCompareは非常に重宝します。
2. 構文と戻り値
StringCompare関数の基本的な構文は以下の通りです。
int StringCompare(
const string string1, // 比較する1つ目の文字列
const string string2, // 比較する2つ目の文字列
bool case_sensitive=true // 大文字・小文字を区別するか(デフォルトはtrue)
);
パラメーター
- string1 / string2: 比較したい文字列です。
- case_sensitive:
trueなら大文字・小文字を厳密に区別します。falseなら区別せずに比較します。
戻り値(int型)
ここが初心者がつまずきやすいポイントです。戻り値は bool(true/false)ではなく、比較結果を数値で返します。
- 0: 2つの文字列が等しい
- -1: string1 が string2 より小さい(辞書順)
- 1: string1 が string2 より大きい(辞書順)
基本的には「0なら一致」と覚えておけば間違いありません。
3. 具体的な使い方・実践サンプルコード
以下は、ユーザーが入力した通貨ペア名が、現在のチャートの通貨ペアと一致するかどうかを判定する実用的なスクリプト例です。
//+------------------------------------------------------------------+
//| 文字列比較のデモスクリプト |
//+------------------------------------------------------------------+
void OnStart()
{
// 比較対象の文字列
string currentSymbol = _Symbol; // 例: "EURUSD"
string inputSymbol = "eurusd"; // ユーザー入力(小文字)
// 1. 通常の比較(大文字・小文字を区別する)
int resultStrict = StringCompare(currentSymbol, inputSymbol, true);
if(resultStrict == 0)
Print("厳密な比較: 一致しました。");
else
Print("厳密な比較: 一致しません。"); // こちらが実行される
// 2. 柔軟な比較(大文字・小文字を区別しない)
int resultFlexible = StringCompare(currentSymbol, inputSymbol, false);
if(resultFlexible == 0)
Print("柔軟な比較: 一致しました。"); // こちらが実行される
else
Print("柔軟な比較: 一致しません。");
// 3. 応用:辞書順の判定
string a = "Apple";
string b = "Banana";
if(StringCompare(a, b) < 0)
{
PrintFormat("%s は %s より辞書順で前です。", a, b);
}
}
このコードのように、case_sensitive を false に設定することで、大文字・小文字の差によるバグ(予期せぬ不一致)を未然に防ぐことができます。
4. 使用上の注意点とよくあるエラー
「0」が一致を意味することへの勘違い
MQL5に限らず、C言語系の関数に慣れていない初心者は、if(StringCompare(s1, s2)) と書いてしまいがちです。
しかし、この書き方だと「戻り値が0(一致)」のときに false と判定されてしまい、一致したときに処理が実行されないという逆の結果を招きます。必ず if(StringCompare(s1, s2) == 0) と記述するように徹底しましょう。
パフォーマンス面
非常に膨大な数(数万回〜)の文字列比較を1秒間に行うような特殊なロジックの場合、単純な == 演算子の方がわずかに高速な場合があります。しかし、通常のEA開発においてその差は無視できるレベルです。コードの堅牢性(大文字・小文字のハンドリング)を優先し、StringCompareを積極的に使うべきです。
5. 【重要】自動売買における約定スピードと環境の罠
プロのクオンツエンジニアの視点から断言しますが、プログラムのアルゴリズムがどれだけ優れていても、実行環境が「自宅のPC」である限り、そのEAは本来の性能を発揮できません。家庭用インターネット回線には数十ミリ秒から数百ミリ秒の「レイテンシ(通信遅延)」が存在し、このわずかな遅れがFXの世界では致命的な「スリッページ」を引き起こします。
特にボラティリティが高い局面では、発注ボタンを押してから証券会社に注文が届くまでの間に価格が数ピップスも動いてしまうことが珍しくありません。このコンマ数秒の損失を積み重ねると、バックテストでは右肩上がりのロジックも、リアル口座では使い物にならないゴミと化します。極限まで約定スピードを高め、意図した通りの価格で約定させるには、ブローカーのサーバーと同じデータセンター内、あるいは至近距離に設置された自動売買専用のVPS(仮想専用サーバー)を利用することが、プロとして最低限の必須条件です。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント