Mal compris. En règle générale, l'arbitrage consiste à négocier au moins deux instruments dans le sens de l'autre. Ici, il semble qu'un ordre soit généré pour chaque situation d'arbitrage, c'est-à-dire que l'on espère que l'instrument réel se rapprochera de l'instrument synthétique, mais pas l'inverse. La probabilité de cette situation est de 50-50, à mon avis.
En outre, pour une raison quelconque, le cours acheteur est utilisé pour les achats et le cours vendeur pour les ventes :
price = symbol_info.bid if direction == "BUY" else symbol_info.ask
Si l'idée est de "faire plier" le courtier sur l'écart - les 8 points dans la condition du signal :
arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008 alors dans les propriétés de l'ordre il y a un slippage de 30 ("déviation" : 30), ce qui lui donne l'opportunité d'exécuter avec des pertes beaucoup plus importantes que le profit prévu.
Et je n'ai pas vu de positions se clôturer exactement à la condition d'un déclenchement réussi de l'arbitrage, et attendre la clôture sur un take profit ou un stop loss kilométrique revient à deviner le marc de café pour une stratégie d'arbitrage (qui attrape des déséquilibres millimétriques), à mon avis.
Veuillez expliquer de quoi il s'agit :
А теперь следующий шаг — список pairs. Это наши валютные пары, которые мы будем использовать для синтеза. Дальше начинается еще один процесс. Мы запускаем цикл по всем парам. Для каждой пары мы рассчитываем синтетическую цену двумя способами: Делим bid первой пары на ask второй. Делим bid первой пары на bid второй. И каждый раз мы увеличиваем наш method_count. В итоге у нас получается не 1000, не 1500, а целых 2000 синтетических цен!
Voici les paires :
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')] Quelle est l'offre de la première paire ? La première paire est :
('AUDUSD', 'USDCHF')
ticks = mt5.copy_ticks_from(symbol, utc_from, count, mt5.COPY_TICKS_ALL) Tout est installé. Voici ce qui apparaît dans les 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'', b'', b'', b''],
dtype='|V0')
Et ici, nous obtenons déjà une sortie à temps :
ticks_frame['time'] = pd.to_datetime(ticks_frame['time'], unit='s')
Le code de l'exemple https://www.mql5.com/fr/docs/python_metatrader5/mt5copyticksfrom_py ne fonctionne pas non plus
>>> 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("Tics reçus :",len(ticks)) Получено тиков: 100000 >>> print("Prenons les tiques résultantes telles qu'elles sont".) Выведем полученные тики как есть >>> count = 0 >>> for tick in ticks: ... count+=1 ... print(tick) ... if count >= 100: ... break ... b'' b'' b'' b''
Bref, à quoi ressemble python ? Comment le préparer ? Ce n'est pas clair...
- www.mql5.com
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Un nouvel article Système d'arbitrage à haute fréquence en Python utilisant MetaTrader 5 a été publié :
Marché des changes. Stratégies algorithmiques. Python et MetaTrader 5. Cela s'est concrétisé lorsque j'ai commencé à travailler sur un système d'arbitrage. L'idée était simple : créer un système à haute fréquence pour détecter les déséquilibres de prix. À quoi tout cela a-t-il abouti en fin de compte ?
J'ai utilisé l’API de MetaTrader 5 le plus souvent au cours de cette période. J'ai décidé de calculer les taux de croisement synthétiques. J'ai décidé de ne pas me limiter à dix ou cent. Leur nombre a dépassé le millier.
La gestion des risques est une tâche distincte. Architecture du système, algorithmes, prise de décision - nous analyserons tout ici. Je montrerai les résultats du backtesting et du trading en direct. Et bien sûr, je partagerai des idées pour l'avenir. Qui sait, peut-être l'un d'entre vous souhaite-t-il approfondir ce sujet ? J'espère que mon travail sera demandé. J'aimerais croire qu'il contribuera au développement du commerce algorithmique. Peut-être que quelqu'un s'en inspirera pour créer quelque chose d'encore plus efficace dans le monde de l'arbitrage à haute fréquence. Après tout, c'est l'essence même de la science : avancer en s'appuyant sur l'expérience des prédécesseurs. Allons droit au but.
Auteur : Yevgeniy Koshtenko