refactor(swap): 合并多空名义本金参数为单一 posiTotalNotional 并加固测试
- DealInterests 的 posiLongNotionalValue + posiShortNotionalValue 合并为 posiTotalNotional(调用点以 posiLongNotional+posiShortNotional 求和传入),净减一个参数 - SwapDealService / SwapEodPositionService / InterestCalcRequest 同步收敛多空死管道参数 - 19 个测试调用点适配新签名 - SwapEodPositionServiceIntegrationTest 参数计数断言由裸数字改为参数名集合断言(CollectionAssert.AreEquivalent,对增删/重排/改名敏感)
This commit is contained in:
@@ -145,7 +145,7 @@ namespace YLErp.Modules.SwapModule
|
||||
protected override List<swap_flow_event> CalcSwapInterests(
|
||||
trade td, trade_extend tradeExtend, DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent, int eventType, bool tdClose,
|
||||
decimal orginPv, bool add = false, bool settment = true, bool newCalcLast = false,
|
||||
List<swap_flow_event> closeList = null)
|
||||
|
||||
@@ -125,7 +125,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = CreateCompoundPosition();
|
||||
var interests = service.GetInterests(td, td.trade_extend, unwindDate, unwindDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, closePercent,
|
||||
Principal, Principal, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
add: false, settment: false, newCalcLast: false);
|
||||
Assert.AreEqual(1, interests.Count);
|
||||
@@ -356,7 +356,7 @@ namespace YLErp.Modules.SwapModule
|
||||
|
||||
var interests = ServiceByDate().GetInterests(td, td.trade_extend, unwindDate, unwindDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
add: false, settment: false, newCalcLast: false);
|
||||
|
||||
@@ -420,7 +420,7 @@ namespace YLErp.Modules.SwapModule
|
||||
|
||||
var result = service.GetInterests(td, td.trade_extend, resetDate, resetDate,
|
||||
new List<eod_swap_position> { preEod }, new List<swap_position> { position },
|
||||
remainingPrincipal, remainingPrincipal, 0m, remainingPrincipal, 1m,
|
||||
remainingPrincipal, remainingPrincipal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, true, remainingPrincipal,
|
||||
add: false, settment: false, newCalcLast: false).Single();
|
||||
|
||||
@@ -466,7 +466,7 @@ namespace YLErp.Modules.SwapModule
|
||||
|
||||
var result = service.GetInterests(td, td.trade_extend, unwindDate, unwindDate,
|
||||
new List<eod_swap_position> { preEod }, new List<swap_position> { position },
|
||||
remainingPrincipal, remainingPrincipal, 0m, remainingPrincipal, 1m,
|
||||
remainingPrincipal, remainingPrincipal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, remainingPrincipal,
|
||||
add: false, settment: false, newCalcLast: false).Single();
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace YLErp.Modules.SwapModule
|
||||
{
|
||||
DealInterests(interestList, eodPositions, new List<eod_swap_position>(),
|
||||
settleDate, td, new List<swap_flow_event>(), new List<swap_flow_event>(), null,
|
||||
posiLongNational, 0m, 0m, grossPrice, orginPv);
|
||||
posiLongNational + 0m, 0m, grossPrice, orginPv);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace YLErp.Modules.SwapModule
|
||||
trade td, trade_extend tradeExtend,
|
||||
DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent,
|
||||
int eventType, bool tdClose,
|
||||
decimal orginPv,
|
||||
@@ -77,7 +77,7 @@ namespace YLErp.Modules.SwapModule
|
||||
}
|
||||
|
||||
return (DealService ?? new SwapDealService(this)).GetInterests(td, tradeExtend, valueDate, unwindDate,
|
||||
eodPositions, positions, posiNotionalValue, posiLongNotionalValue, posiShortNotionalValue,
|
||||
eodPositions, positions, posiNotionalValue,
|
||||
closePosiNotionalValue, closePrecent, eventType, tdClose,
|
||||
orginPv, add, settment, newCalcLast, closeList);
|
||||
}
|
||||
@@ -99,7 +99,7 @@ namespace YLErp.Modules.SwapModule
|
||||
decimal orginPv = DealInterestsScenarioTest.Principal)
|
||||
{
|
||||
SaveAutoEodInterestPosition(eodPayPosition, null, position, td, valueDate, interval,
|
||||
lastEodSwap, posiLongNotional, 0m, 1m, orginPv);
|
||||
lastEodSwap, posiLongNotional + 0m, 1m, orginPv);
|
||||
return PersistedPositions.LastOrDefault();
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ namespace YLErp.Modules.SwapModule
|
||||
decimal closeNotional, bool autoSwap)
|
||||
{
|
||||
SaveAutoEodWithCloseInterestPosition(eodPayPosition, null, position, td, valueDate, interval,
|
||||
posiLongNotional, posiShortNotional, flowEvents, closeNotional, autoSwap, 1m,
|
||||
posiLongNotional + posiShortNotional, flowEvents, closeNotional, autoSwap, 1m,
|
||||
DealInterestsScenarioTest.Principal);
|
||||
return PersistedPositions.LastOrDefault();
|
||||
}
|
||||
@@ -121,7 +121,7 @@ namespace YLErp.Modules.SwapModule
|
||||
decimal grossPrice, decimal orginPv)
|
||||
{
|
||||
SaveEodInterestPositionCopy(eodPayPosition, null, valueDate, td, position, null,
|
||||
false, posiLongNotional, posiShortNotional, grossPrice, orginPv);
|
||||
false, posiLongNotional + posiShortNotional, grossPrice, orginPv);
|
||||
return PersistedPositions.LastOrDefault();
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ namespace YLErp.Modules.SwapModule
|
||||
{
|
||||
DealInterests(interestList, eodPositions, new List<eod_swap_position>(),
|
||||
settleDate, td, flowEvents, new List<swap_flow_event>(), null,
|
||||
posiLongNational, posiShortNational, closeNational, grossPrice, orginPv);
|
||||
posiLongNational + posiShortNational, closeNational, grossPrice, orginPv);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1229,7 +1229,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var result = new SwapDealService(service).GetInterests(
|
||||
td, td.trade_extend, closeDate, closeDate,
|
||||
new List<eod_swap_position> { previousEod }, new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, orginPv,
|
||||
false, settment: false, newCalcLast: false, closeList: null).Single();
|
||||
|
||||
@@ -1268,7 +1268,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var firstCloseInterest = dealService.GetInterests(
|
||||
td, td.trade_extend, firstCloseDate, firstCloseDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
originalNotional, originalNotional, 0m, remainingNotional, 0.5m,
|
||||
originalNotional, remainingNotional, 0.5m,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false).Single();
|
||||
var firstCloseCash = Math.Round(firstCloseInterest.InterestAmount, ConsGlobal.MoneyRound,
|
||||
@@ -1286,13 +1286,13 @@ namespace YLErp.Modules.SwapModule
|
||||
var replayAtPreviousEod = dealService.GetInterests(
|
||||
td, td.trade_extend, firstCloseDate, firstCloseDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false).Single();
|
||||
var replayAtFinalClose = dealService.GetInterests(
|
||||
td, td.trade_extend, finalCloseDate, finalCloseDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false).Single();
|
||||
var expectedFinalInterest = firstCloseEod.InterestIncomeSum
|
||||
@@ -1306,7 +1306,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var finalCloseInterest = dealService.GetInterests(
|
||||
td, td.trade_extend, finalCloseDate, finalCloseDate,
|
||||
new List<eod_swap_position> { firstCloseEod }, new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false).Single();
|
||||
var finalCloseCash = Math.Round(finalCloseInterest.InterestAmount, ConsGlobal.MoneyRound,
|
||||
@@ -1434,7 +1434,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var partial = service.GetInterests(
|
||||
td, td.trade_extend, partialCloseDate, partialCloseDate,
|
||||
new List<eod_swap_position> { previousEod }, new List<swap_position> { position },
|
||||
notional, notional, 0m, partialNotional, partialPercent,
|
||||
notional, partialNotional, partialPercent,
|
||||
(int)SwapEventTypeEnum.平仓, false, notional,
|
||||
settment: false).Single();
|
||||
AssertDecimal(84090.95m, Math.Round(partial.InterestAmount, ConsGlobal.MoneyRound,
|
||||
@@ -1444,7 +1444,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var final = service.GetInterests(
|
||||
td, td.trade_extend, maturityDate, maturityDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, remainingNotional,
|
||||
settment: false, newCalcLast: true).Single();
|
||||
AssertDecimal(268428.73m, Math.Round(final.InterestAmount, ConsGlobal.MoneyRound,
|
||||
@@ -1575,7 +1575,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var intermediateInterest = dealService.GetInterests(
|
||||
td, td.trade_extend, intermediateDate, intermediateDate,
|
||||
new List<eod_swap_position> { partialEod }, new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false, newCalcLast: true).Single();
|
||||
Assert.IsTrue(Math.Abs(259348.386714765m - intermediateInterest.InterestAmount) <= 0.01m,
|
||||
@@ -1706,7 +1706,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var intermediateInterest = dealService.GetInterests(
|
||||
td, td.trade_extend, intermediateDate, intermediateDate,
|
||||
new List<eod_swap_position> { partialEod }, new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false, newCalcLast: true).Single();
|
||||
Assert.IsTrue(Math.Abs(259348.386714765m - intermediateInterest.InterestAmount) <= 0.01m,
|
||||
@@ -1739,7 +1739,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var finalInterest = dealService.GetInterests(
|
||||
td, td.trade_extend, finalCloseDate, finalCloseDate,
|
||||
new List<eod_swap_position> { intermediateEod }, new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false, newCalcLast: false).Single();
|
||||
AssertDecimal(expectedFinalInterest, finalInterest.InterestAmount,
|
||||
@@ -1829,7 +1829,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var result = dealService.GetInterests(
|
||||
td, td.trade_extend, finalCloseDate, finalCloseDate,
|
||||
new List<eod_swap_position> { previousEod }, new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, remainingNotional,
|
||||
settment: false).Single();
|
||||
|
||||
@@ -1927,7 +1927,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var partialInterest = dealService.GetInterests(
|
||||
td, td.trade_extend, partialCloseDate, partialCloseDate,
|
||||
new List<eod_swap_position> { preCloseEod }, new List<swap_position> { position },
|
||||
originalNotional, originalNotional, 0m, partialNotional, partialClosePercent,
|
||||
originalNotional, partialNotional, partialClosePercent,
|
||||
(int)SwapEventTypeEnum.平仓, false, originalNotional,
|
||||
settment: false).Single();
|
||||
AssertExcelMoney(scenario.ExpectedPartialInterest, partialInterest.InterestAmount,
|
||||
@@ -1976,7 +1976,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var finalInterest = dealService.GetInterests(
|
||||
td, td.trade_extend, finalCloseDate, finalCloseDate,
|
||||
new List<eod_swap_position> { finalPreEod }, new List<swap_position> { position },
|
||||
remainingNotional, remainingNotional, 0m, remainingNotional, 1m,
|
||||
remainingNotional, remainingNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, remainingNotional,
|
||||
settment: false).Single();
|
||||
AssertExcelMoney(scenario.ExpectedFinalInterest, finalInterest.InterestAmount,
|
||||
|
||||
@@ -209,7 +209,7 @@ namespace YLErp.Modules.SwapModule
|
||||
CloseDate, CloseDate, // valueDate / unwindDate
|
||||
new List<eod_swap_position>(), // eodPositions(空)
|
||||
new List<swap_position> { position },
|
||||
Notional, Notional, Notional, Notional, // posiNotional / long / short / closePosiNotional
|
||||
Notional, Notional, // posiNotional / closePosiNotional
|
||||
1m, // closePercent
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, Notional, // tdClose / orginPv
|
||||
|
||||
@@ -142,11 +142,11 @@ namespace YLErp.Modules.SwapModule
|
||||
|
||||
var intraday = CreateService().GetIntradayUnwindInterests(InterestCalcRequest.IntradayUnwind(
|
||||
td, td.trade_extend, UnwindDate, UnwindDate, eodPositions, positions,
|
||||
PreClose, PreClose, 0m, Closed, ClosePercent,
|
||||
PreClose, Closed, ClosePercent,
|
||||
(int)SwapEventTypeEnum.平仓, tdClose: true, orginPv: PreClose, add: true, newCalcLast: false, closeList: null));
|
||||
|
||||
var eodPostClose = CreateService().GetInterests(td, td.trade_extend, UnwindDate, UnwindDate,
|
||||
eodPositions, positions, Remaining, Remaining, 0m, Closed, 1m,
|
||||
eodPositions, positions, Remaining, Closed, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, tdClose: false, orginPv: PreClose,
|
||||
add: true, settment: false, newCalcLast: false, closeList: null);
|
||||
|
||||
@@ -177,11 +177,11 @@ namespace YLErp.Modules.SwapModule
|
||||
|
||||
var intraday = CreateService().GetIntradayUnwindInterests(InterestCalcRequest.IntradayUnwind(
|
||||
td, td.trade_extend, UnwindDate, UnwindDate, eodPositions, positions,
|
||||
PreClose, PreClose, 0m, Closed, ClosePercent,
|
||||
PreClose, Closed, ClosePercent,
|
||||
(int)SwapEventTypeEnum.平仓, tdClose: true, orginPv: PreClose, add: true, newCalcLast: false, closeList: null));
|
||||
|
||||
var eodPostClose = CreateService().GetInterests(td, td.trade_extend, UnwindDate, UnwindDate,
|
||||
eodPositions, positions, Remaining, Remaining, 0m, Closed, 1m,
|
||||
eodPositions, positions, Remaining, Closed, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, tdClose: false, orginPv: PreClose,
|
||||
add: true, settment: false, newCalcLast: false, closeList: null);
|
||||
|
||||
@@ -209,7 +209,7 @@ namespace YLErp.Modules.SwapModule
|
||||
|
||||
// 全平:剩余=0,平掉=全部 1000
|
||||
var result = CreateService().GetInterests(td, td.trade_extend, UnwindDate, UnwindDate,
|
||||
eodPositions, positions, 0m, 0m, 0m, PreClose, 1m,
|
||||
eodPositions, positions, 0m, PreClose, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, tdClose: false, orginPv: PreClose,
|
||||
add: true, settment: false, newCalcLast: false, closeList: null);
|
||||
|
||||
@@ -244,7 +244,7 @@ namespace YLErp.Modules.SwapModule
|
||||
trade td, trade_extend tradeExtend,
|
||||
DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent,
|
||||
int eventType, bool tdClose,
|
||||
decimal orginPv,
|
||||
@@ -282,7 +282,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var req = InterestCalcRequest.EodPostCloseSettle(
|
||||
td, td.trade_extend, UnwindDate, UnwindDate,
|
||||
new List<eod_swap_position> { preEod }, positions,
|
||||
remainingNotionalAfterClose: Remaining, remainingLongNotional: Remaining, remainingShortNotional: 0m,
|
||||
remainingNotionalAfterClose: Remaining,
|
||||
closedNotional: Closed,
|
||||
eventType: (int)SwapEventTypeEnum.平仓, tdClose: false,
|
||||
orginPv: PreClose, add: true, newCalcLast: false);
|
||||
|
||||
@@ -228,7 +228,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = CreateFloatInterestPosition(interestRule, interestType, fixedRate);
|
||||
var interests = _service.GetInterests(td, td.trade_extend, valueDate, unwindDate,
|
||||
eodPositions, new List<swap_position> { position },
|
||||
posiNotional, posiNotional, posiNotional, posiNotional, closePercent,
|
||||
posiNotional, posiNotional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, posiNotional, false, settment: false, newCalcLast: newCalcLast, closeList: closeList);
|
||||
AssertInterestEqual(1, interests.Count);
|
||||
@@ -244,7 +244,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = CreateFloatInterestPosition(interestRule, interestType, fixedRate);
|
||||
var interests = _service.GetInterests(td, td.trade_extend, valueDate, valueDate,
|
||||
eodPositions, new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, Principal, false, settment: true, newCalcLast: false, closeList: closeList);
|
||||
AssertInterestEqual(1, interests.Count);
|
||||
@@ -263,7 +263,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = CreateFixedInterestPosition(fixedRate, interestRule);
|
||||
var interests = _service.GetInterests(td, td.trade_extend, valueDate, unwindDate,
|
||||
eodPositions, new List<swap_position> { position },
|
||||
posiNotional, posiNotional, posiNotional, posiNotional, closePercent,
|
||||
posiNotional, posiNotional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, posiNotional, false, settment: false, newCalcLast: newCalcLast, closeList: closeList);
|
||||
AssertInterestEqual(1, interests.Count);
|
||||
@@ -279,7 +279,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = CreateFixedInterestPosition(fixedRate, interestRule);
|
||||
var interests = _service.GetInterests(td, td.trade_extend, valueDate, valueDate,
|
||||
eodPositions, new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, Principal, false, settment: true, newCalcLast: false, closeList: closeList);
|
||||
AssertInterestEqual(1, interests.Count);
|
||||
|
||||
@@ -322,7 +322,7 @@ namespace YLErp.Modules.SwapModule
|
||||
valueDate, unwindDate,
|
||||
eodPositions,
|
||||
new List<swap_position> { position },
|
||||
posiNotional, posiNotional, posiNotional, posiNotional, closePercent,
|
||||
posiNotional, posiNotional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, posiNotional, false, settment: false, newCalcLast: newCalcLast, closeList: closeList);
|
||||
|
||||
@@ -346,7 +346,7 @@ namespace YLErp.Modules.SwapModule
|
||||
valueDate, valueDate,
|
||||
eodPositions,
|
||||
new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, Principal, false, settment: true, newCalcLast: false, closeList: closeList);
|
||||
|
||||
@@ -371,7 +371,7 @@ namespace YLErp.Modules.SwapModule
|
||||
valueDate, valueDate,
|
||||
eodPositions,
|
||||
new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, closePercent,
|
||||
Principal, Principal, closePercent,
|
||||
(int)SwapEventTypeEnum.自动互换,
|
||||
false, Principal, false, settment: false, newCalcLast: false, closeList: closeList);
|
||||
|
||||
@@ -407,7 +407,7 @@ namespace YLErp.Modules.SwapModule
|
||||
valueDate, unwindDate,
|
||||
eodPositions,
|
||||
new List<swap_position> { position },
|
||||
posiNotional, posiNotional, posiNotional, posiNotional, closePercent,
|
||||
posiNotional, posiNotional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, posiNotional, false, settment: false, newCalcLast: newCalcLast, closeList: closeList);
|
||||
|
||||
@@ -430,7 +430,7 @@ namespace YLErp.Modules.SwapModule
|
||||
valueDate, valueDate,
|
||||
eodPositions,
|
||||
new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, Principal, false, settment: true, newCalcLast: false, closeList: closeList);
|
||||
|
||||
@@ -1716,7 +1716,7 @@ namespace YLErp.Modules.SwapModule
|
||||
valueDate, unwindDate,
|
||||
eodPositions,
|
||||
new List<swap_position> { position },
|
||||
posiNotional, posiNotional, posiNotional, posiNotional, closePercent,
|
||||
posiNotional, posiNotional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, posiNotional, false, settment: false, newCalcLast: newCalcLast, closeList: closeList);
|
||||
|
||||
@@ -1747,7 +1747,7 @@ namespace YLErp.Modules.SwapModule
|
||||
valueDate, unwindDate,
|
||||
eodPositions,
|
||||
new List<swap_position> { position },
|
||||
posiNotional, posiNotional, posiNotional, posiNotional, closePercent,
|
||||
posiNotional, posiNotional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, posiNotional, false, settment: false, newCalcLast: newCalcLast, closeList: closeList);
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ namespace UnitTestProject.Modules.SwapModule.Margin
|
||||
{
|
||||
oldList = svc.GetInterests(td, extend, valueDate, valueDate,
|
||||
preEods, marginPositions,
|
||||
0m, 0m, 0m, 0m, 1.0m,
|
||||
0m, 0m, 1.0m,
|
||||
(int)SwapEventTypeEnum.自动互换, tdClose: false,
|
||||
orginPv: 0m,
|
||||
add: false, settment: true, newCalcLast: false, closeList: null);
|
||||
|
||||
@@ -119,7 +119,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = CreateInterestPosition();
|
||||
var interests = service.GetInterests(td, td.trade_extend, unwindDate, unwindDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
add: false, settment: false, newCalcLast: false);
|
||||
return interests.Count > 0 ? interests[0].InterestAmount : 0m;
|
||||
@@ -142,7 +142,7 @@ namespace YLErp.Modules.SwapModule
|
||||
};
|
||||
var interests = service.GetInterests(td, td.trade_extend, valueDate, valueDate,
|
||||
new List<eod_swap_position> { preEod }, new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
add: false, settment: true, newCalcLast: false);
|
||||
if (interests.Count == 0) return (0m, 0m);
|
||||
@@ -313,7 +313,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var svc5 = new StubDealService(0m, floatRate: 0.001);
|
||||
var i5 = svc5.GetInterests(td, td.trade_extend, day5, day5,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
settment: false);
|
||||
decimal swap1 = i5.Count > 0 ? i5[0].InterestAmount : 0m;
|
||||
@@ -322,7 +322,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var svc10 = new StubDealService(swap1, floatRate: 0.001);
|
||||
var i10 = svc10.GetInterests(td, td.trade_extend, day10, day10,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
settment: false);
|
||||
decimal swap2 = i10.Count > 0 ? i10[0].InterestAmount : 0m;
|
||||
@@ -332,7 +332,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var svc15 = new StubDealService(totalConsumed, floatRate: 0.001);
|
||||
var i15 = svc15.GetInterests(td, td.trade_extend, day15, day15,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
settment: false);
|
||||
decimal finalUnwind = i15.Count > 0 ? i15[0].InterestAmount : 0m;
|
||||
@@ -362,7 +362,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var svc = new StubDealService(0m, floatRate: 0.001);
|
||||
var interests = svc.GetInterests(td, td.trade_extend, unwindDate, unwindDate,
|
||||
new List<eod_swap_position>(), new List<swap_position> { position },
|
||||
Principal, Principal, Principal, Principal, 1m,
|
||||
Principal, Principal, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, Principal,
|
||||
settment: false);
|
||||
return interests.Count > 0 ? interests[0].InterestAmount : 0m;
|
||||
|
||||
@@ -103,7 +103,7 @@ namespace YLErp.Modules.SwapModule
|
||||
SwapCalcTrace.Reset();
|
||||
var eod = new List<eod_swap_position> { MakeEod(valueDate, PrepayRemaining, 0m) };
|
||||
var fe = _svc.GetInterests(td, td.trade_extend, FullDate, FullDate, eod,
|
||||
new List<swap_position> { pos }, PrepayFix, PrepayFix, PrepayFix, PrepayFix, 1m,
|
||||
new List<swap_position> { pos }, PrepayFix, PrepayFix, 1m,
|
||||
(int)SwapEventTypeEnum.平仓, false, PrepayFix, false,
|
||||
settment: false, newCalcLast: calcLast, closeList: null)[0];
|
||||
var trace = SwapCalcTrace.Dump();
|
||||
|
||||
@@ -101,7 +101,7 @@ namespace YLErp.Modules.SwapModule
|
||||
protected override List<swap_flow_event> CalcSwapInterests(
|
||||
trade td, trade_extend tradeExtend, DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent, int eventType, bool tdClose,
|
||||
decimal orginPv, bool add = false, bool settment = true, bool newCalcLast = false,
|
||||
List<swap_flow_event> closeList = null)
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var result = service.GetInterests(
|
||||
trade, trade.trade_extend, closeCase.CloseDate, closeCase.CloseDate,
|
||||
new List<eod_swap_position> { previousEod }, new List<swap_position> { position },
|
||||
closeCase.RemainingNotional, closeCase.RemainingNotional, 0m,
|
||||
closeCase.RemainingNotional,
|
||||
closeCase.RemainingNotional, 1m, (int)SwapEventTypeEnum.平仓,
|
||||
false,
|
||||
closeCase.InterestType == 0 ? closeCase.RemainingNotional : closeCase.OriginalNotional,
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using YLErp.DBModels.Enums;
|
||||
|
||||
@@ -272,7 +273,16 @@ namespace YLErp.Modules.SwapModule
|
||||
Console.WriteLine($" ✓ {scenario.Scenario}");
|
||||
}
|
||||
|
||||
Assert.AreEqual(13, parameters.Length, "DealInterests应有13个参数");
|
||||
// 校验参数集合(按名称,对参数增删/重排/改名均敏感,比裸数字更稳)
|
||||
var expectedParamNames = new[]
|
||||
{
|
||||
"interestList", "eodPositions", "todyEodPositions", "settleDate",
|
||||
"td", "flowEvents", "autoInterests", "lastEodSwap",
|
||||
"posiTotalNotional", "closeNational", "grossPrice", "orginPv"
|
||||
};
|
||||
var actualParamNames = parameters.Select(p => p.Name).ToArray();
|
||||
CollectionAssert.AreEquivalent(expectedParamNames, actualParamNames,
|
||||
"DealInterests 参数集合应与预期一致(新增/重排/改名参数时请同步更新此列表)");
|
||||
Console.WriteLine("✅ 分支覆盖分析完成");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
protected override List<swap_flow_event> CalcSwapInterests(
|
||||
trade td, trade_extend tradeExtend, DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent, int eventType, bool tdClose,
|
||||
decimal orginPv, bool add = false, bool settment = true, bool newCalcLast = false,
|
||||
List<swap_flow_event> closeList = null)
|
||||
@@ -64,7 +64,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
var svc = new StubSwapDealService(
|
||||
new OptUserInfo(0, nameof(SwapInterestScenario1And2Test), OptUserFrom.UnitTest), _floatRates);
|
||||
return svc.GetInterests(td, tradeExtend, valueDate, unwindDate,
|
||||
eodPositions, positions, posiNotionalValue, posiLongNotionalValue, posiShortNotionalValue,
|
||||
eodPositions, positions, posiNotionalValue,
|
||||
closePosiNotionalValue, closePrecent, eventType, tdClose,
|
||||
orginPv, add, settment, newCalcLast, closeList);
|
||||
}
|
||||
@@ -74,7 +74,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
List<swap_flow_event> flowEvents, decimal closeNotional, eod_swap_position prevEod)
|
||||
{
|
||||
SaveAutoEodWithCloseInterestPosition(prevEod, null, position, td, valueDate, null,
|
||||
posiLongNotional, posiShortNotional, flowEvents, closeNotional, false, 1m,
|
||||
posiLongNotional + posiShortNotional, flowEvents, closeNotional, false, 1m,
|
||||
posiLongNotional + posiShortNotional);
|
||||
return PersistedPositions.LastOrDefault();
|
||||
}
|
||||
@@ -211,7 +211,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
var interests = svc.GetInterests(
|
||||
td, td.trade_extend, valueDate, valueDate,
|
||||
prevEod, new List<swap_position> { position },
|
||||
closeNotional, closeNotional, 0m, closeNotional, 1m,
|
||||
closeNotional, closeNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, closeNotional, false, settment: false, newCalcLast: isMaturity);
|
||||
Assert.AreEqual(1, interests.Count);
|
||||
|
||||
@@ -178,7 +178,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
protected override List<swap_flow_event> CalcSwapInterests(
|
||||
trade td, trade_extend tradeExtend, DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent, int eventType, bool tdClose,
|
||||
decimal orginPv, bool add = false, bool settment = true, bool newCalcLast = false,
|
||||
List<swap_flow_event> closeList = null)
|
||||
@@ -186,7 +186,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
var svc = new RealSwapDealService(
|
||||
new OptUserInfo(0, nameof(SwapInterestScenario3And4FloatingTest), OptUserFrom.UnitTest), _floatRates, FlowEvents);
|
||||
var interests = svc.GetInterests(td, tradeExtend, valueDate, unwindDate,
|
||||
eodPositions, positions, posiNotionalValue, posiLongNotionalValue, posiShortNotionalValue,
|
||||
eodPositions, positions, posiNotionalValue,
|
||||
closePosiNotionalValue, closePrecent, eventType, tdClose,
|
||||
orginPv, add, settment, newCalcLast, closeList);
|
||||
// 捕获 base InterestPrincipal(= EOD:1406 行赋给 TdInterestPrincipal 的值,反推前),供 TdInterestPrincipal 断言镜像分叉。
|
||||
@@ -226,7 +226,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
List<swap_flow_event> flowEvents, decimal closeNotional, eod_swap_position prevEod)
|
||||
{
|
||||
SaveAutoEodWithCloseInterestPosition(prevEod, null, position, _td, valueDate, null,
|
||||
posiLongNotional, posiShortNotional, flowEvents, closeNotional, false, 1m,
|
||||
posiLongNotional + posiShortNotional, flowEvents, closeNotional, false, 1m,
|
||||
posiLongNotional + posiShortNotional);
|
||||
return PersistedPositions.LastOrDefault();
|
||||
}
|
||||
@@ -394,7 +394,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
var interests = svc.GetInterests(
|
||||
td, td.trade_extend, valueDate, valueDate,
|
||||
prevEod, new List<swap_position> { position },
|
||||
closeNotional, closeNotional, 0m, closeNotional, 1m,
|
||||
closeNotional, closeNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, closeNotional, false, settment: false, newCalcLast: isMaturity);
|
||||
Assert.AreEqual(1, interests.Count);
|
||||
|
||||
@@ -79,14 +79,14 @@ namespace YLErp.Modules.SwapModule
|
||||
protected override List<swap_flow_event> CalcSwapInterests(
|
||||
trade td, trade_extend tradeExtend, DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent, int eventType, bool tdClose,
|
||||
decimal orginPv, bool add = false, bool settment = true, bool newCalcLast = false,
|
||||
List<swap_flow_event> closeList = null)
|
||||
{
|
||||
LastInterestCalculationPositions = positions;
|
||||
return base.CalcSwapInterests(td, tradeExtend, valueDate, unwindDate,
|
||||
eodPositions, positions, posiNotionalValue, posiLongNotionalValue, posiShortNotionalValue,
|
||||
eodPositions, positions, posiNotionalValue,
|
||||
closePosiNotionalValue, closePrecent, eventType, tdClose,
|
||||
orginPv, add, settment, newCalcLast, closeList);
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
protected override List<swap_flow_event> CalcSwapInterests(
|
||||
trade td, trade_extend tradeExtend, DateTime valueDate, DateTime unwindDate,
|
||||
List<eod_swap_position> eodPositions, List<swap_position> positions,
|
||||
decimal posiNotionalValue, decimal posiLongNotionalValue, decimal posiShortNotionalValue,
|
||||
decimal posiNotionalValue,
|
||||
decimal closePosiNotionalValue, decimal closePrecent, int eventType, bool tdClose,
|
||||
decimal orginPv, bool add = false, bool settment = true, bool newCalcLast = false,
|
||||
List<swap_flow_event> closeList = null)
|
||||
@@ -67,7 +67,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
var svc = new StubSwapDealService(
|
||||
new OptUserInfo(0, nameof(SwapSingleTradeVerificationTest), OptUserFrom.UnitTest), _floatRates);
|
||||
return svc.GetInterests(td, tradeExtend, valueDate, unwindDate,
|
||||
eodPositions, positions, posiNotionalValue, posiLongNotionalValue, posiShortNotionalValue,
|
||||
eodPositions, positions, posiNotionalValue,
|
||||
closePosiNotionalValue, closePrecent, eventType, tdClose,
|
||||
orginPv, add, settment, newCalcLast, closeList);
|
||||
}
|
||||
@@ -77,7 +77,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
List<swap_flow_event> flowEvents, decimal closeNotional, eod_swap_position prevEod)
|
||||
{
|
||||
SaveAutoEodWithCloseInterestPosition(prevEod, null, position, td, valueDate, null,
|
||||
posiLongNotional, posiShortNotional, flowEvents, closeNotional, false, 1m,
|
||||
posiLongNotional + posiShortNotional, flowEvents, closeNotional, false, 1m,
|
||||
posiLongNotional + posiShortNotional);
|
||||
return PersistedPositions.LastOrDefault();
|
||||
}
|
||||
@@ -213,7 +213,7 @@ namespace UnitTestProject.Modules.SwapModule
|
||||
var interests = svc.GetInterests(
|
||||
td, td.trade_extend, valueDate, valueDate,
|
||||
prevEod, new List<swap_position> { position },
|
||||
closeNotional, closeNotional, 0m, closeNotional, 1m,
|
||||
closeNotional, closeNotional, 1m,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, closeNotional, false, settment: false, newCalcLast: isMaturity);
|
||||
Assert.AreEqual(1, interests.Count);
|
||||
|
||||
@@ -93,7 +93,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = MakePrepayPosition();
|
||||
var interests = _svc.GetInterests(td, td.trade_extend, UnwindDate, UnwindDate,
|
||||
eodPositions, new List<swap_position> { position },
|
||||
UnderlyingNotional, UnderlyingNotional, UnderlyingNotional, UnderlyingNotional, closePercent,
|
||||
UnderlyingNotional, UnderlyingNotional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, UnderlyingNotional, false, settment: false, newCalcLast: false, closeList: null);
|
||||
Assert.AreEqual(1, interests.Count, "预付金腿应生成 1 条 flow_event");
|
||||
@@ -111,7 +111,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = MakePrepayPosition(fix, rate);
|
||||
var interests = _svc.GetInterests(td, td.trade_extend, UnwindDate, UnwindDate,
|
||||
eodPositions, new List<swap_position> { position },
|
||||
notional, notional, notional, notional, closePercent,
|
||||
notional, notional, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, notional, false, settment: false, newCalcLast: false, closeList: null);
|
||||
Assert.AreEqual(1, interests.Count, "预付金腿应生成 1 条 flow_event");
|
||||
@@ -279,7 +279,7 @@ namespace YLErp.Modules.SwapModule
|
||||
};
|
||||
var interests = _svc.GetInterests(td, td.trade_extend, ProdUnwindDate, ProdUnwindDate,
|
||||
eod, new List<swap_position> { position },
|
||||
fix, fix, fix, fix, closePercent,
|
||||
fix, fix, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, fix, false, settment: false, newCalcLast: false, closeList: null);
|
||||
Assert.AreEqual(1, interests.Count, "预付金腿应生成 1 条 flow_event");
|
||||
@@ -373,7 +373,7 @@ namespace YLErp.Modules.SwapModule
|
||||
// orginPv 传 notional:非预付金腿不走 877-881 的 Fix 对齐,dynomicPrincipal = notional + notional - notional = notional
|
||||
var interests = _svc.GetInterests(td, td.trade_extend, ProdUnwindDate, ProdUnwindDate,
|
||||
eod, new List<swap_position> { position },
|
||||
notional, notional, notional, notional * closePercent, closePercent,
|
||||
notional, notional * closePercent, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, notional, false, settment: false, newCalcLast: false, closeList: null);
|
||||
Assert.AreEqual(1, interests.Count, "非预付金腿应生成 1 条 flow_event");
|
||||
@@ -488,7 +488,7 @@ namespace YLErp.Modules.SwapModule
|
||||
};
|
||||
var interests = _svc.GetInterests(td, td.trade_extend, ProdUnwindDate, ProdUnwindDate,
|
||||
eodPos, new List<swap_position> { position },
|
||||
baseP, baseP, baseP, baseP * closePercent, closePercent,
|
||||
baseP, baseP * closePercent, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, baseP, false, settment: eodPath, newCalcLast: false, closeList: null);
|
||||
Assert.AreEqual(1, interests.Count, $"mode={mode} 应生成 1 条 flow_event");
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace YLErp.Modules.SwapModule
|
||||
var position = MakePosition(currentNotional);
|
||||
var interests = _svc.GetInterests(td, td.trade_extend, UnwindDate, UnwindDate,
|
||||
MakeLastEod(), new List<swap_position> { position },
|
||||
currentNotional, currentNotional, currentNotional, currentNotional * closePercent, closePercent,
|
||||
currentNotional, currentNotional * closePercent, closePercent,
|
||||
(int)SwapEventTypeEnum.平仓,
|
||||
false, N, false, settment: false, newCalcLast: false, closeList: null);
|
||||
Assert.AreEqual(1, interests.Count, "标的期初全价腿应生成 1 条 flow_event");
|
||||
|
||||
Reference in New Issue
Block a user