183 lines
5.7 KiB
C#
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; }
|
|
}
|
|
}
|