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中做到这一点。
任何关于如何实现这一点的想法,我想我必须将两个酒吧的实例连接在一起,连接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]
将引用前一个元素。