描画オブジェクトの作成 (ObjectCreate)
MetaTrader のチャート上に何らかの図形を描画するには、ObjectCreate 関数(日本語)を使って、描画オブジェクトを生成します。
chart_id / sub_window
chart_id
引数と sub_window
引数には、どのチャートの、どのウィンドウに描画オブジェクトを表示するかを指定します。
カレントチャートのメインウィンドウに表示するのであれば、両方とも 0 を指定しておけば OK です。
name
name
引数では、作成する描画オブジェクトに名前を付けます。
描画オブジェクトの各種プロパティを設定するときは、この名前で描画オブジェクトを指定することになります。
名前はチャート内(サブウィンドウを含む)で一意でなければいけません。
ただし、使用上 63 文字までしか使えないので、その範囲で他のインジケーターとできるだけ被らない名前を付ける必要があります。
簡単なテクニックとして、次のようなプレフィックスマクロを定義しておけば、
オブジェクト名が必要なところで次のように使えます。
文字列リテラルを並べると自動的に結合されるので、+
演算子を使った文字列結合は必要ないことに注意してください。
type
type
引数では、どのような種類の描画オブジェクトを作成するかを指定します。
例えば、ラベルであれば OBJ_LABEL
を指定し、水平線であれば OBJ_HLINE
を指定します。
time1 / price1
time1
引数や price1
引数では、描画オブジェクトのアンカーポイントを指定します。
アンカーポイントとは、描画オブジェクトの表示位置を示す座標情報です。
描画オブジェクトの種類によって、アンカーポイントをいくつ指定しなければいけないかが決まっています(0 個以上)。
例えば、長方形オブジェクト (OBJ_RECTANGLE
) やトレンドラインオブジェクト (OBJ_TREND
) の場合は、2 つのアンカーポイント(time1
、price1
、time2
、price2
)を指定する必要があります。
ラベルオブジェクト (OBJ_LABEL
) のように、アンカーポイントをまったく使用しない描画オブジェクトもあります(ラベルの表示位置は OBJPROP_XDISTANCE
などのプロパティで指定します)。
その場合でも、ObjectCreate
関数の使用上、1 つはアンカーポイントを指定しなければいけません。
ラベルオブジェクトを作成する場合は、time1
引数と price1
引数には、適当に 0 を指定しておけば OK です。
次のインジケーターでは、CreateObject
関数を使って、1 つの水平線オブジェクト (OBJ_HLINE
) を作成しています。
水平線は 1 つのアンカーポイント(price1
のみ)を使用します。
描画オブジェクトの削除 (ObjectDelete, ObjectDeleteAll)
描画オブジェクトを 1 つずつ削除(ObjectDelete)
CreateObject
で作成した描画オブジェクトは、ObjectDelete 関数(日本語)を使って削除することができます。
インジケーターの OnDeinit
関数内で呼び出すようにしておけば、インジケーターをチャートからデタッチしたときに、自動的に描画オブジェクトを削除できます。
注意点としては、ObjectDelete
関数は非同期で実行されるため、OnDeinit
関数で単独で呼び出しても処理が即座に反映されないことがあるということです(市場がクローズしているときなど)。
この問題を解決するには、ObjectDelete
関数の後ろで、ObjectFind
関数など同期実行される関数を呼び出しておきます。
描画オブジェクトをまとめて削除 (ObjectsDeleteAll)
ObjectDeleteAll 関数(日本語)を使うと、指定したチャート内の描画オブジェクトをまとめて削除することができます。
2 つ目のバージョンでは、指定したプレフィックスを名前に持つ描画オブジェクトだけをまとめて削除することができます。 これを使えば、インジケーターが自分で追加したオブジェクトだけをまとめて削除することができます。
次のインジケーターは、チャートへのアタッチ時に 3 つの水平線を生成し、デタッチ時に自分が作成した水平線をすべて削除します。
描画オブジェクトの設定 (ObjectSetXxx)
ObjectCreate
関数によって描画オブジェクトを作成したら、あとは次のような関数を使って各種プロパティを設定していきます。
- ObjectSetInteger 関数(日本語)… 整数型のプロパティを設定
- ObjectSetDouble 関数(日本語)… 浮動小数点数型のプロパティを設定
- ObjectSetString 関数(日本語)… 文字列型のプロパティを設定
次のサンプルスクリプトでは、ラベルオブジェクト作成し、上記の関数を使ってフォントサイズや表示位置の設定を行っています。
関連記事
- MetaTrader/MQL: 価格情報を取得する (SymbolInfoTick, CopyRates)
- MetaTrader/MQL: OrderSend で決済注文を出す(ポジションのクローズ)(MT5)
- MetaTrader/MQL: ヘッジアカウントとネットアカウントの違いを理解する
- MetaTrader/MQL: OrderSend で成行注文を出す (MT5)
- MetaTrader/MQL: チャート上でのキーハンドリング (OnChartEvent)
- MetaTrader/MQL: プログラムがデモ口座で実行されている調べる (ACCOUNT_TRADE_MODE)
- MetaTrader/MQL: 注文時のフィル・ポリシー(充填ポリシー)を理解する