为拆三类腿做准备,按 Strategy 模式封装 CalcNotionalByMode 的 switch。 本次零生产代码改动,全部为新增小文件,每个类单一职责<50行。 新增(策略接口+值对象): - InterestLegs/IInterestLegStrategy.cs NotionalResult 值对象(closePrincipal/posiPrincipal/closePercent) + IInterestLegStrategy 接口(每个mode一个实现) 新增(3个活跃利息腿mode): - InterestLegs/FixedNotionalLeg.cs mode 1 固定值 计息基数恒=InterestPrincipalFix, 不随平仓比例变化(合同写死的固定值) - InterestLegs/ContractNotionalLeg.cs mode 2 合约名义本金规模 平仓本金=posiNotional×closePercent, 按比例线性缩放 - InterestLegs/UnderlyingFullPriceLeg.cs mode 9 标的期初全价 主路径公式同mode2, 差异在衡泰路径grossPrice折算+EOD复利反推 确认现状: - 界面实际只有3个活跃利息腿mode(1/2/9), TradeView.cshtml:330-349 - mode 3(持仓名义本金)/4(持仓市值) 零引用=死代码, 本次不实现 - mode 7/8(多空存续) 界面已注释掉, 本次不实现 - mode 5/6(预付金) 属保证金维度, 后续单独做PrepayLeg 新增测试(8个,全过): - InterestLegStrategyTest.cs 覆盖各mode的部分平仓/全平/零平仓场景 验证策略行为与现有CalcNotionalByMode switch完全一致
19 lines
929 B
C#
19 lines
929 B
C#
using YLErp.DBModels;
|
||
|
||
namespace YLErp.Modules.SwapModule.InterestLegs;
|
||
|
||
/// <summary>
|
||
/// 标的期初全价利息腿(InterestMode=标的期初全价)。
|
||
/// 站在"持仓全价"视角:计息基数 = 标的含费全价(PosiGrossPrice/EntryDirtyPrice) × 数量。
|
||
/// 主路径 CalcNotionalByMode 公式与合约名义本金规模(2)相同;
|
||
/// 差异在衡泰路径会乘 grossPrice 折算(SwapDealService.GetUnwindInterestsByHT),
|
||
/// 以及 EOD 复利部分平仓后直接返回剩余本金(禁止反推,SwapEodPositionService:1458-1465)。
|
||
/// </summary>
|
||
public sealed class UnderlyingFullPriceLeg : IInterestLegStrategy
|
||
{
|
||
public InterestModeEnum Mode => InterestModeEnum.标的期初全价;
|
||
|
||
public NotionalResult CalcNotional(decimal fix, decimal posiNotional, decimal posiLong, decimal posiShort, decimal closePercent)
|
||
=> new(posiNotional * closePercent, posiNotional, closePercent);
|
||
}
|