MQL4でインジケーター関数を使うとき、「どの価格を基準に計算するか」を指定する場面が頻繁にあります。たとえば移動平均線を計算するとき、終値を使うのか、高値と安値の平均を使うのかで結果が変わりますよね。
この「どの価格を使うか」を指定するために用意されているのが、ENUM_APPLIED_PRICE(適用価格の列挙型)です。全部で7種類の定数があり、iMA()やiRSI()などの組み込み関数で頻繁に使われます。
この記事では、7つの価格定数それぞれの意味と計算式、そして実際のコードでの使い方をわかりやすく解説します。
ENUM_APPLIED_PRICEとは?
ENUM_APPLIED_PRICEは、MQL4で定義されている列挙型(enum)のひとつです。テクニカル指標の計算に使う「価格の種類」を指定するために使います。
たとえば、移動平均線を計算するiMA()関数のシグネチャを見てみましょう。
double iMA(
string symbol, // 通貨ペア
int timeframe, // 時間足
int ma_period, // 期間
int ma_shift, // シフト
int ma_method, // 移動平均の種類
int applied_price, // 適用価格 ← ここ!
int shift // バーのインデックス
);
このapplied_priceの部分に、ENUM_APPLIED_PRICEの定数を指定します。どの定数を選ぶかによって、計算結果が変わってくるわけです。
7つの価格定数一覧
ENUM_APPLIED_PRICEには、以下の7つの定数が定義されています。
| 定数名 | 値 | 説明 | 計算式 |
|---|---|---|---|
| PRICE_CLOSE | 0 | 終値 | Close |
| PRICE_OPEN | 1 | 始値 | Open |
| PRICE_HIGH | 2 | 高値 | High |
| PRICE_LOW | 3 | 安値 | Low |
| PRICE_MEDIAN | 4 | 中間値 | (High + Low) / 2 |
| PRICE_TYPICAL | 5 | 典型値 | (High + Low + Close) / 3 |
| PRICE_WEIGHTED | 6 | 加重終値 | (High + Low + Close + Close) / 4 |
PRICE_CLOSE(終値)— 値: 0
もっとも一般的に使われる適用価格です。各ローソク足の終値(Close)を使って計算します。特にこだわりがなければ、まずはこれを選んでおけば問題ありません。多くのトレーダーやテクニカル分析の教科書でも、終値ベースの計算がデフォルトとされています。
PRICE_OPEN(始値)— 値: 1
各ローソク足の始値(Open)を使って計算します。始値はバーの開始時点の価格なので、「そのバーが始まった瞬間にわかる値」という特徴があります。バックテストやリアルタイム処理で、確定済みの値だけを使いたい場合に選ばれることがあります。
PRICE_HIGH(高値)— 値: 2
各ローソク足の高値(High)を使って計算します。高値ベースの移動平均線は、レジスタンスライン(上値抵抗線)のような役割として活用できます。
PRICE_LOW(安値)— 値: 3
各ローソク足の安値(Low)を使って計算します。安値ベースの移動平均線は、サポートライン(下値支持線)のような役割として活用できます。PRICE_HIGHと組み合わせて移動平均チャネルを作る使い方が人気です。
PRICE_MEDIAN(中間値)— 値: 4
計算式は (High + Low) / 2 です。ローソク足の高値と安値のちょうど中間の価格、つまりそのバーの「値幅の中心」を使います。終値の偏りを排除し、そのバーの価格帯の中心で計算したいときに使います。
PRICE_TYPICAL(典型値)— 値: 5
計算式は (High + Low + Close) / 3 です。Median Price(中間値)に終値を加えて3で割った値で、中間値よりも実際の値動きの結果(終値)を反映した価格になります。CCI(商品チャネル指数)などのインジケーターでは、このTypical Priceが標準的に使われています。
PRICE_WEIGHTED(加重終値)— 値: 6
計算式は (High + Low + Close + Close) / 4 です。Typical Price(典型値)の計算式で終値を2回カウントすることで、終値により大きな比重を置いた価格です。「値幅全体も考慮したいけど、やっぱり終値を重視したい」という場合に適しています。
この3つの関係性を整理すると、次のようになります。
- Median Price(HL/2):ローソク足の値幅の中間値
- Typical Price(HLC/3):中間値に終値を加え、より実際の値動きに近づけた値
- Weighted Close(HLCC/4):さらに終値の比重を高め、終値に近づけた値
実際のコードでの使い方
iMA関数での基本的な使用例
もっとも基本的な使い方です。20期間の単純移動平均線を終値ベースで計算します。
void OnTick()
{
// 20期間SMAを終値(PRICE_CLOSE)で計算
double ma_close = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
// 20期間SMAを典型値(PRICE_TYPICAL)で計算
double ma_typical = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_TYPICAL, 0);
Print("終値ベースSMA: ", ma_close);
Print("典型値ベースSMA: ", ma_typical);
}
同じ期間・同じ移動平均の種類でも、適用価格を変えるだけで計算結果が変わることがわかります。
iRSI関数での使用例
RSI(相対力指数)でも適用価格を指定できます。
void OnTick()
{
// 14期間RSIを終値で計算
double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);
if(rsi > 70)
{
Print("RSIが70を超えました(買われすぎ): ", rsi);
}
else if(rsi < 30)
{
Print("RSIが30を下回りました(売られすぎ): ", rsi);
}
}
HIGH/LOWを使った移動平均チャネルの作成例
PRICE_HIGHとPRICE_LOWを組み合わせると、価格を挟み込むようなチャネル(帯)を作ることができます。
void OnTick()
{
int period = 20;
// 高値ベースの移動平均(上側バンド)
double upper = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_HIGH, 0);
// 安値ベースの移動平均(下側バンド)
double lower = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_LOW, 0);
// 終値ベースの移動平均(中央線)
double middle = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, 0);
Print("上側: ", upper, " 中央: ", middle, " 下側: ", lower);
// 現在価格が上側バンドを超えたら
if(Ask > upper)
{
Print("価格が移動平均チャネルの上側を突破!");
}
// 現在価格が下側バンドを下回ったら
if(Bid < lower)
{
Print("価格が移動平均チャネルの下側を突破!");
}
}
このように、適用価格を変えるだけで同じiMA関数から異なる性質のラインを引くことができます。
input変数でユーザーに選ばせる方法
EAやカスタムインジケーターを作るとき、適用価格をユーザーがパラメーター画面から選べるようにしたいですよね。MQL4では、ENUM_APPLIED_PRICEをinput変数の型として使うことで、自動的にドロップダウンリストが表示されます。
// パラメーター設定
input int MAPeriod = 20; // 移動平均の期間
input ENUM_MA_METHOD MAMethod = MODE_SMA; // 移動平均の種類
input ENUM_APPLIED_PRICE MAPrice = PRICE_CLOSE; // 適用価格
void OnTick()
{
double ma = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 0);
Print("MA値: ", ma);
}
このように書くだけで、MetaTraderのパラメーター入力画面に「適用価格」のドロップダウンリストが自動生成されます。ユーザーは「Close price」「Open price」「Median Price (HL/2)」…といった選択肢から直感的に選ぶことができます。
int型で宣言してユーザーに数値を手入力させるよりも、はるかに使いやすく、入力ミスも防げる優れた方法です。EAやインジケーターを配布する場合は、ぜひこの書き方を使いましょう。
定数の整数値を直接使う場合の注意
ENUM_APPLIED_PRICEの各定数には整数値(0〜6)が割り当てられているため、数値を直接指定しても動作します。
// 定数名を使う場合(推奨)
double ma1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
// 整数値を直接使う場合(非推奨)
double ma2 = iMA(NULL, 0, 20, 0, MODE_SMA, 0, 0);
上の2行はどちらも同じ結果になりますが、整数値を直接書く方法はおすすめしません。理由は以下の通りです。
- 可読性が低い:「0」だけでは何の価格かすぐにわからない
- 保守性が悪い:後から見たとき、あるいは他の人が見たときに意味が伝わらない
- タイプミスに気づきにくい:定数名なら打ち間違えればコンパイルエラーになるが、数値だと範囲外の値でも気づきにくい
常にPRICE_CLOSEやPRICE_TYPICALのような定数名を使うようにしましょう。
どの適用価格を選ぶべきか?
7種類もあると「結局どれを使えばいいの?」と迷いますよね。以下に用途別の目安をまとめます。
| 用途・場面 | おすすめの適用価格 |
|---|---|
| 一般的なトレンド分析 | PRICE_CLOSE(最も標準的) |
| ノイズを減らしたい | PRICE_TYPICAL または PRICE_MEDIAN |
| 終値重視だがノイズも減らしたい | PRICE_WEIGHTED |
| レジスタンスライン的に使いたい | PRICE_HIGH |
| サポートライン的に使いたい | PRICE_LOW |
| CCIなど特定のインジケーター | PRICE_TYPICAL(標準仕様に従う) |
迷ったときはPRICE_CLOSEを選んでおけば、まず間違いありません。そこから最適化やバックテストを行って、他の価格定数を試してみるのがよいでしょう。
まとめ
ENUM_APPLIED_PRICEは、テクニカル指標の計算に「どの価格を使うか」を指定するための列挙型です。今回のポイントを振り返りましょう。
- 7種類の定数がある:PRICE_CLOSE(終値)、PRICE_OPEN(始値)、PRICE_HIGH(高値)、PRICE_LOW(安値)、PRICE_MEDIAN(中間値)、PRICE_TYPICAL(典型値)、PRICE_WEIGHTED(加重終値)
- iMA()やiRSI()などの組み込み関数で、applied_priceパラメーターに指定して使う
- input変数の型にENUM_APPLIED_PRICEを使えば、ドロップダウンリストで選択できるようになる
- 整数値の直接指定は動作するが、可読性の観点から定数名を使うべき
- 迷ったらPRICE_CLOSEが最も無難で一般的
適用価格の選択はインジケーターの計算結果に直接影響するため、それぞれの意味を理解しておくことが大切です。この記事を参考に、自分のEAやインジケーターに最適な適用価格を選んでみてください。

