このページでは、アローの位置に対する判定時間を割り出す方法を解説していきます。
バックテストを行うには、アローの位置の価格や判定時間の価格、その勝敗結果を計算する必要があります。
アローは出せるようになっても、そのアローの勝敗を求められなければ、いちいち目視して確認していくしかないため非効率です。
どのように判定時間を求めるのかを過程を含めて説明しているので、理解できるようになると思います。
全体の流れを考える
いきなりコードを書こうと思っても、全体の流れが理解できていないと取り掛かれません。
具体的にアローを表示した後どういった流れになるかを一度イメージしてみます。
- エントリー時間と判定時間を求める
- エントリー中は別のエントリーを行わない
- 判定時刻を迎えたらエントリーと判定時の価格を比較する
- 比較結果から勝敗を決める
- 勝敗結果を出力する
ざっくりとこんな感じになりますが、このページでは①について解説していきます。
このコードは5分足チャートで確定足ベースのロジックに対して判定するものを想定しています。
エントリー時間と判定時間を求める
エントリー時間と判定時間は、アローを出したタイミングでわかりますので、アロー表示のタイミングで、それぞれの時間を求めたいと思います。
そうなると、コードを書き始める箇所は以下のところになります。
まず、アローが出た時間はエントリー時間ではない点に注意です。
アローはエントリー条件が確定したタイミングの足の位置になりますので、エントリー時間は次の足となり、エントリ価格もその足の始値になります。
そうなると判定時間はさらに次の足となりますが、判定時の価格はエントリー時間と同じ足の終値になる点に注意です。
まとめると以下のコードを書けば求められることが分かります。
- 5分現在足から1本分未来にずらした時間がエントリー時間
- 5分現在足から2本分未来にずらした時間が判定時間
- エントリー価格は、エントリー時間の始値
- 判定価格は、判定時間から1本過去にずらした時間の終値
エントリー時間と判定時間のコードは以下のようになりました。
//5分現在足から1本分未来時間にずらす datetime LowEntryTime = time[i] + PeriodSeconds(NULL) * 1; //5分現在足から2本分未来時間にずらす datetime LowJudgeTime = time[i] + PeriodSeconds(NULL) * 2;
計算式について説明すると、現在時刻「time[i]」に5分の秒数である300秒に1本なら1倍、2本なら2倍掛けたものを足してます。
1倍なら掛けなくても良いですが。
しかし、変数はコードブロック{ }内でしか記録されません。このままだと、if文を抜けた際に記録したデータも失われますので、対策する必要があります。
そのためにはグローバル変数を使用します。
変数の宣言をコードブロック{ }の外側ですることで、データも失われず継続的に利用できるようになります。
どこで宣言するかというと先頭部分の以下あたりです。
datetime LowEntryTime; datetime LowJudgeTime;
グローバル変数を用意出来たら、先ほどの変数の「datetime」の部分を消しておきましょう。
正しい値が取得できているかデバッグで確認してみます。
追加したコードの行番号をダブルクリックして停止マークになることを確認し、デバッグのスタートボタンを押します。
デバッグが停止マークの部分で止まっていることがわかると思います。ただ、このままだと何も分かりません。
下の赤枠部分に1行ずつ以下を入力しましょう。
time[i] LowJudgeTime LowJudgeTime
そうすると、変数内に格納されている値が確認できるようになります。
「LowJudgeTime」だけ値がまだ取得できていませんので、上部にある「ステップイン」ボタンを押して、コードを1行分だけ実行させましょう。
値が更新されました。
この例で言うと、アロー表示された時間は「15:20」、次足からエントリーすることになるので、エントリー時間は「15:25」、判定時間を迎えるのは5分後なので「15:30」と正しい時間が表示されていることが分かります。
同様の手順で「HighEntryTime」「HighJudgeTime」のコードを書いてみてください。グローバル変数の用意も忘れずに。
コメント