MQL4 チャート操作リファレンス|WindowHandle・ChartID・スクリーンショット・プロパティ設定

MQL4チャート操作はWindowHandle・ChartID・WindowScreenShotの3系統で実装する。WindowHandle()・WindowFind()によるウィンドウ操作、ChartID()(ビルド600+)によるチャート識別、Period()・Symbol()による現在のチャート情報取得、WindowScreenShot()・ChartScreenShot()によるスクリーンショット、WindowPriceOnDropped()によるドラッグ&ドロップ座標取得、ChartSetInteger()・ChartGetInteger()によるチャートプロパティ操作まで、MT4開発に必要なチャート操作のすべてをコード付きで解説します。

目次

MQL4とMQL5のチャート操作の違い

機能MQL4MQL5
チャートIDChartID()(ビルド600+)/ WindowHandle()ChartID()
チャート情報Period(), Symbol()ChartPeriod(), ChartSymbol()
サブウィンドウ検索WindowFind()ChartWindowFind()
スクリーンショットWindowScreenShot() / ChartScreenShot()ChartScreenShot()
プロパティ設定ChartSetInteger()等(ビルド600+)ChartSetInteger()等
チャート操作ChartOpen/Close/Next等(ビルド600+)ChartOpen/Close/Next等

MQL4のチャート操作はビルド600を境に大きく変わりました。旧形式のWindow系関数に加え、ビルド600+ではChartSetInteger() / ChartGetInteger()等のMQL5互換APIが追加されています。新規開発では新形式の使用を推奨します。

MQL4のチャート操作はビルド600を境に大きく変わりました。旧形式のWindow系関数に加え、ビルド600+ではChartSetInteger() / ChartGetInteger()等のMQL5互換 APIが追加されています。新規開発では新形式の使用を推奨します。

チャート基本情報

関数戻り値説明
Symbol()string現在のチャートの通貨ペア
Period()int現在のチャートの時間軸(分)
ChartID()long現在のチャートのID(ビルド600+)
WindowHandle(string, int)intチャートウィンドウのハンドル
Barsintチャートのバー数
WindowBarsPerChart()int表示されているバー数
WindowFirstVisibleBar()int最初の可視バーのインデックス
WindowIsVisible(int)boolサブウィンドウが表示されているか
void PrintChartInfo()
  {
   Print("=== チャート情報 ===");
   Print("通貨ペア:", Symbol());
   Print("時間軸:", PeriodToStr(Period()));
   Print("チャートID:", ChartID());
   Print("バー数:", Bars);
   Print("表示バー数:", WindowBarsPerChart());
   Print("最初の可視バー:", WindowFirstVisibleBar());
   Print("サブウィンドウ数:", WindowsTotal());
  }

string PeriodToStr(int period)
  {
   switch(period)
     {
      case PERIOD_M1:  return"M1";
      case PERIOD_M5:  return"M5";
      case PERIOD_M15: return"M15";
      case PERIOD_M30: return"M30";
      case PERIOD_H1:  return"H1";
      case PERIOD_H4:  return"H4";
      case PERIOD_D1:  return"D1";
      case PERIOD_W1:  return"W1";
      case PERIOD_MN1: return"MN1";
     }
   return"Unknown(" + IntegerToString(period) +")";
  }

ウィンドウ関数

// サブウィンドウの検索
void FindIndicatorWindow()
  {
   // インジケーターが表示されているサブウィンドウ番号を取得
   int window = WindowFind("RSI(14)");
   if(window >= 0)
      Print("RSIはサブウィンドウ", window,"に表示されています");
   else
      Print("RSIは表示されていません");
  }

// 価格座標の取得
void GetDropCoordinates()
  {
   // EAがドラッグ&ドロップされた位置の価格と時刻
   double price = WindowPriceOnDropped();
   datetime time = WindowTimeOnDropped();
   int xPixel = WindowXOnDropped();
   int yPixel = WindowYOnDropped();

   Print("ドロップ位置: price=", price," time=", TimeToStr(time));
   Print("ピクセル座標: x=", xPixel," y=", yPixel);
  }

// 価格⇔ピクセル座標変換
void CoordinateConversion()
  {
   // 価格からY座標
   int y = WindowPriceToY(Ask, 0);
   Print("Ask価格のY座標:", y);

   // Y座標から価格
   double price = WindowYToPrice(y, 0);
   Print("Y=", y,"の価格:", price);

   // 時刻からX座標
   int x = WindowTimeToX(Time[0], 0);
   Print("現在バーのX座標:", x);
  }

チャートプロパティ操作(ビルド600+)

