using YLErp.Abstract.DataProviders;
using YLErp.Enums;
namespace YLErp.BLL.MarginCalculation
{
///
/// 预付金计算请求参数
///
public class RunMarginCalculationReq
{
public RunMarginCalculationReq(OptUserInfo user)
{
UserInfo = user ?? throw new ArgumentNullException(nameof(user));
}
public OptUserInfo UserInfo { get; private set; }
///
/// 操作人ID
///
public int userId => UserInfo.UserId;
///
/// 操作人名称
///
public string userName => UserInfo.UserName;
///
/// 结算日
///
public DateTime settleDate { get; set; }
///
/// 用于计算的交易数据列表
///
public List tradeList { get; set; }
///
/// 计算单笔交易初始预付金时候需要用到该参数
///
public int realTradeId { get; set; }
///
/// 默认false,是否已经获取了奇异期权要素信息
/// 这个属性应该是为了避免重复获取奇异期权要素信息提高性能
///
public bool hasOptionInfo { get; set; }
///
/// 是否用于计算相反方向的预付金,默认:false
///
public bool forOtherSide { get; set; }
///
/// 波动率类型(默认:交易)
///
public string volType { get; set; } = "交易";
public SettlementTypeEnum settlementType { get; set; } = SettlementTypeEnum.ClosePrice;
public CalcMarginTypeEnum CalcMarginType { get; set; } = CalcMarginTypeEnum.None;
///
/// 计算预付金时用到的价格提供接口实现
///
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 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 },
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; }
///
/// 操作人ID
///
public int userId => UserInfo.UserId;
///
/// 操作人名称
///
public string userName => UserInfo.UserName;
///
/// 结算日
///
public DateTime settleDate { get; set; }
public List tradeSpans { get; set; }
public List tradeSpansOtherSide { get; set; }
public int SpanType { get; set; }
public List RefreshClientIds { get; set; }
public Dictionary clientAdditionalMarginDic { get; set; }
public bool OnlyBuyer { get; set; } = true;
///
/// 分客户收盘客户id
///
public IEnumerable ClientIds { get; set; }
}
}