101 lines
3.5 KiB
C#
101 lines
3.5 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.DoubleSharkFin;
|
|
using Qdp.Pricing.Library.Options.Products.DoubleSharkFin.Engines.Analytical;
|
|
using Qdp.Pricing.Library.Options.Products.DoubleSharkFin.Engines.Numerical;
|
|
|
|
namespace YLErp.BLL.Calculation.Engine
|
|
{
|
|
class DoubleSharkFinFactory : OptionEngineFactoryBase
|
|
{
|
|
public static DoubleSharkFinFactory Instance
|
|
{
|
|
get
|
|
{
|
|
if (_instance == null)
|
|
{
|
|
_instance = new DoubleSharkFinFactory();
|
|
}
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
protected DoubleSharkFinFactory() { }
|
|
protected static DoubleSharkFinFactory _instance;
|
|
|
|
public override IEngine GetEngine(
|
|
string engineName = null,
|
|
OptionExercise exercise = OptionExercise.European,
|
|
params object[] additionalParams)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(engineName))
|
|
{
|
|
return DefaultEngine(exercise, additionalParams);
|
|
}
|
|
else
|
|
{
|
|
switch (engineName.ToUpper())
|
|
{
|
|
case "ANALYTICALDOUBLESHARKFINOPTIONENGINE":
|
|
return DefaultEngine(exercise, 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);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
private IEngine DefaultEngine(
|
|
OptionExercise exercise,
|
|
params object[] additionalParams)
|
|
{
|
|
if (additionalParams.Length > 0 && additionalParams[0] is DoubleSharkFinOption)
|
|
{
|
|
var hasCustomziedObservations = false;
|
|
if (additionalParams.Length > 2)
|
|
{
|
|
hasCustomziedObservations = (bool)additionalParams[2];
|
|
}
|
|
if (hasCustomziedObservations)
|
|
{
|
|
var quadratureFastMode = false;
|
|
if (additionalParams.Length > 3)
|
|
{
|
|
quadratureFastMode = (bool)additionalParams[3];
|
|
}
|
|
|
|
if (quadratureFastMode)
|
|
{
|
|
return new QuadDoubleSharkFinOptionEngine(parallelDegree: Environment.ProcessorCount);
|
|
}
|
|
else
|
|
{
|
|
return new QuadDoubleSharkFinOptionEngine(parallelDegree: PS.Config.ErpElement.QdpParallelDegree);
|
|
}
|
|
}
|
|
|
|
var useFourier = false;
|
|
if (additionalParams.Length > 1)
|
|
{
|
|
useFourier = (bool)additionalParams[1];
|
|
}
|
|
return new AnalyticalDoubleSharkFinOptionEngine(useFourier);
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("双鲨期权计算引擎构造失败");
|
|
}
|
|
}
|
|
}
|
|
}
|