TRS-ZS-546 资金监控增加费用及利息

This commit is contained in:
吴方海
2025-07-08 10:28:28 +08:00
parent 55fb92d16e
commit 688ed0d682
13 changed files with 162 additions and 14 deletions
@@ -1,10 +1,12 @@
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using Org.BouncyCastle.Asn1.Ocsp;
using YieldChain.Helpers;
using YLErp.BLL;
using YLErp.BLL.MarginCalculation;
using YLErp.Configuration;
using YLErp.DBModels;
using YLErp.DBModels.Enums;
using YLErp.Helpers;
using YLErp.Model;
@@ -37,7 +39,7 @@ namespace YLErp.Modules.EodModule.SettlementModule
var currencyCodes = _context.CurrencyCodes;
var currencyProvider = _context.EodCurrencyProvider;
List<int> marginTypes = new List<int>() { (int)InterestModeEnum., (int)InterestModeEnum. };
//预付金可取上浮比率
var marginRatio = _context.SystemValue.MarginRatio ?? 0.15;
var marginMaxRatio = marginRatio + 0.02;
@@ -123,7 +125,7 @@ namespace YLErp.Modules.EodModule.SettlementModule
join t in DbContext.trade.Where(x => x.TradeType == "收益互换" && x.ValidState != ConsGlobal.InValid && ConsTrade.TradeStatusAfterConfirmed.Contains(x.TradeStatus) && x.StartDate <= balanceDate) on eod.SwapTradeId equals t.id
select eod;
// 互换合约估值持仓信息
var eodSwapPosiQuery = from eod in DbContext.eod_swap_position.Where(x => x.ValueDate <= balanceDate && x.ValueDate >= preBalanceDate&&x.PosiDirection>0)
var eodSwapPosiQuery = from eod in DbContext.eod_swap_position.Where(x => x.ValueDate <= balanceDate && x.ValueDate >= preBalanceDate)
join t in DbContext.trade.Where(x => x.TradeType == "收益互换" && x.ValidState != ConsGlobal.InValid && ConsTrade.TradeStatusAfterConfirmed.Contains(x.TradeStatus) && x.StartDate <= balanceDate) on eod.SwapTradeId equals t.id
select eod;
var positionList = DbContext.trade.Where(t => (ConsTrade.TradeStatusAfterConfirmed.Contains(t.TradeStatus)||t.UnWindDate> balanceDate) && t.ValidState != "InValid"&&t.TradeType=="收益互换");
@@ -136,7 +138,11 @@ namespace YLErp.Modules.EodModule.SettlementModule
StructureType = t.StructureType,
marin = s.InterestPrincipalFix * (s.InterestDirection == 1 ? -1m : 1m)
};
// 互换平仓信息
var clientEventFlowQuery = from eod in DbContext.swap_flow_event.Where(x => x.EventDate <= balanceDate && x.EventDate > preBalanceDate && x.DataState == (int)SwapFlowDateStateEnum. && x.EventType == (int)SwapFlowEventTypeEnum.)
join t in DbContext.trade.Where(x => x.TradeType == "收益互换" && x.ValidState != ConsGlobal.InValid && ConsTrade.TradeStatusAfterConfirmed.Contains(x.TradeStatus) && x.TradeDate <= balanceDate) on eod.SwapTradeId equals t.id
select eod;
var clientEventFlows = clientEventFlowQuery.ToList();
var eodSwaps = eodSwapQuery.ToList();
var eodSwapPosis = eodSwapPosiQuery.ToList();
if (reqClientIds != null && reqClientIds.Any())
@@ -144,6 +150,7 @@ namespace YLErp.Modules.EodModule.SettlementModule
eodSwaps = eodSwaps.Where(t => reqClientIds.Contains(t.ClientId)).ToList();
eodSwapPosis= eodSwapPosis.Where(t => reqClientIds.Contains(t.ClientId)).ToList();
marignQuery = marignQuery.Where(t => reqClientIds.Contains(t.ClientId));
clientEventFlows.Where(t => reqClientIds.Contains(t.ClientId??0));
}
var swapIds = eodSwaps.Select(s => s.SwapTradeId);
var todaySwapTrades = DbContext.trade.Where(t => swapIds.Contains(t.id)).ToList();
@@ -297,6 +304,10 @@ namespace YLErp.Modules.EodModule.SettlementModule
var PFE = 0d;
//互换存续预付金
var SwapMarinAmount = 0d;
//交易费用
var tradeFee= 0d;
//利息盈亏
var interestPnl= 0d;
//
ClientBalanceDaily clientbalancedaily = null;
#endregion
@@ -807,11 +818,9 @@ namespace YLErp.Modules.EodModule.SettlementModule
foreach (var item in clientEodSwapsLast)
{
var lastEodSwap = eodSwaps.FirstOrDefault(t => t.SwapTradeId == item.SwapTradeId && t.ValueDate == preBalanceDate);
var lastEodSwapPosition = eodSwapPosis.FirstOrDefault(t => t.SwapTradeId == item.SwapTradeId && t.ValueDate == preBalanceDate&&t.PosiStartDate<= preBalanceDate);
var eodSwapPosition = clientEodSwapPositionLast.FirstOrDefault(t => t.SwapTradeId == item.SwapTradeId && t.ValueDate == balanceDate && t.PosiStartDate <= balanceDate);
item.PostionValue=Math.Round(item.PostionValue, ConsGlobal.MoneyRound,MidpointRounding.AwayFromZero);
PotentialSurpluses += Convert.ToDouble(item.PostionValue) * (-1);
// WinLoss += Convert.ToDouble(item.TdRealizedPnL) * (-1);
// WinLoss += Convert.ToDouble(item.TdRealizedPnL) * (-1);
var lastPv = lastEodSwap != null ? Convert.ToDouble(lastEodSwap.PostionValue) * (-1) : 0;
eodPnlSum.LastPvSum = eodPnlSum.LastPvSum.HasValue ? eodPnlSum.LastPvSum + lastPv : lastPv;
var pnl = item.PostionValue;
@@ -827,6 +836,17 @@ namespace YLErp.Modules.EodModule.SettlementModule
DailyPnl += Convert.ToDouble(pnl - lastPnl + item.TdRealizedPnL) * (-1);
//PayableMargin += Convert.ToDouble(item.InitMarginLoss + item.InitMarginGain+ item.PostionMarginLoss + item.PostionMarginGain);
}
var clientEventFlowList = clientEventFlows.Where(x=>x.ClientId== client.id);
foreach (var item in clientEventFlowList.GroupBy(x => x.SwapTradeId))
{
var eventPosi = item.FirstOrDefault(t => t.PayDirection > 0);
var eventInterests = item.Where(t => t.PayDirection == 0).ToList();
interestPnl += Convert.ToDouble(eventInterests.Sum(x=>x.InterestClosePnL)) * (-1);
tradeFee += Convert.ToDouble(eventPosi.TradingFee + eventPosi.TradingFeePending) * (-1);
}
var clientmarignQuery = marignQuery.Where(x => x.ClientId == client.id&&x.StructureType!="多空组合");
SwapMarinAmount = Convert.ToDouble(clientmarignQuery.Sum(s => s.marin));
#endregion
@@ -963,6 +983,8 @@ namespace YLErp.Modules.EodModule.SettlementModule
clientbalancedaily.ExerciseBalance = ExerciseBalance;
clientbalancedaily.AdvisableMargin = AdvisableMargin;
clientbalancedaily.TotalNominal = TotalNominal;
clientbalancedaily.trade_fee = tradeFee;
clientbalancedaily.interest_pnl = interestPnl;
clientbalancedaily.Pv = clientPv ?? 0;
clientbalancedaily.RoundedPv = roundedClientPv ?? 0;
clientbalancedaily.SellPv = clientSellPv ?? 0;
@@ -1067,6 +1089,8 @@ namespace YLErp.Modules.EodModule.SettlementModule
clientbalancedaily.CouponSum = clientbalancedaily.Coupon;
clientbalancedaily.SwapBalanceSum = clientbalancedaily.SwapBalance;
clientbalancedaily.WinLossSum = clientbalancedaily.WinLoss;
clientbalancedaily.trade_fee_sum = clientbalancedaily.trade_fee;
clientbalancedaily.interest_pnl_sum = clientbalancedaily.interest_pnl;
clientbalancedaily.EndPremiumSum = clientbalancedaily.EndPremium;
clientbalancedaily.CashInCashOutProductChangeSum = clientbalancedaily.CashInCashOutProductChange;
@@ -1134,6 +1158,8 @@ namespace YLErp.Modules.EodModule.SettlementModule
clientbalancedaily.CouponSum += clientbalancedailyPre.CouponSum;
clientbalancedaily.SwapBalanceSum += clientbalancedailyPre.SwapBalanceSum;
clientbalancedaily.WinLossSum += clientbalancedailyPre.WinLossSum;
clientbalancedaily.trade_fee_sum += clientbalancedailyPre.trade_fee_sum??0;
clientbalancedaily.interest_pnl_sum += clientbalancedailyPre.interest_pnl_sum??0;
clientbalancedaily.EndPremiumSum += (clientbalancedailyPre.EndPremiumSum ?? 0);
clientbalancedaily.CashInCashOutProductChangeSum += clientbalancedailyPre.CashInCashOutProductChangeSum;
}