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);
}
このサンプルコードでは、以下のことを行っています。
- #propertyディレクティブを使って、インディケータの設定を行います。
- 外部パラメータ(JawsPeriod、TeethPeriod、LipsPeriod)を宣言します。
- グローバル変数としてインディケータ配列(BlueBuffer、RedBuffer、LimeBuffer)を宣言します。
- init()関数内で、IndicatorBuffers()関数を使って配列の個数を設定します。
- SetIndexStyle()関数を使って、各インディケータ配列のスタイルを設定します。
- SetIndexBuffer()関数を使って、配列の領域を確保します。
- IndicatorShortName()関数を使って、インディケータの短縮名称を設定します。
- start()関数内で、IndicatorCounted()関数を使って変化していないバーの数を取得します。
- 必要なバー数分だけ計算を行うために、limitを設定します。
- メインループ内で、指定された期間の移動平均を計算し、各インディケータ配列に値を設定します。
まとめ
インディケータの計算を最適化することで、チャート上のパフォーマンスが向上し、トレードの精度も向上します。MQL4のIndicatorCounted()関数を使用することで、効率的にインディケータの計算を行い、無駄な処理を減らすことができます。初心者の方も、この基本的な使い方を理解して、実際のトレードに応用してみてください。
ディスカッション
コメント一覧
まだ、コメントがありません