#include "CalcLibSMA.h"

/// <summary>
/// Class:	ExponentialMovingAverage
/// 
/// In order to reduce the lag in simple moving averages, technicians 
/// sometimes use exponential moving averages, or exponentially 
/// weighted moving averages. Exponential moving averages reduce 
/// the lag by applying more weight to recent prices relative to 
/// older prices. The weighting applied to the most recent price 
/// depends on the length of the moving average. The shorter the 
/// exponential moving average is, the more weight that will be 
/// applied to the most recent price. For example: a 10-period 
/// exponential moving average weighs the most recent price 18.18% 
/// and a 20-period exponential moving average weighs the most 
/// recent price 9.52%. The method for calculating the exponential 
/// moving average is fairly complicated. The important thing to 
/// remember is that the exponential moving average puts more 
/// weight on recent prices. As such, it will react quicker to 
/// recent price changes than a simple moving average. 
/// 
///	Exponential Moving Average Calculation
/// The formula for an exponential moving average is:
///	X = (K x (C - P)) + P
///	X = Current EMA 
/// C = Current Price
/// P = Previous period's EMA*
///	K = Smoothing constant
/// (*A SMA is used for first period's calculation)
/// 
/// The smoothing constant applies the appropriate weighting to the 
/// most recent price relative to the previous exponential moving 
/// average. The formula for the smoothing constant is:
///
/// K = 2/(1+N)
/// N = Number of periods for EMA
/// For a 10-period EMA, the smoothing constant would be .1818.


/// </summary>
class CalcLibEMA : public CalcLibCalc
{
private:
	int m_period;		//Number of values to take
	CalcLibSMA m_sma; 
	double m_smoothingConstant;
public:
	CalcLibEMA(DOUBLEVECTOR values, DATEVECTOR dates, int periods);
	inline int getPeriod() { return m_period; }
	int doCalc();
private:	
	double calcSmoothingConstant(int period);
};

