113 lines
3.9 KiB
C#
113 lines
3.9 KiB
C#
using Qdp.Pricing.Base.Implementations;
|
|
using YLErp.Abstract;
|
|
using YLErp.Abstract.DataProviders;
|
|
using YLErp.Enums;
|
|
using YLErp.Modules.CalculationModule;
|
|
using YLErp.Modules.CalculationModule.Abstract;
|
|
using YLErp.Modules.DataProviderModule;
|
|
using YLErp.Modules.TradeRiskCalcModule.TaskRunner;
|
|
|
|
namespace YLErp.Modules.TradeRiskCalcModule
|
|
{
|
|
class InnerOptionValueCalcContext : OptionValueCalcContext
|
|
{
|
|
public InnerOptionValueCalcContext(DateTime valueDate, IOtcTradeValueCalcContext baseContext)
|
|
: base(valueDate, baseContext)
|
|
{
|
|
|
|
}
|
|
|
|
public InnerOptionValueCalcContext(string volType, bool isEodCalc, DateTime valueDate, double sysRiskFreeRate, IOptionCalcDataProvider dataProvider)
|
|
: base(volType, isEodCalc, valueDate, sysRiskFreeRate, dataProvider)
|
|
{
|
|
|
|
}
|
|
|
|
public override bool IsPreciseTimeMode => true;
|
|
|
|
public override string GetFixingString(OtcTradeBase trade, trade_asian_option asianOption, double spotPrice)
|
|
{
|
|
var fixing = AsiaOptionProvider.Default.GetFixingString(ValueDate, trade, asianOption);
|
|
|
|
if (CalcScenario == CalcScenarioEnum.RealtimeRisk && IsPreciseTimeMode)
|
|
{
|
|
//修复实时计算中fixing最后一天的价格不是实时价格
|
|
fixing = FixingService.AddOrReplaceLastDateSpotPrice(fixing, ValueDate, spotPrice);
|
|
}
|
|
|
|
if(PS.Config.Is润和 && DateTime.Now.Hour < 15)
|
|
{
|
|
var index = fixing.IndexOf(ValueDate.ToString("yyyy-MM-dd"));
|
|
if (index >= 0)
|
|
{
|
|
fixing = fixing.Remove(index).TrimEnd(';');
|
|
}
|
|
}
|
|
|
|
return fixing;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 上一交易日期权估值计算上下文
|
|
/// </summary>
|
|
class YdOptionCalculateContext : InnerOptionValueCalcContext
|
|
{
|
|
readonly ITradeHisDataProvider _ydTradeHisDataProvider;
|
|
|
|
public YdOptionCalculateContext(DateTime valueDate, IOtcTradeValueCalcContext baseContext,
|
|
IEodPriceProvider eodPriceProvider, ITradeHisDataProvider ydTradeHisDataProvider, SettlementTypeEnum settlementType)
|
|
: base(valueDate, baseContext)
|
|
{
|
|
if (eodPriceProvider is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(eodPriceProvider));
|
|
}
|
|
|
|
DataProvider = new OptionCalcDataProvider(baseContext.DataProvider)
|
|
{
|
|
UnderlyingPriceProvider = new EodPriceProviderWrap(eodPriceProvider, settlementType)
|
|
};
|
|
|
|
_ydTradeHisDataProvider = ydTradeHisDataProvider ?? throw new ArgumentNullException(nameof(ydTradeHisDataProvider));
|
|
|
|
CalcDeltaT1 = false;
|
|
}
|
|
|
|
public override bool IsPreciseTimeMode => false;
|
|
|
|
public override PricingRequest GetPricingRequest(OtcTradeBase trade)
|
|
{
|
|
if (CalcScenario == CalcScenarioEnum.RealtimeRisk
|
|
&& !string.IsNullOrEmpty(PS.Config.ErpElement.RealtimeRisk_SkipTradeTypes)
|
|
&& PS.Config.ErpElement.RealtimeRisk_SkipTradeTypes.Contains(trade.TradeType))
|
|
{
|
|
return PricingRequest.None;
|
|
}
|
|
|
|
return PricingRequest.Pv;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取交易的无风险利率
|
|
/// </summary>
|
|
public override double GetRiskFreeRate(OtcTradeBase trade)
|
|
{
|
|
return _ydTradeHisDataProvider.GetNoRiskRate(trade.id) ?? trade.NoRiskRate ?? SysRiskFreeRate;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取交易的分红率
|
|
/// </summary>
|
|
public override double GetDividendRate(OtcTradeBase trade)
|
|
{
|
|
return _ydTradeHisDataProvider.GetDividendRate(trade.id) ?? GetRiskFreeRate(trade);
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return base.ToString() + "--" + DataProvider.UnderlyingPriceProvider.ToString();
|
|
}
|
|
}
|
|
}
|