Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Советники

Gold MT5 Fractal Breakout EA - эксперт для MetaTrader 5

chen guang
chen guang
Quant-разработчик | Специалист по EA и алготрейдингу
Специализируюсь на высокопроизводительных советниках (EA) для MT4/MT5, пользовательских индикаторах и системах автотрейдинга со строгим риск-менеджментом.
🚀 Бесплатные инструменты и бэктесты: rbot.cc
| Russian English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Просмотров:
16
Рейтинг:
(2)
Опубликован:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Обзор

Gold Fractal Breakout EA — это советник для MetaTrader 5, который ищет подтвержденные максимумы и минимумы колебаний, а затем пытается разместить ордера «Buy Stop» и «Sell Stop» вблизи этих уровней. Для определения структуры он использует настраиваемые соседние бары, а не встроенный индикатор iFractals. Ордера и позиции идентифицируются по текущему символу и настроенному магическому номеру.

Стратегия сочетает в себе анализ ценовой структуры, отложенные входы и управление выходом на основе процентных показателей. Она не рисует на графике стрелки входа, фрактальные маркеры или торговые панели. Иллюстрация ниже поясняет концепцию размещения ордеров; она является синтетической и не отражает исторические сделки, скриншот терминала или измеренную доходность.


Концептуальная схема входа на покупку. Цены приведены в качестве примера; данных об исторической доходности нет.

Символ и таймфрейм

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

Временной интервал структуры фиксирован на H1 внутренней константой InpFractalTF. Этот параметр не подлежит изменению. Даже если период графика или Тестера стратегий равен D1, CopyRates считывает бары H1. Сканирование запускается на первом доступном тике после настроенного интервала, который по умолчанию составляет 15 минут; управление позициями осуществляется на каждом тике. Таким образом, H1 описывает данные сигнала по умолчанию, а не проверенный лучший торговый таймфрейм.

Как интерпретируются условия входа

IsSwingHigh требует, чтобы рассматриваемый максимум был строго выше всех выбранных более ранних и более поздних соседних максимумов; IsSwingLow требует соответствующего строго более низкого минимума. При настройках по умолчанию проверяются по пять баров с каждой стороны. FindSwing начинает поиск за пределами пяти самых последних закрытых баров, исключая текущий бар из окна подтверждения, и возвращает самый последний уровень, соответствующий критериям. Если требуемая история недоступна, уровень не возвращается.

Для сигнала на покупку цена Ask должна находиться ниже максимума колебания на величину, превышающую настроенный минимальный зазор. Для сигнала на продажу цена Bid должна быть выше минимума колебания на величину, превышающую этот зазор. Затем советник применяет свой смещённый вход, проверяет наличие открытого ордера в том же направлении в пределах указанного расстояния и удостоверяется, что этот ордер находится за пределами минимального брокерского расстояния стопа от текущей котировки.

Точка входа на покупку = максимум колебания + максимум колебания × смещение для покупки / 100. Точка входа на продажу = минимум колебания − минимум колебания × смещение для продажи / 100. Оба смещения по умолчанию равны −0,10%, поэтому точка входа на покупку находится ниже максимума, а точка входа на продажу — выше минимума. Эти значения по умолчанию предполагают границу колебания, а не требуют завершённого прорыва за её пределы. Ордер по-прежнему отправляется только в том случае, если его цена является допустимой для стоп-ордера относительно текущего рынка.

Фрагменты кода

Следующие фрагменты взяты из файла MQ5, который в настоящее время можно скачать из этой записи CodeBase. Они поясняют отдельные части реализации и не являются самостоятельными программами.

Исправлена история H1 и подтверждены кандидаты

const ENUM_TIMEFRAMES InpFractalTF     = PERIOD_H1; // Зафиксированный временной интервал данных H1, независимый от периода графика или тестера

double FindSwing(bool high)
  {
//--- Загрузить ценовые бары для поиска колебаний
   MqlRates r[];
   ArraySetAsSeries(r,true);
   int need=InpMaxSearchBars+InpFractalLeft+InpFractalRight+5;
   if(CopyRates(_Symbol,InpFractalTF,0,need,r)<need)
      return 0;
//--- Пропустить неподтвержденных кандидатов и выполнять поиск от самых новых к самым старым
   int first=InpFractalRight+1;
   int last=MathMin(InpMaxSearchBars,ArraySize(r)-InpFractalLeft-1);
   for(int i=first;i<=last;i++)
      if(high ? IsSwingHigh(r,i) : IsSwingLow(r,i))
         return high?r[i].high:r[i].low;
   return 0;
  }

Массив серий использует индекс 0 для текущего бара. Начиная с InpFractalRight + 1, сохраняются закрытые цены всех более поздних баров подтверждения. При значении по умолчанию для количества баров справа, равном пяти, первый кандидат имеет индекс 6, а более поздние бары сравнения — индексы от 5 до 1. Функция CopyRates явно запрашивает данные H1, независимо от периода привязанного графика.

