ObjectCreateチャートに部品(線・ラベル・ボタン等)を置く
チャートの上に矢印・線・ラベル・ボタンなどを置く、いちばん基本の関数。パネルを持つインジ・EAは、ほぼ必ずこれを呼んでいる。同じ名前が既にあると失敗するため、名前の付け方と存在確認が実務の9割を占める。
1書式
bool ObjectCreate( string name, // オブジェクトの名前(一意) int type, // OBJ_LABEL などの種類 int window, // サブウィンドウ番号(0=本窓) datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0 );
bool ObjectCreate( long chart_id, // ★チャートIDが先頭に増える(0=いまのチャート) string name, ENUM_OBJECT type, // ★intからENUM_OBJECTに int sub_window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0 );
MQL5は先頭に chart_id が増える点と、type の型が変わる点の2つを直せば、ほぼそのまま動く。
2引数
| 引数 | 内容 |
|---|---|
| chart_id MQL5のみ | 対象のチャート。0でいま実行しているチャート |
| name | オブジェクト名。他のオブジェクトと重複できない(重複時は失敗しGetLastErrorに4200が入る) |
| type | 種類。OBJ_LABEL(文字)・OBJ_RECTANGLE_LABEL(塗り枠)・OBJ_BUTTON・OBJ_HLINEなど |
| window / sub_window | サブウィンドウ番号。0で価格の本窓 |
| time1,price1… | 種類ごとに使う数が違う(ラベル系は無視され、座標は別途 OBJPROP_XDISTANCE 等で指定する) |
3戻り値
成功でtrue。同じ名前のオブジェクトが既にあるとfalse(上書きはされない)。作る前にObjectFindで存在を確かめ、無いときだけ作るのが定石。
4実際に動かした結果
同名で2回 ObjectCreate を呼んだときの挙動を確認。
| 操作 | 結果 |
|---|---|
| 1回目:ObjectCreate(0,”lab1″,OBJ_LABEL,0,0,0) | true・作成される |
| 2回目:同じ名前でもう一度 | false(既存のオブジェクトはそのまま残る) |
| ObjectSetString で位置だけ更新 | 既存のオブジェクトの座標が動く(作り直し不要) |
5使用例:無ければ作り、あれば動かすだけにする
void Lab(string name, int x, int y, string txt, color c)
{
if(ObjectFind(0, name) < 0)
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetString (0, name, OBJPROP_TEXT, txt);
ObjectSetInteger(0, name, OBJPROP_COLOR, c);
}
毎ティック呼んでも、2回目以降は座標と文字を書き換えるだけになる(作り直さない)。MetaEditorでコンパイル0エラー・0警告を確認済み。
6MQL4→MQL5の違い
クリックの当たり判定の優先順位が逆になる。MT4はボタンを最優先で拾うが、MT5はボタンの上を横切る線(水平線など)をボタンより先に拾う(線から約7ドット以内)。目盛り線とボタンを両方持つパネルは、MT5だけボタンが反応しない、という形で症状が出る。
直し方は、クリックされたいオブジェクトに OBJPROP_ZORDER を高い値(例:10)で設定すること。
同じ見た目でも、クリックの相手がMT4とMT5で違う
7よくある罠
- OBJ_LABELは横幅およそ375pxで描画が切れる。長い注記は全角30字程度までに収める。
- OBJ_BUTTON等は全角記号(− ◀ ▶ +)を描けず「?」になる。矢印は▲▼のみ描ける。半角の
- + < >を使う。 - OBJ_RECTANGLE_LABELを重ねると色が混ざって見えることがある(透過ではなく色そのものが変わって見える)。塗り分けは重ねずに済む配置にする。
OBJPROP_TIMEFRAMESを切り替えると描画の順番が変わり、文字が枠の下に隠れることがある。
8関連する関数
9使っている無料ツール
今日はどこを見ればいいか。
ドル円とユーロドルの主要ライン・予想高値安値を、平日の朝に図1枚にまとめています。
朝刊を見る→