feat: 增加周线表
This commit is contained in:
@@ -0,0 +1,60 @@
|
|||||||
|
package com.lanyuanxiaoyao.leopard.core.entity;
|
||||||
|
|
||||||
|
import com.lanyuanxiaoyao.leopard.core.Constants;
|
||||||
|
import com.lanyuanxiaoyao.service.template.entity.SimpleEntity;
|
||||||
|
import jakarta.persistence.Column;
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.EntityListeners;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.ManyToOne;
|
||||||
|
import jakarta.persistence.Table;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.ToString;
|
||||||
|
import lombok.experimental.FieldNameConstants;
|
||||||
|
import org.hibernate.annotations.Comment;
|
||||||
|
import org.hibernate.annotations.DynamicInsert;
|
||||||
|
import org.hibernate.annotations.DynamicUpdate;
|
||||||
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 年线行情,后复权
|
||||||
|
*/
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
@FieldNameConstants
|
||||||
|
@Entity
|
||||||
|
@DynamicUpdate
|
||||||
|
@DynamicInsert
|
||||||
|
@EntityListeners(AuditingEntityListener.class)
|
||||||
|
@Table(name = Constants.DATABASE_PREFIX + "weekly")
|
||||||
|
public class Weekly extends SimpleEntity {
|
||||||
|
@Column(name = "`year`", nullable = false)
|
||||||
|
@Comment("年份")
|
||||||
|
private Integer year;
|
||||||
|
@Column(name = "`week`", nullable = false)
|
||||||
|
@Comment("周数")
|
||||||
|
private Integer week;
|
||||||
|
@Comment("开盘价")
|
||||||
|
private Double open;
|
||||||
|
@Comment("最高价")
|
||||||
|
private Double high;
|
||||||
|
@Comment("最低价")
|
||||||
|
private Double low;
|
||||||
|
@Comment("收盘价")
|
||||||
|
private Double close;
|
||||||
|
@Comment("涨跌额")
|
||||||
|
private Double priceChangeAmount;
|
||||||
|
@Comment("涨跌幅")
|
||||||
|
private Double priceFluctuationRange;
|
||||||
|
@Comment("成交量")
|
||||||
|
private Double volume;
|
||||||
|
@Comment("成交额")
|
||||||
|
private Double turnover;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(nullable = false)
|
||||||
|
@ToString.Exclude
|
||||||
|
private Stock stock;
|
||||||
|
}
|
||||||
@@ -34,11 +34,11 @@ public class TaskService extends SimpleServiceSupport<Task> {
|
|||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final Set<TaskTemplate> templates = Stream.of(
|
private final Set<TaskTemplate> templates = Stream.of(
|
||||||
new TaskTemplate("更新股票信息", "更新股票信息", UpdateStockTask.class),
|
new TaskTemplate("b29f76a5-b07d-4182-85f8-2641c2a975c1", "更新股票信息", "更新股票信息", UpdateStockTask.class),
|
||||||
new TaskTemplate("更新年线指标", "更新年线指标", UpdateYearlyTask.class),
|
new TaskTemplate("e42dde60-5584-4c27-b3f7-72e4a4ff662d", "更新年线数据", "更新年线数据", UpdateYearlyTask.class),
|
||||||
new TaskTemplate("更新日线数据", "更新日线数据", UpdateDailyTask.class),
|
new TaskTemplate("b9df25ce-aa55-4f73-8265-d8a724614177", "更新日线数据", "更新日线数据", UpdateDailyTask.class),
|
||||||
new TaskTemplate("更新财务指标", "更新财务指标", UpdateFinanceIndicatorTask.class),
|
new TaskTemplate("8ab30478-c81f-4bbf-94dd-7e05fa537b50", "更新财务指标", "更新财务指标", UpdateFinanceIndicatorTask.class),
|
||||||
new TaskTemplate("金字塔选股", "金字塔选股", PyramidSelect.class)
|
new TaskTemplate("a6a7b569-a171-481b-9184-716925571639", "金字塔选股", "金字塔选股", PyramidSelect.class)
|
||||||
).collect(Collectors.toSet());
|
).collect(Collectors.toSet());
|
||||||
private final Map<String, TaskTemplate> templateMap = templates.stream()
|
private final Map<String, TaskTemplate> templateMap = templates.stream()
|
||||||
.collect(Collectors.toMap(TaskTemplate::id, template -> template));
|
.collect(Collectors.toMap(TaskTemplate::id, template -> template));
|
||||||
|
|||||||
@@ -40,21 +40,29 @@ public class UpdateYearlyTask extends TaskRunner {
|
|||||||
var endYear = dailyRepository.findMaxTradeDate().getYear();
|
var endYear = dailyRepository.findMaxTradeDate().getYear();
|
||||||
var stocks = stockRepository.findAll();
|
var stocks = stockRepository.findAll();
|
||||||
for (int year = startYear, index = 0; year <= endYear; year++, index++) {
|
for (int year = startYear, index = 0; year <= endYear; year++, index++) {
|
||||||
for (var stock : stocks) {
|
int currentYear = year;
|
||||||
log.info("Processing {} {}", stock.getCode(), year);
|
stocks.parallelStream()
|
||||||
if (stock.getListedDate().getYear() > year) {
|
.forEach(stock -> {
|
||||||
continue;
|
if (stock.getListedDate().getYear() > currentYear) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var yearlyOptional = yearlyRepository.findOne(
|
||||||
|
QYearly.yearly.stock.eq(stock)
|
||||||
|
.and(QYearly.yearly.year.eq(currentYear))
|
||||||
|
);
|
||||||
|
if (yearlyOptional.isPresent() && currentYear != endYear) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
var dailies = dailyRepository.findAll(
|
var dailies = dailyRepository.findAll(
|
||||||
QDaily.daily.tradeDate.year().eq(year)
|
QDaily.daily.tradeDate.year().eq(currentYear)
|
||||||
.and(QDaily.daily.stock.eq(stock))
|
.and(QDaily.daily.stock.eq(stock))
|
||||||
);
|
);
|
||||||
var yearly = yearlyRepository.findOne(
|
if (dailies.isEmpty()) {
|
||||||
QYearly.yearly.stock.eq(stock)
|
return;
|
||||||
.and(QYearly.yearly.year.eq(year))
|
}
|
||||||
).orElseGet(Yearly::new);
|
var yearly = yearlyOptional.orElseGet(Yearly::new);
|
||||||
yearly.setStock(stock);
|
yearly.setStock(stock);
|
||||||
yearly.setYear(year);
|
yearly.setYear(currentYear);
|
||||||
yearly.setClose(dailies.getLast().getHfqClose());
|
yearly.setClose(dailies.getLast().getHfqClose());
|
||||||
yearly.setOpen(dailies.getFirst().getHfqOpen());
|
yearly.setOpen(dailies.getFirst().getHfqOpen());
|
||||||
yearly.setHigh(dailies.stream().map(Daily::getHfqHigh).max(Double::compareTo).orElse(0.0));
|
yearly.setHigh(dailies.stream().map(Daily::getHfqHigh).max(Double::compareTo).orElse(0.0));
|
||||||
@@ -64,7 +72,7 @@ public class UpdateYearlyTask extends TaskRunner {
|
|||||||
yearly.setPriceChangeAmount(yearly.getClose() - yearly.getOpen());
|
yearly.setPriceChangeAmount(yearly.getClose() - yearly.getOpen());
|
||||||
yearly.setPriceFluctuationRange((yearly.getClose() - yearly.getOpen()) / yearly.getOpen());
|
yearly.setPriceFluctuationRange((yearly.getClose() - yearly.getOpen()) / yearly.getOpen());
|
||||||
yearlyRepository.save(yearly);
|
yearlyRepository.save(yearly);
|
||||||
}
|
});
|
||||||
updater.update((year - startYear) * 1.0 / (endYear - startYear + 1));
|
updater.update((year - startYear) * 1.0 / (endYear - startYear + 1));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user