feat: 增加日线的均线显示
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
package com.lanyuanxiaoyao.leopard.core.helper;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
import org.ta4j.core.Bar;
|
||||
import org.ta4j.core.BaseBar;
|
||||
import org.ta4j.core.BaseBarSeries;
|
||||
import org.ta4j.core.indicators.SMAIndicator;
|
||||
import org.ta4j.core.indicators.helpers.ClosePriceIndicator;
|
||||
|
||||
public class TaHelper {
|
||||
public static <T> List<Double> sma(List<T> data, int period, Function<T, Double> closeFunction) {
|
||||
var series = new BaseBarSeries();
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
var price = closeFunction.apply(data.get(i));
|
||||
Bar bar = new BaseBar(
|
||||
Duration.ofDays(1),
|
||||
ZonedDateTime.now().plusDays(i),
|
||||
price,
|
||||
price,
|
||||
price,
|
||||
price,
|
||||
0
|
||||
);
|
||||
series.addBar(bar);
|
||||
}
|
||||
var sma = new SMAIndicator(new ClosePriceIndicator(series), period);
|
||||
var result = new ArrayList<Double>(series.getBarCount());
|
||||
for (int i = 0; i < series.getBarCount(); i++) {
|
||||
result.add(sma.getValue(i).doubleValue());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -33,4 +33,8 @@ public interface DailyRepository extends SimpleRepository<Daily> {
|
||||
@EntityGraph(attributePaths = {"stock"})
|
||||
@Override
|
||||
List<Daily> findAll(Predicate predicate, OrderSpecifier<?>... orders);
|
||||
|
||||
@EntityGraph(attributePaths = {"stock"})
|
||||
@Query("from Daily daily where daily.stock.id = ?1 and daily.tradeDate <= current date order by daily.tradeDate desc limit ?2")
|
||||
List<Daily> findRecent(Long stockId, int days);
|
||||
}
|
||||
|
||||
@@ -55,18 +55,16 @@ public class StockService extends SimpleServiceSupport<Stock> {
|
||||
return financeIndicatorRepository.findAll(
|
||||
QFinanceIndicator.financeIndicator.stock.id.eq(stockId)
|
||||
.and(QFinanceIndicator.financeIndicator.year.between(current.minusYears(years).getYear(), current.getYear())),
|
||||
QDaily.daily.tradeDate.asc()
|
||||
QFinanceIndicator.financeIndicator.year.asc()
|
||||
);
|
||||
}
|
||||
|
||||
@Cacheable(value = "findDailyRecent", cacheManager = "long-cache", sync = true)
|
||||
public List<Daily> findDailyRecent(Long stockId, int days) {
|
||||
var current = LocalDate.now();
|
||||
return dailyRepository.findAll(
|
||||
QDaily.daily.stock.id.eq(stockId)
|
||||
.and(QDaily.daily.tradeDate.between(current.minusDays(days), current)),
|
||||
QDaily.daily.tradeDate.asc()
|
||||
);
|
||||
return dailyRepository.findRecent(stockId, days)
|
||||
.stream()
|
||||
.sorted(Comparator.comparing(Daily::getTradeDate))
|
||||
.toList();
|
||||
}
|
||||
|
||||
@Cacheable(value = "findDailyLatest", cacheManager = "long-cache", sync = true)
|
||||
|
||||
Reference in New Issue
Block a user