Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 45
- Опубликован:
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
В конвейерах маркировки с тройным барьером в качестве порога min_ret часто используется произвольная константа (0,5–1,0 %) или устаревшее допущение о спрэде. Установка порога ниже фактической стоимости транзакции в обоих направлениях приводит к тому, что конвейер маркирует шум, обусловленный затратами, как торгуемый сигнал. В результате маркированный набор данных систематически завышает показатель «edge», и любая модель, обученная на этих метках, переобучается на артефакт схемы маркировки, а не на подлинную рыночную структуру.
TransactionCostCollector.mq5 — это автономный скрипт, который решает задачу сбора данных в рамках данной проблемы. Он производит выборку из исторического распределения спредов, считывает данные брокера о ставках свопа и диагностике комиссионных для привязанного к графику символа и экспортирует все данные в структурированный файл CSV. Файл CSV обрабатывается сопутствующим классом Python TransactionCostModel, который преобразует все затраты в доходность в виде дробей и вычисляет пороговое значение min_ret для конкретного инструмента, необходимое для вашего вызова по маркировке.

Трехпанельная иллюстрация результатов работы TransactionCostCollector: разбивка внутридневных затрат по сессиям (a), полное распределение затрат (b) и кривая процентилей для выбора min_ret (c)
Что собирает скрипт
Скрипт собирает три компонента затрат для одного символа за один прогон:
- Спред — историческое распределение, полученное с помощью CopySpread() за запрашиваемое количество баров. Представляется в виде среднего значения, стандартного отклонения и процентилей (p25, p50, p75, p90, p95, p99), все в пунктах. Также рассчитывается по часам UTC в течение дня, чтобы выявить влияние сессий.
- Своп — ставки свопа за ночь по длинным и коротким позициям, считываемые непосредственно из SYMBOL_SWAP_LONG / SYMBOL_SWAP_SHORT, включая режим свопа (пункты, валюта, проценты) и день недели, в который взимается тройной своп.
- Комиссия — только для диагностики. MQL5 не предоставляет комиссию за лот в виде прямого вызова API у всех брокеров. Скрипт фиксирует значение ACCOUNT_COMMISSION_BLOCKED и примечание, объясняющее, как вычислить ставку за лот на основе одной эталонной сделки.
Входные параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
| InpBars | 50000 | Количество баров истории спредов для выборки. Чем больше значение, тем более репрезентативное распределение и тем больше вариаций сессий будет отражено. 50 000 баров на H1 охватывают примерно 5,7 года; на M15 — примерно 1,4 года. Уменьшите значение, если в терминале имеется ограниченная история по данному инструменту. |
| InpOutputFile | (пусто) | Переопределение имени выходного файла. Если поле оставлено пустым (по умолчанию), файл получает имя <SYMBOL>_costs.csv — например, EURUSD_costs.csv для EURUSD. Файл записывается в папку MQL5\Files\ в папке данных терминала (режимFILE_WRITE | FILE_CSV ). |
Формат вывода CSV
Формат CSV использует структуру из четырёх столбцов: раздел, ключ, значение, единица. Разделы:
- symbol_properties — размер пункта, коэффициент пипса, значение тика, размер контракта, идентификаторы валют.
- swap — ставки по длинным/коротким позициям, режим свопа, дни недели с тройным свопом.
- commission — диагностическое значение и примечание о его вычислении.
- spread_summary — среднее, стандартное отклонение и процентили по всем барам выборки.
- spread_by_hour — средний спред (в пунктах) для каждого часа суток, по одной строке на час (UTC, время брокера).
Как запустить
- Поместите файл TransactionCostCollector.mq5 в папку MQL5\Scripts\Downloads\ и скомпилируйте в MetaEditor.
- Откройте график нужного символа на любом таймфрейме. Таймфрейм определяет, с какого типа баров будет браться выборка для распределения спреда — рекомендуется H1 как разумный компромисс между детализацией и длиной истории.
- Перетащите скрипт на график. Появится диалоговое окно ввода параметров (управляется параметром #property script_show_inputs). Установите для параметра InpBars желаемое количество баров для выборки и нажмите «ОК».
- Получите выходной файл CSV из папки MQL5\Files\ в папке данных терминала (Файл → Открыть папку данных в MetaTrader 5).
Интеграция с Python
Сопутствующий класс Python TransactionCostModel загружает файл CSV и вычисляет min_ret для маркировки с тройным барьером:
from afml.transaction_costs import load_cost_model import pandas as pd model = load_cost_model( csv_path = "EURUSD_costs.csv", spread_percentile = "p95_pips", # консервативный slippage_pips = 0.4, commission_per_lot = 7.0, # из эталонной сделки lot_size = 0.01, ) close = pd.read_parquet("EURUSD_H1.parquet")["close"] min_ret = model.min_ret_for_symbol( price_series = close, holding_days = 1.0, cost_multiplier = 1.5, # 1,5-кратный уровень безубыточности ) print(f"min_ret = {min_ret:.6f}")
Примечания по комиссии
Ставку комиссии за лот невозможно получить программным путём у всех брокеров. Рекомендуемая процедура: откройте контрольную сделку объёмом ровно 1,0 стандартного лота на демо-счёте, сразу после открытия сделки счёта с терминала значение ACCOUNT_COMMISSION_BLOCKED, а затем закройте сделку. Заблокированное значение, деленное на 1,0, даёт ставку за лот. Сверьте результат с выпиской со счёта. Эту операцию необходимо выполнять один раз для каждого брокера.
Почему p95, а не среднее значение
Средний спред в основном определяется периодами низкой активности: азиатской сессией, ночной консолидацией и упорядоченными трендовыми условиями. Однако входы по стратегии часто совпадают с моментами наибольшей неопределённости (именно тогда модели генерируют сигналы). Использование 95-го процентиля спреда в качестве входного параметра min_ret учитывает стоимость в типичных условиях входа, а не в условиях среднего рынка.
Ссылки и сопутствующая статья
- López de Prado, M. (2018). Advances in Financial Machine Learning, Глава 3 (Labels), стр. 44–47. Wiley.
- Полная реализация и вывод формулы: «Схема машинного обучения для MetaTrader 5 — Часть 14: Модель транзакционных издержек » Патрика М. Ньороге.
- Сопутствующий класс TransactionCostModel на языке Python и примеры использования включены в пакет для скачивания статьи.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/73173
EA Money Management
Простой эксперт, построенный на критерии тренда
Institutional Harmonic Volumetric Gravity Center
Модуль количественного расчета объемной плотности, использующий математику взвешенного гармонического среднего для устранения арифметических выбросов и определения истинного центра тяжести институциональной ликвидности.
YURAZ_RSAXEL Скрипт рисует уровни Рудолфа Акселя
Скрипт рисует уровни Рудолфа Акселя
YURAZ_MCCH
Индикатор рассчитывает % роста или падения относительно CLOSE, написан с применением ООП, и легко интегрируется в любой советник или иной индикатор.