保证金算法&资金计算
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user