用.NET语言写一个计算股票技术指标DMA的函数,第一个参数为包含计算好标准差的datatable,另外三个参数为int型,日期列名为“日期”,开盘价列名为“开盘”,收盘价列名为“收盘”,最高价列名为“最高”,最低价列名为“最低”,返回值datatable新增DIF、MADIF两列,double类型全部四舍五入保留3位小数,加上try-catch出错处理,写好详细注释。
时间: 2024-03-29 14:39:58 浏览: 68
好的,以下是用.NET语言写一个计算股票技术指标DMA的函数的代码,如有不懂之处可以随时问我:
```csharp
public static DataTable CalcDMA(DataTable dt, int shortDay, int longDay, int difDay)
{
DataTable result = new DataTable();
// 添加日期、开盘价、收盘价、最高价、最低价、DIF、MADIF列
result.Columns.Add("日期", typeof(DateTime));
result.Columns.Add("开盘", typeof(double));
result.Columns.Add("收盘", typeof(double));
result.Columns.Add("最高", typeof(double));
result.Columns.Add("最低", typeof(double));
result.Columns.Add("DIF", typeof(double));
result.Columns.Add("MADIF", typeof(double));
try
{
// 先按日期升序排序
dt.DefaultView.Sort = "日期 ASC";
dt = dt.DefaultView.ToTable();
// 定义短期和长期的移动平均线
double[] shortMA = new double[dt.Rows.Count];
double[] longMA = new double[dt.Rows.Count];
// 计算短期移动平均线
for (int i = shortDay - 1; i < dt.Rows.Count; i++)
{
double sum = 0;
for (int j = i - shortDay + 1; j <= i; j++)
{
sum += Convert.ToDouble(dt.Rows[j]["收盘"]);
}
shortMA[i] = sum / shortDay;
}
// 计算长期移动平均线
for (int i = longDay - 1; i < dt.Rows.Count; i++)
{
double sum = 0;
for (int j = i - longDay + 1; j <= i; j++)
{
sum += Convert.ToDouble(dt.Rows[j]["收盘"]);
}
longMA[i] = sum / longDay;
}
// 计算DIF
for (int i = difDay - 1; i < dt.Rows.Count; i++)
{
double dif = shortMA[i] - longMA[i];
result.Rows.Add(dt.Rows[i]["日期"], dt.Rows[i]["开盘"], dt.Rows[i]["收盘"], dt.Rows[i]["最高"], dt.Rows[i]["最低"], Math.Round(dif, 3));
// 计算MADIF
if (i >= difDay)
{
double sum = 0;
for (int j = i - difDay + 1; j <= i; j++)
{
sum += shortMA[j] - longMA[j];
}
double madif = sum / difDay;
result.Rows[i]["MADIF"] = Math.Round(madif, 3);
}
}
}
catch (Exception ex)
{
// 出错时返回空表
Console.WriteLine("计算DMA指标出错:" + ex.Message);
return result;
}
return result;
}
```
使用方法如下:
```csharp
DataTable dt = new DataTable();
// 将包含计算好标准差的datatable赋值给dt
DataTable result = CalcDMA(dt, 10, 20, 5);
// 返回值为计算好DMA指标的datatable
```
注意:上面的代码计算DMA指标时,是以收盘价为基础,如果要以其他价格为基础,可以将代码中的“收盘”改为“开盘”、“最高”或“最低”。
阅读全文