保证金算法&资金计算

This commit is contained in:
吴方海
2025-04-16 15:15:59 +08:00
parent 6e644083df
commit 8e61f23e18
47 changed files with 695 additions and 1194 deletions
@@ -5,6 +5,7 @@ using YieldChain.Helpers;
using YLErp.BLL;
using YLErp.BLL.MarginCalculation;
using YLErp.Configuration;
using YLErp.DBModels.Enums;
using YLErp.Helpers;
using YLErp.Model;
using YLErp.Model.Enum;
@@ -202,7 +203,9 @@ namespace YLErp.Modules.EodModule.SettlementModule
foreach (var currencyCode in currencyCodes)
{
fundObject.InFund.Add(currencyCode, 0);
fundObject.VmInFund.Add(currencyCode, 0);
fundObject.OutFund.Add(currencyCode, 0);
fundObject.VmOutFund.Add(currencyCode, 0);
fundObject.NetFund.Add(currencyCode, 0);
fundObject.InFundOther.Add(currencyCode, 0);
fundObject.OutFundOther.Add(currencyCode, 0);
@@ -212,8 +215,10 @@ namespace YLErp.Modules.EodModule.SettlementModule
}
//入金
var inFund = 0.0;
var vmInFund = 0.0;
//出金
var outFund = 0.0;
var vmOutFund = 0.0;
//其他收入
var inFundOther = 0.0;
//其他支出
@@ -340,9 +345,13 @@ namespace YLErp.Modules.EodModule.SettlementModule
throw new Exception("客户:" + client.Name + "未配置结算币种");
}
clientbalancedailyPre.FundObject.InFund.Add(client.SettlementCurrency, clientbalancedailyPre.InFund ?? 0);
clientbalancedailyPre.FundObject.VmInFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund ?? 0);
clientbalancedailyPre.FundObject.InFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.InFundSum ?? 0);
clientbalancedailyPre.FundObject.VmInFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund_sum ?? 0);
clientbalancedailyPre.FundObject.OutFund.Add(client.SettlementCurrency, clientbalancedailyPre.OutFund ?? 0);
clientbalancedailyPre.FundObject.VmOutFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund ?? 0);
clientbalancedailyPre.FundObject.OutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.OutFundSum ?? 0);
clientbalancedailyPre.FundObject.VmOutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund_sum ?? 0);
clientbalancedailyPre.FundObject.NetFund.Add(client.SettlementCurrency, clientbalancedailyPre.NetFund ?? 0);
clientbalancedailyPre.FundObject.NetFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.NetFundSum ?? 0);
clientbalancedailyPre.FundObject.OtherFund.Add(client.SettlementCurrency, clientbalancedailyPre.OtherFund ?? 0);
@@ -364,9 +373,13 @@ namespace YLErp.Modules.EodModule.SettlementModule
if (currencyCodes.Count() == 1 && currencyCodes.FirstOrDefault() == string.Empty)
{
clientbalancedailyPre.FundObject.InFund.Add(string.Empty, clientbalancedailyPre.InFund ?? 0);
clientbalancedailyPre.FundObject.VmInFund.Add(string.Empty, clientbalancedailyPre.vm_in_fund ?? 0);
clientbalancedailyPre.FundObject.InFundSum.Add(string.Empty, clientbalancedailyPre.InFundSum ?? 0);
clientbalancedailyPre.FundObject.VmInFundSum.Add(string.Empty, clientbalancedailyPre.vm_in_fund_sum ?? 0);
clientbalancedailyPre.FundObject.OutFund.Add(string.Empty, clientbalancedailyPre.OutFund ?? 0);
clientbalancedailyPre.FundObject.VmOutFund.Add(string.Empty, clientbalancedailyPre.vm_out_fund ?? 0);
clientbalancedailyPre.FundObject.OutFundSum.Add(string.Empty, clientbalancedailyPre.OutFundSum ?? 0);
clientbalancedailyPre.FundObject.VmOutFundSum.Add(string.Empty, clientbalancedailyPre.vm_out_fund_sum ?? 0);
clientbalancedailyPre.FundObject.NetFund.Add(string.Empty, clientbalancedailyPre.NetFund ?? 0);
clientbalancedailyPre.FundObject.NetFundSum.Add(string.Empty, clientbalancedailyPre.NetFundSum ?? 0);
clientbalancedailyPre.FundObject.OtherFund.Add(string.Empty, clientbalancedailyPre.OtherFund ?? 0);
@@ -376,9 +389,13 @@ namespace YLErp.Modules.EodModule.SettlementModule
else
{
clientbalancedailyPre.FundObject.InFund.Add(client.SettlementCurrency, clientbalancedailyPre.InFund ?? 0);
clientbalancedailyPre.FundObject.VmInFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund ?? 0);
clientbalancedailyPre.FundObject.InFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.InFundSum ?? 0);
clientbalancedailyPre.FundObject.VmInFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_in_fund_sum ?? 0);
clientbalancedailyPre.FundObject.OutFund.Add(client.SettlementCurrency, clientbalancedailyPre.OutFund ?? 0);
clientbalancedailyPre.FundObject.VmOutFund.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund ?? 0);
clientbalancedailyPre.FundObject.OutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.OutFundSum ?? 0);
clientbalancedailyPre.FundObject.VmOutFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.vm_out_fund_sum ?? 0);
clientbalancedailyPre.FundObject.NetFund.Add(client.SettlementCurrency, clientbalancedailyPre.NetFund ?? 0);
clientbalancedailyPre.FundObject.NetFundSum.Add(client.SettlementCurrency, clientbalancedailyPre.NetFundSum ?? 0);
clientbalancedailyPre.FundObject.OtherFund.Add(client.SettlementCurrency, clientbalancedailyPre.OtherFund ?? 0);
@@ -429,44 +446,35 @@ namespace YLErp.Modules.EodModule.SettlementModule
if (clientEntryexit.Direction.Equals("入金"))
{
if (fundObject.InFund.ContainsKey(clientEntryexit.CurrencyCode))
// 根据 cash_type 判断资金进入哪个部分
if (clientEntryexit.cash_type == CashTypeEnum..ToString())
{
fundObject.InFund[clientEntryexit.CurrencyCode] += clientEntryexit.Money ?? 0;
AddToFund(fundObject.InFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
// 更新 NetFund
AddToFund(fundObject.NetFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
}
else
{
fundObject.InFund.Add(clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
AddToFund(fundObject.VmInFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
}
if (fundObject.NetFund.ContainsKey(clientEntryexit.CurrencyCode))
{
fundObject.NetFund[clientEntryexit.CurrencyCode] += clientEntryexit.Money ?? 0;
}
else
{
fundObject.NetFund.Add(clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
}
}
else if (clientEntryexit.Direction.Equals("出金"))
{
if (fundObject.OutFund.ContainsKey(clientEntryexit.CurrencyCode))
// 根据 cash_type 判断资金退出到哪个部分
if (clientEntryexit.cash_type == CashTypeEnum..ToString())
{
fundObject.OutFund[clientEntryexit.CurrencyCode] += clientEntryexit.Money ?? 0;
AddToFund(fundObject.OutFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
// 更新 NetFund
AddToFund(fundObject.NetFund, clientEntryexit.CurrencyCode, -(clientEntryexit.Money ?? 0));
}
else
{
fundObject.OutFund.Add(clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
AddToFund(fundObject.VmOutFund, clientEntryexit.CurrencyCode, clientEntryexit.Money ?? 0);
}
if (fundObject.NetFund.ContainsKey(clientEntryexit.CurrencyCode))
{
fundObject.NetFund[clientEntryexit.CurrencyCode] -= clientEntryexit.Money ?? 0;
}
else
{
fundObject.NetFund.Add(clientEntryexit.CurrencyCode, -clientEntryexit.Money ?? 0);
}
}
else if (clientEntryexit.Direction.Equals("其他收入"))
{
@@ -613,84 +621,15 @@ namespace YLErp.Modules.EodModule.SettlementModule
});
}
if (balanceDate >= new DateTime(2021, 6, 25) && PS.Config.Company == CompanyEnum.)
{
var clientCashInCashOutHistorys = DbContext.clientcashincashout_history.Where(x => x.ClientId == client.id && x.HappenDate == balanceDate).ToList();
if (balanceDate == new DateTime(2021, 6, 25))
{
clientCashInCashOutHistorys = DbContext.clientcashincashout_history.Where(x => x.ClientId == client.id && x.HappenDate <= new DateTime(2021, 6, 25)).ToList();
}
clientCashInCashOutHistorys.ForEach(item =>
{
if (item.Action.Equals("入金"))
{
if (fundObject.InFund.ContainsKey("CNY"))
{
fundObject.InFund["CNY"] += item.Amount ?? 0;
}
else
{
fundObject.InFund.Add("CNY", item.Amount ?? 0);
}
if (fundObject.NetFund.ContainsKey("CNY"))
{
fundObject.NetFund["CNY"] += item.Amount ?? 0;
}
else
{
fundObject.NetFund.Add("CNY", item.Amount ?? 0);
}
}
else if (item.Action.Equals("出金"))
{
if (fundObject.OutFund.ContainsKey("CNY"))
{
fundObject.OutFund["CNY"] += Math.Abs(item.Amount ?? 0);
}
else
{
fundObject.OutFund.Add("CNY", Math.Abs(item.Amount ?? 0));
}
//出金历史记录为负数,包含方向了
if (fundObject.NetFund.ContainsKey("CNY"))
{
fundObject.NetFund["CNY"] += item.Amount ?? 0;
}
else
{
fundObject.NetFund.Add("CNY", item.Amount ?? 0);
}
}
else
{
if (item.Action.Equals("期权费"))
{
CurrChangeAmount += item.Amount ?? 0.0;
OptionPremium += item.Amount ?? 0.0;
}
else if (item.Action.Equals("结算金额"))
{
CurrChangeAmount += item.Amount ?? 0.0;
SettlementBalance += item.Amount ?? 0.0;
UnwindBalance += item.Amount ?? 0.0;
}
}
});
}
foreach (var item in currencyCodes)
{
if (fundObject.TodayRemainFund.ContainsKey(item))
{
fundObject.TodayRemainFund[item] = (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.OtherFund.ContainsKey(item) ? fundObject.OtherFund[item] : 0);
fundObject.TodayRemainFund[item] = (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.VmInFund.ContainsKey(item) ? fundObject.VmInFund[item] : 0) - (fundObject.VmOutFund.ContainsKey(item) ? fundObject.VmOutFund[item] : 0);
}
else
{
fundObject.TodayRemainFund.Add(item, (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.OtherFund.ContainsKey(item) ? fundObject.OtherFund[item] : 0));
fundObject.TodayRemainFund.Add(item, (fundObject.LastDayRemainFund.ContainsKey(item) ? fundObject.LastDayRemainFund[item] : 0) + (fundObject.NetFund.ContainsKey(item) ? fundObject.NetFund[item] : 0) + (fundObject.VmInFund.ContainsKey(item) ? fundObject.VmInFund[item] : 0) - (fundObject.VmOutFund.ContainsKey(item) ? fundObject.VmOutFund[item] : 0));
}
if ((client.SettlementCurrency ?? "CNY") == item || item == "")
@@ -719,7 +658,9 @@ namespace YLErp.Modules.EodModule.SettlementModule
CurrAvailAmount += fundObject.TodayRemainFund[item] * rateObj.Rate;
LastDayAvailAmount += fundObject.LastDayRemainFund[item] * rateObj.Rate;
inFund += fundObject.InFund[item] * rateObj.Rate;
vmInFund += fundObject.VmInFund[item] * rateObj.Rate;
outFund += fundObject.OutFund[item] * rateObj.Rate;
vmOutFund += fundObject.VmOutFund[item] * rateObj.Rate;
NetFund += fundObject.NetFund[item] * rateObj.Rate;
inFundOther += fundObject.InFundOther[item] * rateObj.Rate;
outFundOther += fundObject.OutFundOther[item] * rateObj.Rate;
@@ -1019,33 +960,6 @@ namespace YLErp.Modules.EodModule.SettlementModule
}
#endregion
#region --
//获取客户导入的所有持仓信息 -- 收益互换(国君)
var clientEodPositionSwapMannual = EodPositionSwapMannual.Where(x => x.ClientId == client.id).ToList();
if (clientEodPositionSwapMannual.Any())
{
double swapMargin = 0.0;
double swappv = 0.0;
double swappnl = 0.0;
clientEodPositionSwapMannual.ForEach(x =>
{
var underly = underlyDataSource.GetData(x.UnderlyingCode);
var variety = varietyDataSource.GetData(underly.UnderlyingTypeId);
currencyProvider.TryGetCurrencyRate(variety.QuoteCurrency, client.SettlementCurrency, out var rateObj);
//预付金导入是客户方向,其他值是交易员方向
swapMargin += (x.Margin) * rateObj.Rate;
swappv += (-x.PositionPnl + x.TotalFee) * rateObj.Rate;
swappnl += (-x.PositionPnl * rateObj.Rate);
});
PayableMargin -= swapMargin;
clientPv = (clientPv ?? 0) + swappv;
roundedClientPv = (roundedClientPv ?? 0) + swappv;
PositionPnl += swappnl;
RoundedPositionPnl += swappnl;
}
#endregion
#region ClientBalacedaily ClientBalace对象赋值
if (client.BoundSide == BoundSideEnum. && clientSpan != null)
@@ -1091,7 +1005,9 @@ namespace YLErp.Modules.EodModule.SettlementModule
clientbalancedaily.FrozenRedeemFunds = clientFrozenFund.RedeemFunds;
clientbalancedaily.MarginBalance = MarginBalance;
clientbalancedaily.InFund = inFund;
clientbalancedaily.vm_in_fund = vmInFund;
clientbalancedaily.OutFund = outFund;
clientbalancedaily.vm_out_fund = vmOutFund;
clientbalancedaily.NetFund = NetFund;
clientbalancedaily.OtherFund = OtherFund;
clientbalancedaily.IsTradeCredit = IsTradeCredit;
@@ -1216,14 +1132,22 @@ namespace YLErp.Modules.EodModule.SettlementModule
clientbalancedaily.NetFundSum += clientbalancedaily.FundObject.NetFundSum[item] * rateObj.Rate;
clientbalancedailyPre.FundObject.InFundSum.TryGetValue(item, out var preInFundSum);
clientbalancedailyPre.FundObject.VmInFundSum.TryGetValue(item, out var vmpreInFundSum);
clientbalancedaily.FundObject.InFund.TryGetValue(item, out var inFundToday);
clientbalancedaily.FundObject.VmInFund.TryGetValue(item, out var vminFundToday);
clientbalancedaily.FundObject.InFundSum[item] = preInFundSum + inFundToday;
clientbalancedaily.FundObject.VmInFundSum[item] = vmpreInFundSum + vminFundToday;
clientbalancedaily.InFundSum += clientbalancedaily.FundObject.InFundSum[item] * rateObj.Rate;
clientbalancedaily.vm_in_fund_sum += clientbalancedaily.FundObject.VmInFundSum[item] * rateObj.Rate;
clientbalancedailyPre.FundObject.OutFundSum.TryGetValue(item, out var preOutFundSum);
clientbalancedaily.FundObject.OutFund.TryGetValue(item, out var outFundToday);
clientbalancedailyPre.FundObject.VmOutFundSum.TryGetValue(item, out var vmpreOutFundSum);
clientbalancedaily.FundObject.VmOutFund.TryGetValue(item, out var vmoutFundToday);
clientbalancedaily.FundObject.OutFundSum[item] = preOutFundSum + outFundToday;
clientbalancedaily.FundObject.VmOutFundSum[item] = vmpreOutFundSum + vmoutFundToday;
clientbalancedaily.OutFundSum += clientbalancedaily.FundObject.OutFundSum[item] * rateObj.Rate;
clientbalancedaily.vm_out_fund_sum += clientbalancedaily.FundObject.VmOutFundSum[item] * rateObj.Rate;
clientbalancedailyPre.FundObject.OtherFundSum.TryGetValue(item, out var preOtherFundSum);
clientbalancedaily.FundObject.OtherFund.TryGetValue(item, out var otherFundToday);
@@ -1246,11 +1170,15 @@ namespace YLErp.Modules.EodModule.SettlementModule
clientbalancedaily.FundObject.NetFundSum = clientbalancedaily.FundObject.NetFund;
clientbalancedaily.FundObject.InFundSum = clientbalancedaily.FundObject.InFund;
clientbalancedaily.FundObject.OutFundSum = clientbalancedaily.FundObject.OutFund;
clientbalancedaily.FundObject.VmInFundSum = clientbalancedaily.FundObject.VmInFund;
clientbalancedaily.FundObject.VmOutFundSum = clientbalancedaily.FundObject.VmOutFund;
clientbalancedaily.FundObject.OtherFundSum = clientbalancedaily.FundObject.OtherFund;
clientbalancedaily.NetFundSum = clientbalancedaily.NetFund;
clientbalancedaily.InFundSum = clientbalancedaily.InFund;
clientbalancedaily.vm_in_fund_sum= clientbalancedaily.vm_in_fund;
clientbalancedaily.OutFundSum = clientbalancedaily.OutFund;
clientbalancedaily.vm_out_fund_sum = clientbalancedaily.vm_out_fund;
clientbalancedaily.OtherFundSum = clientbalancedaily.OtherFund;
}
@@ -1375,5 +1303,16 @@ namespace YLErp.Modules.EodModule.SettlementModule
return true;
}
private void AddToFund(Dictionary<string, double> fundDictionary, string currencyCode, double amount)
{
if (fundDictionary.ContainsKey(currencyCode))
{
fundDictionary[currencyCode] += amount;
}
else
{
fundDictionary.Add(currencyCode, amount);
}
}
}
}