Malentendido. Por lo general, el arbitraje implica negociar al menos dos instrumentos en la dirección del otro. Aquí, parece que se genera una orden para cada situación de arbitraje, es decir, la esperanza es que el instrumento real suba al sintético, pero no viceversa. La probabilidad de que esto ocurra es del cincuenta por ciento, en mi opinión.
Además, por alguna razón se toma el precio de compra para las compras y el de venta para las ventas:
price = symbol_info.bid if direction == "BUY" else symbol_info.ask
Si la idea es "doblar" al broker en el spread - los 8 puntos en la condición de señal:
arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008 entonces en las propiedades de la orden hay un deslizamiento de 30 ("desviación": 30), lo que le da la oportunidad de ejecutar con pérdidas mucho mayores que el beneficio previsto.
Y no vi que las posiciones se cerraran exactamente en la condición de activación exitosa del arbitraje, y esperar el cierre en el take profit o stop loss kilométrico es como adivinar los posos del café para una estrategia de arbitraje (que capta desequilibrios milimétricos), en mi opinión.
Por favor, explique de qué se trata:
А теперь следующий шаг — список pairs. Это наши валютные пары, которые мы будем использовать для синтеза. Дальше начинается еще один процесс. Мы запускаем цикл по всем парам. Для каждой пары мы рассчитываем синтетическую цену двумя способами: Делим bid первой пары на ask второй. Делим bid первой пары на bid второй. И каждый раз мы увеличиваем наш method_count. В итоге у нас получается не 1000, не 1500, а целых 2000 синтетических цен!
Aquí están los 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')] ¿Cuál es la oferta del primer par? El primer par es:
('AUDUSD', 'USDCHF')
ticks = mt5.copy_ticks_from(symbol, utc_from, count, mt5.COPY_TICKS_ALL) Todo instalado. Esto es lo que aparece en
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''],
dtype='|V0')
Y aquí ya obtenemos una salida a tiempo:
ticks_frame['time'] = pd.to_datetime(ticks_frame['time'], unit='s')
El código del ejemplo https://www.mql5.com/es/docs/python_metatrader5/mt5copyticksfrom_py tampoco 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 recibidos:",len(ticks)) Получено тиков: 100000 >>> print("Tomemos las garrapatas resultantes como son".) Выведем полученные тики как есть >>> count = 0 >>> for tick in ticks: ... count+=1 ... print(tick) ... if count >= 100: ... break ... b'' b'' b'' b''
En fin, ¿cómo es python? ¿Cómo prepararlo? No está claro...
- www.mql5.com
Nuevo artículo Python High Frequency Arbitrage Trading System with MetaTrader 5 ha sido publicado:
Autor: Yevgeniy Koshtenko
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Sistema de arbitraje de alta frecuencia en Python con MetaTrader 5:
Mercado de divisas. Estrategias algorítmicas. Python y MetaTrader 5. Todo esto se juntó cuando empecé a trabajar en un sistema comercial de arbitraje. La idea era sencilla: crear un sistema de alta frecuencia para encontrar desequilibrios de precios. ¿Y qué resultó al final?
Durante este periodo, utilicé la API de MetaTrader 5 con mayor frecuencia. Empecé con esta idea: decidí contar las tasas cruzadas sintéticas, sin limitarme a diez o cien. La cifra llegó a miles.
Por otro lado, estaba el reto de la gestión de riesgos. En este artículo hablaré de todo ello. Arquitectura de sistemas, algoritmos, toma de decisiones: lo desglosaremos todo. Asimismo, veremos los resultados del backtesting y de las operaciones en vivo. Y, obviamente, compartiremos ideas para el futuro. Quién sabe, quizá alguno de ustedes quiera profundizar en este tema... Espero que mi trabajo tenga cierto éxito. Me gustaría creer que contribuirá al desarrollo del trading algorítmico. Quizá alguien lo tome como base y cree algo todavía mejor en el mundo del arbitraje de alta frecuencia. Al fin y al cabo, ese es el principio esencial de la ciencia: avanzar basándose en la experiencia de los predecesores. Vamos directamente al grano.
Autor: Yevgeniy Koshtenko