refactor(swap): 重置日判定收口 IsResetDay 私有谓词(零行为变更)
EQD-6968 三判定之一的"是否重置日"公式原在 GetFloatRate(days%period) 与 CalcUnwindInterest 当日归周期判定(daysFromStart%rest_days) 各写一遍, 收口为单一谓词;锚点差异(td.StartDate vs position.PosiStartDate, 非初始持仓两锚点可能不同)在注释中显式注记,只收口公式不统一锚点—— 统一锚点属行为变更需业务定调。 验证:内存套件 102/102 全绿
This commit is contained in:
@@ -845,6 +845,15 @@ namespace YLErp.Modules.SwapModule
|
||||
return nextInterval?.Rate ?? position.InterestRateDefault;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重置日判定:自锚点日起每 period 天一遇,锚点当日即首个重置日((日-锚点)%period==0)。
|
||||
/// EQD-6968 取价依赖三判定之一。锚点口径注记:GetFloatRate 传交易起始日 td.StartDate,
|
||||
/// 分段重放/当日归周期判定传 position.PosiStartDate——非初始持仓(部分平仓剩余仓)两锚点可能不同,
|
||||
/// 本方法只收口公式、不统一锚点(统一属行为变更,需业务定调)。
|
||||
/// </summary>
|
||||
private static bool IsResetDay(DateTime date, DateTime anchorDate, int period)
|
||||
=> (date - anchorDate).Days % period == 0;
|
||||
|
||||
/// <summary>
|
||||
/// 获取浮动利率
|
||||
/// </summary>
|
||||
@@ -853,7 +862,7 @@ namespace YLErp.Modules.SwapModule
|
||||
if (string.IsNullOrEmpty(position.FloatRateUnderlyingCode)) return position.FloatRate;
|
||||
|
||||
int days = (endDate - startDate).Days;
|
||||
bool isResetDay = days % period == 0;
|
||||
bool isResetDay = IsResetDay(endDate, startDate, period);
|
||||
// 重置日恰为到期日(endDate)时,取价日=endDate;否则=startDate(原逻辑)。
|
||||
DateTime rateDate = IndexFixerBase.GetFixingDate(
|
||||
isResetDay ? endDate : startDate, position.interest_rule);
|
||||
@@ -1211,12 +1220,12 @@ namespace YLErp.Modules.SwapModule
|
||||
var floateRate = preEodPosition.FloatRate;
|
||||
if (position.InterestType == (int)InterestTypeEnum.复利)
|
||||
{
|
||||
var daysFromStart = (endDate - position.PosiStartDate).Days;
|
||||
var daysFromPreEod = preEodPosition.id != 0
|
||||
? (endDate - preEodPosition.ValueDate).Days
|
||||
: 0;
|
||||
// 不算尾 + 当日即新周期首日 + 未到重置日 ==> 说明这一天应归入下一个计息周期 当天无需单独计息
|
||||
if (!calcLast && daysFromPreEod == 1 && daysFromStart % (position.interest_rest_days ?? 1) != 0)
|
||||
if (!calcLast && daysFromPreEod == 1
|
||||
&& !IsResetDay(endDate, position.PosiStartDate, position.interest_rest_days ?? 1))
|
||||
{
|
||||
interest.InterestPrincipal = preEodPosition.TdInterestPrincipal * closePrecent; // 计息基数
|
||||
interest.FloatRate = preEodPosition.FloatRate;
|
||||
|
||||
Reference in New Issue
Block a user