using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Domain.Entities.Stocks; /// /// T+1 일별 마감 시세 (금융위 주식시세 API) — (StockID, TradingDate) UNIQUE. /// 수정주가 보정 없음 (액면분할 등 미반영 — 차트는 TradingView 위임). /// public class StockDailyPrice { [ForeignKey(nameof(StockID))] public virtual Stock? Stock { get; private set; } [Key] public long ID { get; private set; } public int StockID { get; private set; } /// 거래일 (basDt) public DateOnly TradingDate { get; private set; } /// 시가 public int Open { get; private set; } /// 고가 public int High { get; private set; } /// 저가 public int Low { get; private set; } /// 종가 public int Close { get; private set; } /// 거래량 (주) public long Volume { get; private set; } /// 거래대금 (원) public long TradingValue { get; private set; } /// 전일 대비 (원) public int ChangeAmount { get; private set; } /// 등락률 % public decimal ChangeRate { get; private set; } /// 시가총액 (원) public long? MarketCap { get; private set; } /// 상장주식수 public long? ListedShares { get; private set; } public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; private StockDailyPrice() { } public static StockDailyPrice Create( int stockID, DateOnly tradingDate, int open, int high, int low, int close, long volume, long tradingValue, int changeAmount, decimal changeRate, long? marketCap = null, long? listedShares = null ) { ArgumentOutOfRangeException.ThrowIfNegativeOrZero(stockID); return new StockDailyPrice { StockID = stockID, TradingDate = tradingDate, Open = open, High = high, Low = low, Close = close, Volume = volume, TradingValue = tradingValue, ChangeAmount = changeAmount, ChangeRate = changeRate, MarketCap = marketCap, ListedShares = listedShares }; } /// 동일 (StockID, TradingDate) 재수집 시 값 갱신 (upsert) public void Update( int open, int high, int low, int close, long volume, long tradingValue, int changeAmount, decimal changeRate, long? marketCap = null, long? listedShares = null ) { Open = open; High = high; Low = low; Close = close; Volume = volume; TradingValue = tradingValue; ChangeAmount = changeAmount; ChangeRate = changeRate; MarketCap = marketCap; ListedShares = listedShares; } }