📈
MQL5 ②Bufferの時系列データとかそうじゃないとかの理解を深めたい
OnCaliculateの引数の検証
ArraySetAsSeries設定なし
前回はCopyRatesで取得したMqlRates配列の時系列かそうじゃないかは
ArraySetAsSeriesで決められることを確認。
OnCaliculateで引数に渡される値を検証
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
int limit = rates_total - prev_calculated;
if(limit>0) {
//openの検証
Print("配列0のとき");
PrintFormat("[0]time:%s :open:%.3f", (string)time[0], open[0]);
Print("配列最大値のとき");
PrintFormat("[%d]time:%s :open:%.3f", rates_total, (string)time[rates_total-1], open[rates_total-1]);
}
return(rates_total);
}
時間 | ソース | メッセージ |
---|---|---|
2024.12.13 18:30:07.496 | Test2 (GOLD,H1) | 配列0のとき |
2024.12.13 18:30:07.496 | Test2 (GOLD,H1) | [0]time:2016.06.27 05:00:00 :open:1327.980 |
2024.12.13 18:30:07.496 | Test2 (GOLD,H1) | 配列最大値のとき |
2024.12.13 18:30:07.496 | Test2 (GOLD,H1) | [50001]time:2024.12.13 11:00:00 :open:2674.940 |
これをみるとOnCaliculateで渡される値は0が一番昔、rates_total-1が最新とわかる。
ArraySetAsSeries TRUE(時系列設定
ArraySetAsSeriesでOpenもTimeも時系列にしてみる
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]) {
//ArraySetAsSeriesで時系列に★
ArraySetAsSeries(time,true);
ArraySetAsSeries(open,true);
int limit = rates_total - prev_calculated;
if(limit>0) {
//openの検証
Print("配列0のとき");
PrintFormat("[0]time:%s :open:%.3f", (string)time[0], open[0]);
Print("配列最大値のとき");
PrintFormat("[%d]time:%s :open:%.3f", rates_total, (string)time[rates_total-1], open[rates_total-1]);
}
return(rates_total);
}
時間 | ソース | メッセージ |
---|---|---|
2024.12.13 18:34:17.362 | Test2 (GOLD,H1) | 配列0のとき |
2024.12.13 18:34:17.362 | Test2 (GOLD,H1) | [0]time:2024.12.13 11:00:00 :open:2674.940 |
2024.12.13 18:34:17.362 | Test2 (GOLD,H1) | 配列最大値のとき |
2024.12.13 18:34:17.362 | Test2 (GOLD,H1) | [50001]time:2016.06.27 05:00:00 :open:1327.980 |
これで配列が時系列になった。
デフォルトでもらえるデータもArraySetAsSeriesで時系列にしないとダメなのは注意が必要ですね。
または、CopyRatesで時系列にしてあるバッファに毎回コピーするか。
それにしても2016年からGOLDは2倍になっているんですね、、、
Discussion