c# - 在 C#/.NET 中逐笔更新到烛台/OHLC 数据

我的问题是基于这个前提: Group OHLC-Stockmarket Data into multiple timeframes with T-SQL

就像那个问题的提问者一样,我的目标是从 SQL 源构建烛台数据,但完全使用 C#。换句话说,我想先将逐笔报价的数据完整地下载到我的C#程序中,然后在程序中对其进行操作,得到如下结果:

TimeStamp          | Price 
2012-02-17 15:15:0 | 102  
2012-02-17 15:16:0 |108   
2012-02-17 15:17:0 | 101  
2012-02-17 15:18:0 |105   
2012-02-17 15:19:0 |107   
2012-02-17 15:20:0 |115   

Desired Query Result (5 minutes):

Timestamp       |Open|High|Low|Close
2012-02-15:19:0 |102 |108 |101|107
2012-02-15:24:0 |115.|....|...|...
2012-02-15:29:0 |....|....|...|...

(部分转载自上述问题)

我在 C# 中的代码使用相关的连接字符串逐笔报价下载整个报价数据,并将数据存储在数组中。

//SQL connection string
SqlConnection o_sqlConnection = new SqlConnection();
o_sqlCommand.CommandText = "(see query below)";
SqlDataReader o_sqlDataReader;
...
//Storage of query result in arrays
pricetmp = Convert.ToDouble(o_sqlDataReader["Price"]);
            priceList.Add(pricetmp);
voltmp = Convert.ToDouble(o_sqlDataReader["Volume"]);
            volList.Add(voltmp);
//along with date, time and stock symbol
//eventually
double[] priceArray = price.ToArray();
DateTime[] timestampArray = timestamp.ToArray();
...

我需要帮助来编写与上述问题的答案中的 SQL 查询产生相同结果的代码部分,即

(reprinted from the link)
select  min(timestamp) as Time
,       max(Price) as Highest
,       min(Price) as Lowest
,       min(case when rn_asc = 1 then [Price] end) as first
,       min(case when rn_desc = 1 then [Price] end) as Last
from    (
    select  row_number() over (
                partition by cast(cast(timestamp as float) * 24 * 12 as int)
                order by timestamp) as rn_asc
    ,       row_number() over (
                partition by cast(cast(timestamp as float) * 24 * 12 as int)
                order by timestamp desc) as rn_desc
    ,       where Stocksymbol = 'abc123'
    ,       *
    from    @t
    ) as SubQueryAlias
group by
    cast(cast(timestamp as float) * 24 * 12 as int)

注意:我修改了上面的查询以适合我的目的 - 即直接将报价数据(而不是更短时间范围的 OHLC 数据)转换为 OHLC 数据。

作为 C# 的新手,我希望能就如何编写模拟上述查询结果的函数提供一些建议。 这是我目前所拥有的:

int j = 0; //n is length of data per expected number of OHLC bars
double[] open = new double[n];
double[] close = new double[n];
double[] high = new double[n];
double[] low = new double[n];
int i = 0; int ratio = priceData.Length/n;
while (i < priceData.Length)
{
    open[i/ratio] = priceData[i];
    close[i/ratio] = priceData[i];
    high[i/ratio] = priceData[i];
    low[i/ratio] = priceData[i];

    if (i != -1)
    {
        for (j = i + 1; j < i + ratio; j++)
        {
        if (priceData[j] > high[i/ratio])
            high[i/ratio] = priceData[j];
        if (priceData[j] < low[i/ratio])
            low[i/ratio] = priceData[j];
        close[i/ratio] = priceData[j];
        }
    }

    i += ratio;
}
//output open, high, low, close

如何根据预期时间范围为 n 个值选择参数? (1 分钟、2 分钟、15 分钟等)(在 SQL 数据中很容易做到)?或者更具体地说,我如何概括此代码以输入所需的时间范围并使用它来计算 OHLC 数据?我如何结合使用 DateTime 数组(此示例代码忽略它)来对数据进行排序?

这在 SQL 中似乎更容易做到,因为产生 5 分钟数据的 24 x 12 计算可以修改为其他数字(例如 24 x 4 用于 15 分钟数据,24 x 30 用于 2 分钟数据等)对于不同的时间范围。但我需要完全在 C# 中完成此操作。

我的滴答时间一般是每 3 毫秒一次,但数据中没有固定或一致的滴答数。

最佳答案

为什么不使用图表系列的 DataManipulator.Group 方法?

你可以这样做:

    chart.DataManipulator.Group("HiLoOpCl", 5, IntervalType.Minutes, "series1", "series2")

我认为它更好。

https://stackoverflow.com/questions/18065216/

相关文章:

jsp - JSTL 自定义标签变量替换

visual-studio-2010 - Visual-Studio 中 lex 和 yacc 的语

django - 在 Django 中的多个字段上进行关键字搜索

arrays - 重命名 MongoDB 数组中嵌入文档中的字段不起作用

google-translate - 如何让谷歌翻译显示原始语言名称

python - 使用python将HTML页面中的所有链接替换为本地地址

python - 在python多处理中实现Ctrl+C取消

three.js - 在 three.js 中显示数千张图片

python - 在 python 中加载 JSON 作为实际对象,而不是 dict

node.js - Mongo降序排序