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で動かすまでの手順を確認します。
- MetaEditorで新規スクリプト「TernaryOperatorExample」を作成し、上のコードを貼り付けてコンパイルする
- MT4のナビゲーターからチャートへドラッグ&ドロップで実行する
- 「エキスパート」タブで3つのPrintの出力結果を確認する
- 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行に圧縮できる便利な演算子です。
ただしネストすると一気に読みにくくなるため、
「値を決めるだけ」の単純な条件に限定して使うことをおすすめします。
コメント