Обсуждение статьи "Высокочастотная арбитражная торговая система на Python с использованием MetaTrader 5"

 

Опубликована статья Высокочастотная арбитражная торговая система на Python с использованием MetaTrader 5:

Создаем легальную в глазах брокеров арбитражную систему, которая создает тысячи синтетических цен на рынке Форекс, анализирует их, и успешно торгует в прибыль.

Валютный рынок. Алгоритмические стратегии. Python и MetaTrader 5. Это было объединено в единое целое, когда я начал работу над арбитражной торговой системой. Задумка была простой — создать высокочастотную систему для поиска ценовых дисбалансов. К чему это все привело в итоге?

API MetaTrader 5 я использовал чаще всего в этот период. Начал с такой идеи — решил посчитать синтетические кросс-курсы. Я решил не ограничиваться десятью или сотней. Количество перешло границы тысячи.

Отдельно стояла задача управления рисками. В этой статье я расскажу обо всём. Архитектура системы, алгоритмы, принятие решений — мы разберем все. Покажу результаты бэктестинга и живой торговли. И конечно, поделюсь идеями на будущее. Кто знает, может, кто-то из вас захочет развить эту тему дальше? Я надеюсь, что моя работа окажется востребованной. Хочется верить, что она внесёт свой вклад в развитие алгоритмической торговли. Может, кто-то возьмёт её за основу и создаст что-то ещё более эффективное в мире высокочастотного арбитража. В конце концов, в этом и есть суть науки — двигаться вперёд, опираясь на опыт предшественников. Давайте, перейдем непосредственно к сути.

Автор: Yevgeniy Koshtenko

 
метку Toxic Order Flow ставят не столько из-за поглощения ликвидности из рынка в моменте, сколько из-за высоких нагрузок на обслуживание такого потока ордеров.
Токсик - это прибыльная торговля. Нет проблемы ордер-спама.
 

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

Также почему-то для покупок берется цена bid, а для продаж ask:

price = symbol_info.bid if direction == "BUY" else symbol_info.ask

Если идея в том, чтобы "прогнуть" брокера на спред - те 8 пунктов, что в условии сигнала:

arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008

то в свойствах приказа стоит проскальзывание 30 ("deviation": 30), что дает ему возможность исполнить с гораздо большими потерями, чем планируемая прибыль.

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

 

Объясните пожалуйста, о чем это:

А теперь следующий шаг — список pairs. Это наши валютные пары, которые мы будем использовать для синтеза. Дальше начинается еще один процесс. Мы запускаем цикл по всем парам. Для каждой пары мы рассчитываем синтетическую цену двумя способами:

Делим bid первой пары на ask второй.
Делим bid первой пары на bid второй.
И каждый раз мы увеличиваем наш method_count. В итоге у нас получается не 1000, не 1500, а целых 2000 синтетических цен!

Вот пары:

pairs = [('AUDUSD', 'USDCHF'), ('AUDUSD', 'NZDUSD'), ('AUDUSD', 'USDJPY'),
             ('USDCHF', 'USDCAD'), ('USDCHF', 'NZDCHF'), ('USDCHF', 'CHFJPY'),
             ('USDJPY', 'USDCAD'), ('USDJPY', 'NZDJPY'), ('USDJPY', 'GBPJPY'),
             ('NZDUSD', 'NZDCAD'), ('NZDUSD', 'NZDCHF'), ('NZDUSD', 'NZDJPY'),
             ('GBPUSD', 'GBPCAD'), ('GBPUSD', 'GBPCHF'), ('GBPUSD', 'GBPJPY'),
             ('EURUSD', 'EURCAD'), ('EURUSD', 'EURCHF'), ('EURUSD', 'EURJPY'),
             ('CADCHF', 'CADJPY'), ('CADCHF', 'GBPCAD'), ('CADCHF', 'EURCAD'),
             ('CHFJPY', 'GBPCHF'), ('CHFJPY', 'EURCHF'), ('CHFJPY', 'NZDCHF'),
             ('NZDCAD', 'NZDJPY'), ('NZDCAD', 'GBPNZD'), ('NZDCAD', 'EURNZD'),
             ('NZDCHF', 'NZDJPY'), ('NZDCHF', 'GBPNZD'), ('NZDCHF', 'EURNZD'),
             ('NZDJPY', 'GBPNZD'), ('NZDJPY', 'EURNZD')]

Что такое Bid первой пары ? Первая пара это ведь:

('AUDUSD', 'USDCHF')