用.NET语言写一个计算股票技术指标DMI的函数,第一个参数为包含计算好标准差的datatable,另外两个参数为int型,日期列名为“日期”,开盘价列名为“开盘”,收盘价列名为“收盘”,最高价列名为“最高”,最低价列名为“最低”,返回值datatable新增PDI,MDI,ADX,ADXR四列,double类型全部四舍五入保留3位小数,加上try-catch出错处理,写好详细注释。
时间: 2024-03-28 08:42:17 浏览: 64
Trady:Trady是一个方便的库,用于计算技术指标,它的目标是成为一个自动交易系统,提供股票数据馈送,指标计算,策略建立和自动交易。 它基于.NET Standard 2.0构建
好的,这里是用.NET语言写计算DMI的函数,注释已经加上了。
```csharp
using System;
using System.Data;
public static DataTable CalculateDMI(DataTable dt, int n, int m)
{
// 定义返回值的DataTable,包含PDI, MDI, ADX, ADXR四列
DataTable result = new DataTable();
result.Columns.Add("PDI", typeof(double));
result.Columns.Add("MDI", typeof(double));
result.Columns.Add("ADX", typeof(double));
result.Columns.Add("ADXR", typeof(double));
try
{
// 检查DataTable的列名是否正确
if (!dt.Columns.Contains("日期") || !dt.Columns.Contains("开盘") ||
!dt.Columns.Contains("收盘") || !dt.Columns.Contains("最高") ||
!dt.Columns.Contains("最低"))
{
throw new ArgumentException("DataTable的列名不正确!");
}
// 定义变量
double tr = 0.0;
double pdm = 0.0;
double mdm = 0.0;
double pdi = 0.0;
double mdi = 0.0;
double dx = 0.0;
double adx = 0.0;
double adxr = 0.0;
double sumtr = 0.0;
double sumpdm = 0.0;
double summdm = 0.0;
double sumdx = 0.0;
double sumadx = 0.0;
// 遍历DataTable的每一行
for (int i = 1; i < dt.Rows.Count; i++)
{
// 计算TR
double h = Convert.ToDouble(dt.Rows[i]["最高"]);
double l = Convert.ToDouble(dt.Rows[i]["最低"]);
double pc = Convert.ToDouble(dt.Rows[i - 1]["收盘"]);
double tr1 = Math.Max(h - l, Math.Abs(h - pc));
double tr2 = Math.Max(h - l, Math.Abs(l - pc));
tr = Math.Max(tr1, tr2);
// 计算PDM和MDM
double o = Convert.ToDouble(dt.Rows[i]["开盘"]);
double c = Convert.ToDouble(dt.Rows[i]["收盘"]);
pdm = Math.Max(h - pc, 0);
mdm = Math.Max(pc - l, 0);
if (pdm < mdm)
{
pdm = 0;
}
else if (pdm > mdm)
{
mdm = 0;
}
// 计算TR、PDM、MDM的n日移动平均值
if (i < n)
{
sumtr += tr;
sumpdm += pdm;
summdm += mdm;
}
else
{
sumtr = sumtr - sumtr / n + tr;
sumpdm = sumpdm - sumpdm / n + pdm;
summdm = summdm - summdm / n + mdm;
}
// 计算PDI和MDI
if (i >= n)
{
pdi = sumpdm / sumtr * 100;
mdi = summdm / sumtr * 100;
}
// 计算DX
if (pdi + mdi != 0)
{
dx = Math.Abs(pdi - mdi) / (pdi + mdi) * 100;
}
// 计算DX的m日移动平均值
if (i < n + m)
{
sumdx += dx;
}
else
{
sumdx = sumdx - sumdx / m + dx;
}
// 计算ADX和ADXR
if (i >= n + m)
{
adx = sumdx / m;
sumadx += adx;
if (i == n + m)
{
result.Rows.Add(DBNull.Value, DBNull.Value, adx, DBNull.Value);
}
else
{
adxr = (adx + Convert.ToDouble(result.Rows[i - n - m - 1]["ADX"])) / 2;
result.Rows.Add(pdi, mdi, adx, adxr);
}
}
}
}
catch (Exception ex)
{
// 出错处理
Console.WriteLine(ex.Message);
result = null;
}
// 返回结果
return result;
}
```
使用方法:
```csharp
// 假设DataTable的名称为dt
DataTable result = CalculateDMI(dt, 14, 6);
```
其中,14表示计算TR、PDM、MDM的n日移动平均值的n为14,6表示计算DX的m日移动平均值的m为6。
阅读全文