feat: 简化交易计算
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user