Строгое сравнение с максимумом колебания

bool IsSwingHigh(const MqlRates &r[],int i)
  {
//--- Сравнить кандидат с более старыми столбцами
   for(int k=1;k<=InpFractalLeft;k++)
      if(r[i].high<=r[i+k].high)
         return false;
//--- Сравнить кандидат с более поздними столбцами
   for(int k=1;k<=InpFractalRight;k++)
      if(r[i].high<=r[i-k].high)
         return false;
   return true;
  }

Кандидат отбраковывается, если любой выбранный соседний максимум равен ему или выше него. Функция IsSwingLow применяет соответствующее обратное сравнение к минимумам. Эти функции выявляют подтвержденную ценовую структуру; они не вызывают встроенный индикатор iFractals.

Смещения входа и начальные выходы

double entry=buy?swing+Pct(swing,InpBuyEntryOffsetPct):swing-Pct(swing,InpSellEntryOffsetPct);

   entry=N(entry);

   if(SimilarPending(type,entry))

      return;

//--- Рассчитать начальные значения стоп-лосса и тейк-профита

   double sl=buy?entry-Pct(entry,InpStopLossPct):entry+Pct(entry,InpStopLossPct);

   double tp=buy?entry+Pct(entry,InpTakeProfitPct):entry-Pct(entry,InpTakeProfitPct);

   sl=N(sl);

   tp=N(tp);

Этот фрагмент взят из функции PlaceBreakout; параметры buy, swing и type задаются ранее в этой функции. Функция Pct вычисляет процент от первого аргумента, а N выравнивает цены по тиковой сетке символа. До нормализации свинг-максимум 3000 со смещением покупки -0,10% дает точку входа 2997; свинг-минимум 3000 со смещением продажи -0,10% дает точку входа 3003. Последующие проверки на расстояние до брокера, объем, сессию и маржу по-прежнему могут предотвратить отправку заявки.

Определение размера позиции и управление позициями

Режим фиксированных лотов нормализует параметр InpFixedLots до текущих значений минимума, максимума и шага объема для данного символа. Режим «процент риска» оценивает объем ордера на основе текущего собственного капитала счета, настроенного процента риска, расстояния от точки входа до стопа, а также размера тика и стоимости тика для данного символа, кэшированных при инициализации. Оба режима ограничивают объем значениями минимума и максимума для данного символа и округляют в меньшую сторону до шага объема с использованием десятичной точности, определяемой шагом. Значения ниже минимума повышаются до минимума, что может увеличить подверженность риску выше запрошенного размера или оценки риска. Недопустимое расстояние или неверные свойства тика в кэше приводят к переходу на нормализованные фиксированные лоты. Перед отправкой позиции и отложенные ордера в одном направлении по данному символу учитываются при расчете SYMBOL_VOLUME_LIMIT, включая сделки с другими магическими номерами; недостаточный остаток лимита не позволяет разместить новый ордер.

Начальные уровни стоп-лосса и тейк-профита рассчитываются как проценты от цены открытия отложенного ордера. При каждом тике благоприятное движение измеряется от цены открытия позиции с использованием цены «Bid» для покупок и «Ask» для продаж. При достижении уровня безубыточности стоп-ордер перемещается в сторону небольшой фиксации прибыли, основанной на цене. Обновления трейлинга применяются только в том случае, если благоприятное движение находится в диапазоне между триггером трейлинга и максимальным процентом трейлинга.

При достижении порога спасения от убытка советник перемещает тейк-профит на уровень, соответствующий меньшему убытку относительно цены открытия. Это направлено на выход из позиции в случае последующего восстановления цены в сторону данной цели; это не приводит к немедленному закрытию позиции и не гарантирует восстановления. Например, цель спасения при покупке по умолчанию находится на 0,15% ниже цены входа после неблагоприятного движения не менее чем на 1,00%. Обновлённая цель не восстанавливается автоматически до исходного уровня тейк-профита при прекращении условия убытка.

Входные параметры

Все 25 настраиваемых параметров перечислены ниже с их исходными значениями по умолчанию. За исключением параметра InpRiskPercent, процентные настройки описывают ценовые расстояния или ценовое движение, а не доходность счета. Параметр InpDuplicatePoints использует пункты символа, а не универсальный размер пункта. Расстояние трейлинга рассчитывается на основе текущей котировки; остальные описанные здесь процентные значения выхода основаны на цене входа или цене открытия.

