Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 55
- Рейтинг:
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Обзор
Практически каждый инструмент управления рисками из стандартного набора MetaTrader 5 основан на одном скрытом допущении: что наихудший убыток, на который стоит рассчитывать, примерно соответствует наихудшему убытку, который вы уже переживали. Показатель «Средний истинный диапазон» (Average True Range) определяет размер позиций на основе недавней волатильности. Алгоритм повторной выборки по методу Монте-Карло перегруппировывает сделки, которые вы фактически совершили. Показатель «Историческая величина под риском» (Historical Value at Risk) берет процентиль непосредственно из вашей истории доходности. Все эти инструменты анализируют основную часть распределения и молча надеются, что будущее не принесет ничего более экстремального, чем прошлое.
Финансовая доходность имеет «толстые хвосты», поэтому такая надежда необоснованна. Крупные ценовые скачки происходят чаще и достигают более экстремальных значений, чем допускает нормальное распределение, а самый худший день в выборке почти никогда не является самым худшим днем, на который способен рынок. Любой метод, способный учитывать только убытки, не превышающие тех, что уже находятся в его «окне», будет систематически недооценивать редкие обвалы.

Нормальная модель (кривая) в сравнении с реальной доходностью с толстыми хвостами (гистограмма). Заштрихованный левый хвост — это упущенные убытки.
Данный индикатор изначально внедряет в MQL5 раздел статистики, разработанный специально для устранения этого пробела. Теория экстремальных значений не моделирует всё распределение; она моделирует только хвост, причём с формой, обоснованной предельной теоремой, а не взятой на веру. Полученная модель затем может экстраполироваться за пределы всего, что присутствует в выборке: убыток в 99,9%, движение, наблюдаемое примерно раз в три года, — значение, которого в вашей истории на самом деле никогда не было.
Метод. Индикатор реализует метод «Peaks-Over-Threshold»(пики выше порогового значения). Он преобразует цены закрытия графика в одностороннюю серию убытков вниз, сохраняя величину каждого движения вниз и приравнивая каждое движение вверх к нулю. Он выбирает высокий порог u на уровне квантиля этой серии, отбрасывает все, что ниже него, и изучает только превышения — величины, на которые убытки превышают порог. Теорема Пикандса-Балкема-де Хаана гласит, что для широкого класса базовых распределений эти превышения, по мере повышения порога, сходятся к единому семейству: обобщённому распределению Парето. Таким образом, форму хвоста не нужно угадывать, а лишь подбирать.

