MT4 -MQLのオブジェクトでメーターを作る

sitemap
世界最強のFXキャッシュバックサイト
MQLのオブジェクトでメーターを作る【簡易版】
公開日:2018/10/12
最近、オブジェクトを使ったインジゲーターの作成にどっぷりはまってます。

ということで、今回もオブジェクトを使ったインジゲーターを作っていきたいと思います。

どんなインジゲーターにするかちょっと悩んだんですが、今までは単純に四角形を書いたり、文字を表示させるだけのものが多かったので、ちょっと違ったものを作ってみたいと思い考えたのが、

「メーター」

です。

どんなものかというと、既存のインジゲーターの値を取得して、その値によって数値を視覚的にわかりやすいようにメーター化したものです。

先に完成例を見せときますが、こんな感じのものです。

メーター

今回は、とくにデザインとかこだわらずに試しにサクッと作ったので簡易版として紹介します。

以下から作成過程を説明していきます。
ソースコードの説明
メーターの作り方ですが、最初に必要なものを用意します。

外枠の白い線と上下の文字は今まで作ったようにオブジェクトで作ります。

問題はメーターをどうやって表現するかということだったんですが、意外と簡単でした。

あんまり深く考えずに、単純に四角形を数値ごとに表示させるか非表示にしておくかを条件文を作って指定するだけでうまくメーターを表現できました。

では、早速、コードを書いていきます。

■RSIの値を取得

今回は、試しにRSIの値を取得して、数値をメーター化させてみます。
常に最新の値を取得して、さらに整数として表示したいので以下のようにコードを書いていきます。

①double n_rsi = iRSI(NULL,0,rsi_period,0,0);
②double i_rsi = NormalizeDouble(n_rsi,0);

①double n_rsi = iRSI(NULL,0,rsi_period,0,0);
iRSIを使ってRSIの値を取得します。rsi_periodはパラメーターで期間を変えることができます。

②double i_rsi = NormalizeDouble(n_rsi,0);
上記で取得したRSIの値をNormalizeDoubleで四捨五入してi_rsiに代入します。

■オブジェクトの処理

今回は、外枠の四角形1つ、メーターの四角形5つ、上下の文字2つを作るので、それぞれにオブジェクト名とオブジェクトのIDを指定していきます。

①string obj_name01 = "box";
②string obj_name02 = "meter01";
③string obj_name03 = "meter02";
④string obj_name04 = "meter03";
⑤string obj_name05 = "meter04";
⑥string obj_name06 = "meter05";
⑦int    chart_id01 = 0;
⑧int    chart_id02 = 0;
⑨int    chart_id03 = 0;
⑩int    chart_id04 = 0;
⑪int    chart_id05 = 0;
⑫int    chart_id06 = 0;

①string obj_name01 = "box";
外枠の四角形のオブジェクト名を「box」と指定。

②string obj_name02 = "meter01";
1つ目のメーターの四角形のオブジェクト名を「meter01」と指定。

③string obj_name03 = "meter02";
2つ目のメーターの四角形のオブジェクト名を「meter02」と指定。

④string obj_name04 = "meter03";
3つ目のメーターの四角形のオブジェクト名を「meter03」と指定。

⑤string obj_name05 = "meter04";
4つ目のメーターの四角形のオブジェクト名を「meter04」と指定。

⑥string obj_name06 = "meter05";
5つ目のメーターの四角形のオブジェクト名を「meter05」と指定。

⑦int chart_id01 = 0;
外枠の四角形のオブジェクトのオブジェクトIDを「chart_id01」と指定して、メインウインドウに表示するために「0」を代入。

⑧int chart_id02 = 0;
1つ目のメーターの四角形のオブジェクトIDを「chart_id02」と指定して、メインウインドウに表示するために「0」を代入。

⑨int chart_id03 = 0;
2つ目のメーターの四角形のオブジェクトIDを「chart_id03」と指定して、メインウインドウに表示するために「0」を代入。

⑩int chart_id04 = 0;
3つ目のメーターの四角形のオブジェクトIDを「chart_id04」と指定して、メインウインドウに表示するために「0」を代入。

⑪int chart_id05 = 0;
4つ目のメーターの四角形のオブジェクトIDを「chart_id05」と指定して、メインウインドウに表示するために「0」を代入。

⑫int chart_id06 = 0;
5つ目のメーターの四角形のオブジェクトIDを「chart_id06」と指定して、メインウインドウに表示するために「0」を代入。

次に、オブジェクトの作成をしていきます。

ObjectsDeleteAll();

