
MQL4チャート操作はWindowHandle・ChartID・WindowScreenShotの3系統で実装する。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リファレンス総合ガイドでオブジェクト関数と組み合わせたリッチなチャート表示を学びましょう。
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リファレンス 関連記事
- MQL4 取引関数:OrderSend・OrderClose・ポジション管理
- MQL4 インジケーター関数:iMA・iRSI・iCustom
- MQL4 口座・マーケット情報:ロット計算
- MQL4 イベントハンドラ:OnInit・OnTick
- MQL4 エラーコード:リトライパターン
- MQL4 時間・日付関数:取引時間フィルター
- EA始め方ガイド:MT4へのEA設定手順
⚠ リスクに関する注意事項
本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。






