このサイトのオブジェクト関数一覧の記事では、
水平線を1本引くところまでしか実装例がありませんでした。
ですが実際に自作インジケーターを作ろうとすると、必要になるのは水平線だけではありません。
2点を結ぶトレンドライン、特定の足を指す矢印、画面の隅に固定表示するラベル、
この3種類は使う場面が全く違います。
さらに厄介なのは、この3種類はObjectCreateに渡す「座標」
の考え方自体が別物だという点です。
この記事では、3種類のオブジェクトをまとめて描画する実際に動くスクリプトを使って、
それぞれの座標の考え方の違いを解説します。
3種類のオブジェクトで座標の意味が違う
水平線(OBJ_HLINE)は価格(price1)だけで位置が決まり、時間は無視されます。
これに対してトレンドライン(OBJ_TREND)は、
2つの時間と価格の組(time1/price1とtime2/price2)を、
結んだ直線になるため、
始点と終点の両方を指定する必要があります。
矢印(OBJ_ARROW)は水平線と同じく、
1点(time1/price1)だけで位置が決まりますが、
こちらは「その時刻・その価格」にアイコンを置くという意味になります。
そしてラベル(OBJ_LABEL)は、この3つと全く違う考え方で位置が決まります。
ラベルは価格や時間ではなく、チャート画面の四隅からの距離(ピクセル)で位置を指定します。
相場が動いてチャートがスクロールしても、
常に同じ画面位置に表示され続けるのがラベルの特徴です。
実際に動くコード全体(3種類をまとめて描画)
直近10本前の安値から現在足の高値へトレンドラインを引き、
直近20本の最高値の足に下矢印を置き、
画面左上に固定のラベルを表示する、
実際にMetaEditorでコンパイルできるスクリプトです。
//+------------------------------------------------------------------+
//| ObjectTypesDemo.mq4 |
//| 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 strict
#property script_show_inputs
input color TrendColor = clrDodgerBlue;//トレンドラインの色
input color ArrowColor = clrRed;//矢印の色
input color LabelColor = clrWhite;//ラベル文字の色
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
DrawTrendLine();
DrawArrow();
DrawLabel();
}
//+------------------------------------------------------------------+
//| トレンドライン: 2点(time1/price1, time2/price2)を結ぶ |
//+------------------------------------------------------------------+
void DrawTrendLine()
{
string name = "DemoTrendLine";
ObjectDelete(0, name);
datetime t1 = Time[10];
double p1 = Low[10];
datetime t2 = Time[0];
double p2 = High[0];
ObjectCreate(0, name, OBJ_TREND, 0, t1, p1, t2, p2);
ObjectSetInteger(0, name, OBJPROP_COLOR, TrendColor);
ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, false);//右方向へは延長しない
}
//+------------------------------------------------------------------+
//| 矢印: 1点(time1/price1)にアイコンを置く |
//+------------------------------------------------------------------+
void DrawArrow()
{
string name = "DemoArrow";
ObjectDelete(0, name);
int shift = iHighest(NULL, 0, MODE_HIGH, 20, 0);//直近20本の最高値の足
ObjectCreate(0, name, OBJ_ARROW, 0, Time[shift], High[shift] + 20 * Point);
ObjectSetInteger(0, name, OBJPROP_ARROWCODE, SYMBOL_ARROWDOWN);
ObjectSetInteger(0, name, OBJPROP_COLOR, ArrowColor);
}
//+------------------------------------------------------------------+
//| ラベル: 価格・時間ではなく画面の隅からの距離(ピクセル)で位置決め |
//+------------------------------------------------------------------+
void DrawLabel()
{
string name = "DemoLabel";
ObjectDelete(0, name);
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);//time1/price1は使わないので0でよい
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 20);
ObjectSetText(name, "Object Types Demo", 12, "Arial", LabelColor);
}
//+------------------------------------------------------------------+
矢印のOBJPROP_ARROWCODEには、
`233`のような数値を直接書く方法もありますが、
この記事では`SYMBOL_ARROWDOWN`という、
言語組み込みの名前付き定数を使いました。
数値だと上矢印と下矢印を書き間違えても気づきにくいため、
意味の分かる定数名を使う方が安全です。
同様に上向き矢印にしたい場合は`SYMBOL_ARROWUP`を使います。
MetaEditorで実際に動かす手順
- MT4の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
- 「ファイル」→「新規作成」→「スクリプト」を選び、名前を「ObjectTypesDemo」にして作成する
- テンプレートの中身をすべて削除し、上のコードを丸ごと貼り付ける
- F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- チャートへドラッグ&ドロップして実行し、青いトレンドライン・赤い下矢印・左上の白いラベルが同時に表示されることを確認する
コピペして動かない・意図と違うときに確認すること
- ラベルが画面右下など想定と違う位置に出る場合、OBJPROP_CORNERの指定(CORNER_LEFT_UPPER/CORNER_RIGHT_UPPER/CORNER_LEFT_LOWER/CORNER_RIGHT_LOWER)がXDISTANCE・YDISTANCEの基準点を変えることを確認する。右下基準のコーナーでは、XDISTANCEを増やすほど左へ寄る
- トレンドラインが右方向にどこまでも伸びる場合、OBJPROP_RAY_RIGHTがtrue(既定値)のままになっていないか確認する。過去の2点だけを結びたい場合は明示的にfalseへ設定する
- 矢印が想定の足に出ない場合、iHighestの第5引数(start)がずれていないか確認する。0を指定すると最新足を含めた範囲になる
- スクリプトを再実行するたびにオブジェクトが増えていく場合、各Draw関数の先頭にある`ObjectDelete()`を消してしまっていないか確認する。同じ名前で作り直す前に必ず一度削除する
まとめ
トレンドライン・矢印・ラベルは、どれもObjectCreateから作りますが、
渡す座標の意味がそれぞれ違います。
トレンドラインは2点、矢印は1点の「時間と価格」で位置が決まるのに対し、
ラベルだけは画面の隅からのピクセル距離で位置が決まり、時間や価格とは無関係です。
この違いを理解しておけば、オブジェクト関数一覧の記事で紹介した水平線以外の図形も、
迷わず組み合わせられるようになります。
コメント