保证金算法&资金计算

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
@@ -165,76 +165,44 @@ namespace YLErp.Modules.EodModule.SettlementModule
var nextSettleDate = QdpCalendarHelper.GetNonHoliday(settleDate.AddDays(1));
var days = (nextSettleDate - settleDate).Days;
logger.Info("settleDate:" + settleDate.ToString("yyyy-MM-dd") + " nextSettleDate:" + nextSettleDate + " days:" + days);
for (var i=0; i< days; i++)
for (var i = 0; i < days; i++)
{
var yesterday= settleDate.AddDays(i-1);
var today= settleDate.AddDays(i);
var yesterday = settleDate.AddDays(i - 1);
var today = settleDate.AddDays(i);
new SwapEodPositionService(OptUser).SwapPositionCompose(today, yesterday, clientIds);
CalculateMargin(today, yesterday, clientIds);
new SwapEodPositionService(OptUser).SwapEodCompose(today, yesterday, clientIds);
}
}
/// <summary>
/// 追加预付金腿利息归档
/// </summary>
public void ExceuteEodSwapMarginPosi()
{
var settleDate = _context.SettleDate;
var clientIds = _context.Request.ClientIds;
var nextSettleDate = QdpCalendarHelper.GetNonHoliday(settleDate.AddDays(1));
var days = (nextSettleDate - settleDate).Days;
for (var i = 0; i < days; i++)
{
var yesterday = settleDate.AddDays(i - 1);
var today = settleDate.AddDays(i);
new SwapEodPositionService(OptUser).SwapEodCompose(today, yesterday, clientIds);
}
}
/// <summary>
/// 框架合约汇总
/// </summary>
/// <param name="setTaskStep"></param>
public void ExecuteEodSwap()
{
var settleDate = _context.SettleDate;
var clientIds = _context.Request.ClientIds;
var nextSettleDate = QdpCalendarHelper.GetNonHoliday(settleDate.AddDays(1));
var days = (nextSettleDate - settleDate).Days;
for (var i = 0; i < days; i++)
{
var yesterday = settleDate.AddDays(i - 1);
var today = settleDate.AddDays(i);
new SwapEodPositionService(OptUser).SwapEodCompose(today, yesterday, clientIds);
}
}
/// <summary>
/// 计算互换预付金
/// </summary>
/// <returns></returns>
public bool CalculateMargin()
public bool CalculateMargin(DateTime settleDate, DateTime preSettleDate, IEnumerable<int> ClientIds)
{
var balanceDate = _context.SettleDate;
var preSettleDate = _context.PreSettleDate;
var reqClientIds = _context.Request.ClientIds;
// 构建请求对象
CalculateMarginRequest request = new CalculateMarginRequest()
{
currentDate = balanceDate.ToString("yyyy-MM-dd"),
clientIds = reqClientIds,
preSettleDate= preSettleDate.ToString("yyyy-MM-dd")
currentDate = settleDate.ToString("yyyy-MM-dd"),
clientIds = ClientIds,
preSettleDate = preSettleDate.ToString("yyyy-MM-dd")
};
var baseUrl = Environment.GetEnvironmentVariable("BondOmsInterface_BaseUrl");
var calculateMarginUrl = "/marginAlgorithm/triggerMarginCalc";
if (!string.IsNullOrEmpty(baseUrl))
{
var httpHelper = new HttpHelper(baseUrl, null);
// http 请求 Web项目接口
var result = httpHelper.PostRequestNoAuth<CalculateMarginRequest, CalculateMarginResponse>(calculateMarginUrl, request).Result;
if (result!=null&&!result.success)
if (result != null && !result.success)
{
throw new ServiceException($"互换预付金计算失败:{result.message}");
}
}
return true;
}
}
@@ -0,0 +1,31 @@
using Microsoft.EntityFrameworkCore;
namespace YLErp.Modules.EodModule.SettlementModule
{
/// <summary>
/// 检查日终流水
/// </summary>
public class EodCheckSwapFlow : EodSettleServiceBaseV2
{
public const string Step = "检查流水";
public EodCheckSwapFlow(EodSettlementContextV2 context) : base(context)
{
ResetDbContext();
}
/// <summary>
/// 检查结算汇率
/// </summary>
public void Execute()
{
var settleDate = _context.SettleDate;
var swapFlowList = DbContext.swap_flow.Where(x=>x.OccurTime==settleDate&&x.DataState==(int)SwapFlowDateStateEnum.);
if (swapFlowList.Any())
{
_context.RaiseError(Step, $"{settleDate:yyyy-MM-dd}有未簿记的流水未处理");
}
}
}
}
@@ -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);
}
}
}
}
@@ -489,7 +489,8 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int
{
new EodCheckCurrency(_context).Execute();
}
SetTaskStep("检查日终流水");
new EodCheckSwapFlow(_context).Execute();
tasks = new Task[3];
tasks[0] = Task.Run(() =>
@@ -497,9 +498,6 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int
SetTaskStep("检查标的到期日");
new EodCheckMaturityDate(_context).Execute();//t
SetTaskStep("合成篮子标的价格");
new EodBasketPriceSaveService(_context).Execute();//t
if (PS.Config.ErpElement.SupportMultiCalendar)
{
SetTaskStep("为处于节假日的交易标的复制上日收盘价");
@@ -508,121 +506,17 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int
SetTaskStep("检查标的结算价格缺失");
new EodCheckSettlePrice(_context).Execute();//t
if (PS.Config.Is厦门象屿)
{
SetTaskStep("检查标的参考价格缺失");
new EodCheckReferencePrice(_context).Execute();//t
}
});
if (_request.IsSettleOtcTrades)
{
tasks[1] = Task.Run(() =>
{
//SetTaskStep("合成多空组合流水");
//new EodHandleSwapFlowService(_context).Execute();
SetTaskStep("检查当日交易");
new EodCheckNewTrade(_context).Execute();//t
SetTaskStep("日终结算检查");
new EodCheckVolService(_context).Execute();//t
SetTaskStep("合成互换交易");
new TradeSwapFlowMoreCheck(_context).Execute();//t
});
}
if (_request.IsSettleOtcTrades)
{
tasks[2] = Task.Run(() =>
{
SetTaskStep("汇率收盘结算");
new EodCurrencyRateService(_request.UserInfo).HandleAmountByCurrencyRate(_context.SettleDate, _context.Request.ClientIds);//t
});
}
WaitTasks(tasks);
if (_request.IsSettleOtcTrades)
{
tasks = new[]
{
Task.Run(() =>
{
SetTaskStep("检查期权观察状态1");
new EodCheckMonitoredTrade(_context).ExecuteTask1(SetTaskStep);//t
}),
Task.Run(() =>
{
SetTaskStep("检查期权观察状态2");
new EodCheckMonitoredTrade(_context).ExecuteTask2(SetTaskStep);//t
}),
// Task.Run(() =>
//{
// SetTaskStep("定期结算互换收益");
// new EodCheckMonitoredTrade(_context).ExecuteBalanceSwapProfit(SetTaskStep);//t
//})
Task.Run(() =>
{
SetTaskStep("定期归档收益互换");
new EodCheckMonitoredTrade(_context).ExecuteEodSwapPosition(SetTaskStep);//t
})
};
WaitTasks(tasks);
SetTaskStep("自动延期结算");
new EodDelaySettlementTrade(_context).Execute(_report.SetErrorTips);//t
SetTaskStep("检查当日交易");
new EodCheckNewTrade(_context).Execute();//t
SetTaskStep("检查当日到期交易");
new EodCheckMaturityTrade(_context).Execute();//t
SetTaskStep("定期归档收益互换");
new EodCheckMonitoredTrade(_context).ExecuteEodSwapPosition(SetTaskStep);//t
}
new EodCheckMonitoredTrade(_context).CalculateMargin();
new EodCheckMonitoredTrade(_context).ExecuteEodSwap();
tasks = new Task[4];
if (_request.IsSettleExchangeTrades)
{
//tasks[0] = Task.Run(() =>
//{
// if (_context.Request.ClientIds == null)
// {
// SetTaskStep("场内期权结算");
// new ExchangeOptionSettlementService(_context.UserInfo).Execute(_context.SettleDate); //t
// }
//});
}
if (_request.IsSettleOtcTrades)
{
tasks[0] = Task.Run(() =>
{
SetTaskStep("备份场外交易");
SaveEodTrade(_context, _cancellationTokenSource.Token);//t
});
tasks[1] = Task.Run(() =>
{
SetTaskStep("检查权利金应付日");
new EodCheckPremiumPayDate(_context).Execute();//t
});
if (_context.SettlementConfig.CalcForwradMargin)
{
tasks[2] = Task.Run(() =>
{
SetTaskStep("远期预付金成本结算");
new EodForwardMarginSettlement(_context).Execute();//t
});
}
}
//敏感数据计算
WaitTasks(tasks);
}
SetTaskStep("日终持仓结算");
@@ -648,61 +542,7 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int
SetTaskStep("结算客户资金");
new EodClientBalanceCalc(_context).ClientBalanceCalc();
//客户资金买卖权分开算
if (_context.SettlementConfig.CalcBuySell)
{
new EodClientBalanceCalcBS(_context.UserInfo).ClientBalanceByDay(_context.SettleDate, null);
}
_context.LogInfo("结束任务:结算客户资金");
if (PS.Config.ErpElement.UseSettleDataAcquisition)
{
SetTaskStep("配合数据采集,限额监控数据落地");
var service = new QuotaMonitorService(_context.UserInfo);
if (_context.IsCurrentDay)
{
service.EodSettlementExecute(_context.SettleDate);
}
service.EodSensitiveDataCalc(_context);
_context.LogInfo("结束任务:限额监控数据落地");
}
//todo:客户日终结算完成发送行权到期邮件提醒
tasks = new Task[2];
if (_request.IsSettleExchangeTrades)
{
tasks[0] = Task.Run(() =>
{
SetTaskStep("准备次日数据");
new EodDividenService(_context).Execute(eodPositionService.EodTradePositions);//t
});
}
if (_request.IsSettleOtcTrades)
{
tasks[1] = Task.Run(() =>
{
SetTaskStep("除权除息");
var otcTrades = _context.OtcTrades.Where(t => !ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus)).ToList();
var tradeIds = otcTrades.Select(O => O.id);
var parentTradeIds = otcTrades.Where(O => O.ParentTradeId > 0 && !tradeIds.Contains(O.ParentTradeId)).Select(O => O.ParentTradeId).ToHashSet();
if (parentTradeIds.Any())
{
using var db = DbContextFactory.GetYLDbContext();
var parentTrades = new TradeDalService(_context.UserInfo).GetTradeOrEodTrade(parentTradeIds, _context.SettleDate);
otcTrades.AddRange(parentTrades);
}
new EodDividenService(_context).Execute(otcTrades);
});
}
WaitTasks(tasks);
}
_cancellationTokenSource.Token.ThrowIfCancellationRequested();
@@ -711,32 +551,6 @@ where {nameof(t.TaskStartTime)}>'{startDateStr}' and {nameof(t.TaskState)}={(int
//{
AddOrUpdateEodStatus(_request);
//}
//兴证日终持仓数据上传数据中心的FTP服务器
if (PS.Config.Company == CompanyEnum. && _context.IsCurrentDay)
{
Task.Run(() => XingZhengService.EodExecute(_context));
}
//日终数据采集
if (PS.Config.Company == CompanyEnum.)
{
Task.Run(() => ChangJiangService.EodExecute(_context, _request.VolType, _request.UseClosePrice ? "收盘价" : "结算价"));
}
//东证
if (PS.Config.Company == CompanyEnum.)
{
Task.Run(() => DongZhengService.EodExecute(_context));
}
//广发商贸
if (PS.Config.Company == CompanyEnum.广 && _request.VolType == "对冲" && _request.UseClosePrice)
{
Task.Run(() => GuangFaService.EodExecute(_context));
}
sw.Stop();
elapsedMilliseconds = sw.ElapsedMilliseconds;