用.NET语言写出计算股票技术指标DMI的函数,第一个参数为datatable类型,其他参数为int型,日期列名为“日期”,开盘价列名为“开盘”,收盘价列名为“收盘”,最高价列名为“最高”,最低价列名为“最低”,返回值为datatable类型,返回值直接用输入参数的datatable并增加需要的列,double类型全部四舍五入保留3位小数,加上try-catch出错处理,如果出错直接返回null,写好详细注释。
时间: 2024-03-28 11:42:14 浏览: 16
好的,以下是用.NET语言写出计算股票技术指标DMI的函数:
```csharp
public static DataTable CalculateDMI(DataTable dt, int n, int m)
{
try
{
if (!dt.Columns.Contains("日期") || !dt.Columns.Contains("开盘") || !dt.Columns.Contains("收盘") || !dt.Columns.Contains("最高") || !dt.Columns.Contains("最低"))
{
throw new ArgumentException("输入的DataTable必须包含日期、开盘价、收盘价、最高价、最低价这五个列");
}
int row_count = dt.Rows.Count;
if (row_count < n || row_count < m)
{
throw new ArgumentException("输入的DataTable行数必须大于参数n和m");
}
// 计算TR(真实波幅)和DM(方向指标)
List<double> TR = new List<double>();
List<double> DMPlus = new List<double>();
List<double> DMMinus = new List<double>();
for (int i = 1; i < row_count; i++)
{
double tr = Math.Max(Math.Max(dt.Rows[i]["最高"], (double)dt.Rows[i - 1]["收盘"]) - Math.Min(dt.Rows[i]["最低"], (double)dt.Rows[i - 1]["收盘"]), Math.Abs((double)dt.Rows[i]["最高"] - (double)dt.Rows[i]["最低"]));
TR.Add(tr);
double dmplus = 0;
double dmminus = 0;
if ((double)dt.Rows[i]["最高"] - (double)dt.Rows[i - 1]["最高"] > (double)dt.Rows[i - 1]["最低"] - (double)dt.Rows[i]["最低"])
{
dmplus = Math.Max((double)dt.Rows[i]["最高"] - (double)dt.Rows[i - 1]["最高"], 0);
}
else
{
dmminus = Math.Max((double)dt.Rows[i - 1]["最低"] - (double)dt.Rows[i]["最低"], 0);
}
DMPlus.Add(dmplus);
DMMinus.Add(dmminus);
}
// 计算DI(方向指标)和DX(趋向指标)
List<double> DIPlus = new List<double>();
List<double> DIMinus = new List<double>();
List<double> DX = new List<double>();
for (int i = n; i < row_count; i++)
{
double tr_n = TR.Skip(i - n).Take(n).Sum();
double dmplus_n = DMPlus.Skip(i - n).Take(n).Sum();
double dmminus_n = DMMinus.Skip(i - n).Take(n).Sum();
double diplus = dmplus_n / tr_n * 100;
double diminus = dmminus_n / tr_n * 100;
DIPlus.Add(diplus);
DIMinus.Add(diminus);
double dx = Math.Abs(diplus - diminus) / (diplus + diminus) * 100;
DX.Add(dx);
}
// 计算ADX(平均趋向指标)
List<double> ADX = new List<double>();
for (int i = n + m - 1; i < row_count; i++)
{
double dx_m = DX.Skip(i - m + 1).Take(m - 1).Sum();
double adx = (dx_m + DX[i - m + 1]) / m * 100;
ADX.Add(adx);
}
// 将DI+、DI-、DX、ADX添加到输入的DataTable中
dt.Columns.Add("DI+", typeof(double));
dt.Columns.Add("DI-", typeof(double));
dt.Columns.Add("DX", typeof(double));
dt.Columns.Add("ADX", typeof(double));
for (int i = 0; i < row_count; i++)
{
double diplus = DIPlus.ElementAtOrDefault(i - n + 1) ?? 0;
double diminus = DIMinus.ElementAtOrDefault(i - n + 1) ?? 0;
double dx = DX.ElementAtOrDefault(i - n - m + 2) ?? 0;
double adx = ADX.ElementAtOrDefault(i - n - m + 2) ?? 0;
dt.Rows[i]["DI+"] = Math.Round(diplus, 3);
dt.Rows[i]["DI-"] = Math.Round(diminus, 3);
dt.Rows[i]["DX"] = Math.Round(dx, 3);
dt.Rows[i]["ADX"] = Math.Round(adx, 3);
}
return dt;
}
catch
{
return null;
}
}
```
其中,参数n和m分别为DMI指标中的参数N和M。如果输入的DataTable不符合要求或者出现其他错误,函数会返回null。