122 行
13 KiB
MQL5
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 ¶m[]);
|
|
//--- Запускает трал указанной по тикету позиции
|
|
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 ¶m[])
|
|
{
|
|
//--- Устанавливаем параметры трала (для каждого типа индикаторов используются только свои, нужные индикатору, поля структуры)
|
|
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);
|
|
}
|
|
//+------------------------------------------------------------------+
|