週末(土曜日の朝)の最後の足のバーまでのバーの数の出し方

ヤマケンさんのブログに以下のような記事がありました。

証券会社のサーバによって結果が異なると思いますが、土曜日朝の最後の足までのバーの数ってEAを作るとき必要になったことがありませんか?
例えば火曜日、水曜日でも、現在更新中の足から何本目の足が土曜日の最後の足なのか関数使って出したいと思って考えました。
強引な方法でセンスがなくても申し訳ありません。


int BarTrueNum = 0;
datetime mondaystarttime = iTime(NULL, PERIOD_D1, DayOfWeek() -1);
string StartMondayTime = TimeToStr(mondaystarttime, TIME_DATE) +" 05:00";
int BarTrue = iBarShift(NULL, 0, StrToTime(StartMondayTime), true);
if (BarTrue > BarTrueNum) BarTrueNum = BarTrue;
StartMondayTime = TimeToStr(mondaystarttime, TIME_DATE) +" 06:00";
BarTrue = iBarShift(NULL, 0, StrToTime(StartMondayTime), true);
if (BarTrue > BarTrueNum) BarTrueNum = BarTrue;
StartMondayTime = TimeToStr(mondaystarttime, TIME_DATE) +" 07:00";
BarTrue = iBarShift(NULL, 0, StrToTime(StartMondayTime), true);
if (BarTrue > BarTrueNum) BarTrueNum = BarTrue;
StartMondayTime = TimeToStr(mondaystarttime, TIME_DATE) +" 08:00";
BarTrue = iBarShift(NULL, 0, StrToTime(StartMondayTime), true);
if (BarTrue > BarTrueNum) BarTrueNum = BarTrue;
int WeekLastBarFromNum = BarTrueNum + 1;



もっとセンスの光る方法をご存知でしたらお教え下さい。
お願いします。

↑このコードでは、PERIOD_D1のデータが整合性よく揃っていないと上手く動きません。(例えば、火曜日が市場休みで日足が1本少ない時に水曜日から数えるとNGです。)それから、月曜に市場の開く時刻は5時〜8時とは限らないので、汎用性が低いです。


センスの良し悪しは分かりませんが、私なら以下のような2行を書きます。

datetime sundaystarttime = TimeCurrent()-DayOfWeek()*86400-Hour()*3600-Minute()*60-Seconds();
int start = iBarShift(NULL, 0, sundaystarttime, false)-1;


Alert("Now:"+TimeToStr(Time[0])+        //現在のBar
      " Begin:"+TimeToStr(Time[start])+ //今週の開始
      " Sat:"+TimeToStr(Time[start+1]));//先週の終わり

1行目は、現在の時刻から、日曜日の午前0時の時刻(エポック秒)を求めています。
(日曜午前0時の時刻を求めるのは、その時刻であれば、どの時差の地域でも市場が閉まっているからです。市場が閉まっている時刻の直前のバーは、週末の最後の足になります。
式の意味は、
日曜日午前0時のエポック秒 = 現在のエポック秒 - 日曜日午前0時から現在までに経過した秒数
です。今が火曜日の午前5時19分32秒であれば、日曜午前0時からは、2日と5時間19分32秒経過しているわけです..。


2行目は、日曜日の午前0時に近い Barが何番目になるかを求めています。iBarShift(..., false ) で求まるBar は、先週末側の Bar なので、そこから 1 を引けば、今週のBar の開始位置が分かります。
デイトレタイプのEAで、週明け直後のトレードを避けたい時に、活用できるかもしれません。





勘の鋭い人は、「日曜日の午前0時に近い Bar は、常に先週末側の Barになるの?」と疑問に思われるかもしれません。先週の金曜が○○休暇で、木曜日に市場が閉じていたら、日曜日の午前0時に近い Bar は月曜日の Bar になるのでは?と考えてしまうのです。確かに、iBarShiftのヘルプにも、iBarShift returns nearest.と書かれています。しかし、ここでいう nearest は、指定した時刻の直前にオープンした Bar を指します。


5分足で、00:00 , 00:05 , 00:10 .. のようにBar が並んでいる時、00:04 の時刻のBarを探したら、時間的に近い 00:05 の Bar ではなく、直前にオープンしている 00:00 の Bar が見つかるのと同じ要領で検索されるのです。例外は、チャートデータより古い時刻を指定した時だけ、チャートデータの最古のデータになるだけです。大した知識ではないですが、何かの参考にどうぞ。。