用.NET语言写出计算股票技术指标KDJ,输入参数和返回值均为datatable类型,double类型全部四舍五入保留3位小数。
时间: 2023-05-17 08:07:36 浏览: 60
以下是用.NET语言写出计算股票技术指标KDJ的代码:
```csharp
public static DataTable CalculateKDJ(DataTable dataTable)
{
DataTable resultTable = new DataTable();
resultTable.Columns.Add("K", typeof(double));
resultTable.Columns.Add("D", typeof(double));
resultTable.Columns.Add("J", typeof(double));
double[] high = new double[dataTable.Rows.Count];
double[] low = new double[dataTable.Rows.Count];
double[] close = new double[dataTable.Rows.Count];
for (int i = 0; i < dataTable.Rows.Count; i++)
{
high[i] = Convert.ToDouble(dataTable.Rows[i]["High"]);
low[i] = Convert.ToDouble(dataTable.Rows[i]["Low"]);
close[i] = Convert.ToDouble(dataTable.Rows[i]["Close"]);
}
double[] k = new double[dataTable.Rows.Count];
double[] d = new double[dataTable.Rows.Count];
double[] j = new double[dataTable.Rows.Count];
for (int i = 0; i < dataTable.Rows.Count; i++)
{
double rsv = (close[i] - GetLowest(low, i, 9)) / (GetHighest(high, i, 9) - GetLowest(low, i, 9)) * 100;
if (i == 0)
{
k[i] = d[i] = j[i] = rsv;
}
else
{
k[i] = (2.0 / 3) * k[i - 1] + (1.0 / 3) * rsv;
d[i] = (2.0 / 3) * d[i - 1] + (1.0 / 3) * k[i];
j[i] = 3 * k[i] - 2 * d[i];
}
DataRow row = resultTable.NewRow();
row["K"] = Math.Round(k[i], 3);
row["D"] = Math.Round(d[i], 3);
row["J"] = Math.Round(j[i], 3);
resultTable.Rows.Add(row);
}
return resultTable;
}
private static double GetHighest(double[] array, int index, int count)
{
double highest = double.MinValue;
for (int i = index; i >= Math.Max(0, index - count + 1); i--)
{
if (array[i] > highest)
{
highest = array[i];
}
}
return highest;
}
private static double GetLowest(double[] array, int index, int count)
{
double lowest = double.MaxValue;
for (int i = index; i >= Math.Max(0, index - count + 1); i--)
{
if (array[i] < lowest)
{
lowest = array[i];
}
}
return lowest;
}
```
输入参数为一个DataTable类型的股票数据表,包含High、Low和Close三列,返回值为一个DataTable类型的KDJ指标表,包含K、D和J三列,每个值均为double类型,保留3位小数。