mql5/Experts/Advisors/DualEA/Include/Indicators/Keltner.mqh
2025-09-20 02:27:35 -04:00

64 lines
1.7 KiB
MQL5

#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