2010-11-21 3 views
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); 
    } 
} 

答えて

0

の左と出力の

入力ライアン、 はよさそうだ - ただ、これは意図した意味論であるかどうかをチェックする:

あなたは毎分以内にいくつかの結果が得られます。入力イベントごとに、最初の(今回の分)と現在の価格と、それまでの分に発生した最小値と最大値を含む、同じ開始時間の結果イベントが表示されます。したがって、1分以内の最後の結果イベントだけが、分全体の最初、最後、最後、最後を含むでしょう。正しい? 1分ごとに1つのイベントしか望んでいないのですか?

ローマン

+0

1分ごとに1つのイベントは必要ありません。あなたは正しいです、分の最後のイベントは分の棒の最終状態を定義しますが、分の中のすべてのイベントは、途中で行われたクエリを満たすために使用されます。 –

+0

私は長さ1分の長さのHoppingWindowを使用して1minバーを作成しようとしています。私が理解していないのは、HoppingWindowのFirst()メソッドがないため、現在のタイムフレームの時間を取得する方法です。 – Chris