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

FibRetracementEA

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

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

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

О программе

FibRetracementEA — торговый советник для MetaTrader 5, использующий логику фракталов и фильтрацию размера свинга через ATR для обнаружения локальных максимумов и минимумов ценового графика. Советник отслеживает до двух независимых свингов и ищет ситуацию, когда цена проходит через уровень Фибоначчи 0.618, после чего ожидает подтверждение закрытием свечи в направлении тренда.

Вход в сделку осуществляется только при выполнении условий подтверждения: свеча должна иметь достаточный размер тела (не дохидж) и закрыться за уровнем 0.618 в допустимом временном окне. Для защиты позиции советник поддерживает стоп-лосс, привязанный либо к экстремуму предыдущей свечи, либо к фиксированному проценту от цены входа, а также тейк-профит по фиксированному проценту.

В состав инструментов управления торговлей входят переключатели безубыточности (Break-Even) и автоматического закрытия позиции при закрытии свечи в противофавор направлению сделки. Советник работает на текущем таймфрейме и обрабатывает рыночные события через OnTick, а также отслеживает внешние закрытия позиций через OnTradeTransaction.

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

НастройкаОписание
InpFractalBars Количество баров с каждой стороны от центра, используемое для определения фрактала
InpMinSwingATR Минимальный размер свинга в кратных значениях ATR для квалификации как значимый
InpMaxRetraceBars Максимальное количество баров, в течение которых допускается ретрейсмент до потери импульса и аннулирования свинга
InpATRPeriod Период индикатора ATR, используемый для фильтрации минимального размера свинга
InpMaxConfirmBars Максимальное количество свечей ожидания для подтверждения после касания уровня 0.618
InpMinBodyPct Минимальный процент тела свечи от общего диапазона для признания свечи подтверждением
InpSLMode Режим установки стоп-лосса: по экстремуму предыдущей свечи или по фиксированному проценту от цены входа
InpSLPct Процент стоп-лосса от цены входа, применяемый в режиме фиксированного процента
InpTPPct Процент тейк-профита от цены входа, применяемый в режиме фиксированного процента
InpLotSize Фиксированный размер лота для каждой открытой позиции
InpBreakEven Переключатель включения/отключения функции перевода стоп-лосса на уровень безубыточности
InpBEPct Процент прибыли от цены входа, при достижении которого срабатывает перевод стоп-лосса на уровень безубыточности
InpCloseOnCandle Переключатель автоматического закрытия позиции при закрытии свечи в противофавор направлению сделки
Получить полный код

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

#property version   "1.00"
#property strict

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

CTrade         Trade;
CPositionInfo  PositionInfo;

enum ENUM_SL_MODE
  {
   SL_PREV_CANDLE = 0,  // Previous Candle High/Low
   SL_FIXED_PCT   = 1   // Fixed Percentage
  };

enum ENUM_SWING_STATE
  {
   SS_IDLE        = 0,  // No active setup
   SS_TOUCHED     = 1,  // Price swept through 0.618
   SS_CONFIRMING  = 2,  // Waiting for confirmation candle
   SS_ENTERED     = 3,  // Trade is live
   SS_EXPIRED     = 4,  // Setup timed out or invalidated
  };

enum ENUM_SWING_DIR
  {
   DIR_NONE  = 0,
   DIR_UP    = 1,  // SwingLow → SwingHigh (expect long at 0.618)
   DIR_DOWN  = 2   // SwingHigh → SwingLow (expect short at 0.618)
  };

input group "=== Swing Detection ==="
input int    InpFractalBars    = 5;    // Fractal window: N bars each side
input double InpMinSwingATR    = 1.5;  // Min swing size (× ATR14) to qualify
input int    InpMaxRetraceBars = 20;   // Max bars retracement may take before momentum dies
input int    InpATRPeriod      = 14;   // ATR period for swing size filter

input group "=== Entry Confirmation ==="
input int    InpMaxConfirmBars = 3;    // Max candles to wait for confirmation after touch
input double InpMinBodyPct     = 40.0; // Min confirmation candle body % of total range

input group "=== SL / TP ==="
input ENUM_SL_MODE InpSLMode  = SL_PREV_CANDLE; // SL mode
input double InpSLPct         = 0.30;  // SL % from entry (FIXED_PCT mode)
input double InpTPPct         = 0.60;  // TP % from entry (FIXED_PCT mode)

input group "=== Lot Size ==="
input double InpLotSize        = 0.10; // Fixed lot size

input group "=== Trade Management ==="
input bool   InpBreakEven      = true;  // Enable Break-Even
input double InpBEPct          = 0.30;  // % profit to trigger BE
input bool   InpCloseOnCandle  = true;  // Close if candle closes against trade