void SetupChart()
  {
   long chartId = ChartID();

   // ローソク足表示
   ChartSetInteger(chartId, CHART_MODE, CHART_CANDLES);

   // グリッド表示/非表示
   ChartSetInteger(chartId, CHART_SHOW_GRID, false);

   // 自動スクロール
   ChartSetInteger(chartId, CHART_AUTOSCROLL, true);

   // チャートシフト(右側に余白)
   ChartSetInteger(chartId, CHART_SHIFT, true);

   // Ask/Bidライン表示
   ChartSetInteger(chartId, CHART_SHOW_ASK_LINE, true);
   ChartSetInteger(chartId, CHART_SHOW_BID_LINE, true);

   // 背景色
   ChartSetInteger(chartId, CHART_COLOR_BACKGROUND, clrWhite);

   // ローソク足の色
   ChartSetInteger(chartId, CHART_COLOR_CANDLE_BULL, clrBlue);
   ChartSetInteger(chartId, CHART_COLOR_CANDLE_BEAR, clrRed);

   // 変更を反映
   ChartRedraw(chartId);
  }

// チャートプロパティの取得
void GetChartProperties()
  {
   long chartId = ChartID();

   int mode = (int)ChartGetInteger(chartId, CHART_MODE);
   bool grid = (bool)ChartGetInteger(chartId, CHART_SHOW_GRID);
   int width = (int)ChartGetInteger(chartId, CHART_WIDTH_IN_PIXELS);
   int height = (int)ChartGetInteger(chartId, CHART_HEIGHT_IN_PIXELS);

   Print("チャートモード:", mode);
   Print("グリッド:", grid);
   Print("サイズ:", width,"x", height,"px");
  }
チャートプロパティ変更の注意点
  • ChartSetInteger()等で変更した後、ChartRedraw()を呼ばないと画面に反映されない場合がある
  • チャートの背景色やローソク足の色を変更すると、ユーザーの設定が上書きされる。OnDeinitで元に戻すのがマナー
  • ChartSetInteger(0, CHART_SHIFT, true)で右側にスペースを作ると、将来の価格予測ラインが見やすくなる
チャートプロパティ変更の注意点
  • ChartSetInteger()等で変更した後、ChartRedraw()を呼ばないと画面に反映されない場合がある
  • チャートの背景色やローソク足の色を変更すると、ユーザーの設定が上書きされる。OnDeinitで元に戻すのがマナー
  • ChartSetInteger(0, CHART_SHIFT, true)で右側にスペースを作ると、将来の価格予測ラインが見やすくなる

スクリーンショット

// 旧形式
bool WindowScreenShot(
   string filename,  // ファイル名(Files/フォルダに保存)
   int    size_x,    // 幅(ピクセル)
   int    size_y,    // 高さ(ピクセル)
   int    start_bar = -1,  // 開始バー(-1=現在の表示位置)
   int    chart_scale = -1, // チャートスケール(-1=現在)
   int    chart_mode = -1   // 表示モード(-1=現在)
);

// 新形式(ビルド600+)
bool ChartScreenShot(
   long   chart_id,   // チャートID
   string filename,   // ファイル名
   int    width,      // 幅
   int    height,     // 高さ
   ENUM_ALIGN_MODE align_mode = ALIGN_RIGHT  // 配置
);
void SaveChartScreenShot()
  {
   string filename ="Screenshot_" + Symbol() +"_"
                   + TimeToStr(TimeCurrent(), TIME_DATE) +".png";

   // 旧形式
   if(WindowScreenShot(filename, 1024, 768))
      Print("スクリーンショット保存:", filename);
   else
      Print("保存失敗:", GetLastError());

   // 新形式(ビルド600+)
   // ChartScreenShot(ChartID(), filename, 1024, 768);
  }

// エントリー/決済時に自動スクリーンショット
void TakeTradeScreenShot(string action, int ticket)
  {
   string filename = StringConcatenate("Trade_", action,"_",
      Symbol(),"_",
      IntegerToString(ticket),"_",
      TimeToStr(TimeCurrent(), TIME_DATE),".png"
   );

   WindowScreenShot(filename, 1280, 720);
  }
スクリーンショットの活用法
  • エントリー・決済時に自動撮影すると、後からの分析に非常に役立つ
  • ファイル名に日時・チケット番号を含めると整理しやすい
  • 保存先はMQL4/Files/フォルダ。サイズは1024×768〜1280×720が一般的
  • バックテスト中はWindowScreenShot()が使えないため、IsTesting()で分岐する
スクリーンショットの活用法
  • エントリー・決済時に自動撮影すると、後からの分析に非常に役立つ
  • ファイル名に日時・チケット番号を含めると整理しやすい
  • 保存先はMQL4/Files/フォルダ。サイズは1024×768〜1280×720が一般的
  • バックテスト中はWindowScreenShot()が使えないため、IsTesting()で分岐する

チャートナビゲーション(ビルド600+)

