オブジェクト関数の一覧を調べても、実際にどう組み合わせればチャートにライン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);
  }
//+------------------------------------------------------------------+
Copy

ポイントは、毎回ObjectDelete()で同じ名前のオブジェクトを一度削除してからObjectCreate()で作り直している点です。これを省くと、同じ名前のオブジェクトが既に存在している場合は上書きされるだけなので実害はありませんが、「削除してから作り直す」習慣をつけておくと、名前の付け方を変えたときの二重表示事故を防げます。

まとめ

関連記事