オブジェクト関数の一覧を調べても、実際にどう組み合わせればチャートにライン1本引けるのか分からない——という人向けの記事です。
この記事では、よく使うオブジェクト関数を1つずつ紹介したあと、実際にMetaEditorでコンパイルしてチャートに水平線を1本表示できるサンプルコードを紹介します。
オブジェクト関数
オブジェクト関数とは、グラフィカルオブジェクトを操作する為の関数です。
オブジェクト関数はかなり量があるので、よく使うオブジェクト関数をご紹介したいと思います。あわせて、現在の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
指定した名前のオブジェクトを削除します。
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(非推奨)
指定したオブジェクトのプロパティ値を変更します。
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()で作り直している点です。これを省くと、同じ名前のオブジェクトが既に存在している場合は上書きされるだけなので実害はありませんが、「削除してから作り直す」習慣をつけておくと、名前の付け方を変えたときの二重表示事故を防げます。
コメント