オブジェクト関数の一覧を調べても、
実際にどう組み合わせればチャートにライン1本引けるのか分からない
——という人向けの記事です。
この記事では、よく使うオブジェクト関数を1つずつ紹介したあと、
実際にMetaEditorでコンパイルして
チャートに水平線を1本表示できるサンプルコードを紹介します。
ObjectCreate・ObjectNameでオブジェクトを生成・取得する
オブジェクト関数とは、
グラフィカルオブジェクトを操作する為の関数です。
オブジェクト関数はかなり量があるので、
よく使うオブジェクト関数をご紹介したいと思います。
あわせて、現在のMQL4で推奨されている書き方
(チャートIDを明示する形)で紹介します。
ObjectCreate関数でオブジェクトを生成する
指定したチャートに指定したタイプの
オブジェクトを生成します。
bool ObjectCreate( long chart_id, // チャートID(0で現在のチャート) string name, // オブジェクト名 ENUM_OBJECT type, // オブジェクトタイプ int sub_window, // ウインドウインデックス datetime time1, // 1番目の時間のアンカーポイント double price1, // 1番目の価格のアンカーポイント datetime time2=0, // 2番目の時間のアンカーポイント double price2=0, // 2番目の価格のアンカーポイント datetime time3=0, // 3番目の時間のアンカーポイント double price3=0 // 3番目の価格のアンカーポイント );
・chart_id引数を省略した1つ古い書き方
(
ObjectCreate(name, type,
sub_window, ...))も動きます・複数チャートを同時に扱う場面で挙動が不安定になりやすいため
・現在はchart_idを明示する書き方が推奨されています
ObjectName関数でオブジェクト名を取得する
オブジェクトリストの指定したインデックスに
対応するオブジェクト名を返します。
string ObjectName( long chart_id, // チャートID(0で現在のチャート) int pos, // オブジェクトリストの位置 int sub_window=-1, // ウインドウインデックス(-1で全ウインドウ) int type=-1 // オブジェクトタイプ(-1で全タイプ) );
ObjectDelete・ObjectsDeleteAllでオブジェクトを削除する
次に、作成したオブジェクトを削除する
2つの関数を確認します。
ObjectDelete関数で指定した名前を削除する
指定した名前のオブジェクトを削除します。
bool ObjectDelete( long chart_id, // チャートID(0で現在のチャート) string name // オブジェクト名 );
ObjectsDeleteAll関数で指定タイプを一括削除する
指定したサブウインドウから
指定したタイプのオブジェクトを全て削除します。
bool ObjectsDeleteAll( long chart_id, // チャートID(0で現在のチャート) int sub_window = -1, // ウインドウインデックス(-1で全ウインドウ) int type = -1 // オブジェクトタイプ(-1で全タイプ) );
ObjectSet・ObjectType・ObjectSetTextでプロパティを扱う
続いて、オブジェクトの見た目や種類を
扱う関数を確認します。
ObjectSet関数(非推奨)と現行APIへの置き換え
指定したオブジェクトのプロパティ値を変更します。
bool ObjectSet( string object_name, // オブジェクト名 int index, // プロパティインデックス double value // 設定値 );
・ObjectSet()は非推奨(レガシー)関数です
・今も動作しますが、現在は設定する値の型に応じて
ObjectSetInteger()(色・スタイル等の整数値)、ObjectSetDouble()(価格等の小数値)、ObjectSetString()(テキスト等の文字列)に分かれています・次のセクションのサンプルコードでは
ObjectSetInteger()を使いますObjectType関数とオブジェクトタイプの定数一覧
オブジェクトタイプを返します。
int ObjectType( string object_name // object name );
| OBJ_VLINE | 垂直線 |
| OBJ_HLINE | 水平線 |
| OBJ_TREND | トレンドライン |
| OBJ_TRENDBYANGLE | 角度によるトレンドライン |
| OBJ_CYCLES | サイクルライン |
| OBJ_CHANNEL | チャネル |
| OBJ_STDDEVCHANNEL | 標準偏差チャネル |
| OBJ_REGRESSION | 線形回帰 |
| OBJ_PITCHFORK | アンドリュース・ピッチフォーク |
| OBJ_GANNLINE | ギャンライン |
| OBJ_GANNFAN | ギャンファン |
| OBJ_GANNGRID | ギャングリッド |
| OBJ_FIBO | フィボナッチリトレースメント |
| OBJ_FIBOTIMES | フィボナッチタイムゾーン |
| OBJ_FIBOFAN | フィボナッチファン |
| OBJ_FIBOARC | フィボナッチ円弧 |
| OBJ_FIBOCHANNEL | フィボナッチチャネル |
| OBJ_EXPANSION | フィボナッチ拡張 |
| OBJ_RECTANGLE | 長方形 |
| OBJ_TRIANGLE | 三角形 |
| OBJ_ELLIPSE | 楕円 |
| OBJ_ARROW_THUMB_UP | サムズアップ |
| OBJ_ARROW_THUMB_DOWN | サムズダウン |
| OBJ_ARROW_UP | 上矢印 |
| OBJ_ARROW_DOWN | 下矢印 |
| OBJ_ARROW_STOP | ストップサイン |
| OBJ_ARROW_CHECK | チェックサイン |
| OBJ_ARROW_LEFT_PRICE | 価格ラベル(左側) |
| OBJ_ARROW_RIGHT_PRICE | 価格ラベル(右側) |
| OBJ_ARROW_BUY | 買いサイン |
| OBJ_ARROW_SELL | 売りサイン |
| OBJ_ARROW | 矢印 |
| OBJ_TEXT | テキスト |
| OBJ_LABEL | ラベル |
| OBJ_BUTTON | ボタン |
| OBJ_BITMAP | ビットマップ |
| OBJ_BITMAP_LABEL | ビットマップラベル |
| OBJ_EDIT | 編集枠 |
| OBJ_EVENT | 経済指標カレンダーに反応するイベントオブジェクト |
| OBJ_RECTANGLE_LABEL | カスタムグラフィカルインターフェースを作成したり デザインするオブジェクト |
ObjectSetText関数で説明文を変更する
オブジェクトの説明を変更します。
bool ObjectSetText( string object_name, // オブジェクト名 string text, // 説明 int font_size = 0, // フォントサイズ string font_name = NULL, // フォント color text_color = clrNONE // 色 );
オブジェクト関数を組み合わせて水平線を1本引く
ここまでの関数を組み合わせて、
現在のBid価格に水平線を1本引くだけの
最小限のインジケーターを作ってみましょう。
//+------------------------------------------------------------------+
//| PriceLine.mq4 |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectDelete(0, "PriceLine");//チャートから削除
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
ObjectDelete(0, "PriceLine");//毎回いったん削除して重複を防ぐ
ObjectCreate(0, "PriceLine", OBJ_HLINE, 0, 0, Bid);
ObjectSetInteger(0, "PriceLine", OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, "PriceLine", OBJPROP_COLOR, clrYellow);
return(rates_total);
}
//+------------------------------------------------------------------+
ポイントは、毎回ObjectDelete()で
同じ名前のオブジェクトを一度削除してから
ObjectCreate()で作り直している点です。
これを省くと、同じ名前のオブジェクトが
既に存在している場合は上書きされるだけなので実害はありませんが、
「削除してから作り直す」習慣をつけておくと、
名前の付け方を変えたときの二重表示事故を防げます。
【MQL】図形やラインを表示させるための『オブジェクト関数一覧』についてまとめてみた:まとめ
ObjectCreate・ObjectDelete・ObjectSetInteger等の
基本的なオブジェクト関数を組み合わせれば、
水平線1本のようなシンプルな表示から始められます。
まずは今回のPriceLine.mq4のような
最小構成のコードで動きを確認し、
必要なオブジェクトタイプや装飾を少しずつ増やしていくとよいでしょう。
コメント