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

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

MQL5のChartGetIntegerは、指定したチャートの「状態」を整数(long型)で取得するための非常に汎用性の高い関数です。チャートの背景色、表示されているバーの数、ウィンドウのサイズ、グリッドの表示非表示など、視覚的・構造的な情報をプログラム側で把握するために使用されます。

実務での活用シーン:
* GUI(ボタンやパネル)の動配置: チャートの横幅や縦幅(ピクセル単位)を取得し、画面のリサイズに合わせてボタンの位置を自動調整する。
* バックテストとライブ稼働の判別: 特定のチャート設定を確認し、意図しない環境での動作を制限する。
* ユーザー操作の検知: チャートがスクロールされたか、あるいは自動スクロールが有効になっているかを確認し、描画ロジックを最適化する。

初心者の方は「ただの設定値を取得するだけの関数」と思いがちですが、プロの現場では「ユーザーの操作(UI)とロジック(EA)を同期させるための重要なセンサー」として重宝されます。


2. 構文と戻り値

ChartGetIntegerには、戻り値の受け取り方が異なる2つの書式があります。実務ではエラーハンドリングが容易な「2番目の書式(bool型を返す方)」を使うのが一般的です。

書式1:値を直接返す

long  ChartGetInteger(
   long                          chart_id,     // チャートID(0は現在のチャート)
   ENUM_CHART_PROPERTY_INTEGER   prop_id,      // プロパティID
   int                           sub_window=0  // サブウィンドウ番号
   );

書式2:成功可否を返し、値は参照渡しで受け取る(推奨)

bool  ChartGetInteger(
   long                          chart_id,     // チャートID
   ENUM_CHART_PROPERTY_INTEGER   prop_id,      // プロパティID
   int                           sub_window,   // サブウィンドウ番号
   long&                         long_var      // 値を受け取る変数
   );
  • chart_id: 操作対象のチャート。0を指定すると現在実行中のチャートになります。
  • prop_id: 取得したい情報の種類。CHART_WIDTH_IN_PIXELS(幅)やCHART_BRING_TO_TOP(最前面か)など。
  • 戻り値: 書式2の場合、成功すればtrue、失敗すればfalseを返します。

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

以下のコードは、現在のチャートのピクセルサイズを取得し、それに基づいて情報の表示位置を変更する実戦的なサンプルです。

//+------------------------------------------------------------------+
//| チャートのサイズ情報を取得して出力するEA                                 |
//+------------------------------------------------------------------+
void OnTick()
{
   long width_px;   // 横幅を格納する変数
   long height_px;  // 縦幅を格納する変数
   long first_bar;  // チャート上に表示されている最初のバーのインデックス

   // 1. チャートの横幅(ピクセル)を取得
   if(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0, width_px))
   {
      Print("チャートの横幅: ", width_px, " px");
   }

   // 2. チャートの縦幅(ピクセル)を取得
   if(ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0, height_px))
   {
      Print("チャートの縦幅: ", height_px, " px");
   }

   // 3. チャートに「自動スクロール」が設定されているか確認
   long is_autoscroll;
   if(ChartGetInteger(0, CHART_AUTOSCROLL, 0, is_autoscroll))
   {
      string status = (is_autoscroll > 0) ? "ON" : "OFF";
      Comment("自動スクロール設定: " + status + "\n" +
              "画面サイズ: " + (string)width_px + "x" + (string)height_px);
   }
}

このコードをEAとして適用し、チャートの端をドラッグしてサイズを変えると、リアルタイムで取得される数値が変化することが確認できます。


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

① 型の取り扱いに注意(long型)

ChartGetIntegerはその名の通り「Integer(整数)」を扱いますが、MQL5内部ではlong型(64ビット整数)として処理されます。int型の変数で受け取ろうとすると、値が大きい場合にデータが溢れたり、コンパイル警告が出たりします。必ずlong型を使用しましょう。

② 表示フラグは 0 or 1

CHART_SHOW_GRID(グリッド表示)などのプロパティは、論理値(true/false)ではなく0または1long値として返ってきます。条件分岐で使う際は if(value > 0) のように記述するのが安全です。

③ 非同期処理の罠

チャートのプロパティを変更した直後にChartGetIntegerを呼び出すと、描画更新が間に合わず、変更前の値が返ってくることがあります。確実に最新の状態を取得したい場合は、直前にChartRedraw()を呼ぶなどの工夫が必要な場合があります。


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

プロの開発者がMQL5で最も神経を使うのは、コードの書き方よりも「実行環境のレイテンシ(遅延)」です。自宅のPCや一般的な光回線でEAを運用する場合、ブローカーのサーバーとの間に物理的な距離があるため、たとえプログラムが完璧でも約定までに数十〜数百ミリ秒の遅延が発生します。

このわずかな遅延は、ボラティリティが高い局面では致命的なスリッページを引き起こし、バックテスト通りの利益を削り取ります。プロレベルの約定スピードを確保するには、ブローカーのデータセンターに近い場所に位置する「専用VPS(仮想専用サーバー)」の導入が不可欠です。24時間安定して稼働し、ミリ秒単位の攻防を制する環境を整えることこそが、自動売買で勝ち残るための最低条件と言えるでしょう。

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

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

コメント

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