Spread Profile by Hour
- Утилиты
-
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself. - Версия: 1.0
Spread Profile by Hour строит распределение спреда одного символа для каждого часа серверных суток по тиковой истории вашего собственного брокера и отображает его в виде 24 столбцов. Сплошная часть столбца — медианный спред этого часа, более светлая верхняя часть доходит до 90-го процентиля. Введите размер стопа, которым вы обычно пользуетесь, и каждый столбец получит подпись с его медианным спредом в виде доли от этого стопа, так что издержки выражены в той же единице, что и ваш риск.
Это измерительный инструмент. Он не выставляет ордеров, не использует DLL и WebRequest и не записывает никаких файлов, кроме экспорта в CSV, который вы включаете сами.
Зачем он нужен: для внутридневных и скальперских правил часто именно спред, а не сигнал на вход, решает, сохранится ли преимущество. Терминал показывает спред текущего момента, а история баров хранит одно значение спреда на бар, что скрывает происходившее внутри часа. Одни и те же правила могут работать в спокойные часы и приносить убыток на ежедневном ролловере или на открытии сессии просто потому, что спред там в несколько раз шире. Этот индикатор читает сами котировки — каждый тик Bid и Ask за последние N календарных дней через CopyTicksRange — и группирует их по часу суток по серверному времени.
Что он рассчитывает для каждого серверного часа за последние N календарных дней без учёта сегодняшнего дня, чтобы картина не смещалась, пока вы торгуете:
- Медиана и 90-й процентиль спреда в пунктах для каждого часа — на панели; среднее, максимум и количество котировок, на которых основан каждый час, — в экспорте CSV.
- Два режима выборки. Tick count: каждая котировка учитывается один раз. Time-weighted: каждая котировка учитывается на время, в течение которого она оставалась актуальной, — до 60 секунд. Подсчёт по тикам завышает вес быстрого рынка, а на быстром рынке спред часто широкий; взвешивание по времени отвечает на вопрос, какой спред вы встретили бы в случайный момент этого часа.
- Фильтр по дню недели, с понедельника по пятницу, для правил, которые торгуют только в один день недели; вместе с ним увеличьте глубину истории, поскольку в 20 календарных днях каждый день недели встречается лишь два или три раза.
- Отображение издержек: если введён размер стопа в пунктах, каждый столбец подписывается медианным спредом в процентах от этого стопа, а в заголовке показываются медиана и 90-й процентиль текущего часа в той же единице. Если окно слишком узкое для подписи на каждом столбце, подпись остаётся только у столбца с наибольшей медианой.
- Медианный спред текущего часа в валюте счёта на 1,00 лот, по стоимости тика и размеру тика символа.
- Часы на обоих концах ранжирования по медиане, до трёх с каждого конца, — в заголовке. Часы с одинаковой медианой перечисляются вместе или обобщаются, например «Cheapest: 23 hours at 6 pt», так что равные значения никогда не выдаются за ранжирование; если у всех часов одна и та же медиана, заголовок так и сообщает.
- Подсветка текущего серверного часа и текущий спред в виде пунктирной линии поперёк столбцов.
- Необязательный экспорт почасовой таблицы в CSV в файл MQL5\Files\SpreadProfile_<symbol>_<yyyymmdd>.csv в кодировке UTF-8, записывается после каждого расчёта.
Как он обращается с тиковой историей — именно от этого зависит, можно ли доверять цифрам: за один шаг таймера загружается один день и сразу же освобождается, поэтому график остаётся отзывчивым на золоте или криптовалютах с более чем 100 000 тиков в день. День, который терминал ещё загружает, запрашивается повторно в течение нескольких секунд, а день, тики которого не покрывают его собственные бары M1, перед использованием тоже запрашивается повторно. Дни читаются от самого последнего назад. Если три торговых дня подряд не возвращают тиков (с фильтром по дню недели — три подряд идущих дня с этим днём недели) или десять дней подряд не имеют ни тиков, ни баров M1, эти дни после паузы читаются повторно, и если они всё ещё пусты, загрузка останавливается, а в заголовке показывается дата самого старого фактически использованного дня; разрыв такой же длины внутри тикового хранилища брокера завершает загрузку тем же образом. В заголовке также подсчитываются дни, использованные как частичные, то есть тики не дошли до последнего бара M1, и недоступные дни, то есть бары M1 есть, а тиков нет. Для символа без какой-либо тиковой истории это сообщается примерно в течение двадцати секунд, вместо того чтобы рисовать пустую панель. В журнал пишется одна сводная строка на каждый расчёт — использованные дни, прочитанные тики, заполненные часы, — плюс одна строка с именем CSV-файла, если экспорт включён.
Как читать панель. Каждый столбец — один час суток по серверному времени. Сплошная часть — медиана: у половины котировок, а в режиме Time-weighted — в течение половины времени, спред был на её уровне или ниже. Более светлая верхняя часть — 90-й процентиль: у одной котировки из десяти спред был шире этого значения. Измерения со скриншотов, сделанные на демо-счёте за 20 календарных дней, из которых в 17 были тики:
- EURUSD, Tick count, стоп 50 пунктов: медиана составляет 6 пунктов в 23 из 24 часов. В 21:00 по серверному времени, на ежедневном ролловере, она составляет 34 пункта при 90-м процентиле 58. Это 12 процентов стопа большую часть дня и 68 процентов в этот единственный час.
- GBPUSD, Time-weighted, стоп не введён: 7 пунктов в 23 часах, медиана 46 и 90-й процентиль 94 в 21:00. В режиме Tick count тот же час показывает 54 и 100, потому что котировки скапливаются вокруг ролловера, где спред широкий.
- XAUUSD, Tick count, стоп 1500 пунктов: медиана составляет 182 пункта в каждом часе, по которому есть данные, что равно 12 процентам стопа и 18,20 USD на 1,00 лот, поэтому заголовок сообщает именно это, а не ранжирует равные значения. В ежедневный перерыв в 21:00 тиков меньше минимального количества, и этот час показан прочерком.
Практическое применение — решение о часах торговли: если ваша система торгует в час, когда медианный спред составляет большую долю вашего стопа, либо пропустите этот час, либо расширьте стоп, либо убедитесь, что ожидаемое движение окупает эти издержки. 90-й процентиль показывает, как выглядит плохое, но не редкое исполнение.
Независимая проверка. Почасовая статистика была пересчитана по тем же исходным тикам отдельной реализацией на Python. Медиана, 90-й процентиль, среднее, максимум и количество тиков совпали для каждого часа в обоих режимах выборки, например EURUSD 20:00 с 10 692 тиками и 21:00 с 8 097 тиками, а также GBPUSD 21:00 в обоих режимах. Нагрузочные тесты на той же машине: 20 дней XAUUSD, 4,29 млн тиков, — за время от 1 до 3 секунд; 60 дней с фильтром по понедельникам, 2,60 млн тиков, — за 1,3 секунды; 365 дней EURUSD, 9,37 млн тиков за 232 дня с тиками, — примерно за 30 секунд, включая повторное чтение дней до начала тиковой истории. Ваше время будет зависеть от плотности тиков у вашего брокера и от того, есть ли тики уже на диске.
Входные параметры: глубина истории в календарных днях (от 1 до 365, по умолчанию 20), режим выборки, фильтр по дню недели, диапазон гистограммы в пунктах с ячейкой переполнения, минимальное число тиков, при котором час отображается, размер стопа в пунктах (0 отключает процентные подписи), высота окна, семь цветов, из которых четыре вычисляются автоматически, если оставлено значение None (фон — из графика, текст и сетка — из этого фона, верхняя часть 90-го процентиля — из цвета столбца), размер шрифта и переключатель CSV. Каждый входной параметр описан собственным комментарием в терминале.
Примечания и ограничения. Глубина тиковой истории зависит от вашего брокера и от того, что терминал уже загрузил. При самом первом запуске на большой глубине терминал может ещё загружать тики; день, данные которого ещё поступают, запрашивается повторно в течение нескольких секунд, а затем используется как частичный или пропускается, поэтому если загрузка остановилась рано, прикрепите индикатор заново после завершения загрузки — второй запуск читает с диска. Все часы — серверные, поэтому такое событие, как ролловер, может смещаться на один серверный час между летним и зимним временем, а окно, захватывающее переход, показывает его разделённым между двумя соседними часами. Демо- и реальные счета, а также счета типов standard, raw и zero могут иметь очень разные спреды по одному и тому же символу — измеряйте на том счёте, на котором торгуете. История спреда не предсказывает будущие спреды: новости, праздники и низкая ликвидность могут давать спреды значительно выше показанного здесь 90-го процентиля. Стоимость на лот рассчитывается по текущей стоимости тика, которая для кросс-курсов меняется вместе с обменным курсом. Профиль пересчитывается один раз на каждые новые серверные сутки и при каждом изменении входных параметров, символа или таймфрейма. Индикатор открывается в отдельном окне, и на одном графике может работать несколько копий, каждая в своём окне.
