現在レートに水平線を表示する方法

MetaTrader 4
GogoJungle
2019/08/02 20:34
186

オブジェクトの作成
チャート上にラインを表示するにはObjectCreate関数を使用します。

bool ObjectCreate(
   long chart_id,
   string object_name,
   ENUM_OBJECT object_type,
   sub_window sub_window,
   datetime time1,
   double price1,
   ...
   datetime timeN=0,
   double priceN=0
);

インジケーターを挿入したチャートにオブジェクトを表示するにはchart_idに0を指定します。chart_idに適切な値を指定することで他のチャートにオブジェクトを挿入することも可能です。
MT4におけるチャートIDについて

object_nameには他のオブジェクトと重複しない名前を付けます。この名前をもとにしてオブジェクトを管理します。
水平線を表示する場合にはobject_typeにOBJ_HLINEを指定します。
オブジェクトをサブウィンドウ(MACDやRSIが表示されるチャート下のウィンドウ)に表示する場合にはsub_windowにサブウィンドウの番号を指定します。メインのチャートに表示する場合には0を指定します。

OnInit内でオブジェクトを作成する例は以下のようになります。

#include <stdlib.mqh>

string LineName = "SampleHLine";

int OnInit(){

   if(ObjectCreate(0, LineName, OBJ_HLINE, 0, Time[0], Close[0]) == false){
      Print(__FUNCTION__, " ObjectCreate Error : ", ErrorDescription(GetLastError()));
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}

オブジェクトの設定を変更する

ObjectSet関数を使うことでオブジェクトの設定を変更することができます。
表示位置、色、大きさなど様々な項目を変更可能です。

bool ObjectSet(
   string object_name,
   int index,
   double value
);

object_nameには設定を変更するオブジェクトの名前を指定します。
indexにはどの項目を変更するかを指定します。Object Properties
valueには変更後の値を指定します。

レートが動く毎にオブジェクトの表示位置を現在レートに変更するには、indexにOBJPROP_
PRICE1を指定、valueに現在レートを指定します。

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[]){
  
   if(ObjectSet(LineName, OBJPROP_PRICE1, Close[0]) == false){
      Print(__FUNCTION__, " ObjectSet Error : ", ErrorDescription(GetLastError()));
      return(INIT_FAILED);
   }
  
   return(rates_total);
}

オブジェクトを削除する

チャートからオブジェクトを削除するには、ObjectDelete関数を使用します。

bool ObjectDelete(
   long chart_id,
   string object_name
);

インジケーターを削除した際に表示が消えるよう、OnDeinit関数内で実行する例です。

void OnDeinit(const int reason){
   if(ObjectDelete(0, LineName) == false){
      Print(__FUNCTION__, " ObjectDelete Error : ", ErrorDescription(GetLastError()));
   }
}

まとめ

最終的には以下のコードとなります。

#property copyright "Copyright 2016, gogojungle"
#property link      "http://labo.fx-on.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#include <stdlib.mqh>

string LineName = "SampleHLine";

int OnInit(){

   if(ObjectCreate(0, LineName, OBJ_HLINE, 0, Time[0], Close[0]) == false){
      Print(__FUNCTION__, " ObjectCreate Error : ", ErrorDescription(GetLastError()));
      return(INIT_FAILED);
   }
   if(ObjectSet(LineName, OBJPROP_PRICE1, Close[0]) == false){
      Print(__FUNCTION__, " ObjectSet Error : ", ErrorDescription(GetLastError()));
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}

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[]){
  
   if(ObjectSet(LineName, OBJPROP_PRICE1, Close[0]) == false){
      Print(__FUNCTION__, " ObjectSet Error : ", ErrorDescription(GetLastError()));
      return(INIT_FAILED);
   }
  
   return(rates_total);
}

void OnDeinit(const int reason){
   if(ObjectDelete(0, LineName) == false){
      Print(__FUNCTION__, " ObjectDelete Error : ", ErrorDescription(GetLastError()));
   }
}

コメント

関連項目

検索結果がありません。