用.NET语言写一个计算股票技术指标DMI的函数,第一个参数为datatable类型,另外两个参数为int型;日期列名为“日期”,开盘价列名为“开盘”,收盘价列名为“收盘”,最高价列名为“最高”,最低价列名为“最低”,返回值为datatable类型,返回值包含PDI,MDI,ADX,ADXR四列,double类型全部四舍五入保留3位小数,加上try-catch出错处理,如果出错直接返回null。。
时间: 2024-03-27 16:41:19 浏览: 15
好的,下面是用.NET语言写一个计算股票技术指标DMI的函数的示例代码:
```csharp
public DataTable CalculateDMI(DataTable dt, int n, int m)
{
try
{
DataTable result = new DataTable();
result.Columns.Add("日期", typeof(DateTime));
result.Columns.Add("PDI", typeof(double));
result.Columns.Add("MDI", typeof(double));
result.Columns.Add("ADX", typeof(double));
result.Columns.Add("ADXR", typeof(double));
double[] tr = new double[dt.Rows.Count];
double[] dmplus = new double[dt.Rows.Count];
double[] dmminus = new double[dt.Rows.Count];
double[] diplus = new double[dt.Rows.Count];
double[] diminus = new double[dt.Rows.Count];
double[] dx = new double[dt.Rows.Count];
double[] adx = new double[dt.Rows.Count];
double[] adxr = new double[dt.Rows.Count];
for (int i = 0; i < dt.Rows.Count; i++)
{
double high = Convert.ToDouble(dt.Rows[i]["最高"]);
double low = Convert.ToDouble(dt.Rows[i]["最低"]);
double preClose = i == 0 ? Convert.ToDouble(dt.Rows[i]["开盘"]) : Convert.ToDouble(dt.Rows[i - 1]["收盘"]);
double tr1 = Math.Max(high - low, Math.Abs(high - preClose));
double dmplus1 = high - preClose > preClose - low ? Math.Max(high - preClose, 0) : 0;
double dmminus1 = preClose - low > high - preClose ? Math.Max(preClose - low, 0) : 0;
tr[i] = tr1;
dmplus[i] = dmplus1;
dmminus[i] = dmminus1;
if (i >= n - 1)
{
double trsum = 0;
double dmplussum = 0;
double dmminussum = 0;
for (int j = i - n + 1; j <= i; j++)
{
trsum += tr[j];
dmplussum += dmplus[j];
dmminussum += dmminus[j];
}
double diplus1 = 100 * dmplussum / trsum;
double diminus1 = 100 * dmminussum / trsum;
diplus[i] = diplus1;
diminus[i] = diminus1;
if (i >= n + m - 2)
{
double diplussum = 0;
double diminussum = 0;
for (int j = i - n + 1; j <= i; j++)
{
diplussum += diplus[j];
diminussum += diminus[j];
}
double diplusn = diplussum / n;
double diminusn = diminussum / n;
double dx1 = Math.Abs(diplusn - diminusn) / (diplusn + diminusn) * 100;
dx[i] = dx1;
if (i >= n + m - 1)
{
double dxsum = 0;
for (int j = i - n - m + 2; j <= i; j++)
{
dxsum += dx[j];
}
double dxm = dxsum / m;
adx[i] = dxm;
adxr[i] = (adx[i] + adx[i - m + 1]) / 2;
}
}
}
}
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow row = result.NewRow();
row["日期"] = dt.Rows[i]["日期"];
row["PDI"] = Math.Round(diplus[i], 3);
row["MDI"] = Math.Round(diminus[i], 3);
row["ADX"] = Math.Round(adx[i], 3);
row["ADXR"] = Math.Round(adxr[i], 3);
result.Rows.Add(row);
}
return result;
}
catch
{
return null;
}
}
```
其中,n和m分别表示计算DI和ADX所用的天数,dt是原始股票数据的DataTable对象,其中包含日期、开盘价、收盘价、最高价和最低价五列,函数返回一个新的DataTable对象,包含PDI、MDI、ADX、ADXR四列。函数会对输入参数进行错误处理,如果出错则返回null。