インジケータを計算 OnCalculate 関数

MQL4基礎

イベント処理関数

OnCalculate 関数

OnCalculate関数は、テクニカルインジケータを使用するために使われます。テクニカルインジケータは作成することもできますし、予め用意されたものを使うこともできます。OnCalculate関数は、インジケータ値を計算する必要がある時に呼び出される関数になります。

計算は、プログラムがチャートに挿入された直後と Tick (価格変動) の都度実行されます。

MT4でのイベントとは、MT4の相場の状況変化で、たとえば「EAがチャートに挿入された」「チャート上の価格が更新された」などのことをイベントと言います。そして、それらのイベントが発生する都度実行される関数をイベントハンドラと言います。

データ型と構成・戻り値

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);
}

 戻り値は、int型の数値です。

引数 [10]

OnCalculat関数は 10個の引数で構成されます。


引数名データ型単位初期値説明
rates_totalconst int現在の時間軸の計算用インジケータで利用できるバーの数。
prev_calculatedconst int前の呼び出しで OnCalculate関数によって返された値。最後の計算後に新たに追加されたデータ数を表します。
&time[]const datetime現在の時間軸の開始時間。
&open[]const double現在の時間軸の始値。
&high[]const double現在の時間軸の高値。
&low[]const double現在の時間軸の安値。
&close[]const double現在の時間軸の終値。
&tick_volume[]const long現在の時間軸の Tick数。
&volume[]const long現在の時間軸の取引履歴。
&spread[]const int現在の時間軸のスプレッド。但し、取引会社がスプレッドを提供している場合のみ取得できます。

time[]、open[]、high[]、low[]、close[]、tick_volume[]、volume[]、spread[] のインデックス方向を決定するには、ArrayGetAsSeries関数を呼び出します。デフォルト値に依存しないようにするために、これらの配列に対して無条件にArraySetAsSeries関数を呼び出す必要があります。

使用例

OnCalculate関数を使用したテクニカルインジケータの作成

新規ファイルの作成

MetaEditorのメニューから「ファイル」→「新規作成」を選択します。


すると次のようなメニュー画面が現れるので、「カスタムインディケータ」を選択して「次へ」を選択します。


プログラムの名前を入力します。今回は仮に「a_test」にします。カスタムインジケータのプログラムは「Indicators」フォルダの中に格納されるので「Indicators\」の部分は変更せずに、続けてファイル名を入力してください。
「次へ」を選択してください。


「カスタムインディケータのイベントハンドラ」の選択画面が表示されます。そのまま「次へ」を選択してください。


「カスタムインディケータの画面プロパティ」が表示されます。そのまま「完了」を選択してください。


「a_test.mq4」ファイルが「MQL4\indicators\」へ作成され、次のようなコードが表示されます。


これでOnCalculate関数を使うための準備ができました。必要が無い「コメント」「#property」は削除してもOKです。

[インジケータの実行]
コンパイルすると MT4画面のナビゲーターのインディケータのところに実行ファイルが作成されます。このファイルをチャート上にドラッグ&ドロップすることで、作成したインジケータを実行することができます。

OnCalculate関数を使ったインジケータの作成

次に、上記で作成したコードを使ってインジケータを作成します。作成内容は、各バーの終値を直線で結びます。

コード
// OnCalculate関数を使ったインジケータの作成
#property strict

#property indicator_chart_window       // チャートウィンドウに表示
#property indicator_buffers 1          // インジケータバッファの数
#property indicator_color1 clrRed      // 線の色
#property indicator_width1 2           // 線の太さ
#property indicator_style1 STYLE_SOLID // 線の種類

double Buf[];                          // インジケータバッファの配列

int OnInit() {

   SetIndexBuffer(0, Buf);             // 1次元動的配列をインジケータバッファへ関連付け

   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 i;
   for(i=0;i<rates_total; i++) {
      Buf[i]=close[i];
   }

return(rates_total);
}

インジケータを実行する方法はこちらを参考にしてください。(デモ口座でお試しください)

結果

MQL4で用意されているテクニカルインジケータ関数の使用

移動平均を表示する iMa関数を使って移動平均をチャート上に描画させます。
移動平均は各バーの終値を取得して、設定期間は 10本のバーごとにします。

コード
// MQL4で用意されているテクニカルインジケータ関数の使用
#property strict

#property indicator_chart_window       // チャートウィンドウに表示
#property indicator_buffers 1          // インジケータバッファの数
#property indicator_color1 clrRed      // 線の色
#property indicator_width1 2           // 線の太さ
#property indicator_style1 STYLE_SOLID // 線の種類

double Buf[];                          // インジケータバッファの配列
int MAPeriod=10;                       // 移動平均の設定期間 

int OnInit() {

   SetIndexBuffer(0, Buf);             // 1次元動的配列をインジケータバッファへ関連付け

   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 i;
   for(i=0;i<rates_total; i++) {
      Buf[i]=iMA(Symbol(), 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, i); // 移動平均
   }

return(rates_total);
}

インジケータを実行する方法はこちらを参考にしてください。(デモ口座でお試しください)

結果

タイトルとURLをコピーしました