bug修复
This commit is contained in:
@@ -409,7 +409,6 @@ namespace YLErp.Modules.SwapModule
|
||||
_posiNotionalValue = position.InterestPrincipalFix * closePrecent;
|
||||
positionClone.InterestDirection = position.InterestDirection == (int)SwapDirectionEnum.收取 ? (int)SwapDirectionEnum.支付 : (int)SwapDirectionEnum.收取;
|
||||
}
|
||||
var calendar = "chn";
|
||||
if (!string.IsNullOrEmpty(position.FloatRateUnderlyingCode))
|
||||
{
|
||||
// 获取重置频率,如果为空则默认为1
|
||||
@@ -418,7 +417,7 @@ namespace YLErp.Modules.SwapModule
|
||||
// 计算从 td.StartDate 到 endDate 的天数
|
||||
var days = (endDate - td.StartDate.Value).Days;
|
||||
// 获取合适的 rateDate
|
||||
DateTime rateDate = GetRateDate(position.interest_rule, td.StartDate.Value, endDate, days, interestPeriod, calendar);
|
||||
DateTime rateDate = GetRateDate(position.interest_rule, td.StartDate.Value, endDate, days, interestPeriod);
|
||||
|
||||
// 如果不需要重置,并且上一日已有 FloatRate,则不再查找
|
||||
if (preEodPosition.id != 0 && days % interestPeriod != 0)
|
||||
@@ -434,7 +433,7 @@ namespace YLErp.Modules.SwapModule
|
||||
position.FloatRate = Convert.ToDecimal(floatRate);
|
||||
positionClone.FloatRate = position.FloatRate;
|
||||
}
|
||||
else
|
||||
else if(!swap)
|
||||
{
|
||||
throw new Exception($"获取不到{position.FloatRateUnderlyingCode}在{rateDate:yyyy年MM月dd日}的价格");
|
||||
}
|
||||
@@ -467,16 +466,16 @@ namespace YLErp.Modules.SwapModule
|
||||
/// <summary>
|
||||
/// 根据给定条件获取 rateDate
|
||||
/// </summary>
|
||||
private DateTime GetRateDate(int? interest_rule, DateTime startDate, DateTime endDate, int days, int interestPeriod, string calendar)
|
||||
private DateTime GetRateDate(int? interest_rule, DateTime startDate, DateTime endDate, int days, int interestPeriod)
|
||||
{
|
||||
// 判断是否达到重置周期
|
||||
if (days % interestPeriod == 0)
|
||||
{
|
||||
return QdpCalendarHelper.GetNonHolidayDefore(endDate.AddDays(interest_rule ?? 0), calendar);
|
||||
return QdpCalendarHelper.GetNonHolidayDefore(endDate.AddDays(interest_rule ?? 0));
|
||||
}
|
||||
|
||||
// 如果不在重置周期内,使用 td.StartDate 来获取 rateDate
|
||||
return QdpCalendarHelper.GetNonHolidayDefore(startDate.AddDays(interest_rule ?? 0), calendar);
|
||||
return QdpCalendarHelper.GetNonHolidayDefore(startDate.AddDays(interest_rule ?? 0));
|
||||
}
|
||||
/// <summary>
|
||||
/// 初始化利息腿信息
|
||||
|
||||
@@ -139,7 +139,15 @@ namespace YLErp.Modules.SwapModule
|
||||
var longEventTypes = eventTyps;
|
||||
longEventTypes.Add((int)SwapFlowEventTypeEnum.开仓);
|
||||
var flowEvents = new List<swap_flow_event>();
|
||||
Expression<Func<swap_flow_event, bool>> eventExpression = x => x.SwapTradeId == td.id && x.DataState == (int)SwapFlowDateStateEnum.完成 && longEventTypes.Contains(x.EventType)&& x.EventDate == settleDate;
|
||||
Expression<Func<swap_flow_event, bool>> eventExpression = x => x.SwapTradeId == td.id && x.DataState == (int)SwapFlowDateStateEnum.完成 && longEventTypes.Contains(x.EventType);
|
||||
if (settleDate == td.TradeDate)
|
||||
{
|
||||
eventExpression = eventExpression.And(x => x.EventDate == settleDate);
|
||||
}
|
||||
else
|
||||
{
|
||||
eventExpression = eventExpression.And(x => x.UnwindDate == settleDate);
|
||||
}
|
||||
flowEvents = DbContext.swap_flow_event.Where(eventExpression).ToList();
|
||||
var preDealDate = GetPreDealDate(td.id, settleDate, eventTyps);//上一次平仓/互换/自动互换处理日期
|
||||
List<swap_flow_event> autoInterests = new List<swap_flow_event>();//自动互换利息腿信息
|
||||
@@ -1341,15 +1349,15 @@ namespace YLErp.Modules.SwapModule
|
||||
curretEod.PosiTradingFee = position.PosiTradingFee;
|
||||
curretEod.UnderlyingPrice = UnderlyingCodePrice(position.UnderlyingCode, dealDate, out decimal vobp);
|
||||
SetPriceInfoByFlowEvent(eod, curretEod, unwindEvents, position);
|
||||
if (settleDate == td.TradeDate)
|
||||
{
|
||||
curretEod.UnderlyingPrice = curretEod.PosiGrossPrice;
|
||||
//curretEod.TdCloseMtmPnl = 0;
|
||||
//curretEod.TdCloseFee = 0;
|
||||
}
|
||||
curretEod.TdCloseDividend = curretEod.TdPosiDividend;
|
||||
curretEod.UnderlyingMarketValue = curretEod.UnderlyingPrice * curretEod.PosiQuantity * curretEod.ContractSize * shortRatio;
|
||||
curretEod.PosiMtmPnL = (curretEod.UnderlyingPrice - curretEod.PosiGrossPrice) * curretEod.PosiQuantity * curretEod.ContractSize * shortRatio * directionRatio;
|
||||
if (settleDate == td.TradeDate)
|
||||
{
|
||||
curretEod.PosiMtmPnL = 0;
|
||||
//curretEod.TdCloseMtmPnl = 0;
|
||||
//curretEod.TdCloseFee = 0;
|
||||
}
|
||||
curretEod.PosiDividendSum = curretEod.TdPosiDividend;
|
||||
curretEod.PosiProfitSum = curretEod.PosiMtmPnL + curretEod.PosiDividendSum + curretEod.VTradingFee;
|
||||
curretEod.RealizedMtmPnL = curretEod.TdCloseMtmPnl;
|
||||
|
||||
@@ -1208,7 +1208,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var unwindPercent =1- (flowQty / swapFlow.TradingQty);
|
||||
var fee = (1 - unwindPercent) * swapFlow.TradingFeePending;
|
||||
swapFlow.TradingQty = flowQty;
|
||||
swapFlow.TradingAmount = swapFlow.TradingQty;
|
||||
swapFlow.TradingAmount = swapFlow.TradingQty* swapFlow.TradingAmountAvg;
|
||||
swapFlow.TradingFeePending = fee;
|
||||
return NewSwapTrade(swapFlow, client, asset, underlying, floatRate, clientMarginTemplate,clearingAgency);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user