Files
zszq-trs/YLErpDAL/Modules/TradeRiskCalcModule/InnerOptionValueCalcContext.cs
T
2024-05-09 14:06:26 +08:00

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();
}
}
}