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

Alpha Engine: Intrinsic-Time Coastline Trader - эксперт для MetaTrader 5

Просмотров:
25
Рейтинг:
(2)
Опубликован:
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Обзор

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

«Внутреннее время» — это альтернатива, формализованная группой Олсена в Цюрихе: пусть цена сама решает, когда проходит время. Зафиксируйте пороговое значение дельта. Часы тикают только тогда, когда цена отклоняется на величину дельта от своего последнего экстремума, то есть происходит смена направления. После подтверждения изменения цена обычно продолжает двигаться в новом направлении некоторое время, и это продолжение представляет собой перерегулирование. Вся траектория цены превращается в чередующихся отрезков смены направления и перерегулирования, которые в статьях называют «береговой линией». Таким образом, бурный час и спокойный час измеряются в одной и той же единице: событиях.

Разбиение динамики цен на события смены направления и события перехождения

Изрезанный ценовой путь, разбитый на участки смены направления (сплошная линия) и перебега (пунктирная линия) при фиксированном пороговом значении. Часы внутреннего времени тикают только в моменты событий.

Данный советник представляет собой чистый порт на MQL5 движка Alpha Engine — трейдера по «береговой линии» против тренда, разработанного Голубом, Глаттфельдером и Олсеном на основе этих часов. Он открывает позицию против движения при наступлении внутреннего события, увеличивает позицию при следующем событии, если цена продолжает двигаться против него (каскадирование), и закрывает добавленные части одну за другой с прибылью по мере разворота цены (декаскадирование). Поскольку позиции добавляются исключительно фиксированными шагами, это не является мартингейлом. Ядро принятия решений, алгоритмы с логарифмическим порогом и информационно-теоретический индикатор ликвидности представляют собой построчный перевод исходного Java-кода авторов. Только обработка ордеров адаптирована под терминал.

Торговля по линии побережья: вхождение в тренд по каскаду и выход из него при развороте

Агент с длинной позицией каскадирует (добавляет позиции) по мере падения цены через последовательные внутренние события, а затем декаскадирует (закрывает позиции с прибылью) по мере восстановления цены.

Прочитайте это, прежде чем оценивать результаты. В статье сообщается, что Alpha Engine приносит прибыль даже при случайном блуждании. При тестировании на 200 начальных случайных блужданиях по миллиону тиков каждое эталонный движок фиксировал реализованную прибыль на каждом из них, однако его общая прибыль, включая открытые позиции, в среднем равнялась нулю. Закрытие позиций чаще, чем их открытие, приводит к тому, что доходность преобразуется в множество мелких закрытых прибылей и редких крупных открытых убытков; само по себе это не создаёт преимущества. Поэтому растущая линия баланса этого советника не является доказательством наличия преимущества. Следите за капиталом.


Как он торгует

Советник запускает ансамбль, указанный в статье: восемь независимых агентов, по одному «только длинный» и «только короткий» на каждом из четырёх пороговых значений: 0,25%, 0,5%, 1% и 1,5%. Каждый агент владеет своими ордерами и позициями через собственный «магический номер», поэтому агенты никогда не затрагивают сделки друг друга.

Весь жизненный цикл осуществляется с помощью лимитных ордеров на хеджирующем счете, где каждый каскадный шаг естественным образом представляет собой отдельную позицию. Агент, открывающий длинные позиции, держит один лимитный ордер на покупку, расположенный на следующем нисходящем уровне внутреннего события, и каждое исполнение открывает позицию с тейк-профитом, расположенным ровно на величину дельта выше точки входа. Этот тейк-профит и является «декаскадом». По мере падения цены лестница лимитных ордеров на покупку исполняется; по мере восстановления цены тейк-профиты поочередно сокращают её. Агент с короткой позицией действует по зеркальному принципу. Ожидающий ордер переустанавливается только при изменении ситуации (внутреннее событие, переход на другой уровень или исполнение), поэтому советник не генерирует ордеров при каждом тике.

Два защитных механизма не дают чистому контртрендовому агенту уйти вслед за трендом. Первый — это асимметрия, обусловленная запасом позиций: каждый агент продвигает три «бегуна» при каждом тике, и текущий запас позиций определяет, какой из них управляет ордерами. По мере нарастания запаса позиций неблагоприятный порог расширяется по отношению к благоприятному, поэтому агент становится несклонным к добавлению позиций и стремится их сокращать. Второй — дробное определение размера позиции: размер добавляемой единицы уменьшается по мере роста запасов.