ObjectCreate(chart_id01,obj_name01,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectCreate(chart_id02,obj_name02,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectCreate(chart_id03,obj_name03,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectCreate(chart_id04,obj_name04,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectCreate(chart_id05,obj_name05,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectCreate(chart_id06,obj_name06,OBJ_RECTANGLE_LABEL,0,0,0);

ここの処理は何回も書いていて、繰り返しになってしまうので、今回は説明を省略させていただきます。

詳しく知りたい方は、前回の記事「オブジェクトで四角形を描いて装飾をする」を参考にしてください。

次に、それぞれの四角形のプロパティと位置などを設定するコードを書いていきます。

■外枠の四角形

①ObjectSetInteger(chart_id01, obj_name01, OBJPROP_CORNER, CORNER_LEFT_LOWER);
②ObjectSetInteger(chart_id01, obj_name01, OBJPROP_XDISTANCE, 30);
③ObjectSetInteger(chart_id01, obj_name01, OBJPROP_YDISTANCE, 200);
④ObjectSetInteger(chart_id01, obj_name01, OBJPROP_XSIZE, 70);
⑤ObjectSetInteger(chart_id01, obj_name01, OBJPROP_YSIZE, 130);

ObjectSetInteger(chart_id01, obj_name01, OBJPROP_BGCOLOR, EMPTY_VALUE);
ObjectSetInteger(chart_id01, obj_name01, OBJPROP_BACK, true);

ObjectSetInteger(chart_id01, obj_name01, OBJPROP_BORDER_TYPE, BORDER_FLAT);
ObjectSetInteger(chart_id01, obj_name01, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(chart_id01, obj_name01, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(chart_id01, obj_name01, OBJPROP_WIDTH, 3);

①ObjectSetInteger(chart_id01, obj_name01, OBJPROP_CORNER, CORNER_LEFT_LOWER);
オブジェクトの原点を画面左下の中心に指定。

②ObjectSetInteger(chart_id01, obj_name01, OBJPROP_XDISTANCE, 30);
設定した原点からのX軸の画面中央に向かっての距離を「30」に指定。

③ObjectSetInteger(chart_id01, obj_name01, OBJPROP_YDISTANCE, 200);
設定した原点からのY軸の画面中央に向かっての距離を「200」に指定。

④ObjectSetInteger(chart_id01, obj_name01, OBJPROP_XSIZE, 70);
オブジェクトの横幅を「70」に設定。

⑤ObjectSetInteger(chart_id01, obj_name01, OBJPROP_YSIZE, 130);
オブジェクトの高さを「130」に設定。

この下の部分の処理も繰り返しになりますので、省略します。

詳しく知りたい方は、前回の記事「オブジェクトで四角形を描いて装飾をする」を参考にしてください。

■メーターの四角形

メーターのオブジェクトは表示する座標以外は同じ処理になります。
例として1つ目のメーターのコードを書いておきます。

①ObjectSetInteger(chart_id02, obj_name02, OBJPROP_CORNER, CORNER_LEFT_LOWER);
②ObjectSetInteger(chart_id02, obj_name02, OBJPROP_XDISTANCE, 40);
③ObjectSetInteger(chart_id02, obj_name02, OBJPROP_YDISTANCE, 95);
④ObjectSetInteger(chart_id02, obj_name02, OBJPROP_XSIZE, 50);
⑤ObjectSetInteger(chart_id02, obj_name02, OBJPROP_YSIZE, 20);

ObjectSetInteger(chart_id02, obj_name02, OBJPROP_BGCOLOR, clrRed);
ObjectSetInteger(chart_id02, obj_name02, OBJPROP_BACK, true);

ObjectSetInteger(chart_id02, obj_name02, OBJPROP_BORDER_TYPE, BORDER_FLAT);
ObjectSetInteger(chart_id02, obj_name02, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(chart_id02, obj_name02, OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(chart_id02, obj_name02, OBJPROP_WIDTH, 1);

①ObjectSetInteger(chart_id02, obj_name02, OBJPROP_CORNER, CORNER_LEFT_LOWER);
オブジェクトの原点を画面左下の中心に指定。

②ObjectSetInteger(chart_id02, obj_name02, OBJPROP_XDISTANCE, 40);
設定した原点からのX軸の画面中央に向かっての距離を「40」に指定。

③ObjectSetInteger(chart_id02, obj_name02, OBJPROP_YDISTANCE, 95);
設定した原点からのY軸の画面中央に向かっての距離を「95」に指定。

④ObjectSetInteger(chart_id02, obj_name02, OBJPROP_XSIZE, 50);
オブジェクトの横幅を「50」に設定。

⑤ObjectSetInteger(chart_id02, obj_name02, OBJPROP_YSIZE, 20);
オブジェクトの高さを「20」に設定。

この下の部分の処理も繰り返しになりますので、省略します。

詳しく知りたい方は、前回の記事「オブジェクトで四角形を描いて装飾をする」を参考にしてください。

また、残り4つのメーターもほぼ同じ処理で表示させる位置の座標を変えてあげればできます。

■上下の文字

上の文字「RSI Meter」は飾りなので今回は省略します。

下の文字は、RSIの現在値を表示しています。

①ObjectCreate( "RSI",OBJ_LABEL,0,0,0);
②ObjectSet("RSI",OBJPROP_CORNER,CORNER_LEFT_LOWER);
③ObjectSet("RSI",OBJPROP_XDISTANCE,50);
④ObjectSet("RSI",OBJPROP_YDISTANCE,20);
⑤ObjectSetText("RSI",i_rsi,20,"MS ゴシック",clrWhite);

①ObjectCreate( "RSI",OBJ_LABEL,0,0,0);
オブジェクトの作成と設定。

②ObjectSet("RSI",OBJPROP_CORNER,CORNER_LEFT_LOWER);
オブジェクトの原点を画面左下の中心に指定。

③ObjectSet("RSI",OBJPROP_XDISTANCE,50);
設定した原点からのY軸の画面中央に向かっての距離を「50」に指定。

④ObjectSet("RSI",OBJPROP_YDISTANCE,20);
設定した原点からのX軸の画面中央に向かっての距離を「20」に指定。

⑤ObjectSetText("RSI",i_rsi,20,"MS ゴシック",clrWhite);
取得したRSIの値の文字の設定をします。

ここまでの処理をコンパイルして実行してみます。
実行結果①
メーターのみ

うまく表示できました。

これでベースとなる表示はできました。

ここから、RSIの値によってメーターを表示させたり、非表示にさせたりする処理を追加していきます。

■メーターの表示・非表示

追加する条件文と追加する場所は、1つ目のメーターの処理の部分は、

①if(i_rsi >= 0){
   
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_CORNER, CORNER_LEFT_LOWER);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_XDISTANCE, 40);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_YDISTANCE, 95);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_XSIZE, 50);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_YSIZE, 20);

   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_BGCOLOR, clrRed);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_BACK, true);

   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_STYLE, STYLE_SOLID);
   ObjectSetInteger(chart_id02, obj_name02, OBJPROP_WIDTH, 1);
   
   }

①if(i_rsi >= 0){ }
RSIの値が0以上のときに表示。

今回、1つ目のメーターは常に表示させておくという設定で作ったので、この処理はいらないんですけど、わかりやすくするために書いておきました。

2つ目のメーターの設定は、

①if(i_rsi > 20){

   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_CORNER, CORNER_LEFT_LOWER);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_XDISTANCE, 40);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_YDISTANCE, 120);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_XSIZE, 50);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_YSIZE, 20);

   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_BGCOLOR, clrRed);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_BACK, true);

   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_STYLE, STYLE_SOLID);
   ObjectSetInteger(chart_id03, obj_name03, OBJPROP_WIDTH, 1);
   
