1
在庫データフィードを使って作業していて、データから分かりやすい棒(燭台)を作成したいと考えています。私は必要なデータを私に与えることができるかなり良いクエリがあると思うが、それについてはそれが最良の方法だとは確信していない。ご意見や批判をお寄せください。私はあなたが提供したい意見をお待ちしております。右集約拡張機能はこの問題を解決する最善の方法ですか、グループ化して何かをしようとするべきですか?
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);
}
}
1分ごとに1つのイベントは必要ありません。あなたは正しいです、分の最後のイベントは分の棒の最終状態を定義しますが、分の中のすべてのイベントは、途中で行われたクエリを満たすために使用されます。 –
私は長さ1分の長さのHoppingWindowを使用して1minバーを作成しようとしています。私が理解していないのは、HoppingWindowのFirst()メソッドがないため、現在のタイムフレームの時間を取得する方法です。 – Chris