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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.