1. IndicatorSetInteger関数の概要と実務での活用法
MQL5のIndicatorSetIntegerは、カスタムインジケーターの「プロパティ(属性)」をプログラム側から動的に設定するための関数です。具体的には、インジケーターの小数点以下の桁数、サブウィンドウの高さ、水平レベル(レベル線)の数や色などを制御します。
実務での活用シーン
実務開発において、この関数は単に「見た目を整える」以上の役割を持ちます。
例えば、複数の通貨ペアや異なる銘柄(ゴールドや日経225など)で同じインジケーターを使い回す場合、銘柄によって適切な小数点桁数は異なります。これを手動(プロパティ画面)で設定するのは非効率ですが、IndicatorSetIntegerを使えば、コード内で銘柄の桁数を自動取得し、即座に反映させることが可能です。
初心者がつまずきやすいポイント
最も多いミスは、「EA(エキスパートアドバイザー)からチャート上のインジケーターの設定を変更しようとして失敗する」ことです。IndicatorSetIntegerは、原則としてカスタムインジケーターのソースコード内(主にOnInit内)で使用するものであり、外部のEAから他者のプロパティを直接書き換えるためのものではありません。また、似た関数であるPlotIndexSetInteger(プロットごとの設定)との混同もよく見られるため、注意が必要です。
2. 構文と戻り値
IndicatorSetIntegerには、設定したいプロパティの種類に応じて2つのオーバーロード(構文)が存在します。
構文1:インデックスを指定しないプロパティ
(例:インジケーターの精度、サブウィンドウの高さなど)
bool IndicatorSetInteger(
int prop_id, // プロパティ識別子(ENUM_CUSTOM_INDICATOR_PROPERTY_INTEGER)
int prop_value // 設定する値
);
構文2:インデックスを指定するプロパティ
(例:レベル線の数、レベル線の色など)
bool IndicatorSetInteger(
int prop_id, // プロパティ識別子
int prop_modifier, // 修飾子(レベル線のインデックス:0, 1, 2...)
int prop_value // 設定する値
);
戻り値
- true: 設定成功
- false: 設定失敗(
GetLastError()でエラーコードを確認可能)
3. 具体的な使い方・実践サンプルコード
以下は、カスタムインジケーターにおいて「銘柄の桁数に合わせた精度設定」と「動的なレベル線の配置」を行う実用的なサンプルコードです。
//+------------------------------------------------------------------+
//| Custom_IndicatorSetSample.mq5|
//| Copyright 2023, Quant Engineer |
//+------------------------------------------------------------------+
#property indicator_separate_window // インジケーターをサブウィンドウに表示
#property indicator_buffers 1
#property indicator_plots 1
// プロットの設定
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. バッファの紐付け
SetIndexBuffer(0, Buffer, INDICATOR_DATA);
// 2. インジケーターの精度(小数点以下の桁数)を現在の銘柄に合わせる
// INDICATOR_DIGITS を使用することで、例えばUSDJPYなら3、EURUSDなら5が自動設定される
IndicatorSetInteger(INDICATOR_DIGITS, (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS));
// 3. レベル線の設定(例:RSIのような30/70ラインを引く)
// まずレベル線の合計数を設定(これを忘れると個別の設定が効かない)
IndicatorSetInteger(INDICATOR_LEVELS, 2);
// 0番目のレベル線を設定
IndicatorSetInteger(INDICATOR_LEVELVALUE, 0, 30); // 値を30に設定
IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, STYLE_DOT); // 点線に設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, clrGray); // 色をグレーに設定
// 1番目のレベル線を設定
IndicatorSetInteger(INDICATOR_LEVELVALUE, 1, 70); // 値を70に設定
IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, STYLE_DOT); // 点線に設定
IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, clrGray); // 色をグレーに設定
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
// 計算ロジック(中略)
return(rates_total);
}
4. 使用上の注意点とよくあるエラー
- INDICATOR_LEVELSの優先順位
レベル線の値(INDICATOR_LEVELVALUE)を設定する前に、必ずINDICATOR_LEVELSでレベルの総数を宣言してください。総数が0の状態で値を設定しようとしても無視されます。 - OnInit以外での使用
IndicatorSetIntegerは計算ループ(OnCalculate)内でも呼び出せますが、頻繁に呼び出すと描画負荷が高まり、プラットフォームのパフォーマンスを低下させます。基本的にはOnInit内で一度だけ設定するのがベストプラクティスです。 - プロパティの混同
INDICATOR_HEIGHT(サブウィンドウの高さ)などの設定は、メインウィンドウに表示されるインジケーター(#property indicator_chart_window)では無視されます。作成しているインジケーターがどのタイプかを常に意識してください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの優位性と同じ、あるいはそれ以上に重要なのが「実行環境のレイテンシ(遅延)」です。自宅のPCでMT5を起動し、一般的な光回線で自動売買を行うことは、プロのクオンツから見れば極めてリスクの高い行為と言わざるを得ません。
ネットワークの遅延は「スリッページ」を直撃します。例えば、インジケーターが完璧なサインを出したとしても、自宅PCからブローカーのサーバーへ注文が届くまでに数十〜数百ミリ秒の遅れが生じれば、その間に価格は数ピップス動いてしまいます。この僅かな差が、バックテストの結果とリアルトレードの結果が乖離する最大の原因です。極限まで約定スピードを高め、物理的な距離による損失を排除するには、ブローカーのデータセンターに近い場所に位置する専用のVPS(仮想専用サーバー)の利用が不可欠です。24時間安定稼働し、ミリ秒単位のスピード競争に勝てる環境を整えることこそが、システムトレーダーとしての第一歩となります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント