package com.yami.trading.huobi.data.internal; import com.yami.trading.bean.data.domain.Kline; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; public class KLineConverter { /** * 假设只取了一个区间的数据,直接对数据进行转 * @param sKlineList * @return */ public static List convertTo5MinKline(List sKlineList) { List fiveMinKlineList = new ArrayList<>(); int currentIndex = 0; int dataSize = sKlineList.size(); while (currentIndex < dataSize) { Kline currentKline = sKlineList.get(currentIndex); long currentTimestamp = currentKline.getTs(); BigDecimal open = currentKline.getOpen(); BigDecimal high = currentKline.getHigh(); BigDecimal low = currentKline.getLow(); BigDecimal close = currentKline.getClose(); BigDecimal volume = currentKline.getVolume(); BigDecimal amount = currentKline.getAmount(); long nextTimestamp = currentTimestamp + (5 * 60 * 1000); // 5 minutes in milliseconds // Find the index of the next Kline that satisfies the 5-minute condition int nextIndex = currentIndex + 1; while (nextIndex < dataSize && sKlineList.get(nextIndex).getTs() < nextTimestamp) { Kline nextKline = sKlineList.get(nextIndex); high = high.max(nextKline.getHigh()); low = low.min(nextKline.getLow()); volume = volume.add(nextKline.getVolume()); amount = amount.add(nextKline.getAmount()); close = nextKline.getClose(); nextIndex++; } // Create the 5-minute Kline and add it to the list Kline fiveMinKline = new Kline(); fiveMinKline.setSymbol(currentKline.getSymbol()); fiveMinKline.setTs(currentTimestamp); fiveMinKline.setOpen(open); fiveMinKline.setHigh(high); fiveMinKline.setLow(low); fiveMinKline.setClose(close); fiveMinKline.setVolume(volume); fiveMinKline.setAmount(amount); fiveMinKlineList.add(fiveMinKline); currentIndex = nextIndex; } return fiveMinKlineList; } }