バイナリーオプションなどの勝率がすべてのものにたいしてロジックを自分で数えて、勝敗をコツコツとメモするのは非常に大変ですよね。できれば常に勝率は表示されるようにしておいて検証中のロジックの優位性を確認したい方向けに今回は勝率を表示するプログラムの作成方法を紹介したいと思います。
勝率を表示させるプログラム作成の手順
- 勝率を表示するオブジェクトを作成する関数を作成する。
関数で作成するメリットとして、メインロジックのプログラムの中に勝率を表示させるプログラムを書くとメインロジックの可読性が損なわれてしまうので、今回は関数で作成していきます。 - 1で作成した関数を呼び出す。
とてもシンプルですね笑
今回は勝率を表示するプログラムですので、勝ち負けをカウントするプログラムとは違います。
勝ち負けをカウントするプログラムはまた次回書いていこうと思います。
1、勝率を表示するオブジェクトを作成する関数を作成する。
以下のコードを最終行に貼り付けます。
void plot_aggregate(int win, int lose){
string label_name = "aggregate";
double total = win + lose;
string win_label = "勝ち:" + IntegerToString(win) + "回 ";
string lose_label = "負け:" + IntegerToString(lose) + "回 ";
string win_rate_label = "勝率:" + DoubleToString(win/total*100,1) + "%";
string text = win_label + lose_label + win_rate_label;
ObjectCreate(0, label_name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0,label_name,OBJPROP_XDISTANCE,10);
ObjectSetInteger(0,label_name,OBJPROP_YDISTANCE,50);
ObjectSetInteger(0,label_name,OBJPROP_COLOR,clrYellow);
ObjectSetString(0,label_name,OBJPROP_TEXT,text);
}
以下にコードの解説を乗せておきます。
string label_name はラベルの名前
変数名通りなのですが、ラベルを作成するときにラベルの名前を指定しなければなりません。
集計という英語がaggregateなので、今回はplot_aggregateという変数名にしました。
textは勝ち数、負け数、勝率の三つを含んだ文字列
変数textにwin_label(勝ち数),lose_label(負け数),win_rate_label(勝率)を合わせて格納しています。
今回作成するオブジェクトの種類はlabelなので、全部labelを最後につけていますが、最後をtextにした方がわかりやすかったかもしれません笑
ObjectCreate関数でオブジェクトを作成している。
objectCreate関数の引数は
・チャートの番号(現在のチャートは0)
・オブジェクトの名前
・オブジェクトの種類
・メインウィンドウ(0)かサブウィンドウ(1以上)
・アンカーポイント(価格)
・アンカーポイント(時間)
でオブジェクトを作成することができます。
アンカーポイントは後で変更しますので、どちらも0指定をしています。
ObjectSetString関数でオブジェクトのテキストを設定している。
objectCreate関数の引数と同様に複数の引数を設定して、テキストを設定しています。
下記のサイトに詳しく乗っていますので参考にしてください。
注意点
勝率を表示する際ですが、勝ち数と負け数ともにint型なので、割り算すると0と表示されます。
これはどちらもint型なのが原因です。
一旦double型のtotalを作成してdouble型のtotalで勝ち数を割ることでこの問題を解決できます。変数totalをint型にして勝率を表示させてみてください。わかると思います。
2、1の関数を呼び出します。
1で作成した関数をOnInit関数内で呼び出します。
コードは下記の1行です。
plot_aggregate(1,100);
//第1引数(1の部分)は勝った回数
//第2引数(100の部分)は負けた回数
勝った回数1回で負けた回数100回とか絶望的ですが、逆をいけば勝率ほぼ100%ですね笑
あえてわかりやすくしているだけですので、数字を好きな数字に変更してみてください。
実際にチャートにインジゲータを挿入してみる
では実際にインジゲータを挿入してみてください。
表示されていると思います。
ですが、実は問題があります。なにかわかりますか?
答えはインジゲータをチャートから削除しても勝率が消えない点です。
この点を解消していきます。
インジゲータを削除するタイミングで実行するプログラムを記述する。
OnDeInit関数の中にオブジェクトを削除するおプログラムを記述する。
OnDeInit関数はインジゲータを削除したタイミングや、時間足を切り替えたタイミングに一回だけ実行するプログラムです。
この中に勝率を表示しているオブジェクトを削除するプログラムを記述することで今回の問題点は解消することができます。
下記のコードを最終行に追加します。
void OnDeinit(const int reason){
ObjectsDeleteAll(0);
}
これで全てのオブジェクトを削除できます。
まとめ
今回はオブジェクトを表示するプログラムを作成しました。labelは非常に簡単なオブジェクトなので、いろいろ活用してみてください。
オブジェクトを極めると、水平ラインを表示したりできますので、いろいろ試してみてはいかかでしょうか。
コメント