Параметр Значение по умолчанию Значение и интерпретация
InpMagic 900009 Идентификатор, используемый вместе с символом графика для выбора ордеров и позиций данного советника.
InpComment «GoldX9 strategy 9» Текст, присоединяемый к отправляемым ордерам; фильтрация по владельцу осуществляется с использованием символа и магического номера.
InpLotMode LOT_FIXED LOT_FIXED использует фиксированный объем; LOT_RISK_PERCENT использует определение размера позиции в зависимости от риска по собственному капиталу.
InpFixedLots 0,01 Запрашиваемый объем в фиксированном режиме, нормированный по минимальному/максимальному значению и шагу символа; также служит нормированным значением по умолчанию при недопустимых свойствах определения размера риска.
InpRiskPercent 0,50 Расчетный риск по собственному капиталу на один ордер; не является гарантированным лимитом реализованных убытков.
InpMaxPending 3 Отложенные ордера с одинаковым символом и магическим номером, учитываемые отдельно для каждого направления.
InpMaxPositions 10 Вторичный порог количества позиций; наличие позиции по любому символу уже блокирует открытие новых позиций и вызывает отмену открытых отложенных ордеров.
InpPendingExpiryHours 15 Метка времени, рассчитанная на основе этого значения; при отправке заявок по-прежнему используется тип GTC, поэтому функция ограничения срока действия не реализована.
InpDuplicatePoints 100 Наличие ожидающей записи того же типа на этом расстоянии или в пределах этого расстояния препятствует отправке заявки.
InpRescanMinutes 15 Минимальное время между сканированием записей; для сканирования требуется поступление тика.
InpFractalLeft 5 Количество более старых соседних баров при строгом сравнении колебаний.
InpFractalRight 5 Количество более поздних закрытых соседних баров, необходимых для подтверждения колебания.
InpMaxSearchBars 200 Максимальный индекс рассматриваемой серии кандидатов; для сравнения загружаются дополнительные бары.
InpMinFractalClearancePct 0,02 Разница между ценой «Ask» и максимумом или между ценой «Bid» и минимумом, выраженная в процентах от амплитуды колебания.
InpBuyEntryOffsetPct -0,10 Добавляется к максимуму колебания; отрицательное значение по умолчанию размещает точку входа ниже максимума.
InpSellEntryOffsetPct -0,10 Вычитается из минимума колебания; отрицательное значение по умолчанию размещает точку входа выше минимума.
InpStopLossPct 2,00 Начальное расстояние стопа от цены отложенного ордера.
InpTakeProfitPct 1,00 Начальное расстояние до целевой цены от цены отложенного входа.
InpTrailTriggerPct 0,20 Минимальное благоприятное изменение цены по сравнению с ценой открытия для обновления трейлинга.
InpTrailDistancePct 0,20 Расстояние до стопа, рассчитанное в процентах от текущей цены спроса или предложения.
InpMaxTrailPct 1,00 Верхний порог благоприятного движения для обновлений скользящего стопа; не является ограничением прибыли.
InpSalvageTriggerPct 1,00 Неблагоприятное изменение цены относительно цены открытия, при котором активируется цель спасения.
InpSalvageExitPct 0,15 Целевое расстояние от цены открытия в сторону убытка; сделка не закрывается сразу.
InpBreakEvenTriggerPct 0,10 Выгодное отклонение от цены открытия, при котором активируется фиксация прибыли.
InpBreakEvenLockPct 0,025 Доходность, зафиксированная относительно цены открытия, до вычета затрат.

Структура кода и зависимости

Единственный включённый файл — <Trade/Trade.mqh>, торговый интерфейс стандартной библиотеки MetaTrader 5. Его объект CTrade, trade, отправляет отложенные ордера, присваивает эксперту магический номер, запрашивает изменения позиций и предоставляет описания результатов торговли. Он не используется для обнаружения колебаний или расчёта размера лота. В коде нет ссылок на пользовательские индикаторы, внешние DLL, веб-сервисы или дополнительные пользовательские включения.

Функция OnInit кэширует размер пункта, количество знаков, размер тика и значение тика для символа, а также проверяет четыре входа с положительным значением. Функция OnTick отменяет оставшиеся отложенные заявки при наличии позиции по данному символу, проверяет маржу для отложенных заявок, управляет позициями и ограничивает сканирование возможностей входа только в том случае, если позиций по данному символу нет. Функция OnTradeTransaction также запускает отмену отложенных заявок после заключения сделки. Функции Pct и N обрабатывают процентные расстояния и нормализацию десятичных чисел; OurOrder и OurPosition фильтруют принадлежность; CountPositions и CountPending обеспечивают соблюдение ограничений по времени сканирования; FindSwing и вспомогательные функции для определения колебаний выявляют структуру; SimilarPending, LotsForRisk, PlaceBreakout и ManagePositions реализуют проверку на дубликаты, определение размера позиции, отправку ордеров и закрытие позиций.

