从山证v2.3.0拷贝
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user