126 lines
3.4 KiB
C#
126 lines
3.4 KiB
C#
using YLErp.BLL;
|
|
using YLErp.Modules.EodModule;
|
|
|
|
namespace YLErp.Modules.DataProviderModule
|
|
{
|
|
/// <summary>
|
|
/// 获取历史交易累计盈亏统计盈亏统计信息
|
|
/// </summary>
|
|
public class TradePnlStaticsDataProvider
|
|
{
|
|
InnerProvider _provider;
|
|
|
|
bool _IncludeExchangeTrades;
|
|
|
|
readonly SortedList<DateTime, InnerProvider> _map;
|
|
|
|
private TradePnlStaticsDataProvider()
|
|
{
|
|
_map = new SortedList<DateTime, InnerProvider>();
|
|
}
|
|
|
|
public bool IncludeExchangeTrades
|
|
{
|
|
get
|
|
{
|
|
return _IncludeExchangeTrades;
|
|
}
|
|
set
|
|
{
|
|
if (_IncludeExchangeTrades != value)
|
|
{
|
|
_IncludeExchangeTrades = value;
|
|
|
|
Reset();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
_provider = null;
|
|
|
|
lock (_map)
|
|
{
|
|
_map.Clear();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取历史交易累计盈亏统计信息
|
|
/// </summary>
|
|
public IEnumerable<TradePnlStatics> GetDatas(DateTime valueDate)
|
|
{
|
|
valueDate = valueDate.Date;
|
|
|
|
if (_provider?.ValueDate == valueDate)
|
|
{
|
|
return _provider.GetDatas(IncludeExchangeTrades);
|
|
}
|
|
|
|
lock (_map)
|
|
{
|
|
if (!_map.TryGetValue(valueDate, out _provider))
|
|
{
|
|
foreach (var item in _map.Values.ToArray())
|
|
{
|
|
if (item.LastRequestTime.AddHours(1) < DateTime.Now)
|
|
{
|
|
_map.Remove(item.ValueDate);
|
|
}
|
|
}
|
|
_map.Add(valueDate, _provider = new InnerProvider(valueDate));
|
|
}
|
|
return _provider.GetDatas(IncludeExchangeTrades);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 单一实例
|
|
/// </summary>
|
|
public static readonly TradePnlStaticsDataProvider Default;
|
|
|
|
static TradePnlStaticsDataProvider()
|
|
{
|
|
Default = new TradePnlStaticsDataProvider();
|
|
}
|
|
|
|
class InnerProvider
|
|
{
|
|
IEnumerable<TradePnlStatics> _list;
|
|
|
|
public InnerProvider(DateTime valueDate)
|
|
{
|
|
ValueDate = valueDate.Date;
|
|
_list = Enumerable.Empty<TradePnlStatics>();
|
|
}
|
|
|
|
public DateTime ValueDate { get; }
|
|
|
|
/// <summary>
|
|
/// 最后一次请求时间
|
|
/// </summary>
|
|
public DateTime LastRequestTime { get; private set; }
|
|
|
|
/// <summary>
|
|
/// 获取数据
|
|
/// </summary>
|
|
public IEnumerable<TradePnlStatics> GetDatas(bool includeExchangeTrades)
|
|
{
|
|
LastRequestTime = DateTime.Now;
|
|
|
|
if (!_list.Any())
|
|
{
|
|
var startDate = valuedateBLL.SystemDate.AccruedTotalPnlStartDate ?? DateTime.MinValue;
|
|
|
|
_list = new AccruedTotalPnlService<eod_trade_position_hedgevol>(OptUserInfo.SystemUser)
|
|
.GetFinishedTradePnls(startDate, ValueDate, includeExchangeTrades);
|
|
}
|
|
|
|
//防止缓存数据被污染
|
|
return _list.Select(n => n.Clone()).ToArray();
|
|
}
|
|
}
|
|
}
|
|
}
|