Внутренние глобальные переменные: trade (торговый интерфейс), g_last_scan (время последнего сканирования), g_point (размер пункта по символу), g_digits (количество знаков после запятой в цене), g_tick_size (шаг тика) и g_tick_value (сообщаемое значение тика). InpFractalTF — это внутренняя константа, зафиксированная на значении PERIOD_H1. Эти внутренние переменные и константа таймфрейма не являются пользовательскими параметрами. Советник использует встроенные API терминала для работы с ценами, историей, собственным капиталом счёта, ордерами и позициями.

Ограничения реализации, которые необходимо учитывать перед тестированием

InpPendingExpiryHours используется для расчёта временной метки истечения срока действия, однако в вызовах ордеров явно используется ORDER_TIME_GTC. Поэтому текущий код не реализует заявленный режим истечения срока действия на основе часов. Очистка, вызванная состоянием маржи, может удалить отложенные ордера данного советника, если их расчетная маржа активации превышает запас свободной маржи в буфере. Это не является истечением срока действия по часам. Отложенные ордера данного советника отменяются при обнаружении открытой позиции по данному символу. Один лишь новый свинг не приводит к отмене существующих ордеров.

Любая открытая позиция по текущему символу теперь блокирует отправку новых отложенных заявок, независимо от магического номера. При событии заключения сделки и последующих тиках советник пытается отменить свои оставшиеся отложенные заявки по данному символу. Заявки, принадлежащие другим советникам, не отменяются. Отмена может быть отложена из-за зоны заморозки или закрытой сессии; отмена на стороне клиента не является атомарной гарантией OCO на стороне сервера. Параметр InpMaxPositions остается вторичной проверкой количества, но не разрешает дополнительные входы при наличии позиции. Процент риска рассчитывается для каждого предлагаемого ордера, а не как совокупный лимит портфеля. Требования брокера к минимальному объему, резервный вариант с фиксированным объемом, цены исполнения и торговые издержки могут привести к тому, что фактическая подверженность риску будет отличаться от расчетной. Исходный код не содержит фильтра риска, связанного со спредом или совокупным стоп-лоссом. Он проверяет торговые сессии брокера перед отправкой ордера и изменением позиции, оценивает отдельную маржу активации для всех отложенных ордеров счета и оставляет 20 % текущей свободной маржи в качестве буфера. Если запрашиваемый нормализованный объем не укладывается в оставшийся резерв маржи, весь ордер пропускается, а причина фиксируется в журнале. Объем не уменьшается для укладывания в бюджет маржи. Противоположные ордера не получают предполагаемого снижения маржи за счет зачета.

Цены округляются до сетки тиков символа, хранящейся в кэше, а затем нормализуются до разрядов символа. Как фиксированные, так и основанные на риске объёмы нормализуются в соответствии со спецификациями объёма по символу. Запросы на изменение выхода проверяют существующие зоны заморозки SL/TP и предлагаемые расстояния до стопа/заморозки, а также сообщают о результатах, отклонённых сервером. Попытки модификации ограничиваются до одной раз в пять секунд на каждый цикл управления. Советник также предварительно проверяет ожидающие запросы с помощью OrderCheck перед отправкой. При отправке проверяются как возвращаемое значение CTrade, так и код результата сервера. В случае сбоев в журнал записываются запрошенный нормализованный объем, а также минимальное, максимальное значение, шаг и направленный лимит по символу. Эти параметры также фиксируются в журнале при инициализации.

При инициализации исходный код проверяет количество фрактальных соседей, лимиты на отложенные ордера и позиции, положительный конечный фиксированный объем, а также положительный конечный процент риска, если выбран режим определения размера риска. Ряд других диапазонов остается непроверенным. Независимые противоположные позиции проще всего интерпретировать на хеджирующем счете; на счете с неттингом ордера по одному и тому же символу влияют на общую позицию. Обновленный исходный код скомпилирован без ошибок и предупреждений. Пользователь сообщил о 50 сделках на паре EURUSD (H1) с неттингом и 40 сделках на паре XAUUSD (D1) с неттингом до внедрения этих последних защитных механизмов; при работе с XAUUSD также были зарегистрированы ошибки, связанные с сессией, маржой и замороженными изменениями. Обновленные меры защиты ещё не были повторно протестированы в этих условиях. Расписания сессий не гарантируют доступность во время внеочередных закрытий, и разрыв, внезапное изменение собственного капитала или замороженный отложенный ордер по-прежнему могут помешать своевременной очистке маржи. Результаты производительности не гарантируются.


Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/78308

Prop Firm Equity Guard - Daily Loss Limit and Max Drawdown Protection Prop Firm Equity Guard - Daily Loss Limit and Max Drawdown Protection

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

Session High Low - Asian, London and New York Range Boxes Session High Low - Asian, London and New York Range Boxes

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

YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя

Скрипт рисует уровни Рудолфа Акселя

YURAZ_MCCH YURAZ_MCCH

Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.