C# 在C/.NET中逐个勾选烛台/OHLC数据
我的问题基于这个前提: 像那个问题的提问者一样,我的目标是从SQL源构建烛台数据,但完全使用C。换句话说,我想先将滴答滴答的数据全部下载到我的C程序中,然后在程序中对其进行操作,以获得如下结果:C# 在C/.NET中逐个勾选烛台/OHLC数据,c#,sql,datetime,group-by,finance,C#,Sql,Datetime,Group By,Finance,我的问题基于这个前提: 像那个问题的提问者一样,我的目标是从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:1
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中,这似乎更容易做到,因为24 x 12计算(生成5分钟数据)可以修改为其他数字,例如,对于不同的时间段,对于15分钟的数据,24 x 4,对于2分钟的数据,24 x 30,等等。但我需要完全用C语言来完成
我的逐点计时通常是每3毫秒一次,但数据中没有固定或一致的刻度数。为什么不使用DataManipular。图表系列的分组方法 您可以这样做:
chart.DataManipulator.Group("HiLoOpCl", 5, IntervalType.Minutes, "series1", "series2")
我认为这样更好。为什么不使用数据操纵器。图表系列的分组方法 您可以这样做:
chart.DataManipulator.Group("HiLoOpCl", 5, IntervalType.Minutes, "series1", "series2")
我认为这样更好