доработка кеша3

dev
vlad zverzhkhovskiy 2025-10-07 14:40:53 +03:00
parent ffc21531b5
commit 06cf8ddc19
2 changed files with 45 additions and 6 deletions

View File

@ -72,10 +72,11 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
return ValueTask.CompletedTask;
}
public ValueTask<ITradeDataItem[]> GetData(TimeSpan? period = null, string? key = null)
public ValueTask<ITradeDataItem[]> GetData(TimeSpan? period = null, string? key = null, Func<ITradeDataItem, bool>? selector = null)
{
key = key ?? string.Empty;
var res = new List<ITradeDataItem>();
selector = selector ?? defaultSelector;
lock (_locker)
{
if (_items.TryGetValue(key, out var list) && list.First != null && list.Last != null)
@ -85,7 +86,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
{
foreach (var item in list)
{
if (startTime - item.Time < period.Value)
if (startTime - item.Time < period.Value && selector(item))
{
res.Add(item);
}
@ -93,7 +94,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
}
else
{
return ValueTask.FromResult(list.Reverse().ToArray());
return ValueTask.FromResult(list.Where(selector).Reverse().ToArray());
}
}
@ -102,11 +103,12 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
return ValueTask.FromResult(res.ToArray());
}
public ValueTask<ITradeDataItem[]> GetData(TimeSpan shift, TimeSpan period, string? key = null)
public ValueTask<ITradeDataItem[]> GetData(TimeSpan shift, TimeSpan period, string? key = null, Func<ITradeDataItem, bool>? selector = null)
{
key = key ?? string.Empty;
var res = new List<ITradeDataItem>();
var maxPeriod = shift + period;
selector = selector ?? defaultSelector;
lock (_locker)
{
if (_items.TryGetValue(key, out var list) && list.First != null && list.Last != null)
@ -116,7 +118,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
foreach (var item in list)
{
var dt = startTime - item.Time;
if (dt > shift && dt < maxPeriod)
if (dt > shift && dt < maxPeriod && selector(item))
{
res.Add(item);
}
@ -146,5 +148,7 @@ namespace KLHZ.Trader.Core.Math.Declisions.Services.Cache
AddData(pc).AsTask().Wait();
}
}
private static bool defaultSelector(ITradeDataItem item) => true;
}
}

View File

@ -20,7 +20,8 @@ namespace KLHZ.Trader.Core.Tests
Ticker = figi + "_ticker",
Id = i,
Time = startDt,
Price = (decimal)(i + 0.5)
Price = (decimal)(i + 0.5),
Value = i % 2 == 0 ? i : 0
};
}
}
@ -152,5 +153,39 @@ namespace KLHZ.Trader.Core.Tests
Assert.That(dt <= TimeSpan.FromMinutes(3));
Assert.That(dt > TimeSpan.Zero);
}
[Test]
public void Test9()
{
var count = 60 * 60 * 3 * 24 + 10;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit3(figi);
for (int i = 0; i < hist.Length - 1; i++)
{
cacheUnit.AddData(hist[i], "kkk");
}
var data = cacheUnit.GetData(TimeSpan.FromMinutes(4), TimeSpan.FromMinutes(3), key: "kkk", (i) => i.Value != 0).Result;
Assert.That(data.All(d => d.Value != 0));
}
[Test]
public void Test10()
{
var count = 60 * 60 * 3 * 24 + 10;
var figi = "figi";
var hist = GetHistory(count, figi);
var cacheUnit = new PriceHistoryCacheUnit3(figi);
for (int i = 0; i < hist.Length - 1; i++)
{
cacheUnit.AddData(hist[i], "kkk");
}
var data = cacheUnit.GetData(selector: (i) => i.Value != 0).Result;
Assert.That(data.All(d => d.Value != 0));
}
}
}