【MQL5】ChartSetInteger関数の使い方と自動売買実装コード

1. ChartSetInteger関数の概要と実務での活用法

ChartSetIntegerは、MetaTrader 5(MQL5)において、チャートの見た目や挙動といった「プロパティ」をプログラム側から変更するための非常に重要な関数です。

具体的には、背景色の変更、グリッドの表示/非表示、オートスクロールのON/OFF、さらにはマウスによるドラッグ操作の禁止など、チャートに関するあらゆる数値的な設定(整数型、ブール型、列挙型)を制御できます。

実務での活用シーン:
実務開発において、初心者が最初につまずくのは「チャート設定を手動で変えても、EAを再起動すると元に戻ってしまう」という点です。プロのクオンツエンジニアは、EAの初期化関数(OnInit)内でこの関数を使い、EAのロジックに最適なチャート環境を強制的に構築します。

また、UI(ユーザーインターフェース)を持つEAを開発する際、ボタンをクリックした時にチャートのスクロールを固定したり、特定のイベント時に背景色を変えてアラートを視覚的に伝えるなど、ユーザーエクスペリエンス(UX)の向上にも欠かせません。


2. 構文と戻り値

ChartSetInteger関数には、オーバーロード(引数のパターン)が2つあります。通常は1つ目の形式を多用します。

構文1:基本形式

bool  ChartSetInteger(
   long    chart_id,     // チャートID(0は現在のチャート)
   int     prop_id,      // プロパティID(ENUM_CHART_PROPERTY_INTEGER)
   long    value         // 設定する値
   );

構文2:サブウィンドウ指定形式

bool  ChartSetInteger(
   long    chart_id,     // チャートID
   int     prop_id,      // プロパティID
   int     sub_window,   // サブウィンドウの番号
   long    value         // 設定する値
   );

戻り値

  • true: 設定に成功した場合。
  • false: 設定に失敗した場合。エラーの詳細は GetLastError() 関数で確認できます。

3. 具体的な使い方・実践サンプルコード

以下は、EAが起動した際にチャートのグリッドを消し、オートスクロールを有効にし、さらに独自の背景色を設定する実践的なコード例です。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // 現在のチャートIDを取得(0でも代用可能)
    long currentChartID = ChartID();

    // 1. グリッド(網目)を非表示にする
    // 第二引数には列挙型 ENUM_CHART_PROPERTY_INTEGER を指定
    if(!ChartSetInteger(currentChartID, CHART_SHOW_GRID, false))
    {
        Print("グリッドの設定に失敗しました。");
    }

    // 2. チャートのオートスクロールを有効にする
    ChartSetInteger(currentChartID, CHART_AUTOSCROLL, true);

    // 3. チャートの右端に余白を作る(右シフト)
    ChartSetInteger(currentChartID, CHART_SHIFT, true);

    // 4. 背景色を暗い紺色に変更する
    // 色指定は color型を long型にキャストして渡す
    ChartSetInteger(currentChartID, CHART_COLOR_BACKGROUND, clrDarkSlateBlue);

    // 5. チャート上でのマウス操作(ドラッグ)を禁止する(UI固定などの場合)
    // ChartSetInteger(currentChartID, CHART_MOUSE_SCROLL, false);

    // 設定を即座に反映させるために再描画を行う
    ChartRedraw(currentChartID);

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // EA終了時に設定をデフォルト(白背景など)に戻す処理を書くのが一般的です
    ChartSetInteger(0, CHART_COLOR_BACKGROUND, clrWhite);
    ChartSetInteger(0, CHART_SHOW_GRID, true);
    ChartRedraw(0);
}

4. 使用上の注意点とよくあるエラー

① 「設定が反映されない」ときは ChartRedraw を疑う

ChartSetIntegerを呼び出しただけでは、次のティックが来るまで画面が更新されないことがあります。変更を即座にユーザーに見せたい場合は、必ず ChartRedraw() をセットで呼び出す習慣をつけましょう。

② 型の不一致

この関数は「Integer(整数)」用です。価格のレベルなど「Double(浮動小数点)」を扱う場合は ChartSetDouble を、チャートタイトルのような「String(文字列)」を扱う場合は ChartSetString を使う必要があります。これを間違えると、コンパイルエラーにはならなくても実行時に意図しない動作をします。

③ チャートIDの指定

自作のEAが動いているチャートを操作する場合は 0 または ChartID() で問題ありませんが、別の通貨ペアのチャートを操作したい場合は、正しいチャートIDを取得して渡す必要があります。


5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、プログラムのコード以上に勝敗を分けるのが「実行環境の物理的な距離」です。自宅のPCでMT5を動かし、家庭用光回線でトレードを行うことは、クオンツの観点からは非常にリスクが高いと言わざるを得ません。ネットワークのジッター(揺らぎ)や経由するプロバイダーの遅延は、たとえ数ミリ秒であっても、スリッページを増大させ、バックテストの結果を根底から覆す「隠れた損失」を生み出します。

プロの現場では、ブローカーの取引サーバーが設置されているデータセンターに物理的に近い「専用のVPS(仮想専用サーバー)」を利用するのが常識です。超高速なネットワーク環境下にEAを配置することで、約定スピードを極限まで高め、発注から約定までのレイテンシを最小化することが可能です。わずかな遅延の差が、年間の収益曲線に致命的な乖離をもたらすため、安定した利益を目指すエンジニアにとって、トレード専用VPSの導入は避けて通れない必須の投資となります。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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