![【MQL4】iBarShiftで起きがちな問題](https://celebpanda.com/wp/wp-content/uploads/2021/05/セレブパンダブログ用.jpg)
時間軸を変更する際に、使うのがiBarShiftです。
よく問題になるのは、バーの欠けとヒストリカルデータが足らないことです。
例えば、現在時刻12:04です。チャートは5分足表示しているが、1分足の12:02の終値を取得したいとします。
int barMinute02 = iBarShift(NULL,PERIOD_M1,Time[0],false);
//Time[0] = 12:00
//barMinute02 = 12:00 のバー本数(1分足)
//なので -2本してあげると、12:02のバー本数になります。(バーは0が最新のため)
barMinute02 = barMinute02 - 2;//or barMinute02 -= 2;
double priceClose = iClose(NULL,PERIOD_M1,barMinute02);//終値を取得します
Print("CLOSE : ", DoubleToStr(priceClose,_Digits));
Print("TIME : ", TimeToStr(iTime(NULL,PERIOD_M1,barMinute02)));
ここで、12:01のバーが無い場合は、12:03の終値が取得してしまいます。
この例では、取得時間も出力しているため気付きやすいですが、値のみだと気付きづらいのでお気をつけてください。
対応策は、datetimeでしっかり管理してあげることでしょう。バーの本数ではなく、秒数で時間を進ませてあげます。iBarShiftの最後の引数をtrueに変えるのも有効な手です。
int barMinute02_v1 = iBarShift(NULL,PERIOD_M1,Time[0]+120,true);
//Time[0] + 120(秒) = 12:02
double priceClose_v1 = iClose(NULL,PERIOD_M1,barMinute02_v1);//終値を取得します
Print("CLOSE_V1 : ", DoubleToStr(priceClose_v1,_Digits));
Print("TIME_V1 : ", TimeToStr(iTime(NULL,PERIOD_M1,barMinute02_v1)));
ヒストリカルデータが足らない場合は、どこからかダウンロードしてきたり、
オプションのチャートの最大バー数を最大にしてみたり、5分足から1分足を表示した際は、5倍の本数が必要になります。よく見てみてくださいね。
ストラテジーテスターでも、何本前から必要か計算をして少し前の期間から回すのも必要になります。
よくよく確認しないと、いくらデータを見ても分からない!となりかねますので、注意してください。
では、まただお。