모의투자 관리 기능 추가

This commit is contained in:
Macbook
2026-05-31 03:47:07 +09:00
parent 9d7dddfa57
commit 16d0e2c226
78 changed files with 4688 additions and 972 deletions
@@ -0,0 +1,53 @@
package com.goldenchart.service;
import com.goldenchart.entity.GcPaperOrder;
import com.goldenchart.repository.GcPaperOrderRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Service
@Slf4j
public class PaperOrderMatcherService {
private final GcPaperOrderRepository orderRepo;
private final PaperTradingService paperTradingService;
public PaperOrderMatcherService(GcPaperOrderRepository orderRepo,
@Lazy PaperTradingService paperTradingService) {
this.orderRepo = orderRepo;
this.paperTradingService = paperTradingService;
}
public void onPriceTick(String symbol, double price) {
if (symbol == null || price <= 0) return;
List<GcPaperOrder> pending = orderRepo.findByStatusAndSymbol("PENDING", symbol);
for (GcPaperOrder o : pending) {
try {
paperTradingService.tryFillPendingOrder(o.getId(), price);
} catch (Exception e) {
log.debug("[PaperOrderMatcher] fill skip order={}: {}", o.getId(), e.getMessage());
}
}
}
@Scheduled(fixedDelay = 3000)
public void pollPendingOrders() {
Set<String> symbols = new HashSet<>();
for (GcPaperOrder o : orderRepo.findByStatus("PENDING")) {
symbols.add(o.getSymbol());
}
for (String symbol : symbols) {
try {
double price = paperTradingService.resolveMarkPrice(symbol);
if (price > 0) onPriceTick(symbol, price);
} catch (Exception ignored) {
}
}
}
}