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
を使うことで無駄な計算を防げる
✅ ティックボリュームやスプレッドも取得できる
コメント