②}else{
   
   ObjectDelete(chart_id03,obj_name03);
   
   }

①if(i_rsi > 20){ }
RSIの値が20以上のときに表示。

②else{ObjectDelete(chart_id03,obj_name03);}
RSIの値が20以上ではないときには非表示にするので、ObjectDeleteで削除します。

同様に3つ目~5つ目までのメーターもRSIの値を指定して同じ処理を行うと表示と非表示の切り替えができるようになります。

説明が長くなってしまいましたが、これで完成です。

それでは、ここまでをコンパイルして実行してみます。
実行結果②
RSIの値が60以上のときの表示
メーター

RSIの値が80以上のときの表示
メーター
うまく動いています。
まとめ
いかがだったでしょうか?

今回は、RSIの値をメーターとしてオブジェクトで表現してみました。

いつも見ているインジゲーターとは違った見方ができて、新鮮な感じもしました。

このようにオブジェクトの作成をすることができれば、いろいろな応用が利くようになります。

RSIだけじゃなくて、ほかのインジゲーターをメーターで表示させたり、メーターを横向きにさせたり、数値によって色を変えてみたり、いろいろなものが作れそうです。

これからもしばらく、オブジェクトに没頭すると思うので、また何か作ったら公開していきたいと思います。

それでは、また。
今回使用したMQL一覧
関連ページ
big_candlestick_judgment
スポンサードリンク
Twitter