using YLErp.BLL;
using YLErp.Configuration;
using YLErp.Modules.CalculationModule;
namespace YLErp.Modules.TradeModule.OrderModule
{
///
/// 交易简讯服务
///
public partial class TradeAbstractService : YLBaseService
{
public TradeAbstractService(YLBaseService baseService) : base(baseService)
{
}
public TradeAbstractService(OptUserInfo userInfo) : base(userInfo)
{
}
///
/// 获取交易简讯数据
///
public string GetTradeAbstractInfoText(int tradeId, bool throwIfNotFoundTrade)
{
var td = DbContext.trade.FirstOrDefault(n => n.id == tradeId);
if (td == null)
{
if (throwIfNotFoundTrade)
{
throw new ServiceException("交易数据不存在,id:" + tradeId);
}
return null;
}
tradeBLL.SetFieldsByTradeType(new[] { td });
return GetTradeAbstractInfoText(td);
}
///
/// 获取交易简讯数据
///
public static string GetTradeAbstractInfoText(trade td)
{
var items = GetTradeAbstractInfoItems(td);
return string.Join("\r\n", items.Select(
n => string.IsNullOrEmpty(n.text) ? n.value : n.text.EndsWith(" ") ? n.text + n.value : n.text + ":" + n.value));
}
///
/// 获取交易简讯数据
///
public static IEnumerable<(string text, string value)> GetTradeAbstractInfoItems(trade td)
{
var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(td.UnderlyingCode);
var wrap = new InnerWrap(underlying, td);
IEnumerable<(string text, string value)> bodyList;
switch (td.TradeType == "结构化交易" ? td.StructureType : td.TradeType)
{
case "亚式期权":
bodyList = GenerateTradeAbstract_Asian(td, wrap);
break;
case "障碍期权":
bodyList = GenerateTradeAbstract_Barrier(td, wrap);
break;
case "远期":
case "掉期":
bodyList = GenerateTradeAbstract_Forward(td, wrap);
break;
case "二元期权":
bodyList = GenerateTradeAbstract_binary(td, wrap);
break;
case "雪球期权":
bodyList = GenerateTradeAbstract_snowball(td, wrap);
break;
case "凤凰期权":
bodyList = GenerateTradeAbstract_autocall(td, wrap);
break;
case "双鲨期权":
bodyList = GenerateTradeAbstract_double_sharkfin(td, wrap);
break;
case "香草期权":
case "合成价差期权":
bodyList = GenerateTradeAbstract_Vanilla(td, wrap);
break;
case "现金流交易":
bodyList = GenerateTradeAbstract_Cashflow(td);
break;
case "累计期权":
bodyList = GenerateTradeAbstract_Accumulator(td, wrap);
break;
case "Risky期权":
bodyList = GenerateTradeAbstract_Risky(td, wrap);
break;
default:
bodyList = GenerateTradeAbstract_Defalt(td, wrap);
break;
}
var bodyIndent = string.Empty;
if (PS.Config.Is厦门象屿)
{
bodyList = bodyList.Prepend(("开仓信息", ""));
}
if (bodyList.Any())
{
//var maxLen = bodyList.Max(n => n.text.Length);
//bodyIndent = new string(' ', maxLen + 1);
//bodyList = bodyList.Select(n => (n.text == "#" ? bodyIndent : n.text.PadLeft(maxLen, ' '), n.value)).ToArray();
bodyList = bodyList.Select(n => (n.text == "#" ? new string(' ', 5) : n.text, n.value)).ToArray();
}
var headIndent = bodyIndent.Length > 3 ? bodyIndent.Substring(0, bodyIndent.Length - 3) : string.Empty;
var list = new List<(string text, string value)>() {
(headIndent, PS.Config.CompanyName),
(headIndent, "【场外成交记录摘要】"),
(string.Empty, "####")
};
list.AddRange(bodyList);
return list;
}
///
/// 其他期权生成交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Defalt(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("买卖方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
};
if (wrap.Underlying == null)
{
return list;
}
list.Add(("标的代码", td.UnderlyingCode));
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var tradeType = td.TradeType;
switch (tradeType)
{
case "结构化交易":
tradeType = td.StructureType;
break;
case "凤凰期权":
case ConsGlobal.TradeType.CashFlow:
case ConsGlobal.TradeType.Forward:
case ConsGlobal.TradeType.PayoffSwap:
break;
case "雪球期权":
tradeType = td.OptionType + "雪球";
break;
case "自定义交易":
tradeType = td.StructureIntroduction.TrimToNull() ?? td.StructureType.TrimToNull() ?? td.TradeType;
break;
case "气囊结构":
case "区间累积期权":
case "收益增强结构":
tradeType = td.ExerciseModeCn + tradeType;
break;
default:
tradeType = td.ExerciseModeCn + tradeType.Replace("期权", "") + td.OptionType + "期权";
break;
}
list.Add(("期权类型", tradeType));
if (td.TradeType == "合成价差期权" && !string.IsNullOrWhiteSpace(td.SyntheticUnderlyingTipsInfo))
{
td.UnderlyingCode = td.SyntheticUnderlyingTipsInfo;
}
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
if ((td.TradeType != "亚式期权" || td.trade_asian_option.StrikeType != "Floating") && td.TradeType != "雪球期权")
{
list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
}
var actualExerciseDate = td.ExerciseDate;
if (td.MetaDic == null || td.MetaDic.Count == 0)
{
var exerciseDate = new TradeMetaService(OptUserInfo.SystemUser).GetTradeMeta(td.id, "ActualExerciseDate");
if (!string.IsNullOrWhiteSpace(exerciseDate) && DateTime.TryParse(exerciseDate, out var tempDate))
{
actualExerciseDate = tempDate;
}
}
list.Add(("到期日期", actualExerciseDate.OtcFormatDate()));
if (wrap.IsUsePremiumRate)
{
list.Add(("期权费率", wrap.premiumFmt(td.PremiumRate)));
}
else
{
list.Add(("权利金", wrap.premiumFmt(td.TradeSinglePrice ?? 0) + " " + (td.UnderlyingInstrumentType.Contains("Commodity") ? wrap.QuoteUnitString : "")));
list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString)));
}
if (PS.Config.Is方顿)
{
list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元"));
}
if (PS.Config.Company == CompanyEnum.厦门象屿 || PS.Config.Is润和)
{
list.Add(("成交总额", td.TradePrice.OtcFormatMoney() + " 元"));
}
else
{
list.AddRange(new[] {
("成交总额", td.TradePrice.OtcFormatMoney() + " 元"),
("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney()+ (PS.Config.Is浙期 ? " 元" : "")),
("参与率", td.ParticipationRate.OtcFormatPercent()),
});
}
if (tradeType == "凤凰期权")
{
var koInfo = "";
var coInfo = "";
if (!string.IsNullOrWhiteSpace(td.trade_autocall.KOObservationDates))
{
koInfo = String.Join(",", td.trade_autocall.KOObservationDates.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[0]);
var KOObservationDates = QdpModule.QdpHelper.ParseAutocallCustomizedInfo(td.trade_autocall.KOObservationDates);
if (PS.Config.Is浙期)
{
for (var i = 0; i < KOObservationDates.Item1.Length; i++)
{
string splitStr = ", ";
if (i == KOObservationDates.Item1.Length - 1)
{
splitStr = "";
}
var couponInfo = KOObservationDates.Item3[i].OtcFormat(OtcFormatFlag.percent) + splitStr;
coInfo += KOObservationDates.Item1[i].DateTime.ToString("yyyy-MM-dd") + couponInfo;
}
}
else
{
coInfo = String.Join(",", td.trade_autocall.CouponObservation.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[0]);
}
}
list.Add(("敲出观察日期", koInfo));
list.Add(("票息支付日", coInfo));
}
return list;
}
///
/// 其他期权生成交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Risky(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var dbrisky = td.trade_risky_option;
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("买卖方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
};
if (wrap.Underlying == null)
{
return list;
}
list.Add(("标的代码", td.UnderlyingCode));
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var tradeType = td.ExerciseModeCn + td.TradeType.Replace("期权", "") + td.OptionType + "期权";
list.Add(("期权类型", tradeType));
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
list.Add(("执行价格", wrap.strikeFmt(dbrisky.Strike1) + (PS.Config.Is浙期 ? " 元" : "")));
list.Add(("执行价格2", wrap.strikeFmt(dbrisky.Strike2) + (PS.Config.Is浙期 ? " 元" : "")));
list.Add(("执行价格3", wrap.strikeFmt(dbrisky.Strike3) + (PS.Config.Is浙期 ? " 元" : "")));
list.Add(("参与率", dbrisky.ParticipationRate1.OtcFormatPercent()));
list.Add(("参与率2", dbrisky.ParticipationRate2.OtcFormatPercent()));
list.Add(("参与率3", dbrisky.ParticipationRate3.OtcFormatPercent()));
list.Add(("到期日期", td.ExerciseDate.OtcFormatDate()));
if (wrap.IsUsePremiumRate)
{
list.Add(("期权费率", wrap.premiumFmt(td.PremiumRate)));
}
else
{
list.Add(("权利金", wrap.premiumFmt(td.TradeSinglePrice ?? 0) + " " + (td.UnderlyingInstrumentType.Contains("Commodity") ? wrap.QuoteUnitString : "")));
var tradeampunt = TradeCalcHelper.GetTradeAmountV(td).OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional);
list.Add(("成交数量", tradeampunt));
}
if (PS.Config.Is方顿)
{
list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元"));
}
if (PS.Config.Company == CompanyEnum.厦门象屿 || PS.Config.Is润和)
{
list.Add(("成交总额", td.TradePrice.OtcFormatMoney() + " 元"));
}
else
{
list.AddRange(new[] {
("成交总额", td.TradePrice.OtcFormatMoney() + " 元"),
("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney()+ (PS.Config.Is浙期 ? " 元" : "")),
});
}
return list;
}
///
/// 凤凰期权生成交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_autocall(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var autocall = td.trade_autocall;
if (autocall == null)
{
throw new ServiceException("凤凰期权扩展信息不存在,无法生成交易摘要");
}
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("开仓方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
};
if (PS.Config.Company != CompanyEnum.厦门象屿 && !PS.Config.Is润和)
{
list.AddRange(new[] {
("名义本金", OtcFormatExtensions.OtcFormat(td.StockEqvNotionalToShow, OtcFormatFlag.StockEqvNotional))
});
}
list.Add(("期权类型", "凤凰期权 " + td.OptionType));
list.Add(("标的代码", td.UnderlyingCode));
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + "(开仓)"));
//if (td.TradeType != "自定义交易" && (td.TradeType != "亚式期权" || td.trade_asian_option.StrikeType != "Floating") && td.TradeType != "雪球期权")
//{
// list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
//}
//if (!wrap.IsUsePremiumRate)
//{
// list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString)));
//}
if (PS.Config.Is方顿)
{
list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元"));
}
list.Add(("敲入价格", wrap.strikeFmt(autocall.KIBarrier) + (PS.Config.Is浙期 ? " 元" : "")));
list.Add(("敲出价格", wrap.strikeFmt(autocall.KOBarrier) + (PS.Config.Is浙期 ? " 元" : "")));
switch (autocall.KIPayoffType)
{
case KIPayoffTypeEnum.None:
break;
case KIPayoffTypeEnum.ToCallOption:
list.Add(("执行价格一", wrap.strikeFmt(autocall.SpreadStrike1)));
break;
case KIPayoffTypeEnum.ToPutOption:
list.Add(("执行价格一", wrap.strikeFmt(autocall.SpreadStrike1)));
break;
case KIPayoffTypeEnum.ToCallSpreadOption:
list.Add(("执行价格一", wrap.strikeFmt(autocall.SpreadStrike)));
list.Add(("执行价格二", wrap.strikeFmt(autocall.SpreadStrike1)));
break;
case KIPayoffTypeEnum.ToPutSpreadOption:
list.Add(("执行价格一", wrap.strikeFmt(autocall.SpreadStrike)));
list.Add(("执行价格二", wrap.strikeFmt(autocall.SpreadStrike1)));
break;
default:
break;
}
var kiObsInfo = "每日观察";
if (!string.IsNullOrWhiteSpace(autocall.ObservationDates))
{
kiObsInfo = autocall.ObservationDates;
}
list.Add(("票息率", autocall.Coupon.OtcFormat(OtcFormatFlag.percent)));
list.Add(("票息年化", autocall.IsFixedCoupon ? "否" : "是"));
if (!string.IsNullOrWhiteSpace(kiObsInfo))
{
list.Add(("敲入观察日期", kiObsInfo));
}
var koInfo = "";
var coInfo = "";
if (!string.IsNullOrWhiteSpace(autocall.KOObservationDates))
{
if (PS.Config.Is浙期)
{
var KOObservationDates = string.IsNullOrEmpty(td.trade_autocall.CouponObservation) ? QdpModule.QdpHelper.ParseAutocallCustomizedInfo(TradeObservationHelper.GetAutocallKOObservationAndCoupon(td.trade_autocall.KOObservationDates, td.trade_autocall.CouponBarrier).Item1) : QdpModule.QdpHelper.ParseAutocallCustomizedInfo(td.trade_autocall.CouponObservation);
if (KOObservationDates.Item1 != null)
{
for (var i = 0; i < KOObservationDates.Item1.Length; i++)
{
string splitStr = ", ";
if (i == KOObservationDates.Item1.Length - 1)
{
splitStr = "";
}
var couponInfo = ":" + KOObservationDates.Item3[i].OtcFormat(OtcFormatFlag.percent) + splitStr;
koInfo += KOObservationDates.Item1[i].DateTime.ToString("yyyy-MM-dd") + couponInfo;
}
}
}
else
{
var KOObservationDatesArr = td.trade_autocall.KOObservationDates.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
if (KOObservationDatesArr.Length != 2 && KOObservationDatesArr.Length > 0)
{
var ko = TradeObservationHelper.GetAutocallKOObservationAndCoupon(td.trade_autocall.KOObservationDates, td.trade_autocall.CouponBarrier);
td.trade_autocall.CouponObservation = ko.Item1;
td.trade_autocall.KOObservationDates = ko.Item2;
KOObservationDatesArr = ko.Item2.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
if (KOObservationDatesArr.Any())
{
koInfo = String.Join(",", KOObservationDatesArr[0]);
}
}
else
{
koInfo = String.Join(",", td.trade_autocall.KOObservationDates.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[0]);
}
coInfo = String.Join(",", td.trade_autocall.CouponObservation.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)[0]);
}
}
list.Add(("到期日期", td.ExerciseDate.OtcFormatDate()));
list.Add(("敲出观察日期", koInfo));
if (coInfo.Length > 0)
{
list.Add(("票息支付日", coInfo));
}
return list;
}
///
/// 生成双鲨期权交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_double_sharkfin(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var dbshark = td.trade_double_sharkfin_option;
if (dbshark == null)
{
throw new ServiceException("双鲨期权扩展信息不存在,无法生成交易摘要");
}
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var tradeType = td.ExerciseModeCn + td.TradeType.Replace("期权", "") + td.OptionType + "期权";
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("买卖方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
("标的代码", td.UnderlyingCode),
};
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
list.Add(("期权类型", tradeType));
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
if (td.TradeType != "自定义交易" && (td.TradeType != "亚式期权" || td.trade_asian_option.StrikeType != "Floating") && td.TradeType != "雪球期权")
{
list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
}
list.Add(("到期日期", td.ExerciseDate.OtcFormatDate()));
if (wrap.IsUsePremiumRate)
{
list.Add(("期权费率", wrap.premiumFmt(td.PremiumRate)));
}
else
{
list.Add(("权利金", wrap.premiumFmt(td.TradeSinglePrice ?? 0) + " " + (td.UnderlyingInstrumentType.Contains("Commodity") ? wrap.QuoteUnitString : "")));
list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString)));
}
if (PS.Config.Is方顿)
{
list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元"));
}
if (PS.Config.Company == CompanyEnum.厦门象屿 || PS.Config.Is润和)
{
list.AddRange(new[] {
("成交总额", td.TradePrice.OtcFormatMoney() + " 元")
});
list.AddRange(new[] {
("高障碍价格",wrap.strikeFmt( dbshark.BarrierHigh)+ (PS.Config.Is浙期 ? " 元" : "")),
("低障碍价格", wrap.strikeFmt(dbshark.BarrierLow)+ (PS.Config.Is浙期 ? " 元" : "")),
("高行权价",wrap. strikeFmt(dbshark.StrikeHigh)+ (PS.Config.Is浙期 ? " 元" : "")),
("连离类型", dbshark.Discrete),
("补偿金额", wrap.premiumFmt(wrap.IsUsePremiumRate? dbshark.RebateRate:dbshark.Rebate)+ " 元"),
("高障碍补偿金额",wrap. premiumFmt(wrap.IsUsePremiumRate? dbshark.RebateHighRate:dbshark.RebateHigh)+ " 元") });
}
else
{
list.AddRange(new[] {
("成交总额", td.TradePrice.OtcFormatMoney() + " 元"),
("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney()+ (PS.Config.Is浙期 ? " 元" : "")),
("参与率", td.ParticipationRate.OtcFormatPercent()),
});
list.AddRange(new[] {
("高障碍价格",wrap.strikeFmt( dbshark.BarrierHigh)+ (PS.Config.Is浙期 ? " 元" : "")),
("低障碍价格", wrap.strikeFmt(dbshark.BarrierLow)+ (PS.Config.Is浙期 ? " 元" : "")),
("高行权价",wrap. strikeFmt(dbshark.StrikeHigh)+ (PS.Config.Is浙期 ? " 元" : "")),
("连离类型", dbshark.Discrete),
("补偿金额", wrap.premiumFmt(wrap.IsUsePremiumRate? dbshark.RebateRate:dbshark.Rebate)+ " 元"),
("高障碍补偿金额",wrap. premiumFmt(wrap.IsUsePremiumRate? dbshark.RebateHighRate:dbshark.RebateHigh)+ " 元"),
("高参与率", dbshark.CallParticipationRate.OtcFormatPercent()),
("低参与率", dbshark.PutParticipationRate.OtcFormatPercent()),
});
}
return list;
}
///
/// 生成二元期权交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_binary(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var binary = td.trade_binary_option;
if (binary == null)
{
throw new ServiceException("二元期权扩展信息不存在,无法生成交易摘要");
}
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var tradeType = td.ExerciseMode == "American" ? td.ExerciseModeCn + td.TradeType.Replace("期权", "") + "期权" : td.ExerciseModeCn + td.TradeType.Replace("期权", "") + td.OptionType + "期权";
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("买卖方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
("标的代码", td.UnderlyingCode),
};
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
list.Add(("期权类型", tradeType));
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
if (td.TradeType != "自定义交易" && (td.TradeType != "亚式期权" || td.trade_asian_option.StrikeType != "Floating") && td.TradeType != "雪球期权")
{
list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
}
list.Add(("到期日期", td.ExerciseDate.OtcFormatDate()));
if (wrap.IsUsePremiumRate)
{
list.Add(("期权费率", wrap.premiumFmt(td.PremiumRate)));
}
else
{
list.Add(("权利金", wrap.premiumFmt(td.TradeSinglePrice ?? 0) + " " + (td.UnderlyingInstrumentType.Contains("Commodity") ? wrap.QuoteUnitString : "")));
list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString)));
}
if (PS.Config.Is方顿)
{
list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元"));
}
if (PS.Config.Company == CompanyEnum.厦门象屿 || PS.Config.Is润和)
{
list.Add(("成交总额", td.TradePrice.OtcFormatMoney() + " 元"));
}
else
{
list.AddRange(new[] {
("成交总额", td.TradePrice.OtcFormatMoney() + " 元"),
("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney()+ (PS.Config.Is浙期 ? " 元" : "")),
("参与率", td.ParticipationRate.OtcFormatPercent()),
});
}
list.AddRange(new[] {
("二元类型", binary.PayoffType),
("补偿金额", wrap.premiumFmt(wrap.IsUsePremiumRate ? binary.CashOrNothingAmountRate : binary.CashOrNothingAmount)+ " 元")
});
if (binary.PayoffType.Contains("Double"))
{
list.Add(("高障碍价格", wrap.strikeFmt(binary.UpperBarrier) + " 元"));
list.Add(("高障碍补偿金额", wrap.premiumFmt(wrap.IsUsePremiumRate ? binary.CashOrNothingAmountHighRate : binary.CashOrNothingAmountHigh) + " 元"));
}
if (td.ExerciseMode == "American")
{
list.AddRange(new[] {
("观察方式", binary.MonitorType),
("补偿支付", binary.RebateTypeCn),
("观察频率", binary.ObservationDates??"每日观察"),
});
}
list.AddRange(new[] {
("补偿按敲出日年化", binary.RebateAnnualizedAtKO ? "是": "否"),
("补偿计息规则", binary.RebateAnnualizedAtKO ? binary.RebateDayCount : "")
});
return list;
}
///
/// 生成障碍期权交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Barrier(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var barrier = td.trade_barrier_option;
if (barrier == null)
{
throw new ServiceException("障碍期权扩展信息不存在,无法生成交易摘要");
}
var list = GenerateTradeAbstract_Vanilla(td, wrap).ToList();
list.AddRange(new (string, string)[] {
("障碍类型", barrier.BarrierType),
("观察频率", barrier.ObservationDates??"每日观察"),
//("报价单位", wrap.QuoteUnitString),
("障碍水平", wrap.strikeFmt(barrier.BarrierPrice)),
});
if (barrier.BarrierType.Contains("双"))
{
list.Add(("高障碍水平", wrap.strikeFmt(barrier.UpperBarrierPrice)));
}
if (barrier.BarrierType == "双障碍敲出")
{
list.AddRange(new (string, string)[] {
// ("连离类型", barrier.Discrete),
("补偿金额", wrap.premiumFmt(wrap.IsUsePremiumRate ?barrier.RebateRate : barrier.Rebate)+ (wrap.IsUsePremiumRate ?"":" 元")),
("高障碍补偿金额", wrap.premiumFmt(wrap.IsUsePremiumRate ?barrier.RebateHighRate : barrier.RebateHigh)+ (wrap.IsUsePremiumRate ?"":" 元")),
("补偿支付", barrier.RebateTypeCn),
// ("补偿按敲出日年化", barrier.RebateAnnualizedAtKO ? "是": "否"),
//("补偿计息规则", barrier.RebateAnnualizedAtKO ? barrier.RebateDayCount : "")
});
}
else
{
list.AddRange(new (string, string)[] {
//("连离类型", barrier.Discrete),
("补偿金额", wrap.premiumFmt(wrap.IsUsePremiumRate ?barrier.RebateRate : barrier.Rebate)+ (wrap.IsUsePremiumRate ?"":" 元")),
("补偿支付", barrier.RebateTypeCn),
//("补偿按敲出日年化", barrier.RebateAnnualizedAtKO ? "是": "否"),
// ("补偿计息规则", barrier.RebateAnnualizedAtKO ? barrier.RebateDayCount : "")
});
}
return list;
}
///
/// 生成亚式期权交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Asian(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var asian = td.trade_asian_option;
if (asian == null)
{
throw new ServiceException("亚式期权扩展信息不存在,无法生成交易摘要");
}
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var tradeType = td.ExerciseModeCn + td.TradeType.Replace("期权", "") + td.OptionType + "期权";
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("买卖方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
("标的代码", td.UnderlyingCode),
};
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
list.Add(("期权类型", tradeType));
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
if (asian.StrikeType != "Floating")
{
list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
}
list.Add(("到期日期", td.ExerciseDate.OtcFormatDate()));
if (wrap.IsUsePremiumRate)
{
list.Add(("期权费率", wrap.premiumFmt(td.PremiumRate)));
}
else
{
list.Add(("权利金", wrap.premiumFmt(td.TradeSinglePrice ?? 0) + " " + (td.UnderlyingInstrumentType.Contains("Commodity") ? wrap.QuoteUnitString : "")));
list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString)));
}
if (PS.Config.Is方顿)
{
list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元"));
}
if (PS.Config.Company == CompanyEnum.厦门象屿 || PS.Config.Is润和)
{
list.Add(("成交总额", td.TradePrice.OtcFormatMoney() + " 元"));
}
else
{
list.AddRange(new[] {
("成交总额", td.TradePrice.OtcFormatMoney() + " 元"),
("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney()+ (PS.Config.Is浙期 ? " 元" : "")),
("参与率", td.ParticipationRate.OtcFormatPercent()),
});
}
list.AddRange(new[] {
("均价起算日", asian.AveragingPeriodStartDate.OtcFormatDate()),
("均价计算", asian.PayoffTypeCn.Replace("(离散)", "")),
("行权价类型", asian.StrikeTypeCn),
});
if (asian.PayoffTypeCn.Contains("增强"))
{
list.Add(("结算类型", asian.SettleMode == "AtEnd" ? "递延" : "立即"));
}
list.Add(("杠杆率", asian.StrikeGearingFactor.OtcFormatPercent()));
return list;
}
///
/// 生成香草交易摘要
/// 默认交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Vanilla(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var tradeType = PS.Config.Is瑞达 && td.TradeType == "香草期权" ? td.ExerciseModeCn + td.OptionType + "期权" : td.ExerciseModeCn + td.TradeType.Replace("期权", "") + td.OptionType + "期权";
//如果是组合标的
if (wrap.CommodityCode == "组合标的")
{
if (!string.IsNullOrWhiteSpace(td.SyntheticUnderlyingTipsInfo))
{
td.UnderlyingCode = td.SyntheticUnderlyingTipsInfo;
}
else
{
td.UnderlyingCode = synthetic_underlyingBLL.GetUnderlyingTipsInfo(td.UnderlyingCode);
}
}
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("买卖方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
("标的代码", td.UnderlyingCode),
};
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
if (td.ParentTradeId > 0 && td.IsGroup == 0)
{
list.Add(("期权类型", td.StructureType));
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
}
else
{
if (td.ParentTradeId > 0)
{
var tradelists = DbContextFactory.GetYLDbContext().trade.Where(x => x.ParentTradeId == td.ParentTradeId).OrderBy(x => x.TradeNumber).ToList();
list.Add(("期权类型", tradeType));
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
int i = 1;
foreach (var item in tradelists)
{
var key = "执行价格" + NumberHelper.CurrToChnInt(i);
list.Add((key, wrap.strikeFmt(item.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
i++;
}
}
else
{
list.Add(("期权类型", tradeType));
list.Add(("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")));
list.Add(("执行价格", wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")));
}
}
list.Add(("到期日期", td.ExerciseDate.OtcFormatDate()));
if (wrap.IsUsePremiumRate)
{
list.Add(("期权费率", wrap.premiumFmt(td.PremiumRate)));
}
else
{
list.Add(("权利金", wrap.premiumFmt(td.TradeSinglePrice ?? 0) + " " + (td.UnderlyingInstrumentType.Contains("Commodity") ? wrap.QuoteUnitString : "")));
list.Add(("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio, PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit : wrap.TradeUnitString)));
}
if (PS.Config.Is方顿)
{
list.Add(("保底收益总额", td.OriginalPrincipalSum.OtcFormatMoney() + " 元"));
}
list.Add(("成交总额", (td.TradePrice ?? 0).OtcFormatMoney() + " 元"));
if (PS.Config.Company != CompanyEnum.厦门象屿 && !PS.Config.Is润和)
{
if (td.TradeType == "障碍期权")
{
list.Add(("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney() + (PS.Config.Is浙期 ? " 元" : "")));
}
else
{
list.Add(("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney() + (PS.Config.Is浙期 ? " 元" : "")));
}
if (td.TradeType != "累计期权")
{
if (td.IsGroup == 2 && td.StructureType.Contains("折价") && td.ParticipationRate < 1)
{
list.Add(("参与率", (1 - td.ParticipationRate).OtcFormatPercent()));
}
else
{
list.Add(("参与率", td.ParticipationRate.OtcFormatPercent()));
}
}
}
return list;
}
///
/// 生成远期交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Forward(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
//var forwardTrade = DbContextFactory.GetYLDbContext(null).trade_forward.FirstOrDefault(a=>a.TradeId == td.)
td.TradeOriginalAmount = td.OriginalNotional / wrap.CountRatio;
var tradeType = (td.StructureType.TrimToNull() ?? td.TradeType) + (td.OptionType == "看涨" || td.OptionType == "多头" ? "多头" : "空头");
//如果是组合标的
if (wrap.CommodityCode == "组合标的")
{
if (!string.IsNullOrWhiteSpace(td.SyntheticUnderlyingTipsInfo))
{
td.UnderlyingCode = td.SyntheticUnderlyingTipsInfo;
}
else
{
td.UnderlyingCode = synthetic_underlyingBLL.GetUnderlyingTipsInfo(td.UnderlyingCode);
}
}
var underlyingCode = td.UnderlyingCode + (!string.IsNullOrWhiteSpace(td.BasisUnderlyingCode) ? ("-" + td.BasisUnderlyingCode) : "");
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("成交方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
("期权类型", tradeType),
("标的代码",underlyingCode ),
};
if (wrap.UnderlyingInstrumentType == "Stock")
{
list.Add(("标的名称", wrap.UnderlyingName));
}
var actualExerciseDate = td.ExerciseDate;
if (td.MetaDic == null || td.MetaDic.Count == 0)
{
var exerciseDate = new TradeMetaService(OptUserInfo.SystemUser).GetTradeMeta(td.id, "ActualExerciseDate");
if (!string.IsNullOrWhiteSpace(exerciseDate) && DateTime.TryParse(exerciseDate, out var tempDate))
{
actualExerciseDate = tempDate;
}
}
list.AddRange(new[] {
("标的价格", td.SpotPrice.OtcFormatUmPrice() + (PS.Config.Is浙期 ? " 元" : "")),
("执行价格",wrap.strikeFmt(td.Strike) + (PS.Config.Is浙期 ? " 元" : "")),
("到期日期", actualExerciseDate.OtcFormatDate()),
("远期价值", (-td.trade_forward.ForwardValue).OtcFormatMoney() + " 元"),
("成交数量", td.TradeOriginalAmount.OtcFormatNotional(wrap.CountRatio,PS.Config.IsUseDisplayNotional) + (PS.Config.IsUseDisplayNotional ? wrap.QuoteUnit :wrap.TradeUnitString)),
("成交总额", (-td.TradePrice).OtcFormatMoney() + " 元"),
("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney()+ (PS.Config.Is浙期 ? " 元" : "")),
});
if (PS.Config.Company == CompanyEnum.厦门象屿 || PS.Config.Is润和)
{
list.Remove(("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney() + (PS.Config.Is浙期 ? " 元" : "")));
}
if (!string.IsNullOrEmpty(td.trade_forward.ObservationDates))
{
var trade_forward = td.trade_forward;
var ObservationDateStr_2 = getObservationDate(trade_forward.ObservationDates);
list.Add(("结算价格", ObservationDateStr_2));
}
return list;
}
///
/// 生成现金流交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Cashflow(trade td)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
var list = new List<(string, string)> {
("交易编号", td.TradeNumber),
("成交日期", td.TradeDate.OtcFormatDate()),
("成交方向", td.ClientName),
("#", td.BuySell == "买入" ? "卖出" : "买入"),
("期权类型", td.TradeType),
};
if (PS.Config.Company == CompanyEnum.厦门象屿 || PS.Config.Is润和)
{
list.AddRange(new[] {
("到期日期", td.ExerciseDate.OtcFormatDate()),
("利率", td.trade_cashflow.ProfitRate.OtcFormatPercent()),
("利率类型", td.trade_cashflow.RateType.ToString()),
("计息日历规则", td.trade_cashflow.ProfitDayCount),
});
}
else
{
list.AddRange(new[] {
("到期日期", td.ExerciseDate.OtcFormatDate()),
("名义本金", td.StockEqvNotionalToShow.OtcFormatMoney()+ (PS.Config.Is浙期 ? " 元" : "")),
("利率", td.trade_cashflow.ProfitRate.OtcFormatPercent()),
("利率类型", td.trade_cashflow.RateType.ToString()),
("计息日历规则", td.trade_cashflow.ProfitDayCount),
});
}
if (td.trade_cashflow.DepositType == CashflowDepositTypeEnum.资金收益)
{
list.Add(("返还比例", td.trade_cashflow.PrepayRatio.OtcFormatPercent()));
}
return list;
}
///
/// 生成累计期权交易摘要
///
private static IEnumerable<(string text, string value)> GenerateTradeAbstract_Accumulator(trade td, InnerWrap wrap)
{
if (td is null)
{
throw new ArgumentNullException(nameof(td));
}
if (wrap is null)
{
throw new ArgumentNullException(nameof(wrap));
}
var ext = td.trade_accumulator_option;
if (ext == null)
{
throw new ServiceException("累计期权扩展信息不存在,无法生成交易摘要");
}
var list = GenerateTradeAbstract_Vanilla(td, wrap).ToList();
list.AddRange(new (string, string)[]
{
("敲出障碍价格",wrap.strikeFmt( ext.KOBarrier)+ (PS.Config.Is浙期 ? " 元" : "")),
("累计类型", ext.AccumuType),
("累计结构类型", ext.AccumulatorStructureType==AccumulatorStructureTypeEnum.Segmented?"三段式":"标准"),
("上端收益类型", ext.PayoffType)
});
if (ext.AccumulatorStructureType == AccumulatorStructureTypeEnum.Segmented)
{
list.Remove(list.Find(l => l.text == "执行价格"));
list.Add(("执行价格1", wrap.strikeFmt(td.Strike.Value)));
list.Add(("执行价格2", wrap.strikeFmt(ext.Strike2.Value)));
list.Add(("执行价格3", wrap.strikeFmt(ext.Strike3.Value)));
if (ext.PayoffType == "固定")
{
if (td.OptionType == "看涨")
{
list.Add(("乘数1", ext.Multiplier.Value.ToString("F2")));
}
else
{
list.Add(("乘数3", ext.Multiplier3.Value.ToString("F2")));
}
list.Add(("票息", OtcFormatExtensions.OtcFormat(ext.Coupon, ext.CouponPercent ? OtcFormatFlag.premiumRateP : OtcFormatFlag.tradePrice)));
list.Add(("票息2", OtcFormatExtensions.OtcFormat(ext.Coupon2, ext.CouponPercent ? OtcFormatFlag.premiumRateP : OtcFormatFlag.tradePrice)));
}
else
{
list.Add(("乘数1", ext.Multiplier.Value.ToString("F2")));
list.Add(("乘数2", ext.Multiplier2.Value.ToString("F2")));
list.Add(("乘数3", ext.Multiplier3.Value.ToString("F2")));
}
list.Add(("敲出是否终止", ext.EarlyTerminate ? "是" : "否"));
list.Add(("结算方式1", ext.SettlementMode));
list.Add(("结算方式2", ext.SettlementMode2));
list.Add(("结算方式3", ext.SettlementMode3));
}
else
{
if (ext.PayoffType == "固定")
{
list.Add(("票息", OtcFormatExtensions.OtcFormat(ext.Coupon, ext.CouponPercent ? OtcFormatFlag.premiumRateP : OtcFormatFlag.tradePrice)));
//list.Add(("票息是否年化", ext.IsFixedCoupon ? "否" : "是"));
//list.Add(("票息日历规则", ext.CouponDayCount));
}
if (PS.Config.ErpElement.AccumulatorShowMultiplier1)
{
list.Add(("杠杆倍数", (td.OptionType == "看涨" ? ext.PutMultiplier : ext.CallMultiplier).ToString("F2")));
}
else
{
list.Add(("看涨乘数", ext.CallMultiplier.ToString("F2")));
list.Add(("看跌乘数", ext.PutMultiplier.ToString("F2")));
}
//list.Add(("沽购数量", td.TradeAmount.ToString("F2") + wrap.TradeUnitString));
list.Add(("敲出是否终止", ext.EarlyTerminate ? "是" : "否"));
list.Add(("结算方式", ext.SettlementMode));
}
var koInfo = "";
if (!string.IsNullOrWhiteSpace(ext.KOObservationDates))
{
var KOObservationDates = QdpModule.QdpHelper.ParseAutocallCustomizedInfo(ext.KOObservationDates);
for (var i = 0; i < KOObservationDates.Item1.Length; i++)
{
string splitStr = ", ";
if (i == KOObservationDates.Item1.Length - 1)
{
splitStr = "";
}
var couponInfo = PS.Config.Is浙期 && KOObservationDates.Item3 != null && ext.PayoffType == "固定" ? ":" + KOObservationDates.Item3[i].OtcFormat(OtcFormatFlag.percent) + splitStr : splitStr;
koInfo += KOObservationDates.Item1[i].DateTime.ToString("yyyy-MM-dd") + couponInfo;
}
}
else
{
koInfo = "每日";
}
list.Add(("观察日期", koInfo));
return list;
}
private static string getObservationDate(string ObservationDateStr)
{
var observationDateStr = "";
var yyyy = "";
var days = ObservationDateStr.Split(',');
foreach (var day in days)
{
if (Convert.ToDateTime(day).ToString("yyyy年") != yyyy)
{
observationDateStr += Convert.ToDateTime(day).ToString("yyyy年M月d日") + "、";
yyyy = Convert.ToDateTime(day).ToString("yyyy年");
}
else
{
observationDateStr += Convert.ToDateTime(day).ToString("M月d日") + "、";
}
}
observationDateStr = observationDateStr.Substring(0, observationDateStr.Length - 1);
observationDateStr += NumberHelper.CurrToChnInt(days.Count());
observationDateStr += "个交易日,Mysteel每天最后公布的标的物价格的算术平均价";
return observationDateStr;
}
class InnerWrap
{
public InnerWrap(underlying_manager underlying, OtcTradeBase td)
{
Underlying = underlying;
if (underlying != null)
{
TradeUnitString = " " + underlying.TradeUnitString;
QuoteUnitString = " 元/" + underlying.QuoteUnitString;
}
if (td != null)
{
IsUsePremiumRate = td.IsUsePremiumRate == true;
strikeFmt = td.IsMoneynessOption == "是"
? new Func(d => OtcFormatExtensions.OtcFormat(d, OtcFormatFlag.percent))
: new Func(d => OtcFormatExtensions.OtcFormatFlex(d, 2, 4));
premiumFmt = IsUsePremiumRate
? new Func(d => OtcFormatExtensions.OtcFormat(d, OtcFormatFlag.premiumRateP))
: new Func(d => OtcFormatExtensions.OtcFormat(d, OtcFormatFlag.tradeSinglePrice));
}
else
{
strikeFmt = new Func(d => OtcFormatExtensions.OtcFormatFlex(d, 2, 4));
premiumFmt = new Func(d => OtcFormatExtensions.OtcFormat(d, OtcFormatFlag.tradeSinglePrice));
}
}
//-------Trade------------------------
public bool IsUsePremiumRate { get; }
public Func strikeFmt { get; }
public Func premiumFmt { get; }
//-------Underlying------------------------
public underlying_manager Underlying { get; }
public string UnderlyingName => Underlying?.UnderlyingName;
public string UnderlyingInstrumentType => Underlying?.UnderlyingInstrumentType;
public string CommodityCode => Underlying?.CommodityCode;
public string TradeUnitString { get; }
public string QuoteUnitString { get; }
public string QuoteUnit => " " + (Underlying?.QuoteUnit == "500千克" ? "半吨" : Underlying?.QuoteUnit);
public int CountRatio => Underlying?.CountRatio ?? 1;
}
}
}