121 lines
4.7 KiB
C#
121 lines
4.7 KiB
C#
using YLErp.BLL;
|
|
using YLErp.DBModels;
|
|
using YLErp.Modules.EodModule;
|
|
using YLErp.QdpModule;
|
|
using YLErp;
|
|
using YLErp.Jobs.Configs;
|
|
|
|
namespace YLErp.Jobs.Imp
|
|
{
|
|
/// <summary>
|
|
/// 每日计算整体VAR值
|
|
/// </summary>
|
|
public class EodVARCalcJob : BaseJob
|
|
{
|
|
static readonly IYcLogger logger;
|
|
|
|
static EodVARCalcJob()
|
|
{
|
|
logger = LogFactory.GetLogger<EodVARCalcJob>();
|
|
}
|
|
|
|
EodVARCalcJobConfig _eodVARCalcJobConfig;
|
|
public EodVARCalcJob(EodVARCalcJobConfig eodVARCalcJobConfig)
|
|
{
|
|
_eodVARCalcJobConfig= eodVARCalcJobConfig;
|
|
}
|
|
|
|
public override Task JobImp()
|
|
{
|
|
logger.Info("执行EodVARCalcJob");
|
|
var StartDateStr = _eodVARCalcJobConfig.StartDate;
|
|
DateTime.TryParse((StartDateStr ?? ""), out var startDate);
|
|
|
|
using (var db = new YLContext())
|
|
{
|
|
//最后收盘日
|
|
var lastEodDate = db.eodStatus.Any() ? db.eodStatus.Where(O => O.Status == "已收盘").Max(O => O.ValueDate) : DateTime.MinValue;
|
|
//最后计算日期
|
|
var query = db.SensitiveData.Where(O => O.ValueDate <= lastEodDate && O.dataType == DataType.VaR && O.tradeId == "0");
|
|
var lastCalcDate = query.Any() ? query.Max(O => O.ValueDate) : DateTime.MinValue;
|
|
if (lastCalcDate <= startDate)
|
|
{
|
|
var firstEodDate = db.eodStatus.Any() ? db.eodStatus.Where(O => O.Status == "已收盘").Min(O => O.ValueDate) : DateTime.MinValue;
|
|
lastCalcDate = firstEodDate > startDate ? firstEodDate : startDate;
|
|
|
|
}
|
|
var dateList = QdpCalendarHelper.AllBizDays(lastCalcDate, lastEodDate);
|
|
dateList.Add(lastEodDate);
|
|
logger.Info($"{dateList.Count}");
|
|
foreach (var date in dateList)
|
|
{
|
|
try
|
|
{
|
|
//执行eod_var计算整体eod_var
|
|
var service = new EodVaRService(new OptUserInfo(0, "系统", OptUserFrom.System));
|
|
//组一个算整体的VAR的请求
|
|
var req = new eod_varReq()
|
|
{
|
|
ValueDate = date,
|
|
|
|
VaRType = 0,
|
|
|
|
DaysCount = 244,
|
|
};
|
|
|
|
logger.Info($"开始计算{date.ToString("yyyy-MM-dd")}");
|
|
service.CalcEodVaR(req);
|
|
logger.Info("计算完成");
|
|
//写入sensitive
|
|
var data = db.SensitiveData.FirstOrDefault(o => o.ValueDate == date && o.dataType == DataType.VaR && o.tradeId == "0");
|
|
if (data == null)
|
|
{
|
|
data = new SensitiveData();
|
|
data.ValueDate = date;
|
|
data.tradeId = "0";
|
|
data.dataType = DataType.VaR;
|
|
db.SensitiveData.Add(data);
|
|
}
|
|
var percent = PS.Config.ErpElement.EodVarPvPercent;
|
|
logger.Info("默认Percent:" + percent);
|
|
var eodVaRs = db.eod_var.Where(x => x.ValueDate == date && x.VaRType == (int)YLErp.DBModels.Enums.EnumVaRType.HistoricalSimulation && x.TradeType == "");
|
|
var totalVaR = eodVaRs.FirstOrDefault(o => o.UnderlyingCode == null || o.UnderlyingCode == "");
|
|
logger.Info("查询到:" + totalVaR);
|
|
if (totalVaR != null)
|
|
{
|
|
var pvList = totalVaR.PvObject.Split(',').Select(x => double.TryParse(x, out var temp) ? temp : 0).OrderBy(x => x).ToArray();
|
|
var index = (int)Math.Floor(pvList.Length * percent) - 1;
|
|
index = Math.Max(0, index);
|
|
data.param1 = pvList[index];
|
|
}
|
|
db.SaveChanges();
|
|
logger.Info("写入数据库操作完成");
|
|
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
logger.Error(ex);
|
|
throw;
|
|
}
|
|
}
|
|
}
|
|
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
#region JobStatus Manager
|
|
static JobStatus jobStatus = JobStatus.Init;
|
|
|
|
public override JobStatus GetJobStatus()
|
|
{
|
|
return jobStatus;
|
|
}
|
|
|
|
public override void SetJobStatus(JobStatus status)
|
|
{
|
|
jobStatus = status;
|
|
}
|
|
#endregion
|
|
}
|
|
}
|