aggregateToKlines function

List<KLine> aggregateToKlines(
  1. List<Trade> trades,
  2. Duration interval
)

Implementation

List<KLine> aggregateToKlines(List<Trade> trades, Duration interval) {
  trades.sort((a, b) => a.timestamp.compareTo(b.timestamp));

  final List<KLine> result = [];
  if (trades.isEmpty) return result;

  DateTime currentStart = DateTime.fromMillisecondsSinceEpoch(
    (trades.first.timestamp.millisecondsSinceEpoch ~/ interval.inMilliseconds) *
        interval.inMilliseconds,
  );
  List<Trade> bucket = [];

  for (var trade in trades) {
    final bucketStart = DateTime.fromMillisecondsSinceEpoch(
      (trade.timestamp.millisecondsSinceEpoch ~/ interval.inMilliseconds) *
          interval.inMilliseconds,
    );

    if (bucketStart != currentStart) {
      if (bucket.isNotEmpty) {
        result.add(_generateKLine(currentStart, bucket));
      }
      currentStart = bucketStart;
      bucket = [];
    }

    bucket.add(trade);
  }

  if (bucket.isNotEmpty) {
    result.add(_generateKLine(currentStart, bucket));
  }

  return result;
}