← К каталогу
Исходный код · ID 2388

cmrdfxstrategy.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

CMrdFXStrategy.mqh — это MQL4-библиотека (include-файл), реализующая торговую стратегию через класс CMrdFXStrategy. Класс наследует интерфейс IStrategy и объединяет несколько технических индикаторов для формирования торговых сигналов.

Стратегия использует стрелки ZigZag как основной сигнал, а подтверждение ищет через индикатор MBFX, трендовые линии, 15-периодную скользящую среднюю и при необходимости — фильтр тренда на основе SMA 200. Дополнительно доступен фильтр поддержки и сопротивления на нескольких таймфреймах.

Метод Refresh() пересчитывает все индикаторы и возвращает объект CSignal с направлением сделки, уровнем стоп-лосса и состояниями валидности каждого фильтра. Класс поддерживает как покупочные, так и продажные сигналы с различными условиями подтверждения.

Настройки программы

НастройкаОписание
_srfilter_ Заголовок раздела настроек фильтра поддержки и сопротивления в интерфейсе параметров.
UseSupportResistanceFilter Переключатель включения/выключения фильтра уровней поддержки и сопротивления.
MaxPipsFromSR Максимальное расстояние в пунктах от уровня поддержки или сопротивления, в пределах которого уровень считается релевантным для фильтра.
SR_1Hours Переключатель включения проверки уровней поддержки и сопротивления на таймфрейме H1.
SR_4Hours Переключатель включения проверки уровней поддержки и сопротивления на таймфрейме H4.
SR_Daily Переключатель включения проверки уровней поддержки и сопротивления на таймфрейме D1.
SR_Weekly Переключатель включения проверки уровней поддержки и сопротивления на таймфрейме W1.
__trendfilter Заголовок раздела настроек трендового фильтра в интерфейсе параметров.
UseSma200TrendFilter Переключатель включения фильтра тренда на основе 200-периодной простой скользящей средней (SMA 200).
__signals__ Заголовок раздела настроек свечей подтверждения сигналов в интерфейсе параметров.
ZigZagCandles Количество свечей назад, на которых ищутся стрелки ZigZag для формирования сигнала.
MBFXCandles Количество свечей назад, на которых проверяется состояние индикатора MBFX для подтверждения сигнала.
__movingaverage__ Заголовок раздела настроек скользящей средней в интерфейсе параметров.
MovingAveragePeriod Период скользящей средней, используемой в качестве одного из условий подтверждения сигнала.
MovingAverageType Тип скользящей средней (например, MODE_SMA), используемой в стратегии.

Состав библиотеки

Классов: 1 · методов: 6 · конструкторов: 1 · деструкторов: 1 · отдельных функций: 0

Классы
Класс class CMrdFXStrategy

Класс торговой стратегии, объединяющий несколько технических индикаторов (ZigZag, MBFX, трендовые линии, скользящие средние, уровни поддержки и сопротивления) для генерации торговых сигналов на покупку и продажу.

Методы и конструкторы
Конструктор · CMrdFXStrategy CMrdFXStrategy(string symbol)

Конструктор класса. Принимает символ торгового инструмента и инициализирует объекты уровней поддержки/сопротивления для таймфреймов H1, H4, D1 и W1, а также объекты индикаторов ZigZag, MBFX, трендовой линии и сигнала.

Деструктор · CMrdFXStrategy ~CMrdFXStrategy()

Деструктор класса. Освобождает память всех созданных объектов индикаторов, уровней поддержки/сопротивления, трендовых линий и сигнала.

Метод · CMrdFXStrategy CSignal* Refresh()

Основной метод стратегии. Пересчитывает все индикаторы, оценивает условия для покупочных и продажных сигналов по набору правил, формирует объект торгового сигнала с направлением, уровнем стоп-лосса, расстоянием в пунктах и возрастом, а также состояниями валидности каждого индикатора.

Метод · CMrdFXStrategy int GetSignalFirstValid(int zigZagBar, bool zigZagBuy, bool zigZagSell)

Возвращает номер бара, на котором все условия торгового сигнала (MBFX, трендовая линия и скользящая средняя) впервые подтвердились для заданного направления ZigZag.

Метод · CMrdFXStrategy int GetHours(int bar)

