#ifndef DUALEA_INDICATORS_KELTNER_MQH #define DUALEA_INDICATORS_KELTNER_MQH class CKeltner { private: string m_symbol; ENUM_TIMEFRAMES m_tf; int m_emaPeriod; int m_atrPeriod; double m_atrMult; int m_hEMA; int m_hATR; public: CKeltner(): m_symbol(""), m_tf(PERIOD_CURRENT), m_emaPeriod(20), m_atrPeriod(10), m_atrMult(1.5), m_hEMA(-1), m_hATR(-1) {} bool Init(const string symbol, const ENUM_TIMEFRAMES tf, const int emaPeriod=20, const int atrPeriod=10, const double atrMult=1.5) { m_symbol = symbol; m_tf=tf; m_emaPeriod=emaPeriod; m_atrPeriod=atrPeriod; m_atrMult=atrMult; m_hEMA = iMA(m_symbol, m_tf, m_emaPeriod, 0, MODE_EMA, PRICE_TYPICAL); m_hATR = iATR(m_symbol, m_tf, m_atrPeriod); return (m_hEMA>0 && m_hATR>0); } double Middle(const int shift) { if(m_hEMA<=0) return 0.0; double b[1]; if(CopyBuffer(m_hEMA, 0, shift, 1, b)==1) return b[0]; return 0.0; } double BandWidth(const int shift) { if(m_hATR<=0) return 0.0; double b[1]; if(CopyBuffer(m_hATR, 0, shift, 1, b)==1) return m_atrMult * b[0]; return 0.0; } double Upper(const int shift) { double m = Middle(shift); double w = BandWidth(shift); if(m<=0 || w<=0) return 0.0; return m + w; } double Lower(const int shift) { double m = Middle(shift); double w = BandWidth(shift); if(m<=0 || w<=0) return 0.0; return m - w; } double MiddleSlope(const int shift) { double v0 = Middle(shift); double v1 = Middle(shift+1); return (v0 - v1); } }; #endif // DUALEA_INDICATORS_KELTNER_MQH