メーターの作り方ですが、最初に必要なものを用意します。
外枠の白い線と上下の文字は今まで作ったようにオブジェクトで作ります。
問題はメーターをどうやって表現するかということだったんですが、意外と簡単でした。
あんまり深く考えずに、単純に四角形を数値ごとに表示させるか非表示にしておくかを条件文を作って指定するだけでうまくメーターを表現できました。
では、早速、コードを書いていきます。
■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の値を指定して同じ処理を行うと表示と非表示の切り替えができるようになります。
説明が長くなってしまいましたが、これで完成です。
それでは、ここまでをコンパイルして実行してみます。