MQL4でオブジェクトを描画するコードをネットで探すと、
chart_idを書かない古いサンプルがまだたくさん出てきます。
このコードは今のMQL4でも問題なく動くのですが、
同じ書き方をMQL5に持ち込むとコンパイルが通りません。
原因は関数が変わったからではなく、
MQL4だけが持つ「後方互換」という仕組みのためです。
この記事では、MQL4とMQL5でObjectCreate関数がどう違うのか、
そしてMQL5でオブジェクトを作成・削除する実際に動くコードを解説します。
設計思想: MQL4は「大昔の書式も動く」、MQL5は「現行の書式しかない」
MQL4は2005年ごろから使われている言語で、
当時のObjectCreateはchart_id引数を持たず、
オブジェクトの種類(type)も単なる数値(int)で指定する書式でした。
その後MetaQuotes社は関数を現行の形
(chart_id引数付き、typeがENUM_OBJECT型)に作り直しましたが、
世界中にすでに大量のMQL4コードが存在していたため、
大昔の書式も引き続き使えるように後方互換を残しました。
このサイトのオブジェクト関数まとめ記事で解説しているObjectCreateも、
現行の書式を採用しています。
一方のMQL5は、MQL4とは別の言語として2010年に新しく設計されたため、
過去のしがらみを引き継いでいません。
ObjectCreateにも現行の書式しか存在せず、
大昔のMQL4のような「chart_idを省略した書き方」
は最初から用意されていません。
つまり、ネットで拾った古いMQL4サンプルをMQL5にそのまま貼り付けると、
引数の個数や型が合わずコンパイルエラーになります。
MQL5のObjectCreate関数の書式
bool ObjectCreate( long chart_id, //チャートID(0で現在のチャート) string name, //オブジェクト名(一意である必要がある) ENUM_OBJECT type, //オブジェクトの種類(OBJ_HLINE等) int nwin, //サブウィンドウ番号(0はメイン画面) datetime time1, //1番目のアンカーポイントの時間 double price1, //1番目のアンカーポイントの価格 datetime time2=0, //2番目のアンカーポイントの時間 double price2=0, //2番目のアンカーポイントの価格 datetime time3=0, //3番目のアンカーポイントの時間 double price3=0 //3番目のアンカーポイントの価格 );
戻り値は作成の成否(bool)です。
アンカーポイント(time/priceの組)は最大3組まで指定できますが、
実際に使う数はオブジェクトの種類によって変わります。
水平線(OBJ_HLINE)のように価格1つだけで決まる図形は
time1/price1だけで足り、
トレンドラインのように2点を結ぶ図形は
time2/price2まで指定します。
typeがENUM_OBJECT型になっている意味
大昔のMQL4ではtypeが単なるintだったため、
存在しない数値(例えば999)を渡してもコンパイル自体は通り、
実行時に「オブジェクトが作成できない」という形で
問題が表面化していました。
現行のMQL4とMQL5では、
typeがENUM_OBJECTという専用の型になっているため、
OBJ_HLINEやOBJ_TRENDのような決められた定数以外を渡すと
コンパイルの時点ではじかれます。
バグに気づくタイミングが実行時ではなくコンパイル時に早まる、
という地味ですが実務的に助かる違いです。
実際に動くコード全体(水平線の作成と削除)
現在値の位置に水平線を作成し、色と太さを設定したうえで、5秒後に画面から削除する、
実際にMetaEditorでコンパイルできるスクリプトです。
//+------------------------------------------------------------------+
//| ObjectCreateDemo.mq5 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property script_show_inputs
input color LineColor = clrDodgerBlue;//水平線の色
input int LineWidth = 2;//水平線の太さ
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
long chartId = ChartID();
string name = "DemoHLine";
double price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
if(!ObjectCreate(chartId, name, OBJ_HLINE, 0, 0, price))
{
Print("ObjectCreateに失敗しました。エラーコード=", GetLastError());
return;
}
ObjectSetInteger(chartId, name, OBJPROP_COLOR, LineColor);
ObjectSetInteger(chartId, name, OBJPROP_WIDTH, LineWidth);
ObjectSetInteger(chartId, name, OBJPROP_STYLE, STYLE_DASH);
ChartRedraw(chartId);
Print("水平線を", DoubleToString(price, _Digits), "の位置に作成しました。5秒後に削除します。");
Sleep(5000);
if(!ObjectDelete(chartId, name))
Print("ObjectDeleteに失敗しました。エラーコード=", GetLastError());
ChartRedraw(chartId);
}
//+------------------------------------------------------------------+
MetaEditorで実際に動かす手順
- MetaTrader 5の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
- 「ファイル」→「新規作成」→「スクリプト」を選び、名前を「ObjectCreateDemo」にして作成する
- テンプレートの中身をすべて削除し、上のコードを丸ごと貼り付ける
- F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- チャートへドラッグ&ドロップして実行し、青い点線の水平線が一瞬表示されたあと5秒で消えることを確認する
コピペして動かないときに確認すること
- ネットの古いMQL4サンプル(`ObjectCreate(“name”, OBJ_HLINE, 0, time, price)`のようにchart_idがない書き方)をそのまま貼り付けていないか。MQL5には大昔の書式が存在しないため、必ず先頭にchart_idを追加する
- `ObjectCreate()`の第3引数にENUM_OBJECT以外の値を渡していないか。存在しない数値を直接書くとコンパイルエラーになる
- 同じ名前(name)のオブジェクトがすでに存在していないか。同名のオブジェクトが残っていると`ObjectCreate()`が失敗して`false`を返す(スクリプトを何度も実行して前回分を消し忘れているとよく起きる)
- 色や太さが反映されない場合、`ObjectSetInteger()`の呼び出し順序が`ObjectCreate()`より後になっているか確認する(作成前にプロパティを設定しても無視される)
まとめ
MQL4のObjectCreateは、
大昔の書式(chart_idなし・typeがint)と
現行の書式(chart_id付き・ENUM_OBJECT型)の
両方が今も動く、後方互換に配慮した言語です。
一方のMQL5には現行の書式しか存在しないため、
ネットで見つけた古いMQL4サンプルをそのまま持ち込むと
コンパイルが通りません。
typeがENUM_OBJECT型になったことで、
存在しない値を渡すミスもコンパイル時点で
防げるようになっています。
コメント