2018年5月9日水曜日

[MQL4] オーダー約定時刻からの足の本数を求める方法

### オーダー約定時刻からの時間を求める
オーダー約定時刻からの時間は [OrderOpenTime()](https://docs.mql4.com/trading/orderopentime) と [TimeCurrent()](https://docs.mql4.com/dateandtime/timecurrent) の差分で求められます。
なお、OrderOpenTime() を実行する前には [OrderSelect()](https://docs.mql4.com/trading/orderselect) で対象の Order を指定しておく必要があります。

```mq4
// OrderSelect() は実行済みとする
long diff = TimeCurrent() - OrderOpenTime();
printf("%lld", diff); // 約定時刻からの秒
```

この値は**秒**で求められます。

> 参考
>
> [[MQL4] datetime を long にキャストすると 1970/1/1 からの秒になる | Strategy of C](https://strategyofc.blogspot.com/2018/05/mql4-datetime-long-197011.html)

この時、土日に入っている場合は [TimeCurrent()](https://docs.mql4.com/dateandtime/timecurrent) が正確ではない可能性があるので注意が必要です。

> 参考
> 
> [[MQL4] TimeCurrent() は土日の間は更新されない | Strategy of C](https://strategyofc.blogspot.com/2018/05/mql4-timecurrent.html)



### 秒を足の本数に変換する
2018/6/20 追記
[PeriodSeconds()](https://docs.mql4.com/common/periodseconds) を使用する方法に書き換えました。
[PeriodSeconds()](https://docs.mql4.com/common/periodseconds) で先の値を割れば、足の本数になります。 ~~[Period()](https://docs.mql4.com/check/period) は現在のチャートの時間軸を**分**で返すので、 `Period() * 60` で先の値を割れば、足の本数になります。~~ ```mq4 long diff = TimeCurrent() - OrderOpenTime(); int num_bars = (int)(diff / PeriodSeconds()); printf("%d", num_bars); // 約定時刻からの足の本数 ```