Запас (единицы)
Активный участник
Неблагоприятный : благоприятный порог
Добавляемая единица
ниже 15
Симметричный
1 : 1 (дельта в обе стороны)
1
от 15 до 30
Первый асимметричный
2 : 1 (1,5 дельта против 0,75 дельта)
1/2
30 и выше
Второй асимметричный
4 : 1 (2 дельта против 0,5 дельта)
1/4

Кроме того, величина масштабируется с помощью индикатора ликвидности L — информационно-теоретического показателя, характеризующего, насколько нормальным является недавнее ценовое поведение. Он рассматривает каждое внутреннее событие как символ, усредняет неожиданность (самоинформацию) последовательности событий, стандартизирует её и отображает через функцию нормального распределения. Значение L близко к 1, когда цена ведет себя как на нормальном рынке, и падает к 0, когда траектория движения необычно односторонняя. Добавочная величина сохраняется в полном объеме при L от 0,5 и выше, уменьшается вдвое при значениях от 0,1 до 0,5 и сокращается до одной десятой при значениях ниже 0,1. Индикатор работает с собственным более широким порогом перерегулирования, равным 2,525729-кратной величине дельта — это значение выбрано в статье для того, чтобы L как можно четче отделял нормальное поведение от аномального.

Абстрактные единицы преобразуются в лоты через входной параметр InpLotPerUnit, а InpMaxUnits ограничивает запас каждого агента. Это ограничение является элементом контроля риска, который в статье не упоминается: как только оно достигается, агент отменяет свою ожидающую заявку и больше ничего не добавляет, в то время как открытые заявки на фиксацию прибыли продолжают работать.


Рекомендуемая настройка

Настройка
Рекомендуемое значение
Примечания
Символ
EURUSD
Инструмент, использованный для разработки и тестирования, а также тот, на котором были проверены законы масштабирования, описанные в статье. Пороги являются относительными (в процентах от цены), поэтому другие ликвидные валютные пары работают без перемасштабирования.
Таймфрейм
Любой
Советник работает тик за тиком во внутреннем времени, поэтому таймфрейм графика не влияет на его решения.
Тип счёта
Хеджирование
Обязательно. Каждый этап каскада должен представлять собой отдельную позицию, поэтому на счете с неттингом советник по замыслу выводит сообщение и возвращает INIT_FAILED.
Модель тестера
Каждый тик основан на реальных тиках
Внутренние события определяются на основе потока тиков, поэтому модели, основанные на барах, искажают как события, так и исполнение лимитных ордеров. Тестер наследует режим маржи счета, на который вы вошли, поэтому перед тестированием войдите на счет с хеджированием.
InpLotPerUnit
0,02 (по умолчанию), до 0,4
При шаге в 0,01 лота половины и четверти единицы, а также дисконт за ликвидность сохраняются как отдельные размеры только тогда, когда единица составляет около 0,4 лота. Ниже этого уровня более мелкие добавления повышаются до минимального лота. Пороговое смещение находится в бегущих ордерах и не изменяется.
Важно: удаление советника с графика отменяет только его ожидающие ордера на вход. Открытые позиции остаются на месте с привязанными к ним ордерами тейк-профит, поэтому они продолжают закрываться самостоятельно. Закройте их вручную, если хотите, чтобы счет был в нуле.


Результаты бэктеста

EURUSD, каждый тик на основе реальных тиков, с 2 февраля по 31 июля 2026 года, начальный депозит 10 000 на хеджируемом счете, использованы настройки по умолчанию (InpLotPerUnit = 0,02, InpMaxUnits = 30) с включенными всеми восемью агентами. Пороговые значения, правила определения размера позиции и тейк-профит соответствуют параметрам тестового сценария и не настроены под данный инструмент или период.

Отчет Strategy Tester для Alpha Engine по паре EUR/USD

Отчет Strategy Tester за шестимесячный период тестирования по паре EURUSD.

Результат тестирования составил +10,68% с коэффициентом прибыли 2,21 и максимальным падением капитала 10,10% по 318 позициям. Чистая цифра скрывает два совершенно разных потока, и разбивка по тому, как закрывалась каждая позиция, более информативна, чем общий результат:

Составляющие шестимесячного результата
Сумма
294 позиции, закрытые по тейк-профиту
+1 934,14
24 позиции, закрытые тестером по окончании серии
-823,55
Комиссия, взимаемая при открытии позиций
-42,14
Чистая прибыль
+1 068,45

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

Кривая капитала и баланса в бэктесте Alpha Engine

Баланс (синий) растет по мере срабатывания ордеров тейк-профит. Собственный капитал (зеленый) несет на себе открытые каскады и достигает уровня баланса только тогда, когда тестер закрывает их в последний день.

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


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

