MQL4のチャート操作関数を体系的にまとめました。WindowHandle()・WindowFind()によるウィンドウ操作、ChartID()(ビルド600+)によるチャート識別、Period()・Symbol()による現在のチャート情報取得、WindowScreenShot()・ChartScreenShot()によるスクリーンショット、WindowPriceOnDropped()によるドラッグ&ドロップ座標取得、ChartSetInteger()・ChartGetInteger()によるチャートプロパティ操作まで、MT4開発に必要なチャート操作のすべてをコード付きで解説します。
目次
MQL4とMQL5のチャート操作の違い
| 機能 | MQL4 | MQL5 |
|---|---|---|
| チャートID | ChartID()(ビルド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 | チャートウィンドウのハンドル |
| Bars | int | チャートのバー数 |
| 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リファレンス総合ガイドでオブジェクト関数と組み合わせたリッチなチャート表示を学びましょう。





