IndicatorCounted関数|MT4インジケータの計算を最適化する方法

執筆者

佐川直弘(株式会社トリロジー取締役)

MetaTrader 4(MT4)のMQL4プログラムでカスタムインディケータを作成する際には、効率的に計算を行うことが重要です。特に過去のデータを毎回計算するのは無駄が多く、パフォーマンスの低下を招きます。この記事では、IndicatorCounted()関数を使用してインディケータの計算を最適化する方法について、初心者にもわかりやすく解説します。

インディケータの計算を最適化する必要性

インディケータの計算を最適化することで、計算の効率を向上させ、プログラムのパフォーマンスを高めることができます。過去全てのバーを毎回計算するのではなく、変化したバー数分だけ計算を行うことで、無駄な計算を省くことができます。

IndicatorCounted()関数の使用方法

IndicatorCounted()関数を使用すると、変化していないバーの数を取得することができます。この関数の仕様は以下の通りです。

関数仕様
int IndicatorCounted()

引数の説明

name
なし

この関数は、変化していないバーの数を取得し、その数を戻り値として返します。これにより、必要なバー数分だけ計算を行うことができます。

以下に、IndicatorCounted()関数を使用してインディケータの計算を最適化するサンプルコードを示します。

サンプルコード
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Lime
//—- インディケータパラメータ
extern int JawsPeriod = 13; // あごの期間
extern int TeethPeriod = 8;  // 歯の期間
extern int LipsPeriod = 5;   // 唇の期間
//—- インディケータバッファ
double BlueBuffer[]; // ブルーバッファ
double RedBuffer[];  // レッドバッファ
double LimeBuffer[]; // ライムバッファ
// カスタムインディケータの初期化関数
int init() {
    //—- インディケータバッファの設定
    IndicatorBuffers(3);
    //—- 描画設定
    SetIndexStyle(0, DRAW_LINE);
    SetIndexStyle(1, DRAW_LINE);
    SetIndexStyle(2, DRAW_LINE);
    //—- インディケータバッファのマッピング
    SetIndexBuffer(0, BlueBuffer);
    SetIndexBuffer(1, RedBuffer);
    SetIndexBuffer(2, LimeBuffer);
    //—- データウィンドウおよびインディケータサブウィンドウラベルの名前
    IndicatorShortName(“Optimized Indicator");
    return (0);
}
// カスタムインディケータのイテレーション関数
int start() {
    int limit;
    int counted_bars = IndicatorCounted();
    //—- エラーチェック
    if (counted_bars < 0) return(-1);
    //—- 最後のカウント済みバーを再カウント
    if (counted_bars > 0) counted_bars–;
    limit = Bars – counted_bars;
    //—- メインループ
    for (int i = 0; i < limit; i++) {
        //—- ma_shiftは0に設定(上でSetIndexShiftが呼び出されたため)
        BlueBuffer[i] = iMA(NULL, 0, JawsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
        RedBuffer[i] = iMA(NULL, 0, TeethPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
        LimeBuffer[i] = iMA(NULL, 0, LipsPeriod, 0, MODE_SMMA, PRICE_MEDIAN, i);
    }
    return (0);
}

このサンプルコードでは、以下のことを行っています。

  1. #propertyディレクティブを使って、インディケータの設定を行います。
  2. 外部パラメータ(JawsPeriod、TeethPeriod、LipsPeriod)を宣言します。
  3. グローバル変数としてインディケータ配列(BlueBuffer、RedBuffer、LimeBuffer)を宣言します。
  4. init()関数内で、IndicatorBuffers()関数を使って配列の個数を設定します。
  5. SetIndexStyle()関数を使って、各インディケータ配列のスタイルを設定します。
  6. SetIndexBuffer()関数を使って、配列の領域を確保します。
  7. IndicatorShortName()関数を使って、インディケータの短縮名称を設定します。
  8. start()関数内で、IndicatorCounted()関数を使って変化していないバーの数を取得します。
  9. 必要なバー数分だけ計算を行うために、limitを設定します。
  10. メインループ内で、指定された期間の移動平均を計算し、各インディケータ配列に値を設定します。

まとめ

インディケータの計算を最適化することで、チャート上のパフォーマンスが向上し、トレードの精度も向上します。MQL4のIndicatorCounted()関数を使用することで、効率的にインディケータの計算を行い、無駄な処理を減らすことができます。初心者の方も、この基本的な使い方を理解して、実際のトレードに応用してみてください。

MQL4

Posted by 佐川直弘