1
0

feat: 简化交易计算

This commit is contained in:
2025-11-11 23:33:13 +08:00
parent 482eb70465
commit 9a31b8cae4
4 changed files with 43 additions and 6 deletions

View File

@@ -33,6 +33,12 @@
<artifactId>hutool-http</artifactId>
</dependency>
<dependency>
<groupId>org.icepear.echarts</groupId>
<artifactId>echarts-java</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>io.github.ralfkonrad.quantlib_for_maven</groupId>
<artifactId>quantlib</artifactId>

View File

@@ -8,6 +8,7 @@ import com.lanyuanxiaoyao.leopard.core.repository.DailyRepository;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -50,9 +51,6 @@ public class TradeEngine {
.filter(daily -> daily.getTradeDate().isBefore(currentDate))
.toList()
);
if (trade == 0) {
continue;
}
var daily = dailies.stream()
.filter(d -> ObjectUtil.equals(d.getTradeDate(), currentDate))
.findFirst()
@@ -75,20 +73,46 @@ public class TradeEngine {
}
public int getVolume() {
return getVolume(trade -> true);
}
public int getVolume(LocalDate date) {
return getVolume(trade -> trade.date().isBefore(date) || trade.date().isEqual(date));
}
private int getVolume(Predicate<Trade> predicate) {
return trades.stream()
.filter(predicate)
.mapToInt(Trade::volume)
.sum();
}
public double getCash() {
return getCash(trade -> true);
}
public double getCash(LocalDate date) {
return getCash(trade -> trade.date().isBefore(date) || trade.date().isEqual(date));
}
private double getCash(Predicate<Trade> predicate) {
return trades.stream()
.filter(predicate)
.mapToDouble(trade -> -1 * trade.volume() * trade.price())
.sum();
}
public double getPrice() {
int volume = getVolume();
return volume == 0 ? 0 : getCash() / volume;
return getPrice(trade -> true);
}
public double getPrice(LocalDate date) {
return getPrice(trade -> trade.date().isBefore(date) || trade.date().isEqual(date));
}
public double getPrice(Predicate<Trade> predicate) {
int volume = getVolume(predicate);
return volume == 0 ? 0 : getCash(predicate) / volume;
}
public record Trade(