Files
2025-02-07 19:15:50 +03:30

85 lines
7.3 KiB
Plaintext

//+------------------------------------------------------------------+
//| RingBuffer.mqh |
//| Copyright 2016, Vasiliy Sokolov. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link "http://www.mql5.com"
#include "RiBuffDbl.mqh"
#include "RiSMA.mqh"
#include "RiEMA.mqh"
//+------------------------------------------------------------------+
//| Calculate moving average in the ring buffer |
//+------------------------------------------------------------------+
class CRiMACD
{
private:
CRiEMA m_slow_macd; // Fast exponential moving average
CRiEMA m_fast_macd; // Slow exponential moving average
CRiSMA m_signal_macd; // Signal line
double m_delta; // Difference between fast and slow EMAs
public:
double Macd(void);
double Signal(void);
void ChangeLast(double new_value);
void SetFastPeriod(int period);
void SetSlowPeriod(int period);
void SetSignalPeriod(int period);
void AddValue(double value);
};
//+------------------------------------------------------------------+
//| Re-calculate MACD |
//+------------------------------------------------------------------+
void CRiMACD::AddValue(double value)
{
m_slow_macd.AddValue(value);
m_fast_macd.AddValue(value);
m_delta = m_slow_macd.EMA() - m_fast_macd.EMA();
m_signal_macd.AddValue(m_delta);
}
//+------------------------------------------------------------------+
//| Change MACD |
//+------------------------------------------------------------------+
void CRiMACD::ChangeLast(double new_value)
{
m_slow_macd.ChangeValue(m_slow_macd.GetTotal()-1, new_value);
m_fast_macd.ChangeValue(m_fast_macd.GetMaxTotal()-1, new_value);
m_delta = m_slow_macd.EMA() - m_fast_macd.EMA();
m_signal_macd.ChangeValue(m_slow_macd.GetTotal()-1, m_delta);
}
//+------------------------------------------------------------------+
//| Get MACD histogram |
//+------------------------------------------------------------------+
double CRiMACD::Macd(void)
{
return m_delta;
}
//+------------------------------------------------------------------+
//| Get the signal line |
//+------------------------------------------------------------------+
double CRiMACD::Signal(void)
{
return m_signal_macd.SMA();
}
//+------------------------------------------------------------------+
//| Get the fast period |
//+------------------------------------------------------------------+
void CRiMACD::SetFastPeriod(int period)
{
m_slow_macd.SetMaxTotal(period);
}
//+------------------------------------------------------------------+
//| Set the slow period |
//+------------------------------------------------------------------+
void CRiMACD::SetSlowPeriod(int period)
{
m_fast_macd.SetMaxTotal(period);
}
//+------------------------------------------------------------------+
//| Set the signal line period |
//+------------------------------------------------------------------+
void CRiMACD::SetSignalPeriod(int period)
{
m_signal_macd.SetMaxTotal(period);
}