В одной из статей из серии статей "УНИВЕРСАЛЬНЫЙ ТОРГОВЫЙ ЭКСПЕРТ" познакомился со объектно-ориентированным способом определения индикаторов. Более подробно можно узнать из ссылки ниже.
В этой теме предлагаю делиться своими классами для различных пользовательских индикаторов.
Например для индикатора SuperTrend supertrend.zip
Вот такой класс-обертка
В этой теме предлагаю делиться своими классами для различных пользовательских индикаторов.
Например для индикатора SuperTrend supertrend.zip
Вот такой класс-обертка
Код:
//+------------------------------------------------------------------+
//| CSuperTrend.mqh |
//+------------------------------------------------------------------+
enum Trend{Up,Dn,None};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CSuperTrend
{
private:
int m_supertrend_handle; // Хендл индикатора
ENUM_TIMEFRAMES m_timeframe; // Таймфрейм
string m_symbol; // Инструмент
int m_period; // Период
double m_multiplier; // множитель
void Init(void);
public:
CSuperTrend(void);
/*Params*/
//Set
void Timeframe(ENUM_TIMEFRAMES timeframe);//
void Symbol(string symbol);
void Period(int period);
void Multiplier(double multiplier);
//Get
ENUM_TIMEFRAMES Timeframe(void);
string Symbol(void);
int Period(void);
double Multiplier(void);
/*Out values*/
double Value(int index);
Trend Trend(int index);
};
//+------------------------------------------------------------------+
//| Конструктор по умолчанию. |
//+------------------------------------------------------------------+
CSuperTrend::CSuperTrend(void) :
m_symbol(_Symbol),
m_timeframe(PERIOD_CURRENT),
m_period(18),
m_multiplier(1.7)
{
}
//+------------------------------------------------------------------+
//| Инициализация. |
//+------------------------------------------------------------------+
CSuperTrend::Init(void)
{
if(m_supertrend_handle!=INVALID_HANDLE)
{
bool res=IndicatorRelease(m_supertrend_handle);
if(!res)
{
string text="Realise SuperTrend indicator failed. Error ID: "+(string)GetLastError();
}
}
m_supertrend_handle=iCustom(m_symbol,m_timeframe,"supertrend",m_period,m_multiplier);
if(m_supertrend_handle==INVALID_HANDLE)
{
string params="(Period:"+(string)m_period+", Multipier:"+(string)m_multiplier+")";
string text="Create SuperTrend indicator failed"+params+". Error ID: "+(string)GetLastError();
}
}
//+------------------------------------------------------------------+
//| Установка таймфрейма. |
//+------------------------------------------------------------------+
void CSuperTrend::Timeframe(ENUM_TIMEFRAMES tf)
{
m_timeframe=tf;
if(m_supertrend_handle!=INVALID_HANDLE)
Init();
}
//+------------------------------------------------------------------+
//| Возвращает текущий таймфрейм. |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES CSuperTrend::Timeframe(void)
{
return m_timeframe;
}
//+------------------------------------------------------------------+
//| Устанавливает символ, на котором должен быть рассчитан индикатор |
//+------------------------------------------------------------------+
void CSuperTrend::Symbol(string symbol)
{
m_symbol=symbol;
if(m_supertrend_handle!=INVALID_HANDLE)
Init();
}
//+------------------------------------------------------------------+
//| Возвращает символ, для которого рассчитывается индикатор |
//+------------------------------------------------------------------+
string CSuperTrend::Symbol(void)
{
return m_symbol;
}
//+------------------------------------------------------------------+
//| Устанавливает период расчета индикатора|
//+------------------------------------------------------------------+
void CSuperTrend::Period(int period)
{
m_period=period;
if(m_supertrend_handle!=INVALID_HANDLE)
Init();
}
//+------------------------------------------------------------------+
//| Возвращает период |
//+------------------------------------------------------------------+
int CSuperTrend::Period(void)
{
return m_period;
}
//+------------------------------------------------------------------+
//| Устанавливает множитель|
//+------------------------------------------------------------------+
void CSuperTrend::Multiplier(double multiplier)
{
m_multiplier=multiplier;
if(m_supertrend_handle!=INVALID_HANDLE)
Init();
}
//+------------------------------------------------------------------+
//| Возвращает множитель |
//+------------------------------------------------------------------+
double CSuperTrend::Multiplier(void)
{
return m_multiplier;
}
//
// Значение 0-ого буфера индикатора на баре index
//+------------------------------------------------------------------+
double CSuperTrend::Value(int index)
{
if(m_supertrend_handle==INVALID_HANDLE)
Init();
double values[];
if(CopyBuffer(m_supertrend_handle,0,index,1,values))
return values[0];
return EMPTY_VALUE;
}
// Определяем тренд на баре index
//+------------------------------------------------------------------+
Trend CSuperTrend::Trend(int index)
{
double val=Value(index);
double close=iClose(m_symbol,m_timeframe,0);
return (val>close)?Dn:((val<close)?Up:None);
}
//+------------------------------------------------------------------+