public class SMA
{
private readonly int _Length;
private readonly bool _StoreData;
private decimal _Value;
private decimal _Price;
private bool _Primed;
private readonly string _Name;
private readonly DecimalCollection _PriceArray = new DecimalCollection();
private readonly DecimalCollection _ValueArray = new DecimalCollection();
public SMA(int length) : this(length, false)
{
}
/// <summary>
/// Class for calculating Simple Moving Average
/// </summary>
/// <param name="length">Lenght SMA calculation formula</param>
/// <param name="storeData"></param>
public SMA(int length, bool storeData)
{
_Length = length;
_StoreData = storeData;
_Name = GetType().Name + Length;
}
public int Length
{
get { return _Length; }
}
public bool StoreData
{
get { return _StoreData; }
}
public decimal Value
{
get { return _Value; }
}
public bool Primed
{
get { return _Primed; }
}
public string Name
{
get { return _Name; }
}
public DecimalCollection ValueArray
{
get { return _ValueArray; }
}
public void PriceTick(decimal price, bool add)
{
if (add)
AddPrice(price);
else
EditPrice(price);
}
public void PriceTicks(DecimalCollection prices)
{
if (prices == null || prices.Count == 0)
return;
for (int i = 0; i < prices.Count; i++)
{
AddPrice(prices[i]);
}
}
private void AddPrice(decimal price)
{
_Price = price;
if (!_Primed)
{
_PriceArray.Add(_Price);
if (_PriceArray.Count == Length)
{
_Primed = true;
_Value = _PriceArray.Average();
}
}
else
{
_PriceArray.RemoveAt(0);
_PriceArray.Add(price);
_Value = _PriceArray.Average();
if (_StoreData)
{
ValueArray.Add(_Value);
}
}
}
private void EditPrice(decimal price)
{
if (price != _Price)
{
_Price = price;
_PriceArray[_PriceArray.Count - 1] = _Price;
if (_Primed)
{
if (_PriceArray.Count == _Length)
{
_Value = _PriceArray.Average();
if (_StoreData)
{
ValueArray[ValueArray.Count - 1] = _Value;
}
}
else
{
_Value = _PriceArray.Average();
if (_StoreData)
{
ValueArray[ValueArray.Count - 1] = _Value;
}
}
}
}
}
}
This source uses DecimalCollection class that is already published on my blog.