Files
zszq-trs/YLErpDAL/Modules/SwapModule/Margin/MarginCalc.cs
T
hjhan 6fe5d81917 refactor(margin): 3个保证金纯函数迁入 MarginCalc, 改正命名
从 SwapDealService 剥离到 Margin/MarginCalc.cs:
- PreviousBalance: 取上一日终保证金余额(原 ResolveMarginOrginPv, 改正命名)
- FlipDirection: 保证金方向翻转(原 FlipMarginDirection)
- AccumulateSettlement: 平仓汇总(原 AccumulateMarginSettlement)

命名修正: orginPv 是融资腿概念, 保证金没有; 改为 PreviousBalance。
SwapDealService 里删掉这3个private方法, 调用点改用 MarginCalc.XXX。
RecordMarginCashFlow 暂留(依赖实例方法 AddClientCash)。

保证金纯函数现在全部在 Margin 模块, SwapDealService 只保留
RecordMarginCashFlow(资金记录, 需要实例上下文)。
验证: 编译0错误, 全量509测试7失败(基线一致)。
2026-08-11 14:35:42 +08:00

45 lines
1.7 KiB
C#

using YLErp.DBModels;
namespace YLErp.Modules.SwapModule.Margin;
/// <summary>
/// 保证金计算工具。从 SwapDealService 剥离的保证金纯函数。
/// </summary>
public static class MarginCalc
{
/// <summary>
/// 取上一日终保证金余额。
/// 优先 InterestPrincipalFix,其次 TdInterestPrincipal,都没有用 fallback。
/// </summary>
public static decimal PreviousBalance(eod_swap_position preEod, decimal fallback)
{
var previous = preEod.InterestPrincipalFix != 0m
? preEod.InterestPrincipalFix
: preEod.TdInterestPrincipal;
return preEod.id != 0 && previous != 0m ? previous : fallback;
}
/// <summary>
/// 保证金方向翻转。保证金利息是券商付给客户(方向与融资腿相反)。
/// </summary>
public static int FlipDirection(int direction)
=> direction == (int)SwapDirectionEnum.收取
? (int)SwapDirectionEnum.支付
: (int)SwapDirectionEnum.收取;
/// <summary>
/// 汇总保证金腿的平仓返还金额(SwapMarginAmount)和保证金返息(SwapMarginRebatePnl)。
/// 保证金方向与融资腿相反:interestRatio = InterestDirection==1 ? -1 : 1。
/// </summary>
public static void AccumulateSettlement(List<swap_flow_event> interestList, UnwindData unwindData)
{
foreach (var x in interestList)
{
if (!MarginModes.Contains(x.InterestMode)) continue;
var interestRatio = x.InterestDirection == 1 ? -1m : 1m;
unwindData.SwapMarginRebatePnl += x.InterestClosePnL;
unwindData.SwapMarginAmount += x.InterestPrincipal * interestRatio;
}
}
}