class CSuperTrend { private: string m_symbol; ENUM_TIMEFRAMES m_tf; int m_atrPeriod; double m_mult; int m_hATR; public: CSuperTrend(): m_symbol(""), m_tf(PERIOD_CURRENT), m_atrPeriod(10), m_mult(3.0), m_hATR(-1) {} bool Init(const string symbol, const ENUM_TIMEFRAMES tf, const int atrPeriod=10, const double mult=3.0) { m_symbol=symbol; m_tf=tf; m_atrPeriod=MathMax(1,atrPeriod); m_mult=mult; m_hATR=iATR(m_symbol,m_tf,m_atrPeriod); return (m_hATR>0); } // Returns +1 uptrend, -1 downtrend at shift int Direction(const int shift) { double atr=0.0; double b[1]; if(m_hATR>0 && CopyBuffer(m_hATR,0,shift,1,b)==1) atr=b[0]; if(atr<=0) return 0; double hl2 = (iHigh(m_symbol,m_tf,shift)+iLow(m_symbol,m_tf,shift))/2.0; // Simplified supertrend: compare close to hl2 band +/- m_mult*atr double upBand = hl2 - m_mult*atr; double dnBand = hl2 + m_mult*atr; double close = iClose(m_symbol,m_tf,shift); if(close>=dnBand) return +1; if(close<=upBand) return -1; // fallback to prev direction int prev = 0; if(shift+1<1000) prev = Direction(shift+1); return prev; } };