用.NET语言写出计算股票技术指标DMI,第一个参数为datatable类型,其他为int型,返回值为datatable类型,double类型全部四舍五入保留3位小数,加上try catch出错处理,写好详细注释。
时间: 2024-03-27 11:36:59 浏览: 49
好的,根据您的要求,以下是用.NET语言写出计算股票技术指标DMI的代码:
```csharp
using System;
using System.Data;
public class DMIIndicator
{
public static DataTable Calculate(DataTable dataTable, int period, int adxPeriod)
{
try
{
DataTable resultTable = new DataTable();
// 添加结果表的列
resultTable.Columns.Add("Date", typeof(DateTime));
resultTable.Columns.Add("PDI", typeof(double));
resultTable.Columns.Add("MDI", typeof(double));
resultTable.Columns.Add("ADX", typeof(double));
// 初始化计算所需的变量
int rowCount = dataTable.Rows.Count;
double[] tr = new double[rowCount];
double[] dmPlus = new double[rowCount];
double[] dmMinus = new double[rowCount];
double[] diPlus = new double[rowCount];
double[] diMinus = new double[rowCount];
double[] dx = new double[rowCount];
// 计算 TR、DM+ 和 DM-
for (int i = 1; i < rowCount; i++)
{
double high1 = Convert.ToDouble(dataTable.Rows[i]["High"]);
double low1 = Convert.ToDouble(dataTable.Rows[i]["Low"]);
double high2 = Convert.ToDouble(dataTable.Rows[i - 1]["High"]);
double low2 = Convert.ToDouble(dataTable.Rows[i - 1]["Low"]);
double tr1 = high1 - low1;
double tr2 = Math.Abs(high1 - close2);
double tr3 = Math.Abs(low1 - close2);
double dmPlus1 = high1 - high2;
double dmMinus1 = low2 - low1;
if (dmPlus1 > dmMinus1 && dmPlus1 > 0)
{
dmPlus[i] = dmPlus1;
}
if (dmMinus1 > dmPlus1 && dmMinus1 > 0)
{
dmMinus[i] = dmMinus1;
}
tr[i] = Math.Max(tr1, Math.Max(tr2, tr3));
}
// 计算 DI+ 和 DI-
for (int i = period; i < rowCount; i++)
{
double trSum = 0;
double dmPlusSum = 0;
double dmMinusSum = 0;
for (int j = i; j > i - period; j--)
{
trSum += tr[j];
dmPlusSum += dmPlus[j];
dmMinusSum += dmMinus[j];
}
diPlus[i] = dmPlusSum / trSum * 100;
diMinus[i] = dmMinusSum / trSum * 100;
}
// 计算 DX 和 ADX
for (int i = period + adxPeriod; i < rowCount; i++)
{
double diDiff = Math.Abs(diPlus[i] - diMinus[i]);
double diSum = diPlus[i] + diMinus[i];
dx[i] = diDiff / diSum * 100;
double dxSum = 0;
for (int j = i; j > i - adxPeriod; j--)
{
dxSum += dx[j];
}
double adx = dxSum / adxPeriod;
DataRow row = resultTable.NewRow();
row["Date"] = dataTable.Rows[i]["Date"];
row["PDI"] = Math.Round(diPlus[i], 3);
row["MDI"] = Math.Round(diMinus[i], 3);
row["ADX"] = Math.Round(adx, 3);
resultTable.Rows.Add(row);
}
return resultTable;
}
catch (Exception ex)
{
throw ex;
}
}
}
```
这个代码定义了一个名为 `DMIIndicator` 的类,其中有一个名为 `Calculate` 的静态方法,它接收一个 `DataTable` 类型的参数,表示股票数据,还有两个 `int` 类型的参数,分别表示计算 DI 和 DX 的时间周期,以及计算 ADX 的时间周期。最后返回一个 `DataTable` 类型的结果表,其中包含计算出的 PDI、MDI 和 ADX 值。
在方法内部,我们首先创建了一个结果表,并添加了需要的列。然后初始化了一些计算所需的变量,如 TR、DM+ 和 DM- 等。接着,我们使用循环计算 TR、DM+ 和 DM- 的值,并在 DI+ 和 DI- 的计算中使用它们。最后,我们计算 DX 和 ADX 的值,并将它们添加到结果表中。
在代码中,我们使用了 `try...catch` 语句来捕获可能出现的异常,并将它们抛出,以便调用方能够处理它们。同时,我们还添加了详细的注释,以便您更好地理解代码的功能。
阅读全文