feat(swap): EQD-6977 罚息计息接缝——GetIntradayUnwindInterests 按 IsPenaltyInterest 在 GetInterests 返回后追加同构罚息流
This commit is contained in:
@@ -10,6 +10,7 @@ using YLErp.Modules.EodModule;
|
||||
using YLErp.Modules.SwapModule.Accrual;
|
||||
using YLErp.Modules.SwapModule.FundingLegs;
|
||||
using YLErp.Modules.SwapModule.Margin;
|
||||
using YLErp.Modules.SwapModule.Penalty;
|
||||
using YLErp.Modules.SwapModule.ReturnLegs;
|
||||
using YLErp.Modules.TradeModule;
|
||||
using YLErp.Modules.TradeModule.DealModule;
|
||||
@@ -619,10 +620,31 @@ namespace YLErp.Modules.SwapModule
|
||||
/// 语义契约见 InterestCalcRequest.IntradayUnwind 工厂注释;计息走 CalcUnwindInterest 全区间重放。
|
||||
/// </summary>
|
||||
public List<swap_flow_event> GetIntradayUnwindInterests(InterestCalcRequest req)
|
||||
=> GetInterests(req.Td, req.TradeExtend, req.ValueDate, req.UnwindDate, req.EodPositions, req.Positions,
|
||||
{
|
||||
var interests = GetInterests(req.Td, req.TradeExtend, req.ValueDate, req.UnwindDate, req.EodPositions, req.Positions,
|
||||
req.PosiNotionalValue, req.ClosePosiNotionalValue,
|
||||
req.ClosePercent, req.EventType, req.TdClose,
|
||||
req.OrginPv, req.Add, settment: false, req.NewCalcLast, req.CloseList);
|
||||
// EQD-6977 罚息:在 GetInterests 返回后追加(避开其 closeList 去重块),仅手动平仓路径(isPenaltyInterest)触发。
|
||||
if (req.IsPenaltyInterest)
|
||||
{
|
||||
var fundingPositions = req.Positions.Where(p => !MarginModes.Contains(p.InterestMode)).ToList();
|
||||
var annualDays = req.TradeExtend == null ? 365 : req.TradeExtend.ExtendObj.AnnualDays;
|
||||
var calcLast = req.TradeExtend?.ExtendObj.CalcLast ?? true;
|
||||
var trace = new AccrualTrace();
|
||||
PenaltyInterestAppender.Append(
|
||||
req.Td, fundingPositions, interests, req.UnwindDate, annualDays,
|
||||
unwindDaySettled: calcLast || req.NewCalcLast,
|
||||
maturityCalcLast: calcLast,
|
||||
req.PosiNotionalValue, req.ClosePosiNotionalValue, req.ClosePercent,
|
||||
getSpread: p => GetFixedRate(p, req.UnwindDate),
|
||||
getPreEodFloatRate: p => req.EodPositions.FirstOrDefault(x => x.PositionId == p.id)?.FloatRate,
|
||||
tryGetFixing: (d, code) => IndexFixer.TryGetFixing(d, code, out decimal r) ? (decimal?)r : null,
|
||||
trace: trace);
|
||||
SwapCalcTrace.Write(trace); // 与既有 4 处 SwapCalcTrace.Write 同款常驻落盘
|
||||
}
|
||||
return interests;
|
||||
}
|
||||
|
||||
public List<swap_flow_event> GetInterests(
|
||||
trade td,
|
||||
|
||||
Reference in New Issue
Block a user