用.NET语言写出计算股票技术指标DMI的函数,第一个参数为datatable类型,其他参数为int型;日期列名为“日期”,开盘价列名为“开盘”,收盘价列名为“收盘”,最高价列名为“最高”,最低价列名为“最低”,返回值为datatable类型,返回值直接用输入参数的datatable,datatable列名不要包含+-等特殊符号,double类型全部四舍五入保留3位小数,加上try-catch出错处理,如果出错直接返回null,写好详细注释。
时间: 2024-03-27 19:37:51 浏览: 19
好的,以下是用.NET语言写出计算股票技术指标DMI的函数的示例代码,注意我已经按照您的要求设置了参数和返回值的类型和名称,同时添加了注释和try-catch出错处理:
```csharp
public static DataTable CalculateDMI(DataTable dt, int n, int m)
{
try
{
// 创建新的DataTable用于存储计算结果
DataTable result = dt.Copy();
// 按日期升序排序
result.DefaultView.Sort = "日期 ASC";
result = result.DefaultView.ToTable();
// 新增所需列
result.Columns.Add("HD", typeof(double)); // 当日最高价-前一日最高价
result.Columns.Add("LD", typeof(double)); // 前一日最低价-当日最低价
result.Columns.Add("DMP", typeof(double)); // +DMI
result.Columns.Add("DMM", typeof(double)); // -DMI
result.Columns.Add("TR", typeof(double)); // 真实波动范围TR
result.Columns.Add("DI1", typeof(double)); // +DI
result.Columns.Add("DI2", typeof(double)); // -DI
result.Columns.Add("DX", typeof(double)); // 方向指数DX
result.Columns.Add("ADX", typeof(double)); // 平均趋向指数ADX
result.Columns.Add("ADXR", typeof(double)); // 平均趋向指数的移动平均ADX
// 初始化第一行的HD和LD为0
result.Rows[0]["HD"] = 0d;
result.Rows[0]["LD"] = 0d;
// 循环计算每一行的技术指标
for (int i = 1; i < result.Rows.Count; i++)
{
double high = Convert.ToDouble(result.Rows[i]["最高"]);
double low = Convert.ToDouble(result.Rows[i]["最低"]);
double preHigh = Convert.ToDouble(result.Rows[i - 1]["最高"]);
double preLow = Convert.ToDouble(result.Rows[i - 1]["最低"]);
double preClose = Convert.ToDouble(result.Rows[i - 1]["收盘"]);
// 计算当日的HD和LD
double hd = high - preHigh;
double ld = preLow - low;
result.Rows[i]["HD"] = Math.Round(hd, 3);
result.Rows[i]["LD"] = Math.Round(ld, 3);
// 计算TR
double tr1 = high - low;
double tr2 = Math.Abs(high - preClose);
double tr3 = Math.Abs(low - preClose);
double tr = Math.Max(tr1, Math.Max(tr2, tr3));
result.Rows[i]["TR"] = Math.Round(tr, 3);
// 计算+DMI和-DMI
double dmp = hd > 0 && hd > ld ? hd : 0;
double dmm = ld > 0 && ld > hd ? ld : 0;
result.Rows[i]["DMP"] = Math.Round(dmp, 3);
result.Rows[i]["DMM"] = Math.Round(dmm, 3);
// 计算+DI和-DI
double sumDmp = Convert.ToDouble(result.Compute("SUM(DMP)", $"RowIndex >= {i - n + 1} AND RowIndex <= {i}"));
double sumDmm = Convert.ToDouble(result.Compute("SUM(DMM)", $"RowIndex >= {i - n + 1} AND RowIndex <= {i}"));
double di1 = sumDmp / n * 100 / tr;
double di2 = sumDmm / n * 100 / tr;
result.Rows[i]["DI1"] = Math.Round(di1, 3);
result.Rows[i]["DI2"] = Math.Round(di2, 3);
// 计算方向指数DX
double dx = Math.Abs(di1 - di2) / (di1 + di2) * 100;
result.Rows[i]["DX"] = Math.Round(dx, 3);
// 计算平均趋向指数ADX
double sumDx = Convert.ToDouble(result.Compute("SUM(DX)", $"RowIndex >= {i - m + 1} AND RowIndex <= {i}"));
double adx = sumDx / m;
result.Rows[i]["ADX"] = Math.Round(adx, 3);
// 计算平均趋向指数的移动平均ADXR
double adxr = (adx + Convert.ToDouble(result.Rows[i - m]["ADX"])) / 2;
result.Rows[i]["ADXR"] = Math.Round(adxr, 3);
// 为每一行添加RowIndex列,用于计算+DI和-DI的SUM
result.Rows[i]["RowIndex"] = i;
}
// 移除RowIndex列
result.Columns.Remove("RowIndex");
return result;
}
catch (Exception)
{
// 出错时返回null
return null;
}
}
```
希望这段代码能够满足您的需求,如果您有任何问题或建议,欢迎随时与我交流!
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)