if(勝ちポジションなら) { 色を青にする }

else { 色を赤にする }

こんな4行のif-else文、実は1行で書けることをご存知でしょうか。

三項演算子(条件演算子)を使えば、

単純な条件分岐による値の代入を1行にまとめられます。

ただし使いすぎると逆に読みにくくなる、という注意点もあります。

この記事では、MQL4/MQL5共通の三項演算子の構文から、

EA・インジケーターでの実践的な使いどころ、

ネストして読みにくくなる失敗例まで解説します。

この記事で分かること
・三項演算子の構文とif-elseとの対応関係
・戻り値の型を揃える必要があるという制約
・EA・インジケーターでの実践的な使用例
・ネストしすぎて読みにくくなる失敗パターン

三項演算子とは何か

まず、三項演算子がどんな書き方なのかを確認します。

構文(条件 ? 真の場合 : 偽の場合)

expression1 ? expression2 : expression3

MQL4公式リファレンスによれば、

expression1がbool型の値を返し、

真であればexpression2、偽であればexpression3が評価されます。

if-else文との対応関係

公式リファレンスに掲載されている例を確認します。

double true_range = (High==Low) ? 0 : (Close-Open)/(High-Low);

これは次のif-else文と全く同じ意味です。

if(High==Low)
   true_range = 0;
else
   true_range = (Close-Open)/(High-Low);

戻り値の型を揃える必要がある制約

公式リファレンスには、

「第2・第3オペランドは同じ型の値を返す必要があり、void型であってはならない」

と明記されています。

片方はint、もう片方はstringのような組み合わせはコンパイルエラーになります。

なぜ使うのか(メリットとデメリット)

三項演算子を使う意味と、使いすぎたときの弊害を確認します。

代入文を1行で書ける場面

「条件によって代入する値を変えるだけ」の単純な分岐では、

if-elseの4〜5行が1行にまとまり、見通しが良くなります。

読みにくくなるネストの危険

注意
・三項演算子の中に三項演算子を入れる(ネスト)と一気に読みにくくなります
・複数の処理(副作用)を実行したい場合はif-elseを使うべきです
・三項演算子は『値を決めるだけ』の場面に限定するのが安全です

使いどころの判断基準

目安として、「条件は1つだけ」「結果は値の代入だけ」の場合に三項演算子、

それ以外(複数条件・複数の処理)はif-elseを使うと判断に迷いません。

EA・インジケーターでの実践的な使用例

実際のトレードコードでどう使われるかを見ていきます。

売買方向で色を変える

color arrowColor = (orderType == OP_BUY) ? clrBlue : clrRed;

買いなら青、売りなら赤という色分けを1行で表現できます。

0除算を避ける安全装置として使う

公式サンプルのtrue_range例と同じ考え方を、

値幅に対する値動きの比率計算に応用します。

double ratio = (High[1]==Low[1]) ? 0 : (Close[1]-Open[1]) / (High[1]-Low[1]);

高値と安値が同じ(値幅ゼロ)の特殊な足でも、

0除算エラーを起こさずに安全な値を返せます。

スプレッドの広さで許容スリッページを変える

int slippage = (MarketInfo(_Symbol, MODE_SPREAD) > 20) ? 5 : 3;

スプレッドが広い時間帯だけ許容スリッページを広げる、

という調整も三項演算子で簡潔に書けます。

実際に動くコード全体

ここまでの使用例をまとめた、

色分け・比率計算・スリッページ調整を行うスクリプトです。

//+------------------------------------------------------------------+
//|                                        TernaryOperatorExample.mq4 |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property strict

void OnStart()
  {
   int orderType = OP_BUY;

   color arrowColor = (orderType == OP_BUY) ? clrBlue : clrRed;
   Print("矢印の色: ", arrowColor);

   double ratio = (High[1]==Low[1]) ? 0 : (Close[1]-Open[1]) / (High[1]-Low[1]);
   Print("値動きの比率: ", ratio);

   int slippage = (MarketInfo(_Symbol, MODE_SPREAD) > 20) ? 5 : 3;
   Print("許容スリッページ: ", slippage);
  }

MetaEditorでのコンパイル・実行手順

実際にMT4で動かすまでの手順を確認します。

  1. MetaEditorで新規スクリプト「TernaryOperatorExample」を作成し、上のコードを貼り付けてコンパイルする
  2. MT4のナビゲーターからチャートへドラッグ&ドロップで実行する
  3. 「エキスパート」タブで3つのPrintの出力結果を確認する
  4. orderTypeの値をOP_SELLに変えて、色が赤に変わることを確認する

よくあるエラーと注意点

実装でつまずきやすいポイントをまとめます。

型が揃っていないコンパイルエラー

string msg = (lots > 1.0) ? "大ロット" : 0;

このように第2オペランドがstring、第3オペランドがintのように型が違うと、

コンパイルエラーになります。両方とも同じ型に揃えてください。

ネストしすぎて可読性が落ちる

三項演算子を2段・3段と入れ子にすると、

どの条件がどの値に対応するか一見で分からなくなります。

ネストが必要になった時点でif-else文に書き直すことをおすすめします。

MQL4とMQL5の違い

三項演算子の構文・評価順序はMQL4とMQL5で全く同じです。

MQL4との違いを意識する必要がない、数少ない言語仕様の1つです。

よくある質問

三項演算子について、よく検索される疑問に回答します。

三項演算子はif文より処理が速いのですか?

実行速度に意味のある違いはありません。

読みやすさと行数の違いだけと考えてください。

三項演算子の中で関数を呼び出してもよいですか?

文法上は可能です。

ただし両方の式で関数が呼ばれる可能性があるため、

副作用(値を変更する処理)のある関数は避け、

値を返すだけの関数にとどめてください。

3つ以上の条件を三項演算子で書けますか?

ネストすれば文法上は書けますが、読みにくくなるためおすすめしません。

3つ以上の条件分岐はswitch文かif-else if文で書いてください。

【MQL】三項演算子(?:)の使い方とif-elseとの使い分けについてわかりやすく解説してみた:まとめ

三項演算子は、条件によって代入する値を1つだけ決めたい場面で、

if-else文を1行に圧縮できる便利な演算子です。

ただしネストすると一気に読みにくくなるため、

「値を決めるだけ」の単純な条件に限定して使うことをおすすめします。

関連記事