【MQL4】ENUM_APPLIED_PRICE(価格定数)完全ガイド|PRICE_CLOSEからPRICE_WEIGHTEDまで7種類を徹底解説

【辞書】MQLリファレンス

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_CLOSEPRICE_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やインジケーターに最適な適用価格を選んでみてください。