Параметр
По умолчанию
Описание
InpLotPerUnit
0,02
Количество лотов на одну абстрактную единицу размера бумаги. Увеличьте его до 0,4, чтобы сохранить точность дробного размера при символе 0,01 лота, или уменьшите, чтобы торговать меньшими объемами.
InpMaxUnits
30
Максимальный лимит позиции на одного агента, в единицах. По достижении этого лимита новые заявки не размещаются, а открытые ордера на фиксацию прибыли остаются в силе до закрытия позиции. Самый глубокий уровень скева срабатывает только при превышении 30 единиц, поэтому при значении лимита по умолчанию он никогда не достигается.
InpMagicBase
990000
Базовое магическое число. Восемь агентов используют диапазон от InpMagicBase до InpMagicBase + 7, поэтому измените это значение, если другой советник на счете использует этот диапазон.
InpTradeLong
true
Запустить четыре агента, торгующих только длинными позициями.
InpTradeShort
true
Запустить четыре агента, работающих исключительно на понижение. При включении обоих ансамбль представляет собой полную симметричную конфигурацию, описанную в статье.


Использование классов в собственном коде

Один из агентов представляет собой автономный класс CAeLiveTrader. Он не знает ничего о других агентах, поэтому советник может запускать как одного агента, так и использовать другой набор пороговых значений или работать с несколькими символами, создавая столько экземпляров, сколько необходимо:

#include <IntrinsicTime\AeLiveTrader.mqh>

CAeLiveTrader agent;

//--- в OnInit: агент, работающий только с длинными позициями, с дельтой 0,5 %, 0,02 лота на единицу, ограничение в 30 единиц
agent.Init(_Symbol,990100,1,0.005,0.02,30.0);

//--- в функции OnTick
MqlTick t;
if(SymbolInfoTick(_Symbol,t))
   agent.OnTickUpdate(t.bid,t.ask,t.time);

//--- в OnDeinit: отменяет открытую позицию, уровни тейк-профита остаются без изменений
agent.Shutdown();

Агент, работающий во внутреннем времени, также может использоваться самостоятельно. CAeRunner принимает отдельные верхние и нижние пороговые значения в логарифмическом выражении цены, возвращает код события при каждой котировке (плюс или минус 1 при смене направления, плюс или минус 2 при шаге перерегулирования, 0 в остальных случаях) и всегда знает точные цены, при которых сработают следующие события, что делает его естественным источником уровней лимитных ордеров для других стратегий:

#include <IntrinsicTime\AeRunner.mqh>

CAeRunner runner;
runner.Init(0.005,0.005,0.005,0.005);  // отклонение вверх/вниз, перерегулирование вверх/вниз

int ev=runner.Run(AeTick(t.bid,t.ask,t.time));
if(ev==AE_EVENT_DC_DOWN)
   Print("downturn confirmed, next level below: ",runner.ExpectedLowerIE());

Индикатор ликвидности, CAeLocalLiquidity, работает по той же схеме: инициализируйте его с помощью порогового значения, передавайте ему каждую котировку через Computation и считывайте текущее значение L с помощью Liq.


Ограничения

Что стоит знать, прежде чем подключать его к чему-либо, кроме демо-счета.

  • Здесь отсутствует возможность закрытия всей позиции. В статье упоминаемый трейдер закрывает всю позицию агента, как только его общая доходность (реализованная плюс открытая) достигает значения дельта. Реальный агент не воспроизводит это поведение. Каскад, который работает в неблагоприятном направлении и никогда не восстанавливается, останавливается с помощью InpMaxUnits, но не закрывается, а его ордера на фиксацию прибыли остаются активными. Это самый большой риск в данной конструкции, и принудительное закрытие в приведенном выше бэктесте — это его цена.
  • Основную часть затрат составляет своп. Каскады могут оставаться открытыми в течение нескольких недель, поэтому стоимость ночного финансирования значительно превышает стоимость спреда или комиссии. Перед запуском проверьте своп вашего брокера по обеим сторонам.
  • При используемом размере лота расчёт объёма упрощается. При 0,02 лота на единицу полное добавление составляет 0,02 лота, а каждое меньшее добавление округляется до минимума в 0,01 лота, поэтому лестница размеров в тестовом режиме сводится к двум ступеням. Увеличение параметра InpLotPerUnit до значения около 0,4 восстанавливает её, но при гораздо большем размере позиции.
  • Реализованная прибыль не является преимуществом. При случайном блуждании без дрейфа реализованная прибыль движка всегда положительна, в то время как его ожидаемая общая прибыль равна нулю. Одна валютная пара и одно окно тестирования не позволяют установить наличие преимущества в любом случае.
  • Советники приостанавливают работу вне торговых сессий. Советник досрочно возвращается из функции OnTick при закрытии сессии по символу, что позволяет сохранить журнал в чистом виде и обеспечить быструю прогонку. Это имеет значение только для каналов данных, которые продолжают предоставлять котировки во время закрытия торгов.


