このページでは、エントリー時間の価格と判定時間の価格を比較して、そのエントリーが勝っているのか負けているのかを判断し、勝敗をprintf()で表示できるようにしてみます。
前回からの続きのコードを使用しますので、読んでない方は先にこちらをご覧ください。
全体の流れのおさらい
全体の流れは以下の通りでした。
- エントリー時間と判定時間を求める
- エントリー中は別のエントリーを行わない
- 判定時刻を迎えたらエントリーと判定時の価格を比較する
- 比較結果から勝敗を決める
- 勝敗結果を出力する
このページでは③と④について解説していきます。
判定時刻を迎えたら…の条件を考える
判定時刻を迎えたら判定処理をするといっても、具体的にどのようにするのかを考えなければなりません。
といっても、さほど難しくありません。
「LowJudgeTime」より「time[i]」の値が大きくなっていれば良いです。
「datetime」の比較を難しく感じるかもしれませんが、全て秒数のデータだと考えれば、値が大きくなればなるほど未来の時間になるということも理解できるかと思います。
その条件を追加する箇所ですが、for文の中の先頭にします。
まずは「EntryFlagがtrueの時」という条件を追加します。
これによりエントリーした時しか実行しない条件式が出来ました。次に「判定時間を迎えたら」という条件を追加します。
if(LowEntryFlag && time[i] > LowEntryTime) { // } if(HighEntryFlag && time[i] > HighEntryTime) { // }
これで、エントリーした時かつ判定時刻を迎えたらという条件式が出来ました。
価格を確認する
次は、エントリー時の価格と判定時間の価格を知る必要があります。
既にエントリー時間と判定時間はグローバル変数に代入されているので、その時間から価格を求めることが出来ます。
コードは以下の通りです。
//エントリー時間の位置を求める int Entry_Shift = iBarShift(NULL,NULL,LowEntryTime); //エントリー時間の位置の始値を取得 double Entry_Value = iOpen(NULL,NULL,Entry_Shift); //判定時間の位置を求める int Judge_Shift = iBarShift(NULL,NULL,LowJudgeTime); //判定時間の位置の終値を取得 double Judge_Value = iClose(NULL,NULL,Judge_Shift + 1);
iBarShift()関数を使用して、エントリー時間である「LowEntryTime」から現在の配列番号を確認します。
その配列番号がわかれば価格を求められるので、始値を取得するためにiOpen()関数を使用して求めています。
判定価格に対しても同じ内容で求めています。
比較結果から勝敗を決める
価格を比較してエントリー時間の始値が判定時間の終値より高ければ(※Lowの場合)「勝ち」、そうでなければ「負け」という条件式が作れます。
コードは以下の通りです。
if(Entry_Value - Judge_Value > 0) { //Win } else { //Lose }
このコードの条件式は、「エントリー価格 – 判定価格」が「0」を超えているという書き方をしています。
「エントリー価格 > 判定価格」というような書き方でも問題ありませんが、今後スプレッドを考慮して勝敗を決めたいといった場合、この書き方の方が修正しやすいと思ったので、こちらを採用しました。
ちなみにスプレッド「1」として考慮した条件式の場合は、以下のようになります。
if(Entry_Value - Judge_Value > 1 * Point)
あとは、勝った場合と負けた場合のコードを書いていけば良いだけです。
コメント