«Пики выше порогового значения» (Peaks-Over-Threshold): для ряда убытков устанавливается пороговое значение, значения превышения выше него отделяются, и к этим значениям превышения подбирается обобщённое распределение Парето.
Подгонка представляет собой подлинную оптимизацию формы и масштаба обобщённого распределения Парето по методу максимального правдоподобия, выполняемую с помощью оптимизатора с ограничениями ALGLIB, поставляемого вместе с терминалом. Здесь нет ни моста для Python, ни DLL, ни каких-либо внешних зависимостей.
Что показывает инструмент
Три показателя рассчитываются в скользящем окне и отображаются на панели на графике, причём первый из них также отображается в виде линии в дополнительном окне, что позволяет наблюдать, как «хвост» с течением времени сужается или расширяется.
| Интерпретация | Что это такое | Как использовать |
|---|---|---|
| EVT VaR | Величина риска (Value at Risk) при выбранном уровне доверия, экстраполированная из аппроксимированного хвоста, а не считанная из исторических данных. | Убыток, на который следует рассчитывать. Отображается в виде процента на панели и в виде линии в дополнительном окне. Восходящая линия означает, что хвост становится более толстым. |
| EVT ES | Ожидаемый дефицит — средний убыток при превышении VaR. | Насколько плохой станет ситуация, если произойдет неблагоприятный сценарий. Всегда хуже, чем VaR, и является более достоверным показателем для размещения стоп-ордеров. |
| xi (форма) | Индекс приспособленного хвоста. Чем больше значение, тем тяжелее: убытки нарастают по мере удаления от текущего момента. | Показатель режима, обозначенный цветом на панели. Это параметр, определяющий, как далеко простирается экстраполяция. |
Обе оценки представляют собой стандартные формы GPD-POT, поэтому панель отображает именно следующее:
VaR_p = u + (sigma / xi) * [ ( (Nu / n) / (1 - p) )^xi - 1 ] ES_p = VaR_p / (1 - xi) + (sigma - xi * u) / (1 - xi)
Здесь u — пороговое значение, сигма и xi — подходящие масштаб и форма, а Nu / n — частота превышения. Обе формы имеют экспоненциальный предел, который используется автоматически, когда подходящая форма близка к нулю, что обеспечивает стабильность вычислений именно в том режиме, где деление на форму не было бы стабильным.
«Светофор» хвостовой части распределения. Группа экспертов раскрашивает форму таким образом, чтобы режим можно было определить без интерпретации чисел:
| xi | Цвет | Значение |
|---|---|---|
| ниже 0,10 | Зелёный | Близко к случаю экспоненты с узким хвостом. Спокойно. |
| От 0,10 до 0,30 | Золото | Умеренно высокая волатильность, характерная для большинства ликвидных инструментов. |
| выше 0,30 | Красный | С тяжелым хвостом. Убытки накапливаются, а обвалы следуют один за другим. |
Эти пороговые значения служат скорее ориентирами для чтения, чем статистическими порогами, и их можно сдвигать по своему усмотрению. Важно то, что та же форма, определяющая цвет, лежит в основе формул, поэтому панель не может отображать зеленый цвет, пока вычисления незаметно рассчитывают VaR с толстым хвостом.

