このページでは、ラベルオブジェクトを使って勝敗結果を文字列としてわかるように表示する方法について解説します。
アローオブジェクトについては他のページで解説しました。
MT4チャート上で勝敗がわかるようになりましたが、何勝何敗なのかはprintf()関数で表示させた内容を確認しないとわかりません。
そういった部分を文字列としてMT4チャート上に表示させ分かりやすいようにします。
全体の流れのおさらい
全体の流れは以下の通りでした。
- エントリー時間と判定時間を求める
- エントリー中は別のエントリーを行わない
- 判定時刻を迎えたらエントリーと判定時の価格を比較する
- 比較結果から勝敗を決める
- 勝敗結果を出力する
このページでは⑤の部分に該当します。
四角い枠を用意
勝率等をチャート上に直接表示してもいいのですが、せっかくなら四角い枠のボードのようなイメージで別の背景があると分かりやすいので、表示します。
「OnInit()」関数内に以下のように追加します。
ObjectCreate("LowEntryForm",OBJ_RECTANGLE_LABEL,0,0,0); ObjectSet("LowEntryForm",OBJPROP_XDISTANCE,135); ObjectSet("LowEntryForm",OBJPROP_YDISTANCE,5); ObjectSet("LowEntryForm",OBJPROP_XSIZE,130); ObjectSet("LowEntryForm",OBJPROP_YSIZE,70); ObjectSet("LowEntryForm",OBJPROP_BGCOLOR,clrDarkSlateGray); ObjectSet("LowEntryForm",OBJPROP_BORDER_TYPE,BORDER_FLAT); ObjectSet("LowEntryForm",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSet("LowEntryForm",OBJPROP_COLOR,clrWhite); ObjectSet("LowEntryForm",OBJPROP_STYLE,STYLE_SOLID); ObjectSet("LowEntryForm",OBJPROP_SELECTABLE,false); ObjectSet("LowEntryForm",OBJPROP_HIDDEN,true); ObjectSet("LowEntryForm",OBJPROP_FILL,true);
「ObjectCreate()」関数を使用して四角形のオブジェクトとなる「OBJ_RECTANGLE_LABEL」を作成しています。
「OBJPROP_CORNER」を右上となる「CORNER_RIGHT_UPPER」を指定しています。
そこを起点とし「OBJPROP_XDISTANCE」「OBJPROP_YDISTANCE」で座標を指定しています。
オブジェクト自体のサイズとして「OBJPROP_XSIZE」「OBJPROP_YSIZE」を指定することで大きさを決めることが出来ます。
表示されるとこんな感じです。
タイトルとなる文字列を用意
「Low勝率:」「勝ち数:」「負け数:」というようなタイトル部分に該当する文字列を作成します。
3つ分のオブジェクトを作成したコードは以下の通りです。
ObjectCreate("LowEntryLabel1",OBJ_LABEL,0,0,0); ObjectSet("LowEntryLabel1",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSet("LowEntryLabel1",OBJPROP_XDISTANCE,130); ObjectSet("LowEntryLabel1",OBJPROP_YDISTANCE,20); ObjectSet("LowEntryLabel1",OBJPROP_FONTSIZE,10); ObjectSet("LowEntryLabel1",OBJPROP_ANCHOR,ANCHOR_LEFT); ObjectSet("LowEntryLabel1",OBJPROP_COLOR,clrWhite); ObjectSet("LowEntryLabel1",OBJPROP_BACK,false); ObjectSet("LowEntryLabel1",OBJPROP_SELECTABLE,false); ObjectSet("LowEntryLabel1",OBJPROP_HIDDEN,true); ObjectSetString(0,"LowEntryLabel1",OBJPROP_TEXT,"Low勝率:"); ObjectSetString(0,"LowEntryLabel1",OBJPROP_FONT,"メイリオ"); ObjectCreate("LowEntryLabel2",OBJ_LABEL,0,0,0); ObjectSet("LowEntryLabel2",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSet("LowEntryLabel2",OBJPROP_XDISTANCE,130); ObjectSet("LowEntryLabel2",OBJPROP_YDISTANCE,40); ObjectSet("LowEntryLabel2",OBJPROP_FONTSIZE,10); ObjectSet("LowEntryLabel2",OBJPROP_ANCHOR,ANCHOR_LEFT); ObjectSet("LowEntryLabel2",OBJPROP_COLOR,clrWhite); ObjectSet("LowEntryLabel2",OBJPROP_BACK,false); ObjectSet("LowEntryLabel2",OBJPROP_SELECTABLE,false); ObjectSet("LowEntryLabel2",OBJPROP_HIDDEN,true); ObjectSetString(0,"LowEntryLabel2",OBJPROP_TEXT,"勝ち数:"); ObjectSetString(0,"LowEntryLabel2",OBJPROP_FONT,"メイリオ"); ObjectCreate("LowEntryLabel3",OBJ_LABEL,0,0,0); ObjectSet("LowEntryLabel3",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSet("LowEntryLabel3",OBJPROP_XDISTANCE,130); ObjectSet("LowEntryLabel3",OBJPROP_YDISTANCE,60); ObjectSet("LowEntryLabel3",OBJPROP_FONTSIZE,10); ObjectSet("LowEntryLabel3",OBJPROP_ANCHOR,ANCHOR_LEFT); ObjectSet("LowEntryLabel3",OBJPROP_COLOR,clrWhite); ObjectSet("LowEntryLabel3",OBJPROP_BACK,false); ObjectSet("LowEntryLabel3",OBJPROP_SELECTABLE,false); ObjectSet("LowEntryLabel3",OBJPROP_HIDDEN,true); ObjectSetString(0,"LowEntryLabel3",OBJPROP_TEXT,"負け数:"); ObjectSetString(0,"LowEntryLabel3",OBJPROP_FONT,"メイリオ");
文字列の作成は「ObjectCreate()」関数を使って「OBJ_LABEL」を指定します。
文字列自体の指定は、「ObjectSetString()」関数を使って指定します。
勝敗数となる文字列を用意
勝敗数もタイトルと同じように作成します。オブジェクト名が被らないように変更していくだけです。
ObjectCreate("LowEntryLabel4",OBJ_LABEL,0,0,0); ObjectSet("LowEntryLabel4",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSet("LowEntryLabel4",OBJPROP_XDISTANCE,65); ObjectSet("LowEntryLabel4",OBJPROP_YDISTANCE,20); ObjectSet("LowEntryLabel4",OBJPROP_FONTSIZE,10); ObjectSet("LowEntryLabel4",OBJPROP_ANCHOR,ANCHOR_LEFT); ObjectSet("LowEntryLabel4",OBJPROP_COLOR,clrWhite); ObjectSet("LowEntryLabel4",OBJPROP_BACK,false); ObjectSet("LowEntryLabel4",OBJPROP_SELECTABLE,false); ObjectSet("LowEntryLabel4",OBJPROP_HIDDEN,true); ObjectSetString(0,"LowEntryLabel4",OBJPROP_TEXT,"100.00%"); ObjectSetString(0,"LowEntryLabel4",OBJPROP_FONT,"メイリオ"); ObjectCreate("LowEntryLabel5",OBJ_LABEL,0,0,0); ObjectSet("LowEntryLabel5",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSet("LowEntryLabel5",OBJPROP_XDISTANCE,65); ObjectSet("LowEntryLabel5",OBJPROP_YDISTANCE,40); ObjectSet("LowEntryLabel5",OBJPROP_FONTSIZE,10); ObjectSet("LowEntryLabel5",OBJPROP_ANCHOR,ANCHOR_LEFT); ObjectSet("LowEntryLabel5",OBJPROP_COLOR,clrWhite); ObjectSet("LowEntryLabel5",OBJPROP_BACK,false); ObjectSet("LowEntryLabel5",OBJPROP_SELECTABLE,false); ObjectSet("LowEntryLabel5",OBJPROP_HIDDEN,true); ObjectSetString(0,"LowEntryLabel5",OBJPROP_TEXT,"00"); ObjectSetString(0,"LowEntryLabel5",OBJPROP_FONT,"メイリオ"); ObjectCreate("LowEntryLabel6",OBJ_LABEL,0,0,0); ObjectSet("LowEntryLabel6",OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSet("LowEntryLabel6",OBJPROP_XDISTANCE,65); ObjectSet("LowEntryLabel6",OBJPROP_YDISTANCE,60); ObjectSet("LowEntryLabel6",OBJPROP_FONTSIZE,10); ObjectSet("LowEntryLabel6",OBJPROP_ANCHOR,ANCHOR_LEFT); ObjectSet("LowEntryLabel6",OBJPROP_COLOR,clrWhite); ObjectSet("LowEntryLabel6",OBJPROP_BACK,false); ObjectSet("LowEntryLabel6",OBJPROP_SELECTABLE,false); ObjectSet("LowEntryLabel6",OBJPROP_HIDDEN,true); ObjectSetString(0,"LowEntryLabel6",OBJPROP_TEXT,"00"); ObjectSetString(0,"LowEntryLabel6",OBJPROP_FONT,"メイリオ");
「ObjectSetString()」関数を使って「100.00%」や「00」と指定してしまっていますが、「OnInit()」関数内では初期表示となる文字列を指定してるだけなので、これで構いません。
勝率、勝ち数、負け数となる文字列を用意
勝ち数、負け数のカウントを行う処理のコードブロック内に、以下のように追加します。
ObjectSetString(0,"LowEntryLabel5",OBJPROP_TEXT,IntegerToString(LowWins));
ObjectSetString(0,"LowEntryLabel6",OBJPROP_TEXT,IntegerToString(LowLoses));
「ObjectSetString()」関数の文字列部分をカウント数が含まれている変数を指定していますが、変数はint型なので、文字列型のstring型に変換する必要があります。
「IntegerToString()」関数を使うと、文字列に変換してくれます。
最後に勝率ですが、計算式は100 * 勝ち数 / (勝ち数 + 負け数)で求めることが出来ます。
「NormalizeDouble()」関数を使って小数点を2桁までに丸めています。
double WinPer = NormalizeDouble(100.0 * LowWins / (LowWins + LowLoses),2); ObjectSetString(0,"LowEntryLabel4",OBJPROP_TEXT,DoubleToStr(WinPer,2)+ " %");
「WinPer」という変数もdouble型なので、string型に変換しなければなりません。
その場合は、「DoubleToStr()」関数を使って変換できます。その際小数点2桁まで表示す量に指定しています。
しっかり表示されました。
コメント
コメント一覧 (2件)
初めましてポコと申します。
早速ですが質問があります。
土日でチャートが動いていない時に時間足を切り替えるとオブジェクトの一部が消えるのですが、改善方法のヒントを教えて頂きたいです。
補足としてオブジェクト関数はVoidでグローバルで作成しOnInit内で関数を呼び出して表示させています。
よろしくお願いいたします。
コメントありがとうございます。
土日にオブジェクトの一部が消えるということは、それ以外の時は問題なく表示されているということかと思います。
その場合、複数のオブジェクトが重なっている状態ではないでしょうか?
だとすると、Oninit内で複数のオブジェクト関数を実行しているかと思いますが、該当のオブジェクト関数をOninit内の最後の方に実行するようにしてみてください。
実際のコードを見てみないと分かりませんので、見当違いでしたらごめんなさい。
頑張ってください!