// チャート一覧の取得
void ListAllCharts()
  {
   long chartId = ChartFirst();
   int count = 0;

   while(chartId >= 0)
     {
      string sym = ChartSymbol(chartId);
      int period = ChartPeriod(chartId);
      Print("Chart[", count,"]:", sym,"", PeriodToStr(period)," ID=", chartId);
      count++;
      chartId = ChartNext(chartId);
     }

   Print("合計チャート数:", count);
  }

// 新しいチャートを開く
void OpenNewChart(string symbol, int timeframe)
  {
   long newChart = ChartOpen(symbol, timeframe);
   if(newChart > 0)
      Print("チャートを開きました:", symbol," ID=", newChart);
   else
      Print("チャートを開けませんでした");
  }

チャート操作関数一覧(MQL5対応表)

MQL4関数MQL5対応説明
Symbol()_Symbol / ChartSymbol()通貨ペア名
Period()_Period / ChartPeriod()時間軸
ChartID()ChartID()チャートID
WindowHandle()ChartGetInteger(CHART_WINDOW_HANDLE)ウィンドウハンドル
WindowFind()ChartWindowFind()サブウィンドウ検索
WindowsTotal()ChartGetInteger(CHART_WINDOWS_TOTAL)ウィンドウ数
WindowScreenShot()ChartScreenShot()スクリーンショット
WindowPriceOnDropped()ChartPriceOnDropped()ドロップ位置の価格
WindowTimeOnDropped()ChartTimeOnDropped()ドロップ位置の時刻
WindowBarsPerChart()ChartGetInteger(CHART_VISIBLE_BARS)表示バー数
WindowFirstVisibleBar()ChartGetInteger(CHART_FIRST_VISIBLE_BAR)最初の可視バー
ChartSetInteger()ChartSetInteger()整数プロパティ設定
ChartGetInteger()ChartGetInteger()整数プロパティ取得
ChartOpen()ChartOpen()チャートを開く
ChartClose()ChartClose()チャートを閉じる
ChartFirst()ChartFirst()最初のチャートID
ChartNext()ChartNext()次のチャートID

まとめ

MQL4のチャート操作関数は、EA開発での情報表示やデバッグに不可欠です。ポイントは以下の通りです。

  • ビルド600+ではChartSetInteger()等の新しいAPIが使えるため、チャートのカスタマイズが柔軟になった
  • WindowScreenShot()でエントリー/決済時に自動撮影すると、後からの分析に役立つ
  • WindowFind()でインジケーターのサブウィンドウを確認してからオブジェクトを描画する
  • ChartRedraw()を呼ばないと変更が反映されない場合があるので注意

次のステップとして、MQLリファレンス総合ガイドでオブジェクト関数と組み合わせたリッチなチャート表示を学びましょう。

MQL4チャート操作 よくある質問

MQL4のチャート操作関数とは?

チャートの設定変更(色、スケール、時間足)、インジケーターの追加・削除、スクリーンショット取得などを行う関数群です。WindowHide()/WindowIsVisible()でウィンドウ表示制御、ChartSave()でテンプレート保存、ChartApplyTemplate()でテンプレート適用ができます。

MQL4でチャートの時間足を変更する方法は?

ChartSetInteger(0, CHART_PERIOD, PERIOD_H1)でチャートの時間足を変更します。ただしMQL4では自チャートへの適用が主な用途です。別のチャートを開くにはChartOpen(symbol, period)を使います。TimeCurrent()ではなくPeriod()で現在の時間足を取得できます。

MQL4でチャートのスクリーンショットを取る方法は?

ChartScreenShot(0, filename, width, height)でスクリーンショットをBMP形式で保存します。ファイルはMQL4/Filesフォルダに保存されます。定期的にスクリーンショットを記録してEAの動作をモニタリングするのに便利です。

MQL4でチャートをスクロールする方法は?

ChartNavigate(0, CHART_END, 0)でチャートを最新バーに移動、ChartNavigate(0, CHART_BEGIN, 0)で最古バーに移動します。ChartNavigate(0, CHART_CURRENT_POS, shift)で現在位置からシフト量分移動できます。

MQL4でマルチチャートを操作する方法は?

ChartFirst()で最初のチャートIDを取得、ChartNext(chartID)で次のチャートIDを取得してループで全チャートを巡回できます。各チャートにChartSetString(chartID, CHART_COMMENT, text)でコメントを設定できます。

MQL4とMQL5のチャート操作の違いは?

MQL4のチャート操作関数はMQL5と同名のものが大半ですが、細かな引数の違いがあります。MQL5ではChartGetInteger()/ChartSetInteger()等の型別関数が整理され、ChartWindowFind()でウィンドウ番号検索が追加されました。

MQL4リファレンス 関連記事

シストレ.COM編集部|200種類以上のEAをフォワード計測する運営3年の検証メディア。MetaTrader (MT4/MT5) を実運用してきた編集部が監修・執筆しています。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM 記事下バナー
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次