Files
zszq-trs/YLErpDAL/BLL/Calculation/Engine/BinaryEngineFactory.cs
T
2024-05-09 14:06:26 +08:00

122 lines
5.0 KiB
C#

using Qdp.Pricing.Base.Enums;
using Qdp.Pricing.Library.Common.Interfaces;
using Qdp.Pricing.Library.Options.MonteCarlo;
using Qdp.Pricing.Library.Options.Products.Barrier.Engines.Numerical.Quad;
using Qdp.Pricing.Library.Options.Products.Binary.Engines.Analytical;
namespace YLErp.BLL.Calculation.Engine
{
class BinaryEngineFactory : OptionEngineFactoryBase
{
public static BinaryEngineFactory Instance
{
get
{
if (_instance == null)
{
_instance = new BinaryEngineFactory();
}
return _instance;
}
}
protected BinaryEngineFactory() { }
protected static BinaryEngineFactory _instance;
public override IEngine GetEngine(
string engineName = null,
OptionExercise exercise = OptionExercise.European,
params object[] additionalParams)
{
if (string.IsNullOrEmpty(engineName))
{
return DefaultEngine(exercise, additionalParams);
}
else
{
switch (engineName.ToUpper())
{
case "ANALYTICALBINARYEUROPEANOPTIONENGINE":
return new AnalyticalBinaryEuropeanOptionEngine();
case "ANALYTICALBINARYEUROPEANOPTIONREPLICATIONENGINE":
return DefaultEngine(exercise, additionalParams);
case "ANALYTICALBINARYAMERICANOPTIONENGINE":
return new AnalyticalBinaryAmericanOptionEngine();
case "QUADBARRIEROPTIONENGINE":
return new QuadBarrierOptionEngine();
case "GENERICMONTECARLOENGINE":
return CreateGenericMonteCarloEngine(additionalParams);
case "GBMMONTECARLOENGINE":
return new GbmMonteCarloEngine(100000, 1e-3, 1e-6, 1);
default:
if (engineName.IsValidEngineName())
{
return OptionEngineRepository.CreateEngine(engineName);
}
else
{
return DefaultEngine(exercise, additionalParams);
}
}
}
}
/// <summary>
/// /
/// </summary>
/// <param name="exercise"></param>
/// <param name="additionalParams">
/// param[0] - 二元期权的复制模型的步长(仅对复制模型有效)
/// param[1] - 二元期权的复制方法(仅对复制模型有效)
/// param[2] - 是否自定义了观察日(仅对美式二元有效)
/// param[3] - 是否按年化敲出
/// </param>
/// <returns></returns>
private static IEngine DefaultEngine(
OptionExercise exercise,
params object[] additionalParams)
{
switch (exercise)
{
case OptionExercise.European:
if (additionalParams.Length > 1
&& (BinaryOptionReplicationStrategy)additionalParams[1] != BinaryOptionReplicationStrategy.None)
{
return new AnalyticalBinaryEuropeanOptionReplicationEngine((double)additionalParams[0], (BinaryOptionReplicationStrategy)additionalParams[1]);
}
else
{
return string.IsNullOrWhiteSpace(OptionEngineRepository.BinaryEuropeanDefaultEngine)
? new AnalyticalBinaryEuropeanOptionEngine()
: OptionEngineRepository.CreateEngine(OptionEngineRepository.BinaryEuropeanDefaultEngine);
}
case OptionExercise.American:
var customizedObservation = false;
if (additionalParams.Length > 2)
{
customizedObservation = (bool)additionalParams[2];
}
var rebateAnnualized = false;
if (additionalParams.Length > 3)
{
rebateAnnualized = (bool)additionalParams[3];
}
if (customizedObservation || rebateAnnualized)
{
return new QuadBarrierOptionEngine();
}
else
{
return string.IsNullOrWhiteSpace(OptionEngineRepository.BinaryAmericanDefaultEngine)
? new AnalyticalBinaryAmericanOptionEngine()
: OptionEngineRepository.CreateEngine(OptionEngineRepository.BinaryAmericanDefaultEngine);
}
default:
throw new Exception($"二元期权不支持的行权方式{exercise}.无法创建计算引擎");
}
}
}
}