EAやインジケーターを開発していると、「チャートの背景色をプログラムから変更したい」「グリッドを非表示にしたい」「ローソク足の色を統一したい」といった場面に出くわすことがあります。
MQL4では、チャートの見た目や動作を制御するためのチャートプロパティ定数が用意されています。この記事では、ENUM_CHART_PROPERTY_INTEGER、ENUM_CHART_PROPERTY_STRING、ENUM_CHART_PROPERTY_DOUBLEの3種類の列挙型を中心に、チャート設定の操作方法をわかりやすく解説します。
チャートプロパティを操作する関数の全体像
MQL4では、チャートプロパティの値を「設定する関数」と「取得する関数」がデータ型ごとにペアで用意されています。
| データ型 | 設定する関数 | 取得する関数 | 対応する列挙型 |
|---|---|---|---|
| 整数型(long) | ChartSetInteger() | ChartGetInteger() | ENUM_CHART_PROPERTY_INTEGER |
| 浮動小数点型(double) | ChartSetDouble() | ChartGetDouble() | ENUM_CHART_PROPERTY_DOUBLE |
| 文字列型(string) | ChartSetString() | ChartGetString() | ENUM_CHART_PROPERTY_STRING |
これらの関数の第1引数にはチャートIDを指定します。0を指定すると現在のチャートを意味します。第2引数に、これから説明する列挙型の定数を渡すことで、どのプロパティを操作するかを指定します。
ENUM_CHART_PROPERTY_INTEGER — 整数型プロパティ
最も種類が多く、よく使うのがこの整数型プロパティです。チャートの表示/非表示の切り替え、色の設定、モードの変更など幅広い操作ができます。
表示モード系のプロパティ
| 定数名 | 説明 | 設定値 |
|---|---|---|
| CHART_MODE | チャートの表示タイプ | CHART_BARS / CHART_CANDLES / CHART_LINE |
| CHART_FOREGROUND | 価格チャートを前面に表示するか | true / false |
| CHART_SHIFT | 右端にシフト(余白)を設けるか | true / false |
| CHART_AUTOSCROLL | 自動スクロール(最新バーへ自動移動) | true / false |
| CHART_SCALE | チャートのスケール(0〜5) | 0(縮小)〜 5(拡大) |
表示要素の ON/OFF 系プロパティ
| 定数名 | 説明 |
|---|---|
| CHART_SHOW_GRID | グリッド線の表示/非表示 |
| CHART_SHOW_PERIOD_SEP | 期間区切り線の表示/非表示 |
| CHART_SHOW_ASK_LINE | Ask(買値)ラインの表示/非表示 |
| CHART_SHOW_BID_LINE | Bid(売値)ラインの表示/非表示 |
| CHART_SHOW_DATE_SCALE | 横軸(日時スケール)の表示/非表示 |
| CHART_SHOW_PRICE_SCALE | 縦軸(価格スケール)の表示/非表示 |
| CHART_SHOW_OHLC | 四本値(OHLC)の表示/非表示 |
| CHART_SHOW_ONE_CLICK | ワンクリックトレードパネルの表示/非表示 |
| CHART_SHOW_VOLUMES | 出来高の表示モード |
色の設定用プロパティ
チャートの配色もすべてプログラムから制御できます。color型の値を指定します。
| 定数名 | 説明 |
|---|---|
| CHART_COLOR_BACKGROUND | チャートの背景色 |
| CHART_COLOR_FOREGROUND | 前景色(軸やテキストの色) |
| CHART_COLOR_GRID | グリッド線の色 |
| CHART_COLOR_CHART_UP | 上昇バー / ローソク足の外枠・ヒゲの色 |
| CHART_COLOR_CHART_DOWN | 下降バー / ローソク足の外枠・ヒゲの色 |
| CHART_COLOR_CANDLE_BULL | 陽線(Bull)の実体の色 |
| CHART_COLOR_CANDLE_BEAR | 陰線(Bear)の実体の色 |
| CHART_COLOR_CHART_LINE | ラインチャートの色 |
| CHART_COLOR_ASK | Askラインの色 |
| CHART_COLOR_BID | Bidラインの色 |
| CHART_COLOR_STOP_LEVEL | ストップレベルの色 |
読み取り専用のプロパティ
以下のプロパティは値の取得のみ可能で、プログラムから変更はできません(読み取り専用 = r/o)。
| 定数名 | 説明 |
|---|---|
| CHART_WINDOWS_TOTAL | チャートウィンドウの総数(サブウィンドウ含む) |
| CHART_WIDTH_IN_BARS | チャートの幅(バー数単位) |
| CHART_WIDTH_IN_PIXELS | チャートの幅(ピクセル単位) |
| CHART_HEIGHT_IN_PIXELS | チャートの高さ(ピクセル単位) |
| CHART_FIRST_VISIBLE_BAR | 画面上で最初に見えるバーの番号 |
| CHART_VISIBLE_BARS | 画面上に表示されているバーの本数 |
| CHART_IS_OBJECT | オブジェクトとしてのチャートかどうか |
実践サンプル:チャートの配色をカスタマイズする
以下はEAのOnInit()内でチャートの見た目を一括変更する例です。
int OnInit()
{
// チャート表示をローソク足に変更
ChartSetInteger(0, CHART_MODE, CHART_CANDLES);
// 背景色をダークブルーに設定
ChartSetInteger(0, CHART_COLOR_BACKGROUND, clrMidnightBlue);
// グリッドを非表示にする(背景色と同色でも可)
ChartSetInteger(0, CHART_SHOW_GRID, false);
// 陽線(Bull)の色設定
ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, clrDodgerBlue);
ChartSetInteger(0, CHART_COLOR_CHART_UP, clrDodgerBlue);
// 陰線(Bear)の色設定
ChartSetInteger(0, CHART_COLOR_CANDLE_BEAR, clrMediumOrchid);
ChartSetInteger(0, CHART_COLOR_CHART_DOWN, clrMediumOrchid);
// Askラインを表示する
ChartSetInteger(0, CHART_SHOW_ASK_LINE, true);
// 設定を反映
ChartRedraw();
return(INIT_SUCCEEDED);
}
ポイント:ChartSetInteger()を呼んだだけでは画面にすぐ反映されないことがあります。確実に描画を更新したい場合は、最後にChartRedraw()を呼びましょう。
ENUM_CHART_PROPERTY_DOUBLE — 浮動小数点型プロパティ
Double型のプロパティは数が少なく、主にチャートの価格範囲を取得するために使います。
| 定数名 | 説明 | 備考 |
|---|---|---|
| CHART_PRICE_MIN | チャート上の最小価格 | 読み取り専用 |
| CHART_PRICE_MAX | チャート上の最大価格 | 読み取り専用 |
| CHART_SHIFT_SIZE | 右端シフトの割合(10〜50%) | 設定可能 |
| CHART_FIXED_POSITION | 固定位置(左端からの割合%) | 設定可能 |
| CHART_FIXED_MAX | 固定スケール時の最大価格 | 設定可能 |
| CHART_FIXED_MIN | 固定スケール時の最小価格 | 設定可能 |
実践サンプル:現在のチャート価格範囲を取得する
void OnTick()
{
// 現在チャートに表示されている価格範囲を取得
double priceMin = ChartGetDouble(0, CHART_PRICE_MIN);
double priceMax = ChartGetDouble(0, CHART_PRICE_MAX);
Print("表示中の価格範囲: ", priceMin, " ~ ", priceMax);
}
CHART_PRICE_MINとCHART_PRICE_MAXは、画面上に「今見えている」範囲の最小・最大価格です。スクロールやズームに応じて動的に変化するため、現在の表示状態を知りたいときに便利です。
ENUM_CHART_PROPERTY_STRING — 文字列型プロパティ
文字列型のプロパティは現在1つだけです。
| 定数名 | 説明 |
|---|---|
| CHART_COMMENT | チャートの左上に表示されるコメント文字列 |
実践サンプル:チャートにコメントを表示する
void OnTick()
{
// ChartSetString でチャートコメントを設定
string info = "スプレッド: " + IntegerToString(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD))
+ " / Bid: " + DoubleToString(Bid, _Digits);
ChartSetString(0, CHART_COMMENT, info);
ChartRedraw();
}
// コメントの取得
void ShowCurrentComment()
{
string currentComment = ChartGetString(0, CHART_COMMENT);
Print("現在のコメント: ", currentComment);
}
ChartSetString()によるCHART_COMMENTの設定は、Comment()関数と同様にチャート左上にテキストを表示します。Comment()関数との違いは、チャートIDを指定できるため他のチャートウィンドウに対してもコメントを設定できる点です。
応用テクニック:チャートの設定を保存・復元する
EAやインジケーターでチャートの見た目を変更する場合、終了時に元の設定に戻すのがマナーです。以下のパターンを覚えておきましょう。
// グローバル変数に元の設定を保存
color g_origBgColor;
bool g_origShowGrid;
int OnInit()
{
// 元の設定を保存
g_origBgColor = (color)ChartGetInteger(0, CHART_COLOR_BACKGROUND);
g_origShowGrid = (bool)ChartGetInteger(0, CHART_SHOW_GRID);
// 新しい設定を適用
ChartSetInteger(0, CHART_COLOR_BACKGROUND, clrBlack);
ChartSetInteger(0, CHART_SHOW_GRID, false);
ChartRedraw();
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
// 元の設定を復元
ChartSetInteger(0, CHART_COLOR_BACKGROUND, g_origBgColor);
ChartSetInteger(0, CHART_SHOW_GRID, g_origShowGrid);
ChartRedraw();
}
こうすることで、EAを取り外したときにチャートが元の見た目に戻ります。ユーザーにとって親切な設計になりますので、ぜひ習慣にしてください。
よくある注意点とつまずきポイント
① ChartRedraw()を忘れない
チャートプロパティを変更する関数は、実際にはイベントキューにコマンドを追加するだけです。画面への即時反映が必要な場合は、ChartRedraw()を明示的に呼びましょう。
② 第1引数のチャートID
第1引数に0を指定すると「現在のチャート」を意味します。別のチャートを操作したい場合は、ChartID()やChartFirst()/ChartNext()で取得したIDを使います。
③ 読み取り専用プロパティに注意
CHART_WIDTH_IN_PIXELSやCHART_PRICE_MINなどの読み取り専用(r/o)プロパティに対してSet関数を呼んでも、値は変更されません。公式リファレンスで「r/o」の表記を確認しましょう。
④ 新しく開いたチャートの操作タイミング
ChartOpen()で新しくチャートを開いた直後は、まだデータが読み込まれていない場合があります。CHART_PRICE_MINやCHART_PRICE_MAXを取得しても0が返ることがあるため、少し待つか、次のティックで取得するようにしましょう。
まとめ
MQL4のチャートプロパティ定数は、大きく3つの列挙型に分類されます。
- ENUM_CHART_PROPERTY_INTEGER:色・表示切替・モード設定など(最も種類が多い)
- ENUM_CHART_PROPERTY_DOUBLE:価格範囲・スケール関連
- ENUM_CHART_PROPERTY_STRING:チャートコメント
操作にはChartSetInteger()/ChartGetInteger()、ChartSetDouble()/ChartGetDouble()、ChartSetString()/ChartGetString()の6つの関数を使い分けます。
特に、EAやインジケーターでチャートの配色カスタマイズや情報表示を行う際に必須の知識となりますので、まずは本記事のサンプルコードを動かして、チャートプロパティの変更を体験してみてください!

