OnCalculate()の利用方法
MQL4 (MT4)のOnCalculate()の使い方をChatGPTに確認しました。
使用GPTs:EA Creator
MT4 MQL4のOnCalculateの利用方法を実装例を交えて教えて下さい。補足で気を付ける点なども教えて下さい。
回答
OnCalculate
関数は、MetaTrader 4 (MT4) プラットフォームのMQL4言語で、カスタムインジケータにおける主要な計算ロジックを実装するために使用されます。この関数は、インジケータが再描画される必要があるたび(例えば、新しい価格データが到着したときやチャートがスクロールされたときなど)に呼び出されます。
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[] // スプレッドの配列
)
{
// ここにインジケータの計算ロジックを記述します
return(rates_total);
}
使用例:シンプルな移動平均インジケータ
以下の例では、クローズ価格に基づくシンプルな移動平均を計算するカスタムインジケータのOnCalculate
関数を示します。
// インジケータの設定
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
// グローバル変数
double maBuffer[];
// インジケータの初期化
int OnInit()
{
SetIndexBuffer(0, maBuffer); // 移動平均用のバッファを設定
IndicatorDigits(Digits); // 小数点以下の桁数を設定
return(INIT_SUCCEEDED);
}
// メイン計算ロジック
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[]
)
{
int start = prev_calculated - 1;
if(start < 1)
start = 1; // 最初から計算
// 移動平均の計算
for(int i = start; i < rates_total; i++)
{
maBuffer[i] = (close[i] + close[i-1]) / 2.0; // 単純な例として、2期間の平均
}
return(rates_total);
}
注意点
- 最適化:
prev_calculated
パラメータを利用して、計算が必要なデータポイントの数を最小限に抑えることで、インジケータのパフォーマンスを最適化できます。 - バッファの管理:
SetIndexBuffer
を使用してインジケータバッファを設定し、これらのバッファに計算結果を保存します。 - 描画設定: インジケータの視覚的表現に関する設定は、
OnInit
関数内でSetIndexStyle
やSetIndexLabel
などを使用して行います。 - エラーハンドリング: 計算中にエラーが発生した場合(例えば、不正なパラメータが渡された場合など)、適切に処理し、必要に応じてエラーをログに記録します。
OnCalculate
関数を適切に実装することで、価格データに基づいた様々な技術分析インジケータをカスタマイズし、独自の取引戦略に合わせた分析ツールを開発することができます。
MQL4リファレンス
正式な仕様は”MQL4 Reference“をご確認下さい。上記内容を確認しておくとより分かりやすいかと思います。
リンク:https://docs.mql4.com/basis/function/events#oncalculate
他のイベントハンドリング関数の利用方法
以下のそれぞれのリンク先で確認していますので、ご参照ください。
関数名 | 概要 |
---|---|
OnInit | エキスパートアドバイザーやインジケータがチャートに読み込まれた時に一度だけ呼ばれる初期化関数です。初期設定やリソースの準備に使用されます。 |
OnDeinit | エキスパートアドバイザーやインジケータがチャートから削除される時、またはMT4が閉じられる時に呼ばれる終了関数です。使用したリソースの解放などの後処理に使用されます。 |
OnStart | スクリプトが実行された時に呼ばれる関数です。エキスパートアドバイザーでは使用されません。 |
OnCalculate | カスタムインジケーターが新しい価格データを受け取った時に呼ばれる関数です。価格データの分析やインジケーター値の計算に使用されます。 |
OnTick | 新しい市場のティックデータ(価格更新)が到着した時にエキスパートアドバイザーによって呼ばれる関数です。トレードの決定や価格分析に使用されます。 |
OnTimer | 設定された時間間隔で定期的に呼ばれる関数です。定期的なタスクの実行や状態のチェックに使用されます。 |
OnTester | バックテスト中に呼ばれる関数です。バックテストの最後に特定の処理を行うために使用されます。 |
OnChartEvent | チャートイベント(マウス操作、キーボード入力、カスタムイベント)が発生した時に呼ばれる関数です。ユーザーの操作に応じた処理やインタラクティブな機能の実装に使用されます。 |
コメント