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

183 lines
5.7 KiB
C#

using YLErp.Abstract.DataProviders;
using YLErp.Enums;
namespace YLErp.BLL.MarginCalculation
{
/// <summary>
/// 预付金计算请求参数
/// </summary>
public class RunMarginCalculationReq
{
public RunMarginCalculationReq(OptUserInfo user)
{
UserInfo = user ?? throw new ArgumentNullException(nameof(user));
}
public OptUserInfo UserInfo { get; private set; }
/// <summary>
/// 操作人ID
/// </summary>
public int userId => UserInfo.UserId;
/// <summary>
/// 操作人名称
/// </summary>
public string userName => UserInfo.UserName;
/// <summary>
/// 结算日
/// </summary>
public DateTime settleDate { get; set; }
/// <summary>
/// 用于计算的交易数据列表
/// </summary>
public List<trade> tradeList { get; set; }
/// <summary>
/// 计算单笔交易初始预付金时候需要用到该参数
/// </summary>
public int realTradeId { get; set; }
/// <summary>
/// 默认false,是否已经获取了奇异期权要素信息
/// 这个属性应该是为了避免重复获取奇异期权要素信息提高性能
/// </summary>
public bool hasOptionInfo { get; set; }
/// <summary>
/// 是否用于计算相反方向的预付金,默认:false
/// </summary>
public bool forOtherSide { get; set; }
/// <summary>
/// 波动率类型(默认:交易)
/// </summary>
public string volType { get; set; } = "交易";
public SettlementTypeEnum settlementType { get; set; } = SettlementTypeEnum.ClosePrice;
public CalcMarginTypeEnum CalcMarginType { get; set; } = CalcMarginTypeEnum.None;
/// <summary>
/// 计算预付金时用到的价格提供接口实现
/// </summary>
public IPriceProvider PriceProvider { get; set; }
public CalcScenarioEnum GetCalcScenario()
{
if (CalcMarginType == CalcMarginTypeEnum.EodMargin)
{
return CalcScenarioEnum.EodSettlement;
}
return CalcScenarioEnum.InitialMargin;
}
public RunMarginCalculationReq Clone()
{
return (RunMarginCalculationReq)MemberwiseClone();
}
public RunMarginCalculationReq Clone(List<trade> tradeList)
{
var clone = (RunMarginCalculationReq)MemberwiseClone();
clone.tradeList = tradeList;
return clone;
}
public RunMarginCalculationReq Clone(bool forOtherSide)
{
var clone = (RunMarginCalculationReq)MemberwiseClone();
clone.forOtherSide = forOtherSide;
return clone;
}
}
public class GetTradeMarginReq : IPriceProvider
{
public trade trade;
//关于交易id的多义性: 1.组合交易需要真实的交易id;2.考虑到波动率不能获取持仓波动率,将id赋值为0;3.定价页面结构化交易子交易id会赋值-1和-2
//所以添加了这个字段
public int realTradeId;
public double price;
public CalcMarginTypeEnum calcMarginType = CalcMarginTypeEnum.None;
public SettlementTypeEnum settlementType = SettlementTypeEnum.ClosePrice;
public bool hasOptionInfo = false;
public RunMarginCalculationReq GetRunMarginCalculationReq()
{
return new RunMarginCalculationReq(OptUserInfo.SystemUser)
{
realTradeId = realTradeId,
tradeList = new List<trade> { trade },
settleDate = calcMarginType == CalcMarginTypeEnum.InitialMargin ? (trade.TradeDate ?? valuedateBLL.ValueDate) : valuedateBLL.ValueDate,
hasOptionInfo = hasOptionInfo,
forOtherSide = false,
PriceProvider = this,
volType = "交易",
settlementType = settlementType,
CalcMarginType = calcMarginType
};
}
public double GetPrice(string instrumentCode)
{
return (trade.UnderlyingCode ?? string.Empty).Equals(instrumentCode, StringComparison.OrdinalIgnoreCase) ? price : 0;
}
public bool TryGetPrice(string instrumentCode, out double price)
{
if ((trade.UnderlyingCode ?? string.Empty).Equals(instrumentCode, StringComparison.OrdinalIgnoreCase))
{
price = this.price;
return true;
}
price = 0;
return false;
}
}
public class CalcClientMarginReq
{
public CalcClientMarginReq(OptUserInfo user)
{
UserInfo = user ?? throw new ArgumentNullException(nameof(user));
}
public OptUserInfo UserInfo { get; private set; }
/// <summary>
/// 操作人ID
/// </summary>
public int userId => UserInfo.UserId;
/// <summary>
/// 操作人名称
/// </summary>
public string userName => UserInfo.UserName;
/// <summary>
/// 结算日
/// </summary>
public DateTime settleDate { get; set; }
public List<trade_span> tradeSpans { get; set; }
public List<trade_span> tradeSpansOtherSide { get; set; }
public int SpanType { get; set; }
public List<int> RefreshClientIds { get; set; }
public Dictionary<int, double> clientAdditionalMarginDic { get; set; }
public bool OnlyBuyer { get; set; } = true;
/// <summary>
/// 分客户收盘客户id
/// </summary>
public IEnumerable<int> ClientIds { get; set; }
}
}