オブジェクトの色(カラーコード)を取得する方法
公開日:2018/12/14
インジゲーターとEAの作成をするときにオブジェクトの色を指定したり、
色を取得したりする必要が出てきます。
色ってデザインについて重要になってくるので、少し学んでおきたいと思います。
ホームページやアプリ、POPなどを作るときにも同じように色については、
避けては通れない部分になります。
デザイン力上げたいです...。
今まで作ってきたインジゲーターも正直のところ、
デザインに関しては、あとで変更すればいーやくらいの感覚でやっていたので、
これからはもう少し色について意識していきたいところです。
参考記事:
MQLのオブジェクトでメーターを作る【簡易版】
参考記事:
設計図を作って、MQLのオブジェクトでRSIの信号機(ランプ)サインを作る【簡易版】
参考記事:
オブジェクトでインジゲーターを作る方法【矢印サイン版】
それと、インジゲーターを作るときにももちろん必要になる知識になるんですが、
インジゲーターをEA化するときにも、重要になってきます。
なぜかというと、、
色を取得できれば、EAに組み込むこともできるようになる
からです。
前回同様に、これができるようになると、
色の変化によって、エントリーや決済の判断が必要になるインジゲーターを、
EA化することができるようになります。
こういったインジゲーターもあまり多くはないですが、
例えば、
以前作った、RSIのメーターのインジゲーターなんかも、
メーターの強さの変化を色で表していた場合、
色を取得することができれば、強さによって、
エントリーや決済の条件に組み込むことができるようになります。
これってなかなか便利じゃないですか?
ということで、今回は色について紹介していきたいと思います。
とくに色を表すカラーコードについて詳しく触れていきたいと思います。
以下から作成過程を説明していきます。
オブジェクトの色を取得する
今回も、新しく作ったインジゲーター「obj_text_box」を使って説明していきます。
このインジゲーターは、色を取得するための例として使うために作った簡単なインジゲーターですが、
以下のような表示がされます。
四角形(緑色)と文字列(黄色)の2つのオブジェクトが表示されます。
今回は、この四角形と文字列の色を取得します。
コードは以下のようになります。
①obj_total = ObjectsTotal();
②int i = 0;
③for(i = 0; i < obj_total; i++)
{
④string obj_name = ObjectName(i);
⑤color obj_color = ObjectGet(obj_name,OBJPROP_COLOR);
⑥Print("オブジェクト名:"+obj_name+" オブジェクトの色:"+obj_color);
①int obj_total = ObjectsTotal();
表示されているオブジェクトの数を入れるための変数。
②int i = 0;
変数「i」に0を代入します。
③for(i = 0; i < obj_total; i++)
オブジェクトの総数分、繰り返し処理をします。
④string obj_name = ObjectName(i);
string型の変数「obj_name」にオブジェクト名を代入します。
⑤color obj_color = ObjectGet(obj_name,OBJPROP_COLOR);
color型の変数「obj_color」にオブジェクトの色を代入します。ここに今回必要な色情報(数値)が入っています。
⑥Print("オブジェクト名:"+obj_name+" オブジェクトの色:"+obj_color);
ログにオブジェクト名とオブジェクトの色情報を表示します。
これを実行すると以下のような結果になります。
実行結果
オブジェクト名とオブジェクトの色情報がログで表示されました。
さて、ここで問題です。
オブジェクトの色が数字で表示されています。
この数字の色は何色でしょうか?
わかりませんよね?
私も最初はなんのこっちゃと思いましたが、
ホームページなどを作っていたので、色についての知識は少しあったので、
あっ、たぶんカラーコードだなと思いました。
でも、中途半端な文字数だし、文字数がおかしい...
ということで、少し調べてみたんですが、
これは、カラーコードを10進数で表しているということでした。
これをどうやって、カラーコードにするかというと、
まず、10進数を16進数に変換します。
ここでは、変換のやり方は省略しますが、
10進数「65535」を16進数に変換すると、「FFFF」になります。
ちなみに変換する方法は、検索すれば、自動で変換してくれるツールやサイトがあるので、
やり方などを知りたい方は調べてみてください。
で、ここでまた問題発生です...。
カラーコードっていうのは、RGBで表すと、
「#000000」っていう風に6桁で表現されます。
「FFFF」だと2桁足りない...。
うーん、なんだろうと思ったんですが、
わかりやすいように、赤色のオブジェクトを作って同じ処理をしてみました。
すると、「255」ってログに表示されました。
赤色は、RGBで表すと「255,0,0」、
16進数で表すと、「#FF0000」になります。
と、ここで気づいたんですが、
「0」が省略されてる?
これを先ほどの「FFFF」に適用すると、
「00FFFF」と表すことができます。
よし、できた。
ど思ったんですが、
カラーコードに変換してみると、
「00FFFF」は、
水色じゃん...。
うーん、おかしい...。
で、思ったのが、逆の発想で、
黄色って、カラーコードで表すとどうなるっけ?
そこで、よーやく理解できました。
黄色をカラーコードで表すと、
「FFFF00」になります。
ということは、
カラーコード、逆じゃん!
つまり、「00FFFF」を後ろから2桁ずつ並べ替えます。
すると、「FFFF00」になります。
これでよーやく色を取得することができました。
長かった...。
同じように、
「32768」は、
16進数にすると、「8000」になって、
RGBにすると、「008000」になります。
なんで、こんなわかりづらいんだろう...。
まあ、深くは考えずに色の情報を取得できたのでよかったです。
これをもし、EAとかに組み込みたい場合は、
インジゲーターの四角形や矢印、テキストなどの色を上記のコードで取得して、
どのサイン(オブジェクト)がどの色で表せれていて、
何色になったら、エントリーや決済するなどの処理を追加してあげれば、
組み込んでいくことができると思います。
今回のやり方では、何色かを指定する場合、10進数で指定する必要があるので、注意が必要です。
参考MQL:
ObjectsTotal()
参考MQL:
ObjectName
参考MQL:
ObjectGet
参考MQL:
Print
まとめ
いかがだったでしょうか?
今回は、色についていろいろと試行錯誤しながらやってみましたが、
思ったよりたいへんでした。
でも、これができるようになったので、
またインジゲーターやEAの幅が広がった気がします。
そろそろ、インジゲーターの作成に専念してもいいかな...?
また、何か新しい問題やアイディアなどを思いついたら書いていきたいと思います。
それでは、また。
今回使用したMQL一覧
関連ページ