【MQL4メモ】OnCalculate関数とは?

ブログ

MQL4でカスタムインジケーターを作成する際に重要な役割を果たす OnCalculate関数 について、初心者向けにわかりやすく解説します。この関数の役割、各引数の意味・具体例・用途、さらに実際の使用例を紹介します。この記事を読めば、カスタムインジケーター作成の第一歩を踏み出せるようになります。


MQL4 の OnCalculate() 関数とは?

OnCalculate() 関数は、インジケーターの計算を行うための関数 です。
チャートの価格が更新されたり、新しいバー(ローソク足)が形成されたりすると、この関数が自動で実行されます。


1. OnCalculate() の引数の意味

関数の引数を やさしく詳しく 説明します。

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])

(1) rates_total(レートの総数)

  • 意味: チャートに表示されている バー(ローソク足)の数
  • イメージ:
    • rates_total = 1000 なら、1000本のローソク足 がある。
    • 新しいバーができると、rates_total の数が増える。

(2) prev_calculated(前回計算したバーの数)

  • 意味: 前回 OnCalculate() が実行されたときに計算済みだったバーの数
  • 役割: 前回の計算結果を利用して、無駄な再計算を減らす
  • イメージ:
    • 最初の実行時 → prev_calculated = 0
    • 2回目の実行時 → prev_calculated = rates_total - 1 なら、新しいバーだけ計算すればいい。

(3) time[](バーの時間)

  • 意味: 各バーの**時間情報(日時)**を持つ配列。
  • :mql4コピーする編集するPrint("最新のバーの時間: ", time[0]); // 一番新しいバー Print("1つ前のバーの時間: ", time[1]); // 1つ前のバー
  • 用途:
    • 過去のバーの時間を比較して分析 できる(例:特定の時間帯だけエントリー)。
    • 例えば「1時間ごとにシグナルを出す」処理ができる。

(4) open[](バーの始値)

  • 意味: 各バーの 始値(バーが始まった時の価格)を持つ配列。
  • :mql4コピーする編集するdouble open_price = open[0]; // 最新のバーの始値
  • 用途:
    • 始値と終値の差を計算して、ローソク足の大きさを調べる。
    • 特定の時間足の始値を基準にトレードする。

(5) high[](バーの高値)

  • 意味: 各バーの 高値(その時間帯での最高価格)。
  • :mql4コピーする編集するdouble high_price = high[0]; // 最新のバーの高値
  • 用途:
    • 最高値をブレイクしたらエントリーする戦略 に利用。

(6) low[](バーの安値)

  • 意味: 各バーの 安値(その時間帯での最安価格)。
  • :mql4コピーする編集するdouble low_price = low[0]; // 最新のバーの安値
  • 用途:
    • 過去の安値をブレイクしたら売りエントリー する戦略。

(7) close[](バーの終値)

  • 意味: 各バーの 終値(バーが確定したときの価格)。
  • :mql4コピーする編集するdouble close_price = close[0]; // 最新のバーの終値
  • 用途:
    • ほとんどのインジケーターは終値を使う(例:移動平均線 iMA())。
    • 終値でトレンドの強さを判断する

(8) tick_volume[](ティックボリューム)

  • 意味: 各バーのティック数(価格の更新回数)
  • :mql4コピーする編集するlong volume = tick_volume[0]; // 最新のバーのティック数
  • 用途:
    • ボラティリティ(市場の活発度)を分析できる。
    • ティック数が多い → 相場が活発ティック数が少ない → 取引が少ない

(9) volume[](取引量)

  • 意味: 出来高(そのバーの間に取引された量)(ただし、MetaTraderの出来高は信頼性が低い)。
  • :mql4コピーする編集するlong real_volume = volume[0]; // 最新のバーの出来高
  • 用途:
    • 出来高分析(例:出来高が増加したらトレンド継続の可能性)。
    • ただし、MetaTraderでは正確な取引量を提供しないブローカーが多い。

(10) spread[](スプレッド)

  • 意味: 各バーの スプレッド(Bid と Ask の差) を持つ配列。
  • :mql4コピーする編集するint spread_now = spread[0]; // 最新のスプレッド
  • 用途:
    • スプレッドが広すぎるときはトレードを回避する。
    • 高スプレッド時にエントリーしないEA を作成。

2. OnCalculate() の基本的な使い方

最新の終値を取得する例

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
Print("最新の終値: ", close[0]);
return rates_total; // 計算済みのバー数を返す
}

過去10本の終値の平均を計算する

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
double sum = 0;
for(int i = 0; i < 10; i++) {
sum += close[i];
}
double average = sum / 10;
Print("過去10本の終値の平均: ", average);
return rates_total;
}

3. まとめ

OnCalculate() はインジケーターの計算をする関数
価格データ(open, high, low, close)や時間情報を取得できる
prev_calculated を使うことで無駄な計算を防げる
ティックボリュームやスプレッドも取得できる

コメント