struct SwingSetup
  {
   ENUM_SWING_DIR  dir;           // UP or DOWN
   double          swingLow;      // Swing low price
   double          swingHigh;     // Swing high price
   double          fib618;        // 0.618 retracement level
   datetime        swingTime;     // Time when swing was confirmed
   int             retraceBarCount; // Bars since swing confirmed (retracement speed)

   ENUM_SWING_STATE state;        // Current state machine state
   datetime         touchTime;    // Time of first 0.618 touch
   int              confirmBarsElapsed; // Bars elapsed since touch
   bool             priceWentThrough;   // True once price swept THROUGH 0.618

   ulong            tradeTicket;  // Open trade ticket (0 if none)
   double           entryPrice;   // Entry price of trade
   double           tradeDir;     // +1 long, -1 short
   bool             beTriggered;  // Break-even already moved

   void Reset()
     {
      dir                  = DIR_NONE;
      swingLow             = 0;
      swingHigh            = 0;
      fib618               = 0;
      swingTime            = 0;
      retraceBarCount      = 0;
      state                = SS_IDLE;
      touchTime            = 0;
      confirmBarsElapsed   = 0;
      priceWentThrough     = false;
      tradeTicket          = 0;
      entryPrice           = 0;
      tradeDir             = 0;
      beTriggered          = false;
     }
  };

SwingSetup  g_swing[2];          // Two independent swing trackers
datetime    g_lastBarTime = 0;   // Track bar open to detect new bar
int         g_atrHandle   = INVALID_HANDLE;

double g_fractalHigh[];
double g_fractalLow[];

struct FractalCandidate
  {
   bool   valid;
   bool   isHigh;
   double price;
   datetime time;
   int    barIndex; // bar index when it was a candidate
  };

FractalCandidate g_pendingHigh;
FractalCandidate g_pendingLow;

double   g_lastFracHigh      = 0;
datetime g_lastFracHighTime  = 0;
double   g_lastFracLow       = 0;
datetime g_lastFracLowTime   = 0;
bool     g_lastWasHigh       = false; // true = last confirmed fractal was a high

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
  {
   if(g_atrHandle != INVALID_HANDLE)
      IndicatorRelease(g_atrHandle);
  }

void OnTick()
  {
      // код доступен только после оплаты
   }

void ScanFractals(double atr)
  {
   int totalBars = iBars(_Symbol, PERIOD_CURRENT);
   if(totalBars < InpFractalBars * 2 + 2)
      return;

   int checkBar = InpFractalBars + 1; // The bar that is now fully confirmed as fractal center

   double centerHigh = iHigh(_Symbol, PERIOD_CURRENT, checkBar);
   double centerLow  = iLow(_Symbol,  PERIOD_CURRENT, checkBar);

   bool isFracHigh = true;
   for(int j = 1; j <= InpFractalBars; j++)
     {
      if(iHigh(_Symbol, PERIOD_CURRENT, checkBar - j) >= centerHigh ||
         iHigh(_Symbol, PERIOD_CURRENT, checkBar + j) >= centerHigh)
        {
         isFracHigh = false;
         break;
        }
     }

   bool isFracLow = true;
   for(int j = 1; j <= InpFractalBars; j++)
     {
      if(iLow(_Symbol, PERIOD_CURRENT, checkBar - j) <= centerLow ||
         iLow(_Symbol, PERIOD_CURRENT, checkBar + j) <= centerLow)
        {
         isFracLow = false;
         break;
        }
     }

   datetime fracTime = iTime(_Symbol, PERIOD_CURRENT, checkBar);

   if(isFracHigh && centerHigh != g_lastFracHigh)
     {
      OnNewFractalHigh(centerHigh, fracTime, atr);
     }

   if(isFracLow && centerLow != g_lastFracLow)
     {
      OnNewFractalLow(centerLow, fracTime, atr);
     }
  }

void OnNewFractalHigh(double price, datetime t, double atr)
  {

   if(g_lastFracLow > 0 && t > g_lastFracLowTime)
     {
      double swingSize = price - g_lastFracLow;
      if(swingSize >= InpMinSwingATR * atr)
        {

         RegisterSwing(DIR_UP, g_lastFracLow, price, g_lastFracLowTime);
        }
     }

   g_lastFracHigh     = price;
   g_lastFracHighTime = t;
   g_lastWasHigh      = true;
  }

void OnNewFractalLow(double price, datetime t, double atr)
  {

   if(g_lastFracHigh > 0 && t > g_lastFracHighTime)
     {
      double swingSize = g_lastFracHigh - price;
      if(swingSize >= InpMinSwingATR * atr)
        {

         RegisterSwing(DIR_DOWN, price, g_lastFracHigh, g_lastFracHighTime);
        }
     }

   g_lastFracLow     = price;
   g_lastFracLowTime = t;
   g_lastWasHigh     = false;
  }

void RegisterSwing(ENUM_SWING_DIR dir, double low, double high, datetime swingTime)
  {

   int slot = -1;
   for(int i = 0; i < 2; i++)
     {
      if(g_swing[i].state == SS_IDLE || g_swing[i].state == SS_EXPIRED)
        {
         slot = i;
         break;
      

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

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

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

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

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

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

Стоимость полного кода
1 237,30₽ ≈ $15.12