Article-16991-MQL5-Post-Fac.../SymbolTradeExt.mqh
2026-03-24 13:45:14 +07:00

122 行
13 KiB
MQL5

//+------------------------------------------------------------------+
//| SymbolTradeExt.mqh |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#include "Trailings.mqh"
#include "SymbolTrade.mqh"
enum ENUM_TRAILING_MODE // Перечисление режимов трейлинга
{
TRAILING_MODE_SIMPLE=2, // Простой трал
TRAILING_MODE_SAR, // Трал по Parabolic SAR
TRAILING_MODE_AMA, // Трал по адартивной скользящей средней
TRAILING_MODE_DEMA, // Трал по двойной экспоненциальной скользящей средней
TRAILING_MODE_FRAMA, // Трал по фрактальной адартивной скользящей средней
TRAILING_MODE_MA, // Трал по простой скользящей средней
TRAILING_MODE_TEMA, // Трал по тройной экспоненциальной скользящей средней
TRAILING_MODE_VIDYA, // Трал по скользящей средней с динамическим периодом усреднения
};
class CSymbolTradeExt : public CSymbolTrade
{
private:
CSimpleTrailing *m_trailing; // Объект класса трейлингов
ENUM_TIMEFRAMES m_timeframe; // Таймфрейм расчёта индикатора для трала
public:
//--- Устанавливает трал и его параметры
bool SetTrailing(const ENUM_TRAILING_MODE trailing_mode, const int data_index, const long magic, const int start, const int step, const int offset, const MqlParam &param[]);
//--- Запускает трал указанной по тикету позиции
void Trailing(const ulong pos_ticket);
//--- Конструктор/деструктор
CSymbolTradeExt() : m_trailing(NULL), m_timeframe(::Period()) { this.SetSymbol(::Symbol()); }
CSymbolTradeExt(const string symbol, const ENUM_TIMEFRAMES timeframe);
~CSymbolTradeExt();
};
//+------------------------------------------------------------------+
//| Конструктор |
//+------------------------------------------------------------------+
CSymbolTradeExt::CSymbolTradeExt(const string symbol, const ENUM_TIMEFRAMES timeframe) : CSymbolTrade(symbol)
{
this.m_trailing=NULL;
this.m_timeframe=timeframe;
}
//+------------------------------------------------------------------+
//| Деструктор |
//+------------------------------------------------------------------+
CSymbolTradeExt::~CSymbolTradeExt()
{
//--- удаляем созданный объект трала
if(this.m_trailing!=NULL)
delete this.m_trailing;
}
//+------------------------------------------------------------------+
//| Устанавливает параметры трала |
//+------------------------------------------------------------------+
bool CSymbolTradeExt::SetTrailing(const ENUM_TRAILING_MODE trailing_mode, const int data_index, const long magic, const int start, const int step, const int offset, const MqlParam &param[])
{
//--- Устанавливаем параметры трала (для каждого типа индикаторов используются только свои, нужные индикатору, поля структуры)
int ma_period = (int)param[0].integer_value;
int ma_shift = (int)param[1].integer_value;
ENUM_APPLIED_PRICE ma_price = (ENUM_APPLIED_PRICE)param[2].integer_value;
ENUM_MA_METHOD ma_method = (ENUM_MA_METHOD)param[3].integer_value;
int fast_ema = (int)param[4].integer_value;
int slow_ema = (int)param[5].integer_value;
int period_cmo = (int)param[6].integer_value;
double sar_step = param[0].double_value;
double sar_max = param[1].double_value;
//--- в зависимости от типа трейлинга создаём объект трала
//---если в качестве периода расчёта передано значение, меньше допустимого, то для каждого индикатора устанавливается его собственное значение по умолчанию
switch(trailing_mode)
{
case TRAILING_MODE_SIMPLE :
this.m_trailing=new CSimpleTrailing(this.Symbol(), magic, start, step, offset);
break;
case TRAILING_MODE_AMA :
this.m_trailing=new CTrailingByAMA(this.Symbol(), this.m_timeframe, magic,
(ma_period<1 ? 9 : ma_period), (fast_ema<1 ? 2 : fast_ema), (slow_ema<1 ? 30 : slow_ema), ma_shift, ma_price, start, step, offset);
break;
case TRAILING_MODE_DEMA :
this.m_trailing=new CTrailingByDEMA(this.Symbol(), this.m_timeframe, magic, (ma_period==0 ? 14 : ma_period), ma_shift, ma_price, start, step, offset);
break;
case TRAILING_MODE_FRAMA :
this.m_trailing=new CTrailingByFRAMA(this.Symbol(), this.m_timeframe, magic, (ma_period==0 ? 14 : ma_period), ma_shift, ma_price, start, step, offset);
break;
case TRAILING_MODE_MA :
this.m_trailing=new CTrailingByMA(this.Symbol(), this.m_timeframe, magic, ma_period, (ma_period==0 ? 10 : ma_period), ma_method, ma_price, start, step, offset);
break;
case TRAILING_MODE_TEMA :
this.m_trailing=new CTrailingByTEMA(this.Symbol(), this.m_timeframe, magic, (ma_period==0 ? 14 : ma_period), ma_shift, ma_price, start, step, offset);
break;
case TRAILING_MODE_VIDYA :
this.m_trailing=new CTrailingByVIDYA(this.Symbol(), this.m_timeframe, magic, (period_cmo<1 ? 9 : period_cmo), (ma_period==0 ? 12 : ma_period), ma_shift, ma_price, start, step, offset);
break;
case TRAILING_MODE_SAR :
this.m_trailing=new CTrailingBySAR(this.Symbol(), this.m_timeframe, magic, (sar_step<0.0001 ? 0.02 : sar_step), (sar_max<0.02 ? 0.2 : sar_max), start, step, offset);
break;
default :
break;
}
//--- что-то пошло не так - возвращаем false
if(this.m_trailing==NULL)
return false;
//--- всё успешно - делаем трал активным и возвращаем true
this.m_trailing.SetActive(true);
return true;
}
//+------------------------------------------------------------------+
//| Запускает трал указанной по тикету позиции |
//+------------------------------------------------------------------+
void CSymbolTradeExt::Trailing(const ulong pos_ticket)
{
if(this.m_trailing!=NULL)
this.m_trailing.Run(pos_ticket);
}
//+------------------------------------------------------------------+