Discussão do artigo "Sistema de negociação de arbitragem de alta frequência em Python usando MetaTrader 5"

 

Novo artigo Sistema de negociação de arbitragem de alta frequência em Python usando MetaTrader 5 foi publicado:

Criamos um sistema de arbitragem legal aos olhos das corretoras, que gera milhares de preços sintéticos no mercado Forex, os analisa e negocia com sucesso e de forma lucrativa.

O mercado cambial. Estratégias algorítmicas. Python e MetaTrader 5. Tudo isso foi combinado em um único sistema de arbitragem quando comecei a trabalhar nele. A ideia era simples: criar um sistema de alta frequência para detectar desequilíbrios de preços. E no que isso se transformou?

Durante esse período, o API do MetaTrader 5 foi a ferramenta que mais utilizei. Comecei com a seguinte ideia: calcular cotações cruzadas sintéticas. Decidi não me limitar a dez ou cem. O número ultrapassou a casa dos mil.

Havia também a tarefa separada de gerenciamento de risco. Neste artigo, vou explicar tudo. Vamos analisar todos os aspectos do sistema: sua arquitetura, os algoritmos utilizados e o processo de tomada de decisões. Mostrarei os resultados do backtest e da negociação ao vivo. E, claro, compartilharei ideias para o futuro. Quem sabe alguém de vocês queira continuar desenvolvendo esse tema? Espero que meu trabalho seja útil. Quero acreditar que ele contribuirá para o avanço da negociação algorítmica. Talvez alguém o use como base para criar algo ainda mais eficiente no mundo da arbitragem de alta frequência. Afinal, esse é o espírito da ciência: avançar com base na experiência daqueles que vieram antes. Vamos direto ao ponto.


Autor: Yevgeniy Koshtenko

 
метку Toxic Order Flow ставят не столько из-за поглощения ликвидности из рынка в моменте, сколько из-за высоких нагрузок на обслуживание такого потока ордеров.
Toxic é uma negociação lucrativa. Não há problema de spam de ordens.
 

Mal entendido. Normalmente, a arbitragem envolve a negociação de pelo menos dois instrumentos na direção um do outro. Aqui, parece que uma ordem é gerada para cada situação de arbitragem, ou seja, a esperança é de que o instrumento real puxe o sintético, mas não vice-versa. A probabilidade de isso acontecer é de 50%, na minha opinião.

Além disso, por algum motivo, o preço de compra é considerado para compras e o preço de venda para vendas:

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

Se a ideia é "dobrar" o corretor no spread - os 8 pontos na condição de sinal:

arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008

então, nas propriedades da ordem, há um deslizamento de 30 ("desvio": 30), o que lhe dá a oportunidade de executar com perdas muito maiores do que o lucro planejado.

E eu não vi posições fechando exatamente na condição de acionamento bem-sucedido da arbitragem, e esperar pelo fechamento em um take profit ou stop loss quilométrico é como adivinhar a borra de café para uma estratégia de arbitragem (que capta desequilíbrios milimétricos), na minha opinião.

 

Por favor, explique do que se trata:

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

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

Aqui estão os pares:

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')]

Qual é o lance do primeiro par? O primeiro par é:

('AUDUSD', 'USDCHF')
 
pivomoe #:

Qual é o lance do primeiro par? O primeiro par é:

AUDUSD também é um par. AUD para USD.

 
pivomoe #:

Por favor, explique do que se trata:

Aqui estão os pares:

Qual é o lance do primeiro par? O primeiro par é:

É assim que os sintéticos se desenvolvem. Não por meio da diferença, mas da divisão. E não simples - mas... read.....
 
ticks = mt5.copy_ticks_from(symbol, utc_from, count, mt5.COPY_TICKS_ALL)

Tudo instalado. Isso é o que aparece em ticks:

array([b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'',

...

b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'',

b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'',

b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b'', b''],

dtype='|V0')


E aqui já obtemos uma saída pontual:

ticks_frame['time'] = pd.to_datetime(ticks_frame['time'], unit='s')
 

O código do exemplo https://www.mql5.com/pt/docs/python_metatrader5/mt5copyticksfrom_py também não funciona

>>>  timezone = pytz.timezone("Etc/UTC")
>>>  utc_from = datetime(2020, 1, 10, tzinfo=timezone)
>>>  ticks = mt5.copy_ticks_from("EURUSD", utc_from, 100000, mt5.COPY_TICKS_ALL)
>>>
>>> print("Ticks recebidos:",len(ticks))
Получено тиков: 100000
>>> print("Vamos considerar os ticks resultantes como eles são.")
Выведем полученные тики как есть
>>>  count = 0
>>> for tick in ticks:
...     count+=1
...     print(tick)
...     if count >= 100:
...         break
...
b''
b''
b''
b''

Enfim, como é o python? Como prepará-lo? Não está claro...

Документация по MQL5: Python интеграция / copy_ticks_from
Документация по MQL5: Python интеграция / copy_ticks_from
  • www.mql5.com
Получает тики из терминала MetaTrader 5, начиная с указанной даты. Параметры symbol [in]  Имя финансового инструмента, например, ...
 
Será que isso realmente funciona? Não é suportado por corretoras comuns