64 lines
1.7 KiB
MQL5
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
|