Существование децентрализованных рынков под собой всегда подразумевает создание агрегаторов, как первое технологическое звено синхронизации цен на разных таких торговых площадках через арбитраж — проторговка отрицательного спреда на искусственном символе, созданного агрегатором.
Как следствие, агрегаторы создают более выгодные торговые условия, чем на каждой площадке в отдельности, показывая вкусный индикативный поток цен. Индикативный — не гарантирующий исполнение. Т.е. лимитный ордер может быть не исполнен (реджект), что исключено на централизованных (биржевых) рынках.
Поэтому многие брокеры на крупных децентрализованных рынках (FOREX, криптовалюты и т.д.) предпочитают использовать агрегированные ценовые потоки (Feed — Фид), как конкурентное преимущество.
Использование только Фида (B-book).
ДЦ, принимающие внутри себя клиентские ставки, заинтересованы всегда в том, чтобы Фид был качественным: привлекательнее для клиента (выгодные цены), но при этом исключал арбитражные возможности.
На рынке Фидов много предложений. Но далеко не каждый вариант обладает нужными характеристиками. Найти хороший Фид — большое дело. Т.к. он значительно уменьшает вероятность необходимости искусственно гнобить клиентов, т.е. нести репутационные и финансовые издержки.
Агрегатор, как Feed+Executor (A-book).
Для брокеров, работающих на децентрализованном рынке по такой схеме, отпадают проблемы выше, но возникает иная — низкий FillRate (какая часть ордеров заливается). Хороший Feed+Executor — это сравнительно высокая потенциальная прибыль (какой максимум можно выжать теоретически из истории цен, если бы исполнение было идеальным — 100% филрейт) с высоким уровнем Fillrate.
Понятно, что никому не нужны «нулевые спреды», если исполняться по ним не получается. И никому не нужны «широкие спреды» с идеальным исполнением. Т.е. надо давать реальные цены (по которым будет исполнение), но при этом оставаться конкурентноспособным по ним.
Технологически агрегаторы довольно сложны. Там большие технические, организационные и алгоритмические трудности. Любые ошибки - это прямые убытки клиентов: брокеров. Агрегаторы вынуждены постоянно совершенствовать свои технологии и подходы, которые, конечно, никому не раскрывают.
Подводных камней довольно много. Один из самых простых — сильнейшее раздвижение спреда, которое может сносит стопы (и MarginCall) клиентов брокеров. Ведь никто не хочет видеть обнуление своего счета из-за «соплей» (ценовые шпильки).
Фильтр спреда.
Каждый агрегатор решает задачу сохранения стопов своих клиентов по-своему. Мне было интересно решить эту задачу оптимально:
максимальная потенциальная прибыль не страдает, но при этом стоп-ордера не сносятся.
Например, если скальпируете через лимитные ордера, то простой «фильтр спреда» может не пропускать некоторые цены для исполнения лимитных ордеров. Соответственно, не всегда получается проторговка выгодных торговых уровней. Конечно, это условно. В реальности цены все равно индикативны, поэтому никакой гарантии, что по ним было бы исполнение, нет. Однако, ненулевой FillRate все же эти цены имеют, поэтому интересно, существует ли оптимальный в этом отношении алгоритм фильтрации «широкого спреда».
Алгоритм.
Собственно, на этом заканчиваю повествование. Алгоритм такой существует — выложил его в виде исходника в архиве. Там же подробная инструкция.
Скрипт MQL5\Scripts\Level2.mq5 вычисляет стакан для клиентов на основе поступающих котировок в агрегатор.
Файл MQL5\Files\Level2.mq5\QuotesIN.txt содержит котировки, которые приходят в агрегатор:
time LP bid ask
15 0 1.2300 1.2402 // LP0 прислал цены 1.2300/1.2402 со временем 15.
Файл MQL5\Files\Level2.mq5\QuotesOUT.txt содержит вычисленные стаканы для каждого входящего тика:
NewTick:
LP = 2 TimeMsc = 2 bid = 1.2305 ask = 1.2398 // Пришедший тик (из IN-файла)
Market: // Текущие актуальные цены для каждого LP.
LP = 0 TimeMsc = 0 bid = 1.2451 ask = 1.2455
LP = 1 TimeMsc = 1 bid = 1.22 ask = 1.25
LP = 2 TimeMsc = 2 bid = 1.2305 ask = 1.2398
Level2: // Стакан, что направляется клиентам.
LP = 1 TimeMsc = 1 ask = 1.25
LP = 0 TimeMsc = 0 ask = 1.2455
LP = 2 TimeMsc = 2 ask = 1.2398 * // Лучший Ask для клиентов.
LP = 0 TimeMsc = 0 bid = 1.2451 * // Лучший Bid для клиентов.
LP = 2 TimeMsc = 2 bid = 1.2305
LP = 1 TimeMsc = 1 bid = 1.22
Фильтр котировок содержится в методе
void LEVEL2::CheckSpread( QUOTE &Bids[], QUOTE &Asks[] );
Он сырой стакан превращает в стакан для клиентов так, чтобы стопы не сносились, но при этом лимитники исполнялись.
Очень важно, что этот алгоритм не несет рисков для брокеров, которые торгуют по модели A-book-only. Если хотя бы частично (бывают смешанные модели) используется B-book, то он не подходит. Поскольку A-book-only — это очень малая часть клиентов агрегаторов, то предложенный алгоритм — больше теория, чем жизненные реалии. Но мало ли, кто-то реализует в конечном продукте на радость скальперов в малоликвидное периоды...
Канал: https://t.me/fxsaber_Results
Группа: https://t.me/fxsaberDiscussion
На нормальных биржах «шпильки», т.е. short/long squeeze, уменьшаются по мере развития конкуренции в HFT, поэтому централизованные меры борьбы не нужны и вредны. Однако у форексников — все иначе, помимо реджектов они норовят отменять прибыльные сделки, закрытые на шпильках, вызывая здоровую ненависть.
старый трейдер, это не про A-book-only.