Я работаю с фидом биржевых данных и хочу построить из данных минутные бары (свечи). Я думаю, что у меня есть довольно хороший запрос, который даст мне необходимые данные, но я не уверен, что это лучший способ сделать это. Пожалуйста, дайте любые комментарии или критические замечания, которые у вас есть, я открыт для любого ввода, который вы хотите дать.
Вход слева и вывод справа
class StockTick
{
public DateTime Timestamp { get; set; }
public int Id { get; set; }
public decimal LastPrice { get; set; }
}
class FirstUda : CepAggregate<decimal, decimal>
{
public override decimal GenerateOutput(IEnumerable<decimal> payloads)
{
return payloads.First();
}
}
class LastUda : CepAggregate<decimal, decimal>
{
public override decimal GenerateOutput(IEnumerable<decimal> payloads)
{
return payloads.Last();
}
}
public static class CepExtensions
{
[CepUserDefinedAggregate(typeof(FirstUda))]
public static decimal First<InputT>(this CepWindow<InputT> window, Expression<Func<InputT, decimal>> map)
{
throw CepUtility.DoNotCall();
}
[CepUserDefinedAggregate(typeof(LastUda))]
public static decimal Last<InputT>(this CepWindow<InputT> window, Expression<Func<InputT, decimal>> map)
{
throw CepUtility.DoNotCall();
}
}
class Program
{
static void Main(string[] args)
{
using (var server = Server.Create("Default"))
{
var app = server.CreateApplication("app");
var source = GetStockTick();
var input = source.ToPointStream(
app,
t => PointEvent.CreateInsert(t.Timestamp, t),
AdvanceTimeSettings.IncreasingStartTime);
var minuteWindows = input.AlterEventDuration(e => TimeSpan.FromTicks(TimeSpan.TicksPerMinute - (e.StartTime.Ticks % TimeSpan.TicksPerMinute)));
var highLowTicks = from e in minuteWindows
group e by e.Id into g
from win in g.SnapshotWindow(SnapshotWindowOutputPolicy.Clip)
select new
{
Id = g.Key,
Timestamp = win.Max(e => e.Timestamp.AddSeconds(e.Timestamp.Second * -1)),
OpenPrice = win.First(e => e.LastPrice),
HighPrice = win.Max(t => t.LastPrice),
LowPrice = win.Min(t => t.LastPrice),
ClosePrice = win.Last(e => e.LastPrice)
};
foreach (var hl in highLowTicks.ToEnumerable())
{
Console.WriteLine(hl);
}
Console.ReadKey();
}
}
private static IEnumerable<StockTick> GetStockTick()
{
var ticks = new List<StockTick>();
var baseTime = new DateTime(2010, 1, 1, 12, 0, 0);
ticks.Add(new StockTick() { Id = 1, Timestamp = baseTime.AddSeconds(1), LastPrice = 10 });
ticks.Add(new StockTick() { Id = 1, Timestamp = baseTime.AddSeconds(15), LastPrice = 8 });
ticks.Add(new StockTick() { Id = 1, Timestamp = baseTime.AddSeconds(30), LastPrice = 12 });
ticks.Add(new StockTick() { Id = 1, Timestamp = baseTime.AddSeconds(45), LastPrice = 11 });
ticks.Add(new StockTick() { Id = 1, Timestamp = baseTime.AddSeconds(65), LastPrice = 13 });
ticks.Add(new StockTick() { Id = 2, Timestamp = baseTime.AddSeconds(11), LastPrice = 35 });
ticks.Add(new StockTick() { Id = 2, Timestamp = baseTime.AddSeconds(13), LastPrice = 37 });
ticks.Add(new StockTick() { Id = 2, Timestamp = baseTime.AddSeconds(50), LastPrice = 22 });
ticks.Add(new StockTick() { Id = 2, Timestamp = baseTime.AddSeconds(55), LastPrice = 32 });
ticks.Add(new StockTick() { Id = 2, Timestamp = baseTime.AddSeconds(61), LastPrice = 36 });
return ticks.OrderBy(t => t.Timestamp);
}
}