125 lines
4.0 KiB
C#
125 lines
4.0 KiB
C#
using System.Linq.Expressions;
|
|
using YLErp.Abstract;
|
|
using YLErp.Models;
|
|
|
|
namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner
|
|
{
|
|
/// <summary>
|
|
/// 自定义交易风险提供
|
|
/// </summary>
|
|
class ManualRiskProvider : IDataUpdater, IJsonSerializable, IDataSource<ManualRisk>
|
|
{
|
|
readonly DateTime _valueDate;
|
|
readonly string _volType;
|
|
//使用tradeid做为主键
|
|
Dictionary<string, ManualRisk> _dic;
|
|
|
|
DateTime _lastUpateTime;
|
|
|
|
/// <summary>
|
|
/// 构造函数
|
|
/// </summary>
|
|
/// <param name="valueDate">当前结算日期</param>
|
|
public ManualRiskProvider(DateTime valueDate, string volType)
|
|
{
|
|
_valueDate = valueDate;
|
|
_volType = volType;
|
|
}
|
|
|
|
public string TableName => nameof(eod_trade_risk_manual);
|
|
|
|
public int Count => throw new NotImplementedException();
|
|
|
|
public IQueryable<ManualRisk> AsQueryable(Expression<Func<ManualRisk, bool>> predicate = null)
|
|
{
|
|
lock (this)
|
|
{
|
|
return _dic.Values.ToArray().AsQueryable();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取自定义交易风险
|
|
/// </summary>
|
|
public ManualRisk GetData(int tradeId)
|
|
{
|
|
var dic = _dic;
|
|
|
|
if (_dic == null || _lastUpateTime > DateTime.Now || _lastUpateTime.AddMinutes(10) < DateTime.Now)
|
|
{
|
|
lock (this)
|
|
{
|
|
if (_dic == null || _lastUpateTime > DateTime.Now || _lastUpateTime.AddMinutes(10) < DateTime.Now)
|
|
{
|
|
_lastUpateTime = DateTime.Now;
|
|
|
|
using (var db = DbContextFactory.GetYLDbContext())
|
|
{
|
|
var query = db.eod_trade_risk_manual
|
|
.Where(n => n.ValueDate == _valueDate)
|
|
.Select(n => new
|
|
{
|
|
n.TradeId,
|
|
n.VolType,
|
|
risk = new ManualRisk
|
|
{
|
|
Pv = n.Pv,
|
|
Delta = n.Delta,
|
|
Gamma = n.Gamma,
|
|
Theta = n.Theta,
|
|
Vega = n.Vega,
|
|
Rho = n.Rho
|
|
}
|
|
});
|
|
|
|
dic = _dic = query.ToDictionary(n => n.TradeId + "_" + (n.VolType != null ? n.VolType : ""), n => n.risk);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (dic == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
dic.TryGetValue(tradeId + "_" + _volType, out var dataByType);
|
|
if(dataByType == null)
|
|
{
|
|
dic.TryGetValue(tradeId + "_", out var data);
|
|
if(data != null)
|
|
{
|
|
dataByType.Pv = dataByType.Pv ?? data.Pv;
|
|
dataByType.Delta = dataByType.Delta ?? data.Delta;
|
|
dataByType.Gamma = dataByType.Gamma ?? data.Gamma;
|
|
dataByType.Theta = dataByType.Theta ?? data.Theta;
|
|
dataByType.Vega = dataByType.Vega ?? data.Vega;
|
|
dataByType.Rho = dataByType.Rho ?? data.Rho;
|
|
}
|
|
}
|
|
|
|
return dataByType;
|
|
}
|
|
|
|
public void ResetDataSource()
|
|
{
|
|
lock (this)
|
|
{
|
|
_dic = null;
|
|
}
|
|
}
|
|
|
|
public string ToJson()
|
|
{
|
|
return new { _valueDate, _dic }.ToJson();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新数据
|
|
/// </summary>
|
|
public void UpdateData(IEnumerable<string> updateKeyIds)
|
|
{
|
|
ResetDataSource();
|
|
}
|
|
}
|
|
}
|