FX・株・日経225・自動売買・シグナル配信の投資情報総合サイト | MT4やEAのすべてが解かる【fx-on.com】

MQL4とMQL5の互換性について(8)

今回は「オブジェクト関数」について取り上げます。

オブジェクトとは、チャート上に表示させるライン、チャネル、フィボナッチ、図形、矢印などのことです。

通常は、MT4の[挿入]メニュー、MT5の[表示項目の追加]→[オブジェクト]メニューから各オブジェクトを選んでチャート上に表示させます。

これらと同じオブジェクトは、MQL4、MQL5のプログラムから表示させることができます。
そのときに利用するのがオブジェクト関数なのです。

オブジェクト関数の使い方は、大きく分けると

1.オブジェクトの作成
2.オブジェクトの設定
3.オブジェクトの削除

という3つのステップになります。
それぞれのステップについて、MQL4とMQL5の違いを説明していきましょう。




■オブジェクトの作成

オブジェクトを作成する関数は、MQL4、MQL5ともにObjectCreate()です。

ただし、MQL4とMQL5とでは次のようにパラメータの種類と数が異なっています。

[MQL4]
bool ObjectCreate(string name, int type, int window, datetime time1, double price1, datetime time2=0, double price2=0, datetime time3=0, double price3=0)

[MQL5]
bool ObjectCreate(long chart_id, string name, ENUM_OBJECT type, int sub_window, datetime time1, double price1, ..., datetime time30=0, double price30=0)

例えば、ある価格に水平線を引くオブジェクトを生成するには、MQL4の場合、初期化関数init()中に

 ObjectCreate("LineH", OBJ_HLINE, 0, 0, 0);

と記述します。

ここで、「"LineH"」がオブジェクトの名前、「OBJ_HLINE」がオブジェクトの種類を表します。
次の「0」がウィンドウの番号ですが、「0」はチャートウィンドウを表します。
その次の「0」「0」は、時刻、価格を表しますが、ここではそれぞれ「0」にしておきます。

一方、MQL5の場合、最初にチャートIDのパラメータが追加されています。
通常、プログラムを挿入したチャートIDは0なので、「0」というパラメータを追加します。

 ObjectCreate(0, "LineH", OBJ_HLINE, 0, 0, 0);

残りのパラメータはMQL4の場合と同じです。
これを初期化関数OnInit()に記述します。
これで、水平ラインのオブジェクトの準備ができました。




■オブジェクトの設定

水平ラインの価格が固定であれば、ObjectCreate()で指定することもできますが、後から価格が変更になる場合、オブジェクトに値を設定する関数を使います。

オブジェクトに具体的な値を設定する関数として、MQL4の場合、次の二つが用意されています。

 bool ObjectSet(string name, int index, double value) オブジェクトのプロパティ設定
 bool ObjectSetText(string name, string text, int font_size, string font=NULL, color text_color=CLR_NONE)
    オブジェクトのテキスト設定

数値を設定する場合ObjectSet()を、文字列を設定する場合ObjectSetText()を利用します。

一方、MQL5では、オブジェクトを設定する関数は以下の三つです。

 bool ObjectSetDouble(long chart_id, string name, int prop_id, double prop_value)
    実数型オブジェクトプロパティの設定
 bool ObjectSetInteger(long chart_id, string name, int prop_id, long prop_value)
   整数型オブジェクトプロパティの設定
 bool ObjectSetString(long chart_id, string name, int prop_id, string prop_value)
    文字列型オブジェクトプロパティの設定

設定するデータ型が、実数、整数、文字列で区別されています。

例えば、水平ラインに価格priceを設定したい場合、priceは実数データなので、MQL4では、

 ObjectSet("LineH", OBJPROP_PRICE1, price);

MQL5では、

 ObjectSetDouble(0, "LineH", OBJPROP_PRICE, price);

となります。
オブジェクトプロパティID「prop_id」のパラメータがMQL4とMQL5とで若干異なるので注意してください。
これをティック毎に動作するstart()(MQL4の場合)、OnCalculate()(MQL5の場合)の中に記述します。




■オブジェクトの削除

プログラムをチャートから削除したときに、オブジェクトもチャートから消えるように、終了処理関数(MQL4の場合deinit()、MQL5の場合OnDeinit())中にObjectDelete()関数を記述します。

MQL4の場合、

 ObjectDelete("LineH");

のようにオブジェクト名のみをパラメータとして指定します。

MQL5の場合、

 ObjectDelete(0, "LineH");

のようにチャートIDとオブジェクト名を指定します。




■オブジェクトのプログラム例

以上の説明をもとに、簡単なオブジェクトを表示させるカスタム指標プログラムを作成してみます。

表示させるオブジェクトは、下図のような当日の高値と安値の水平ラインとします。



図(USDJPYH1.png)



当日の高値、安値は、MQL4では、

 MarketInfo(Symbol(), MODE_HIGH)
 MarketInfo(Symbol(), MODE_LOW)

で取得します。MQL5では、

 SymbolInfoDouble(_Symbol, SYMBOL_BIDHIGH)
 SymbolInfoDouble(_Symbol, SYMBOL_BIDLOW)

で取得します。

以下にMQL4、MQL5それぞれのプログラムを示します。

MQL4の場合


#property indicator_chart_window

// 初期化関数
int init()
{
   ObjectCreate("LineH", OBJ_HLINE, 0, 0, 0);
   ObjectCreate("LineL", OBJ_HLINE, 0, 0, 0);
   ObjectSet("LineH", OBJPROP_COLOR, Blue);
   ObjectSet("LineL", OBJPROP_COLOR, Red);
   return(0);
}

// 終了処理関数
int deinit()
{
   ObjectDelete("LineH");
ObjectDelete("LineL");
   return(0);
}

// 指標計算関数
int start()
{
   ObjectSet("LineH", OBJPROP_PRICE1, MarketInfo(Symbol(), MODE_HIGH));
   ObjectSet("LineL", OBJPROP_PRICE1, MarketInfo(Symbol(), MODE_LOW));
   return(0);
}






MQL5の場合

#property indicator_chart_window

// 初期化関数
void OnInit()
{
   ObjectCreate(0"LineH"OBJ_HLINE, 0, 0, 0);
   ObjectCreate(0"LineL"OBJ_HLINE, 0, 0, 0);
   ObjectSetInteger(0"LineH"OBJPROP_COLOR, Blue);
   ObjectSetInteger(0"LineL"OBJPROP_COLOR, Red);
}

// 終了処理関数
void OnDeinit(const int reason)
{
   ObjectDelete(0"LineH");
   ObjectDelete(0"LineL");
}

// 指標計算関数
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 &TickVolume[],
                       const long &Volume[],
                       const int &Spread[])
{
   ObjectSetDouble(0"LineH"OBJPROP_PRICESymbolInfoDouble(_SymbolSYMBOL_BIDHIGH));
   ObjectSetDouble(0"LineL"OBJPROP_PRICESymbolInfoDouble(_SymbolSYMBOL_BIDLOW));
   return(rates_total);
}




このような簡単な例では、記述に大きな違いはないので、MQL4からMQL5への移植はそれほど難しくはないでしょう。

公開日:2014年03月15日
Profile
豊嶋教授フォト
豊嶋久道
慶應義塾大学在学中よりC言語プログラミングに親しみ、実用系のフリーソフトウェア、シェアウェアを公開。

1993年博士(工学)の学位を取得
専門はデジタル信号処理。

2003年よりFX取引を始め、システムトレードの道へ。
MetaTrader4、MetaTrader5を利用した売買システムの研究を行っている。

主な著書に
著書