从 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失败(基线一致)。
45 lines
1.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|