Переводит количество баров в целые часы, учитывая текущий таймфрейм графика (от M1 до W1).

Метод · CMrdFXStrategy int GetIndicatorCount()

Возвращает общее количество используемых в стратегии индикаторов с учётом включённых фильтров.

Метод · CMrdFXStrategy CIndicator* GetIndicator(int indicator)

Возвращает объект индикатора по его порядковому индексу.

Метод · CMrdFXStrategy double GetStopLossForOpenOrder()

Возвращает уровень стоп-лосса для открытого ордера на основе последней стрелки ZigZag (низшая цена при покупке, верхняя цена при продаже). Возвращает 0, если подходящая стрелка не найдена.

Получить полный код

Поиск по коду файла

??//+------------------------------------------------------------------+

//|                                               CMrdFXStrategy.mqh |

//|                                    Copyright 2017, Erwin Beckers |

//|                                      https://www.erwinbeckers.nl |

//+------------------------------------------------------------------+

#property copyright "Copyright 2017, Erwin Beckers"

#property link      "https://www.erwinbeckers.nl"

#property strict



extern string     _srfilter_                   = " ------- S&R Filter ------------";

extern bool        UseSupportResistanceFilter  = false;

extern int         MaxPipsFromSR               = 30;

extern bool        SR_1Hours                   = false;

extern bool        SR_4Hours                   = false;

extern bool        SR_Daily                    = true;

extern bool        SR_Weekly                   = true;



extern string     __trendfilter                = " ------- SMA 200 Daily Trend Filter ------------";

extern bool        UseSma200TrendFilter        = false;



extern string     __signals__                  = " ------- Candles to look back for confirmation ------------";

extern int        ZigZagCandles                = 10;

extern int        MBFXCandles                  = 10;



#include <CStrategy.mqh>

#include <CZigZag.mqh>

#include <CMBFX.mqh>

#include <CTrendLine.mqh>

#include <CSupportResistance.mqh>

#include <CUtils.mqh>



extern string     __movingaverage__            = " ------- Moving Average Settings ------------";

extern int        MovingAveragePeriod          = 15;

extern int        MovingAverageType            = MODE_SMA;





bool UseMBFX      = true;

bool UseSMA15     = true;

bool UseTrendLine = true;



//--------------------------------------------------------------------

class CMrdFXStrategy : public IStrategy

{

private:

   CSupportResistance* _supportResistanceH1;

   CSupportResistance* _supportResistanceH4;

   CSupportResistance* _supportResistanceD1;

   CSupportResistance* _supportResistanceW1;

   CZigZag*            _zigZag;         

   CMBFX*              _mbfx;         

   CTrendLine*         _trendLine; 

   int                 _indicatorCount;

   CIndicator*         _indicators[];

   CSignal*            _signal;

   string              _symbol;

   

public:

   //--------------------------------------------------------------------

   CMrdFXStrategy(string symbol)

   {

      _symbol              = symbol;

      _supportResistanceH1 = new CSupportResistance(_symbol, PERIOD_H1);

      _supportResistanceH4 = new CSupportResistance(_symbol, PERIOD_H4);

      _supportResistanceD1 = new CSupportResistance(_symbol, PERIOD_D1);

      _supportResistanceW1 = new CSupportResistance(_symbol, PERIOD_W1);

      _zigZag              = new CZigZag();

      _mbfx                = new CMBFX();

      _trendLine           = new CTrendLine();

      _signal              = new CSignal();

         

      _indicatorCount = 1; // zigzag

      if (UseMBFX) _indicatorCount++;

      if (UseTrendLine) _indicatorCount++;

      if (UseSMA15) _indicatorCount++;

      if (UseSma200TrendFilter) _indicatorCount++; 

      if (UseSupportResistanceFilter) _indicatorCount++; 

       

      ArrayResize(_indicators, 10);

      int index=0;

      _indicators[index] = new CIndicator("ZigZag");

      index++;

      

      if (UseMBFX)

      {

         _indicators[index] = new CIndicator("MBFX");

         index++;

      }

      

      if (UseTrendLine)

      {

         _indicators[index] = new CIndicator("Trend");

         index++;

      }

      

      if (UseSMA15) 

      {

         _indicators[index] = new CIndicator("MA15");

         index++;

      }

      

      if (UseSma200TrendFilter)

      {

         _indicators[index] = new CIndicator("MA200");

         index++;

      }

      

      if (UseSupportResistanceFilter) 

      {

        _indicators[index] = new CIndicator("S&R");

        index++;

      }

   }

   

