恭请诸位高手进来:求SMA和EMA函数的C#写法。

Sammo 2011-05-08 09:34:43
没写过这类函数,来此求助:
一、SMA(X,N,M)的函数算法:
SMA(X,N,M),求X的N日移动平均,M为权重。
算法: 若Y=SMA(X,N,M)
则 Y=[M*X+(N-M)*Y')/N,其中Y'表示上一周期Y值,N必须大于M。

二、EMA(X,N)的函数算法:
EMA(X,N),求X的N日指数平滑移动平均。
算法:若Y=EMA(X,N)
则Y=[2*X+(N-1)*Y']/(N+1),其中Y'表示上一周期Y值。

假设有一数组:decimal[] X=new decimal[100];
如何编写这两个函数,可以实现把X代入函数后,可以实现求出X[0]到X[99]的SMA和EMA的Y值。
还有一个细节就是:如果设定的N值为5天,那么无法求出X[96]到X[99]的Y值,直接返回值为0。

谢谢!!!
...全文
192 点赞 收藏 6
写回复
6 条回复
Sammo 2011年05月10日
为免帖子沉下去,自己再来顶一下。
回复 点赞
Sammo 2011年05月08日
周末,高手都休息去了,为免帖子沉下去,自己来顶一下。
回复 点赞
Sammo 2011年05月08日
周末,高手都休息去了,为免帖子沉下去,自己再来顶一下。
回复 点赞
Sammo 2011年05月08日
[Quote=引用 2 楼 wanghui0380 的回复:]

以前写了一个类似地,加权操作不太相同,不过大体思路是一样滴,你看明白了自己改吧

C# code
delegate T2 Func<T1, T2>(T1 t1);

delegate int[] arraryEleOp(int[] source, Func<int, int> func);
delegate int[] mv(int[] source,……
[/Quote]
小弟是C#菜鸟一个,刚刚开始学不久,这种写法没用过,看了好半天不大明白,可否高手抽空帮我一下,谢谢!
回复 点赞
wanghui0380 2011年05月08日
以前写了一个类似地,加权操作不太相同,不过大体思路是一样滴,你看明白了自己改吧

 delegate T2 Func<T1, T2>(T1 t1);

delegate int[] arraryEleOp(int[] source, Func<int, int> func);
delegate int[] mv(int[] source, int count);


private void button1_Click(object sender, EventArgs e)
{
int[] source =new int[] { 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10 };

arraryEleOp 加减权 = (s, f) => {
List<int> res = new List<int>();

for (int i = 0; i < s.Length; i++)
{
res.Add(s[i] + f(i));

}
return res.ToArray();

};

mv 移动平均 = (s, count) =>
{
List<int> res = new List<int>();
for (int i = 0; i < s.Length - count + 1; i++)
{
ArraySegment<int> t = new ArraySegment<int>(s, i, count);
res.Add(avg(t));
}
return res.ToArray();

};




var res1 =加减权(
移动平均(
加减权(
移动平均(source, 5), i => source[i])
, 5)
, i => -移动平均(source, 5)[i]
);






}






//计算均值
private int avg(ArraySegment<int> source)
{
int res = 0;
for (int i = source.Offset; i < source.Offset + source.Count; i++)
{
res += source.Array[i];
}
return res / source.Count;
}
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告