用.NET语言写一个计算股票技术指标TRIX的函数,第一个参数为datatable类型,其他参数为int型;日期列名为“日期”,开盘价列名为“开盘”,收盘价列名为“收盘”,最高价列名为“最高”,最低价列名为“最低”,返回值直接使用输入的datatable,返回值包含TRIX和MATRIX列,double类型全部四舍五入保留3位小数,加上try-catch出错处理,如果出错直接返回null。
时间: 2024-03-28 17:41:39 浏览: 15
好的,以下是代码实现:
```c#
public static DataTable CalculateTRIX(DataTable dt, int n, int m)
{
DataTable result = dt.Copy();
result.Columns.Add("TRIX", typeof(double));
result.Columns.Add("MATRIX", typeof(double));
try
{
double ema1 = 0;
double ema2 = 0;
double ema3 = 0;
double lastEMA3 = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
double closePrice = Convert.ToDouble(dt.Rows[i]["收盘"]);
double ema1Value = 0;
double ema2Value = 0;
double ema3Value = 0;
if (i == 0)
{
ema1 = closePrice;
ema2 = closePrice;
ema3 = closePrice;
}
else
{
ema1 = (2.0 / (n + 1)) * closePrice + (1 - (2.0 / (n + 1))) * ema1;
ema2 = (2.0 / (n + 1)) * ema1 + (1 - (2.0 / (n + 1))) * ema2;
ema3 = (2.0 / (n + 1)) * ema2 + (1 - (2.0 / (n + 1))) * ema3;
}
if (i >= n * 3 - 2)
{
ema1Value = ema1;
ema2Value = ema2;
ema3Value = ema3;
if (lastEMA3 != 0)
{
double trix = (ema3Value - lastEMA3) / lastEMA3 * 100;
double matrix = (2.0 / (m + 1)) * trix + (1 - (2.0 / (m + 1))) * Convert.ToDouble(result.Rows[i - 1]["MATRIX"]);
result.Rows[i]["TRIX"] = Math.Round(trix, 3);
result.Rows[i]["MATRIX"] = Math.Round(matrix, 3);
}
else
{
result.Rows[i]["TRIX"] = DBNull.Value;
result.Rows[i]["MATRIX"] = DBNull.Value;
}
lastEMA3 = ema3Value;
}
else
{
result.Rows[i]["TRIX"] = DBNull.Value;
result.Rows[i]["MATRIX"] = DBNull.Value;
}
}
}
catch
{
return null;
}
return result;
}
```
其中,n为TRIX的参数,m为MATRIX的参数。
使用方法:
```c#
DataTable dt = new DataTable();
// 添加日期、开盘、收盘、最高、最低列...
DataTable result = CalculateTRIX(dt, 12, 20);
if(result == null)
{
// 处理出错情况
}
else
{
// 处理正确情况
}
```