LINQ查询以查找True Range

本文关键字:True Range 查找 查询 LINQ | 更新日期: 2023-09-27 18:00:43

我在计算LINQ查询时遇到问题,无法为我提供开-高-低-关系列的真实范围。

我有一个对象栏阵列,具有以下属性

DateTime BarTime;
decimal Open;
decimal High;
decimal Low;
decimal Close;

目前我的LINQ查询看起来像

var TrueRange = bars.Select(b => b.High - b.Low);

我想做的是不使用b.High have Math.Max(b.High,previousBarsClose)和b.Low have Math.Min(b.Low,previous BarsClos)

如果知道如何实现这一点,我想我必须将两个酒吧实例连接在一起,连接上一个酒吧的BarTime=BarTime,但不知道如何在LINQ中做到这一点。

LINQ查询以查找True Range

任何关于如何实现这一点的想法,我想我必须将两个酒吧的实例连接在一起,连接BarTime=Previous Bar 的BarTime

这是一个可能的解决方案。您可以使用Skip/Zip(作为Ahmand使用索引器的答案的替代方案):

var TrueRange = bars.Skip(1).Zip(bars, 
                 (b, p) => Math.Max(b.High, p.Close) - Math.Min(b.Low, p.Close));

您可以跳过第一个元素,然后使用重载的Select方法来访问索引。使用索引,您可以访问数组中的上一个元素。只要原始集合允许您使用索引器(如数组或列表),这种方法就会起作用。

var query = bars.Skip(1)
                .Select((b, i) => Math.Max(b.High, bars[i].High) - 
                                    Math.Min(b.Low, bars[i].Low));

注意:索引i将从0开始。由于我们跳过了第一个元素,因此使用bars[i]将引用前一个元素。