用.NET语言写出计算股票技术指标DMI的函数,第一个参数为datatable类型,其他参数为int型;日期列名为“日期”,开盘价列名为“开盘”,收盘价列名为“收盘”,最高价列名为“最高”,最低价列名为“最低”,返回值为datatable类型,返回值直接用输入参数的datatable,double类型全部四舍五入保留3位小数,加上try-catch出错处理,如果出错直接返回null,写好详细注释。
时间: 2024-03-27 07:37:40 浏览: 15
好的,以下是代码实现:
```csharp
using System;
using System.Data;
namespace StockIndicator
{
public static class DMI
{
public static DataTable Calculate(DataTable dt, int n, int m)
{
try
{
// 声明变量
double[] tr = new double[dt.Rows.Count];
double[] hd = new double[dt.Rows.Count];
double[] ld = new double[dt.Rows.Count];
double[] dmP = new double[dt.Rows.Count];
double[] dmM = new double[dt.Rows.Count];
double[] diP = new double[dt.Rows.Count];
double[] diM = new double[dt.Rows.Count];
double[] dx = new double[dt.Rows.Count];
double[] adx = new double[dt.Rows.Count];
// 计算TR,HD和LD
for (int i = 1; i < dt.Rows.Count; i++)
{
double high = Convert.ToDouble(dt.Rows[i]["最高"]);
double low = Convert.ToDouble(dt.Rows[i]["最低"]);
double preClose = Convert.ToDouble(dt.Rows[i - 1]["收盘"]);
tr[i] = Math.Max(high - low, Math.Max(Math.Abs(high - preClose), Math.Abs(low - preClose)));
hd[i] = high - Convert.ToDouble(dt.Rows[i - 1]["最高"]);
ld[i] = Convert.ToDouble(dt.Rows[i - 1]["最低"]) - low;
}
// 计算+DMI和-DMI
for (int i = n + 1; i < dt.Rows.Count; i++)
{
double sumTR = 0;
double sumHD = 0;
double sumLD = 0;
for (int j = i - n; j <= i; j++)
{
sumTR += tr[j];
sumHD += hd[j];
sumLD += ld[j];
}
dmP[i] = sumHD > sumLD && sumHD > 0 ? sumHD : 0;
dmM[i] = sumLD > sumHD && sumLD > 0 ? sumLD : 0;
}
// 计算+DI和-DI
for (int i = n + m + 1; i < dt.Rows.Count; i++)
{
double sumDMp = 0;
double sumDMm = 0;
for (int j = i - m; j <= i; j++)
{
sumDMp += dmP[j];
sumDMm += dmM[j];
}
diP[i] = sumTR[i] > 0 ? Math.Round(sumDMp / sumTR[i] * 100, 3) : 0;
diM[i] = sumTR[i] > 0 ? Math.Round(sumDMm / sumTR[i] * 100, 3) : 0;
}
// 计算DX和ADX
for (int i = n + m + 1; i < dt.Rows.Count; i++)
{
dx[i] = diP[i] + diM[i] > 0 ? Math.Round(Math.Abs(diP[i] - diM[i]) / (diP[i] + diM[i]) * 100, 3) : 0;
double sumDX = 0;
for (int j = i - m; j <= i; j++)
{
sumDX += dx[j];
}
adx[i] = Math.Round(sumDX / m, 3);
}
// 将结果写入DataTable
for (int i = 0; i < dt.Rows.Count; i++)
{
if (i >= n + m + 1)
{
dt.Rows[i]["+DI"] = diP[i];
dt.Rows[i]["-DI"] = diM[i];
dt.Rows[i]["DX"] = dx[i];
dt.Rows[i]["ADX"] = adx[i];
}
else
{
dt.Rows[i]["+DI"] = DBNull.Value;
dt.Rows[i]["-DI"] = DBNull.Value;
dt.Rows[i]["DX"] = DBNull.Value;
dt.Rows[i]["ADX"] = DBNull.Value;
}
}
return dt;
}
catch
{
return null;
}
}
}
}
```
函数的实现步骤如下:
1. 声明变量,包括TR、HD、LD、DM+、DM-、DI+、DI-、DX和ADX。
2. 计算TR、HD和LD。
3. 计算DM+和DM-。
4. 计算DI+和DI-。
5. 计算DX和ADX。
6. 将结果写入DataTable。
7. 返回DataTable或null。
如果出错,直接返回null。函数中使用了try-catch语句进行异常处理,确保程序不会因为出现异常而崩溃。
相关推荐
![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_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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)