Структура файлов

Один советник и четыре заголовочных файла. Заголовочные файлы включаются как <IntrinsicTime\...>, поэтому они должны находиться в подпапке IntrinsicTime в папке Include.

Файл
Роль
Описание
Experts\IntrinsicTime\AlphaEngine.mq5
Советник
Обеспечивает работу хеджирующего счета, формирует ансамбль из восьми агентов на четырех пороговых значениях, указанных в статье, контролирует торговую сессию и управляет каждым агентом с использованием последних котировок.
Include\IntrinsicTime\AeLiveTrader.mqh
Активный агент
CAeLiveTrader — агент типа «косталайн», торгующий реальными лимитными ордерами: выбор «раннера» по запасам, определение размера по доле и ликвидности, нормализация лотов и единственный ордер на вход в рынок с декаскадным тейк-профитом.
Include\IntrinsicTime\AeRunner.mqh
Ранер «Intrinsic-time»
CAeRunner — агент изменения направления на основе логарифмического порога с отдельными порогами роста и падения, генерирующий события изменения направления и перехода за порог, а также ценовые уровни, при достижении которых срабатывают следующие события.
Include\IntrinsicTime\AeLiquidity.mqh
Индикатор ликвидности
CAeLocalLiquidity — информационно-теоретический индикатор L, который масштабирует каждое добавление, с собственным раннером и функцией нормального распределения эталона.
Include\IntrinsicTime\AeTypes.mqh
Общие типы
Структура тиков спроса/предложения и коды внутренних событий, которыми обмениваются бегун, индикатор и агент.


Основа исследования

Реализация основана на следующем:

  • Антон Голуб, Джеймс Б. Глаттфелдер и Ричард Б. Олсен, «The Alpha Engine: Designing an Automated Trading Algorithm», 2017, SSRN 2951348.
  • Джеймс Б. Глаттфелдер, Александр Дюпюи и Ричард Б. Олсен, «Закономерности в высокочастотных данных по валютному рынку: открытие 12 эмпирических законов масштабирования», Quantitative Finance, 2011.
  • Эталонная реализация на Java, предоставленная авторами и доступная на GitHub. В данной адаптации сохранены особенности исходного кода, а не исправлены без уведомления.
Данная программа предназначена исключительно для образовательных целей. Торговля сопряжена с высоким уровнем риска, а прошлые результаты, особенно на исторических данных, не являются показателем будущих результатов. Всегда тщательно тестируйте программу на демо-счете, прежде чем рисковать реальным капиталом.

В сопутствующей статье построен оператор смены направления, воспроизведены законы масштабирования на 17,8 миллионах реальных тиков пары EURUSD в сравнении со случайным блужданием, соответствующим по волатильности, подробно рассмотрен порт Alpha Engine класс за классом и проверена заявленная прибыль от модели случайного блуждания: «Внутреннее время: от законов масштабирования смены направления к Alpha Engine».

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

Repaint Inspector Repaint Inspector

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

ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city ATS Liquidity City - liquidity pools and sweeps, drawn as a neon city

Показывает, где, вероятно, находятся стопы, и какие из них только что были сработаны. Пул ликвидности = подтверждённые максимумы и минимумы колебаний, которые цена ещё не пробила, равные максимумы/минимумы (более крупный пул) и вчерашние максимум и минимум. Когда ценовой бар выходит за пределы пула, он помечается как «пройденный», а если этот же бар закрывается обратно внутри пула — как «захваченный и отклоненный». Без перерисовки: свинг учитывается только после N закрытых баров с каждой стороны. Панель представляет собой город с неоновыми вывесками, нарисованный на CCanvas: цена — это летающий автомобиль, стоп-ордера на продажу — башни под ним, стоп-ордера на покупку — плавучие платформы над ним, вчерашние уровни — золотые рекламные щиты, прожектор прочесывает небо, а бегущая строка отображает сегодняшний улов. Два буфера предоставляют ближайший активный пул выше и ниже для использования в советнике. Только индикатор: он никогда не торгует.

Mirror Hedge EA (Same terminal and account only) Mirror Hedge EA (Same terminal and account only)

Зеркально копирует сделки, открытые, измененные и закрытые другим советником на том же хеджирующем счете, выбранном по «магическому номеру». По умолчанию он меняет направление (Покупка ↔ Продажа, SL ↔ TP), что позволяет проводить форвард-тестирование стратегии в обратном направлении с учетом реальных спредов, проскальзывания и исполнения.

YURAZ_MCCH YURAZ_MCCH

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