前回、オブジェクトで作成したインジゲーターのランプが点灯してるかどうかを、
色の情報を取得してチェックする方法について、簡単にご紹介しました。
参考記事:
オブジェクトの色を取得して売買条件(EA)に組み込む
オブジェクトの色情報を取得できれば、その情報をEAの売買条件に使ったりすることができます。
これができるようになったことで、開発の幅が広がりました。
ということで、今回も色の情報を取得する方法について、別の形のインジゲーターを使って、
取得してみました。
今回は、オブジェクトで作成したメーターの状態(点灯してるか)をチェックする方法について、
簡単にご紹介していきたいと思います。
以下から作成過程を説明していきます。
今回は、以前作成した「RSI Meter」というインジゲーターを例として利用します。
このインジゲーターは、現在のRSIの値をメーター化して視覚的に見やすくしたものです。
参考記事:
MQLのオブジェクトでメーターを作る【簡易版】
前回もRSIの値をベースにしたインジゲーターを例として利用しましたが、
指定した値以上で点灯、指定した値以下で点灯させるパターンのインジゲーターだったので、
2つのオブジェクトの色を取得するだけでした。
今回も取得するオブジェクトの数は少ないですが、インジゲーターの形が違うので、
別パターンとして紹介していきたいと思います。
今回は、メーター1つ1つの色情報を取得していきます。
「RSI Meter」のメーターは全部で、5つあります。
各メーターの点灯条件は、下からRSIの値が、
0以上のとき点灯
20以上のとき点灯
40以上のとき点灯
60以上のとき点灯
80以上のとき点灯
という仕組みになっています。
ということで、まずは、
「ObjectGet(オブジェクト名,OBJPROP_BGCOLOR);」
で、色の情報を取得していきます。
前回は、「OBJPROP_COLOR」で色が取得できましたが、
今回は、背景色と線の色があるので、上記の方法だとオブジェクトの背景色が取得できませんでした。
背景色の情報を取得するには、「OBJPROP_BGCOLOR」を使います。
ちょっと、初歩的なミスで見落としていた部分ですが、忘れないようにメモとして残しておきます。
参考記事:
オブジェクトの色(カラーコード)を取得する方法
では、早速オブジェクトの色情報を取得していきます。
今回はメーターが5つあるので、1つ1つのメーターの色情報を取得していく必要があります。
各メーターの状態(色)によって、ログにメッセージを表示するようにします。
今回もわかりやすいようにメーターの色はすべて赤色にします。
赤色は、10進数で「255」になります。
この取得した値を条件文に組み込んでみたいと思います。
今回も、インジゲーターではなくて、EA用として条件文を組み込んでいくので、
EAファイルで以下のコードを書いて作成します。
void OnTick()
{
①color color_code = 255;
②color obj_color = "";
③obj_color = ObjectGet("meter01",OBJPROP_BGCOLOR);
④if(color_code == obj_color){
⑤Print("1つ目のメーター点灯(RSIの値は20以下)");
}
obj_color = ObjectGet("meter02",OBJPROP_BGCOLOR);
if(color_code == obj_color){
Print("2つ目のメーター点灯(RSIの値が20以上)");
}
obj_color = ObjectGet("meter03",OBJPROP_BGCOLOR);
if(color_code == obj_color){
Print("3つ目のメーター点灯(RSIの値が40以上)");
}
obj_color = ObjectGet("meter04",OBJPROP_BGCOLOR);
if(color_code == obj_color){
Print("4つ目のメーター点灯(RSIの値が60以上)");
}
obj_color = ObjectGet("meter05",OBJPROP_BGCOLOR);
if(color_code == obj_color){
Print("5つ目のメーター点灯(RSIの値が80以上)");
}
}
①color color_code = 255;
売買条件で利用する色の値を入れておく変数。今回は赤色(255)を変数の代入しています。
②color obj_color = "";
color型の変数「obj_color」を宣言して中身を空にしておきます
。
③obj_color = ObjectGet("meter01",OBJPROP_BGCOLOR);
一番下のメーター(オブジェクト)の色情報を取得する。一番下のオブジェクト名は「"meter01"」です。
オブジェクト名がわからない場合は、ObjectNameで確認することができます。
参考記事:
オブジェクトの名前や値を取得する方法
④if(color_code == obj_color){
取得した色が赤色(255)ならという条件文。
⑤Print("1つ目のメーター点灯(RSIの値は20以下)");
1つ目のメーターが点灯していること(現在のRSIの値が20以下)がわかるようにログに表示する。
以下は、③~⑤の繰り返しで、各メーターの状態をチェックしているだけなので、
省略させていただきます。
これをコンパイルして実行すると以下のような結果になります。
EAを実行する前にインジゲーターを先に起動しておく必要があります。
■1つ目と2つ目のメーターが点灯しているとき(RSIの値は20以上)
RSI_Meterの表示(インジゲーター側)
メーターが表示されているときのログ(EA側)
■1つ目、2つ目、3つ目のメーターが点灯しているとき(RSIの値は40以上)
RSI_Meterの表示(インジゲーター側)
メーターが表示されているときのログ(EA側)
このように、現在のRSIの値によって、どのメーターが点灯しているかを、
ログに「~つ目のメーター点灯~」と表示しています。
今回も、売買のコードは書いていませんが、
たとえば、3つ目のメーターが点灯したときに売買注文をしたいときには、
他のメーターのチェックはしないで、3つ目のメーターの状態だけをチェックして、
Printの部分を売買させるコードなどに変更すれば、
EAなどに利用することができます。
注意点として、今回のコードだとtickごとにメーターのチェックをしてログに表示させているので、
メーターに変化があったときだけ、ログを表示させるなどの方法にした方が、
MT4の負荷を減らせると思うので、不要な処理は削除しておいた方が良いです。
そのあたりについては、また次回以降に書いていきたいと思います。
参考MQL:
ObjectGet
参考MQL:
Print
いかがだったでしょうか?
今回は、オブジェクトで作成したメーターのインジゲーターの色情報を取得して、
メーターの状態をチェックする方法について簡単にご紹介しました。
前回と今回、例として利用したインジゲーター以外にもいろいろな形、パターンのものがありますが、
基本的に色を取得する方法は同じです。
そのインジゲーターの特徴や表示されているものがどういった意味を持つかを理解できれば、
色情報を取得して、EAにしたりすることができます。
今後も、また何か思いついたことなどをメモとして書いていきたいと思います。
それでは、また。