我以前见过这个问题的变化,但没有一个确切的答案。
我有一个带有时间戳的对象列表(股票交易数据,或“ticks”):
Class Tick
{
Datetime Timestamp;
double Price;
}非常感谢你对此的任何想法,谢谢!
发布于 2011-04-28 15:16:17
I希望根据这些值生成另一个列表,这些值按一定的间隔分组,以便创建一个OHLC栏(打开、高、低、关闭)。这些酒吧可以是任何指定的间隔(1分钟、5分钟、10小时甚至1小时)。
不幸的是,您没有指定:
假设自然时间的日内酒吧,阶段通常是夹紧到午夜。所以每小时的酒吧是00:00 - 01:00,01:00 - 02:00等等。在这种情况下,酒吧的开始/结束时间可以作为它的唯一键。
那么问题就变成了:滴答的时间戳属于什么条形开始/结束时间?如果我们假设我上面假设的一切,这可以很容易地用一些简单的整数数学来解决。然后,查询可以类似于(未经测试的,只有algo ):
var bars = from tick in ticks
// Calculate the chronological, natural-time, intra-day index
// of the bar associated with a tick.
let barIndexForDay = tick.Timestamp.TimeOfDay.Ticks / barSizeInTicks
// Calculate the begin-time of the bar associated with a tick.
// For example, turn 2011/04/28 14:23.45
// into 2011/04/28 14:20.00, assuming 5 min bars.
let barBeginDateTime = tick.Timestamp.Date.AddTicks
(barIndexForDay * barSizeInTicks)
// Produce raw tick-data for each bar by grouping.
group tick by barBeginDateTime into tickGroup
// Order prices for a group chronologically.
let orderedPrices = tickGroup.OrderBy(t => t.Timestamp)
.Select(t => t.Price)
select new Bar
{
Open = orderedPrices.First(),
Close = orderedPrices.Last(),
High = orderedPrices.Max(),
Low = orderedPrices.Min(),
BeginTime = tickGroup.Key,
EndTime = tickGroup.Key.AddTicks(barSizeInTicks)
};通常需要按索引/日期时间来定位条形图,并按时间顺序枚举所有条形图。在这种情况下,您可能需要考虑将条形图存储在一个集合中,比如一个SortedList<DateTime, Bar> (其中键是bar的开始或结束时间),它将很好地填充所有这些角色。
I还需要找到一种有效的方法来将新的“滴答”排序到列表中,因为它们可能会达到高速率(每秒3到5次滴答)。
这取决于你的意思。
如果这些蜱是从一个实时的价格-饲料(按时间顺序),你根本不需要查找-只是存储当前的,不完整的,“部分”栏。当一个新的滴答到达时,检查它的时间戳。如果它仍然是当前“部分”栏的一部分,只需使用新信息(即Close = tick.Price,High = Max(oldHigh,tick.Price)等)更新条形。否则,“部分”栏就完成了--把它推到你的酒吧集合中。请注意,如果您使用的是“自然时间”栏,那么一条条的结束也可能是由时间的推移而不是由价格事件(例如小时栏在小时内完成)带来的。
编辑:
否则,您将需要进行查找。如果您存储在一个排序列表中(按开始时间/结束时间键),那么您只需要计算与滴答相关的开始时间/结束时间。这应该很简单;我已经在上面的LINQ查询中给出了一个示例,说明如何做到这一点。
例如:
myBars[GetBeginTime(tick.Timestamp)].Update(tick);https://stackoverflow.com/questions/5820397
复制相似问题