Merge branch 'glms/feature/dotnumber' into glms/feature/1.4.2
# Conflicts: # YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml # YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeEdit.js
This commit is contained in:
@@ -51,6 +51,24 @@ namespace YLErp.Modules.SwapModule
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private static decimal ValidateDeliveryPrice(decimal price, string fieldName)
|
||||
{
|
||||
var roundedPrice = Math.Round(price, ConsGlobal.SwapDeliveryPriceRound, MidpointRounding.AwayFromZero);
|
||||
if (price != roundedPrice)
|
||||
{
|
||||
throw new ServiceException($"{fieldName}最多保留{ConsGlobal.SwapDeliveryPriceRound}位小数");
|
||||
}
|
||||
return roundedPrice;
|
||||
}
|
||||
|
||||
private static decimal? RoundSwapBondNetPriceAndYtm(decimal? value)
|
||||
{
|
||||
return value.HasValue
|
||||
? Math.Round(value.Value, ConsGlobal.PriceRound, MidpointRounding.AwayFromZero)
|
||||
: null;
|
||||
}
|
||||
|
||||
#region 互换交易保存
|
||||
/// <summary>
|
||||
/// 新版收益互换预付金校验
|
||||
@@ -334,7 +352,7 @@ namespace YLErp.Modules.SwapModule
|
||||
AssetBookName = asset.Name,
|
||||
Notional = Convert.ToDouble(flowMerge.TradingQtyAbs),
|
||||
TradeAmount = Convert.ToDouble(flowMerge.TradingQtyAbs),
|
||||
StockEqvNotional = Convert.ToDouble(flowMerge.TradingAmount),
|
||||
StockEqvNotional = Math.Round(Convert.ToDouble(flowMerge.TradingAmount), ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero),
|
||||
IsAutoGenerate = true,
|
||||
};
|
||||
if (flowMerge.SettleDate.HasValue)
|
||||
@@ -352,7 +370,7 @@ namespace YLErp.Modules.SwapModule
|
||||
td.ValidState = "Valid";
|
||||
td.TradeSource = "系统交易";
|
||||
td.TradeStatus = ConsTrade.确认成交;
|
||||
td.InitYtm = flowMerge.InitYtm ?? 0;
|
||||
td.InitYtm = RoundSwapBondNetPriceAndYtm(flowMerge.InitYtm) ?? 0;
|
||||
return td;
|
||||
}
|
||||
/// <summary>
|
||||
@@ -372,11 +390,14 @@ namespace YLErp.Modules.SwapModule
|
||||
CountRatio = underlying.CountRatio,
|
||||
ContractSize = Convert.ToDecimal(underlying.ContractSize),
|
||||
PosiNetPrice = flowMerge.TradingAmountFeeAvgAbs,
|
||||
PosiGrossPrice = flowMerge.TradingAmountAvg,
|
||||
PosiGrossPrice = Math.Round(
|
||||
flowMerge.TradingAmountAvg,
|
||||
underlying.IsBond() ? ConsGlobal.PriceRound : ConsGlobal.SwapDeliveryPriceRound,
|
||||
MidpointRounding.AwayFromZero),
|
||||
PosiNetFeePrice = flowMerge.TradingAmountNetFeeAvg ?? 0,
|
||||
PosiNetNoFeePrice = flowMerge.TradingAmountNetAvg ?? 0,
|
||||
PosiQuantity = flowMerge.TradingQtyAbs,
|
||||
PosiNotionalValue = flowMerge.TradingAmount,
|
||||
PosiNotionalValue = Math.Round(flowMerge.TradingAmount, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero),
|
||||
PosiTradingFeePending = flowMerge.TradingFeePending,
|
||||
PosiTradingFee = 0,
|
||||
PosiTradingFeeUnit = 0,
|
||||
@@ -388,7 +409,7 @@ namespace YLErp.Modules.SwapModule
|
||||
OptId = UserInfo.UserId,
|
||||
OptName = UserInfo.UserName,
|
||||
UnderlyingInstrumentType = underlying.UnderlyingInstrumentType,
|
||||
InitYtm = flowMerge.InitYtm
|
||||
InitYtm = RoundSwapBondNetPriceAndYtm(flowMerge.InitYtm)
|
||||
};
|
||||
td.swap_positions.Add(floatPosition);
|
||||
swap_position interestPosition = new swap_position()
|
||||
@@ -581,7 +602,7 @@ namespace YLErp.Modules.SwapModule
|
||||
dbTrade.trade_extend = req.trade_extend;
|
||||
dbTrade.swap_positions = req.swap_positions;
|
||||
dbTrade.MetaDic = req.MetaDic;
|
||||
dbTrade.InitYtm = req.swap_positions.FirstOrDefault(p => p.InitYtm != null)?.InitYtm;
|
||||
dbTrade.InitYtm = RoundSwapBondNetPriceAndYtm(req.swap_positions.FirstOrDefault(p => p.InitYtm != null)?.InitYtm);
|
||||
InnerSaveTrade(false, dbTrade, changsStr, changeConfirmStatus);
|
||||
|
||||
return dbTrade;
|
||||
@@ -675,11 +696,7 @@ namespace YLErp.Modules.SwapModule
|
||||
private bool PrepareTrade(trade req, TradeSourceEnum dataSource, underlying_manager um)
|
||||
{
|
||||
bool tradeNumberGenerated = false;
|
||||
req.InitialMargin = Convert.ToDouble(req.trade_Initial_Margin.MarginValue);
|
||||
if (req.trade_Initial_Margin.MarginType == 0)
|
||||
{
|
||||
req.InitialMargin = req.StockEqvNotional == 0 ? 0 : Convert.ToDouble(req.trade_Initial_Margin.MarginValue) * req.StockEqvNotional;
|
||||
};
|
||||
PrepareInitialMargin(req);
|
||||
var isAddNew = req.id == 0;
|
||||
if (isAddNew)
|
||||
{
|
||||
@@ -722,6 +739,17 @@ namespace YLErp.Modules.SwapModule
|
||||
return tradeNumberGenerated;
|
||||
|
||||
}
|
||||
|
||||
private static void PrepareInitialMargin(trade req)
|
||||
{
|
||||
// 初始预付金依赖最终入库的名义本金,须先统一金额精度,避免两者无法勾稽。
|
||||
req.StockEqvNotional = Math.Round(req.StockEqvNotional, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
||||
req.InitialMargin = Convert.ToDouble(req.trade_Initial_Margin.MarginValue);
|
||||
if (req.trade_Initial_Margin.MarginType == 0)
|
||||
{
|
||||
req.InitialMargin = req.StockEqvNotional == 0 ? 0 : Convert.ToDouble(req.trade_Initial_Margin.MarginValue) * req.StockEqvNotional;
|
||||
}
|
||||
}
|
||||
//准备单个交易
|
||||
private trade PrepareSingleTrade(trade req, TradeSourceEnum dataSource, bool isAddNew, underlying_manager um)
|
||||
{
|
||||
@@ -764,6 +792,7 @@ namespace YLErp.Modules.SwapModule
|
||||
req.SpotPrice = Convert.ToDouble(swapPosition.PosiNetPrice);
|
||||
}
|
||||
req.Strike = null;
|
||||
req.StockEqvNotional = Math.Round(req.StockEqvNotional, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
||||
req.OriginalStockEqvNotional = req.StockEqvNotional;
|
||||
req.StockEqvNotionalReal = req.StockEqvNotional;
|
||||
|
||||
@@ -1351,13 +1380,19 @@ namespace YLErp.Modules.SwapModule
|
||||
position.UnderlyingCode = swap.UnderlyingCode;
|
||||
position.UnderlyingInstrumentType = swap.UnderlyingInstrumentType;
|
||||
position.PosiDirection = swap.PosiDirection;
|
||||
position.PosiGrossPrice = swap.PosiGrossPrice;
|
||||
position.PosiNetPrice = swap.PosiQuantity == 0 ? 0 : (swap.PosiGrossPrice + (position.PosiTradingFeePending / swap.PosiQuantity) * ratio);
|
||||
// position.PosiGrossPrice = string.IsNullOrEmpty(swap.UnderlyingCode)
|
||||
// ? Math.Round(swap.PosiGrossPrice, ConsGlobal.SwapDeliveryPriceRound, MidpointRounding.AwayFromZero)
|
||||
// : ValidateDeliveryPrice(swap.PosiGrossPrice, "期初交割价");
|
||||
var storagePriceRound = ConsGlobal.InstrumentType.IsBond(swap.UnderlyingInstrumentType)
|
||||
? ConsGlobal.PriceRound
|
||||
: ConsGlobal.SwapDeliveryPriceRound;
|
||||
position.PosiGrossPrice = Math.Round(swap.PosiGrossPrice, storagePriceRound, MidpointRounding.AwayFromZero);
|
||||
position.PosiNetPrice = swap.PosiQuantity == 0 ? 0 : (position.PosiGrossPrice + (position.PosiTradingFeePending / swap.PosiQuantity) * ratio);
|
||||
position.PosiNetPrice = Math.Round(position.PosiNetPrice, ConsGlobal.PriceRound, MidpointRounding.AwayFromZero);
|
||||
position.PosiNetNoFeePrice = swap.PosiNetNoFeePrice;
|
||||
position.PosiNetNoFeePrice = RoundSwapBondNetPriceAndYtm(swap.PosiNetNoFeePrice);
|
||||
position.PosiNetFeePrice = swap.PosiQuantity == 0 ? 0 : (swap.PosiNetNoFeePrice + (position.PosiTradingFeePending / swap.PosiQuantity) * ratio);
|
||||
position.PosiNetFeePrice = Math.Round(position.PosiNetFeePrice??0, ConsGlobal.PriceRound, MidpointRounding.AwayFromZero);
|
||||
position.PosiNotionalValue = swap.PosiNotionalValue;
|
||||
position.PosiNotionalValue = Math.Round(swap.PosiNotionalValue, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
||||
position.PosiQuantity = swap.PosiQuantity;
|
||||
position.InterestDirection = swap.InterestDirection;
|
||||
position.InterestMode = swap.InterestMode;
|
||||
@@ -1379,10 +1414,10 @@ namespace YLErp.Modules.SwapModule
|
||||
position.FloatRateUnderlyingCode = swap.FloatRateUnderlyingCode;
|
||||
position.interest_rest_days = swap.interest_rest_days;
|
||||
position.interest_rule = swap.interest_rule;
|
||||
position.InitYtm = swap.InitYtm;
|
||||
if (swap.InitYtm != null && swap.InitYtm > 0)
|
||||
position.InitYtm = RoundSwapBondNetPriceAndYtm(swap.InitYtm);
|
||||
if (position.InitYtm != null && position.InitYtm > 0)
|
||||
{
|
||||
td.InitYtm = swap.InitYtm;
|
||||
td.InitYtm = position.InitYtm;
|
||||
}
|
||||
|
||||
if (position.id == 0)
|
||||
@@ -1481,7 +1516,7 @@ namespace YLErp.Modules.SwapModule
|
||||
td.ProcessStatus = null;
|
||||
if (backToBegin)
|
||||
{
|
||||
td.StockEqvNotional = td.OriginalStockEqvNotional ?? 0;
|
||||
td.StockEqvNotional = Math.Round(td.OriginalStockEqvNotional ?? 0, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
||||
td.UnWindDate = null;
|
||||
td.HasPartialUnWind = null;
|
||||
SingleTradeBackToBegin(td, swapPositions);
|
||||
@@ -1643,10 +1678,10 @@ namespace YLErp.Modules.SwapModule
|
||||
posi.PosiGrossPrice = eodPosi.PosiGrossPrice;
|
||||
posi.PosiNetFeePrice = eodPosi.PosiNetFeePrice;
|
||||
posi.PosiNetNoFeePrice = eodPosi.PosiNetNoFeePrice;
|
||||
posi.PosiNotionalValue = eodPosi.PosiNotionalValue;
|
||||
posi.PosiNotionalValue = Math.Round(eodPosi.PosiNotionalValue, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
||||
if (posi.PosiDirection > 0)
|
||||
{
|
||||
td.StockEqvNotional = Convert.ToDouble(posi.PosiNotionalValue);
|
||||
td.StockEqvNotional = Math.Round(Convert.ToDouble(posi.PosiNotionalValue), ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
||||
td.TradeAmount = Convert.ToDouble(posi.PosiQuantity);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user