   //--------------------------------------------------------------------

   ~CMrdFXStrategy()

   {

      delete _zigZag;

      delete _mbfx;

      delete _trendLine;

      delete _signal;

      delete _supportResistanceH1;

      delete _supportResistanceH4;

      delete _supportResistanceD1;

      delete _supportResistanceW1;

      

      for (int i=0; i < _indicatorCount;++i)

      {

         delete _indicators[i];

      }

      ArrayFree(_indicators);

   }

   

   //--------------------------------------------------------------------

   CSignal* Refresh()

   {

      _zigZag.Refresh(_symbol);

      _mbfx.Refresh(_symbol);

      _trendLine.Refresh(_symbol);

      

      int  zigZagBar    = -1;

      bool zigZagBuy    = false;

      bool zigZagSell   = false;

      bool mbfxOk       = false;

      bool trendOk      = false;

      bool sma15Ok      = false;

      bool sma200ok     = false;

      

      // Rule #1: a zigzar arrow appears

      for (int bar = ZigZagCandles; bar >= 1;bar--)

      {

         ARROW_TYPE arrow = _zigZag.GetArrow(bar); 

         if (arrow == ARROW_BUY)

         {

            zigZagBuy    = true;

            zigZagSell   = false;

            zigZagBar    = bar;

         }

         if (arrow == ARROW_SELL)

         {

            zigZagBuy    = false;

            zigZagSell   = true;

            zigZagBar    = bar;

         }

      }

         

      // BUY signals

      if (zigZagBuy && zigZagBar > 0)

      {

         // sma 200 trendline

         double ima200 = iMA(_symbol, PERIOD_D1, 200, 0, MODE_SMA,PRICE_CLOSE, 1);

         if ( iClose(_symbol, 0, 1) >= ima200 )  sma200ok = true;

          

         // MBFX should be green at the moment 

         // and should have been below < 30 some candles ago

         int barStart = zigZagBar;

         if (zigZagBar == 1) barStart = 2;

         for (int bar = MathMin(barStart, MBFXCandles); bar >= 1; bar--)

         {

            double red   = _mbfx.RedValue(bar);

            double green = _mbfx.GreenValue(bar);

            if (red < 30 || green < 30)

            {

               mbfxOk  = true;

            }

         }

               

         // trend line should be green at the moment

         if (_trendLine.IsGreen(1))

         {

            trendOk = true;

         }

   

         // rule #4: price should be above 15 SMA 

         double ma1 = iMA(_symbol, 0, MovingAveragePeriod, 0, MovingAverageType, PRICE_CLOSE, 1);

         if ( iClose(_symbol, 0, 1) > ma1 )  

         {

            sma15Ok = true;

         }

      }

      

      

      // SELL signals

      if (zigZagSell && zigZagBar > 0)

      {

         double ima200 = iMA(_symbol, PERIOD_D1, 200, 0, MODE_SMA,PRICE_CLOSE, 1);

         if ( iClose(_symbol, 0, 1) <= ima200 ) sma200ok = true;

          

         // MBFX should now be red

         // and should been above > 70 some candles ago

         int barStart = zigZagBar;

         if (zigZagBar == 1) barStart = 2;

         barStart = MathMin(barStart, MBFXCandles);

         for (int bar = barStart; bar >= 1; bar--)

         {

            double red   = _mbfx.RedValue(bar);

            double green = _mbfx.GreenValue(bar);

            if ( (red > 70 && red < 200) || (green >70 && green < 200))

            {

               mbfxOk = true;

            }

         }

         

         // trend line should now be red 

         if (_trendLine.IsRed(1))

         {

            trendOk = true;

         }

               

         // rule #4: and price below SMA15 on previous candle

         double ma1 = iMA(_symbol, 0, MovingAveragePeriod, 0, MovingAverageType, PRICE_CLOSE, 1);

         if (   iClose(_s

Показано первые 50% кода (символов: 24917)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
2 491,70₽ ≈ $30.45