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

オブジェクトの作成


チャート上にラインを表示するには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()));
}
}
TwitterでシェアFacebookでシェアGoogle+でシェアはてなブックマークに追加

TOPへ