📈

MQL5 ②Bufferの時系列データとかそうじゃないとかの理解を深めたい

2024/12/13に公開

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