Индикатор на графике: панель отображает VaR, ожидаемый убыток (Expected Shortfall) и форму хвоста, обозначенную цветом, а в дополнительном окне строится график EVT VaR во времени.
Он отказывается гадать
Это конструктивное решение стоит учесть перед подключением, поскольку оно меняет значение показаний пустой панели. Для надежности двухпараметрической аппроксимации хвоста требуется реальное число превышений, и в литературе по EVT в качестве практического минимума принято считать примерно от тридцати до пятидесяти точек хвоста. Движок навязывает значение в тридцать. При меньшем количестве он сообщает о своём состоянии, а не о конкретной цифре, и панель сообщает об этом простыми словами:
| Статус | Значение |
|---|---|
| OK | Аппроксимация сходилась на достаточном количестве данных по хвостовой части. VaR, ES и xi доступны в режиме реального времени. |
| Недостаточно данных по хвосту (менее 30 превышений) | В окне было зарегистрировано менее тридцати превышений. Увеличьте период обратного обзора или уменьшите пороговое квантиль. |
| Подгонка не сходилась | Оптимизатор не достиг допустимой формы и масштаба. Отчет не сформирован. |
| Не выполнена подгонка / неверные входные данные | Подгонка ещё не выполнялась, либо окно было пустым или вырожденным. |
Конкретный пример этого в действии: при пороговом значении по умолчанию 0,95 «lookback» в 500 баров дает лишь около двадцати пяти превышений, и индикатор сообщает о недостатке данных в хвосте (25 из 30 превышений) вместо конкретного числа. При 800 барах порог преодолевается, и подгонка выполняется корректно. Это не ошибка, которую нужно обходить — это модель отказывается делать предположения, что как раз и является тем поведением, которого вы ожидаете от инструмента, цель которого — честность в отношении редких событий.
Тот же принцип действует и на другом конце. Когда подгоняемая форма достигает единицы, среднее значение хвоста расходится, и показатель «Ожидаемый убыток» перестаёт существовать, поэтому движок возвращает там ноль, а не вымышленное значение. В тех случаях, когда подгонка не получает статус «OK», линия графика для данного столбца остаётся пустой, а не переносит устаревшее значение вперёд, поэтому линия пуста именно там, где модель отказалась давать оценку.
Рекомендуемые настройки
| Параметр | Рекомендуемое значение | Примечания |
|---|---|---|
| Символ | Любой ликвидный инструмент | Ничто не зависит от конкретного символа: анализ проводится на основе логарифмических доходностей, поэтому показатели выражены в процентах и сопоставимы между инструментами. Символ с низким объемом торгов — это единственный случай, когда, вероятно, не будет соблюден нижний порог. |
| Временной интервал | H4 или D1 | VaR представляет собой величину убытка на один бар, поэтому временной интервал определяет значение этого показателя. На D1 это суточный убыток. Внутридневной анализ также подходит, однако хвост доходности за одну минуту представляет собой иной объект. |
| Период обратного анализа | 800 баров | Выбран таким образом, чтобы пороговое значение 0,95 с запасом превышало нижний предел в 30. Более короткие окна реагируют быстрее, но достигают нижнего предела. |
| Требуемый исторический период | Период обратного анализа + 2 бара | До первого бара, подходящего для аппроксимации, ничего не отображается. Убедитесь, что на графике действительно загружено достаточное количество данных, иначе индикатор останется пустым. |
| Пороговое квантиль | 0,95 | Стандартное значение по умолчанию. Уменьшение этого значения приводит к появлению превышений за счёт асимптотической достоверности, поскольку теорема сохраняет силу при увеличении порогового значения. |
Входные параметры
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
| Lookback | 800 | Скользящее окно, выраженное в барах, по которому рассчитывается каждое приближение. Окно, в котором количество пригодных данных для расчета доходности составляет менее половины этого значения, отбрасывается как слишком разреженное. |
| Пороговое значение | 0,95 | Квантиль ряда потерь, используемый для установки порогового значения u POT. Допустимые значения: от 0,5 до 0,999. |
| Уровень доверия | 0,99 | Уровень доверия для VaR и ES. Аппроксимированный хвост экстраполируется, поэтому значение 0,999 является допустимым, даже если в выборке отсутствуют убытки такого размера. |
| RefitEvery | 1 | Периодичность переподгонки для исторических баров. При значении 1 каждый бар подвергается переподгонке, и построенная линия полностью прорисовывается; увеличение этого значения позволяет пожертвовать исторической детализацией в пользу скорости на очень длинных графиках. Текущий бар всегда подвергается переподгонке независимо от настроек. |
| ShowPanel | true | Отобразить панель текста на графике. Объекты панели удаляются при отсоединении индикатора. |
Использование движка в собственном коде
Модель «tail» представляет собой автономный класс CGPDModel, состоящий только из заголовка, без зависимости от графиков или буферов индикаторов. Она подходит для массива убытков, где большее значение означает худший результат, поэтому соглашение о знаках остается за вызывающей стороной, и любая стратегия, способная генерировать ряд убытков, может использовать её напрямую:
#include <EVT\GPDModel.mqh> CGPDModel model; model.SetThresholdQuantile(0.95); if(model.Fit(losses,count) && model.IsReliable()) { double var = model.VaR(0.99); double es = model.ExpectedShortfall(0.99); double xi = model.Xi(); } else Print("tail not usable: ",model.StatusText());
Помимо этого, класс предоставляет доступ к масштабу аппроксимации, выбранному порогу, количеству превышений и перечислению статусов, так что пользователь может зафиксировать в журнале или отобразить, почему именно данное значение не было выведено. Чтобы считывать данные индикатора вместо использования класса, получите дескриптор с помощью iCustom на EVT\EVTCrashGauge и скопируйте буфер 0, который содержит показатель EVT VaR и принимает значение «ноль» на любом баре, где подгонка была недостоверной.
Ограничения
EVT заслуживает своего места в наборе инструментов для управления рисками, но это специализированный инструмент, и чтобы использовать его правильно, нужно знать, в каких случаях он не применим:
- Ему требуется большое количество данных по хвостам. Для аппроксимации хвостов с двумя параметрами необходимо значительное количество превышений. В случае малоликвидного символа или короткого временного интервала правильным ответом будет «недостаточно данных», и алгоритм учитывает это, а не выдумывает число.
- Он чувствителен к пороговому значению. Значение по умолчанию 0,95 является стандартным, но подгоняемая форма и масштаб изменяются вместе с ним. При серьёзном внедрении следует изучить эту чувствительность, а не полагаться на одну настройку, именно поэтому квантиль предоставляется в качестве входного параметра.
- Он измеряет величину, а не момент времени. Стоит повторить, поскольку это наиболее распространённая ошибка. Растущий индекс хвоста не является сигналом о направлении движения.
- Хвост может перестать быть чётко определённым. По мере того как аппроксимированная форма приближается к единице, показатель «Ожидаемый шортфалл» перестаёт существовать, и нулевое значение в этом режиме само по себе является информацией, а не сбоем.
Структура файлов
Один индикатор и один заголовок. Заголовок включен как <EVT\GPDModel.mqh>, поэтому он должен находиться в подпапке EVT в папке Include.
| Файл | Роль | Описание |
|---|---|---|
| Indicators\EVT\EVTCrashGauge.mq5 | Индикатор | Построит серию данных о потенциальных убытках на понижение на основе скользящего окна цен закрытия, синхронизирует подбор модели с тактом бара, выводит на график показатель EVT VaR и поддерживает панель на графике с отображением значений хвоста с цветовой кодировкой. |
| Include\EVT\GPDModel.mqh | Модуль расчета хвоста | Класс CGPDModel: выбор порогового значения, извлечение превышений, аппроксимация GPD по методу максимального правдоподобия с помощью оптимизации с ограничениями ALGLIB, VaR и ожидаемый убыток, а также перечисление состояний, которое контролирует каждое значение. |
Движок инициализирует оптимизатор оценкой по методу моментов перед запуском максимального правдоподобия и ограничивает форму разумным диапазоном, так что патологическое окно сдвигает его в сторону отвергнутой аппроксимации, а не в сторону правдоподобно выглядящей, но неверной.
Научная основа
Реализация следует стандартному подходу «пики над порогом» (Peaks-Over-Threshold) в теории экстремальных значений: теорема Пикандса-Балкема-де Хаана о сходимости превышений порогового значения к обобщенному распределению Парето, оценка формы и масштаба по методу максимального правдоподобия, а также стандартные выражения GPD-POT для показателей «Value at Risk» и «Expected Shortfall».
В сопутствующей статье приводится вывод метода, построчно описывается работа движка и индикатора, а также демонстрируется интеграция оценки риска в хвосте в советник по определению размера позиции для проверки его работы в Тестере стратегий: «Теория экстремальных значений в MQL5: создание индикатора риска краха в хвосте, выходящего за рамки VaR по методу Монте-Карло».
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/75557
RSI Histogram
Это пользовательский индикатор MQL5 для MetaTrader 5 под названием «RSI Histogram». Он выводит стандартную линию RSI в отдельном окне, а также гистограмму тех же значений RSI с цветовой маркировкой, цвет которой меняется в зависимости от динамики:
Relative Moving Average EA
Реализация на языке MQL5 всех четырёх кросс-стратегий из методологии «Относительных скользящих средних» Блоха с использованием его правил адаптивного выхода «Adaptive Crossover Exit», зависящих от режима волатильности. Входы и выходы осуществляются в пространстве фрактилей, поэтому пороговые значения имеют одинаковое значение для любого инструмента.
GoldLondonBreakout
На паре XAUUSD фиксирует позицию в диапазоне азиатской сессии, а затем размещает пару OCO на прорыв (BuyStop/SellStop) к открытию лондонской сессии со стопами, рассчитанными на основе ATR, и размером позиции, определяемым в процентах от риска. Никаких индикаторов, никаких субъективных решений — диапазон измеряется, а не угадывается.
Sessionvolatilityheatmap
Отображает средний диапазон цен за час торгового дня в виде тепловой карты на графике, а также затенение за свечами, соответствующее азиатской, лондонской и нью-йоркской сессиям — так что вы сможете видеть, когда инструмент действительно движется, а не просто гадать.