Discussion de l'article "Système d'arbitrage à haute fréquence en Python utilisant MetaTrader 5"

 

Un nouvel article Système d'arbitrage à haute fréquence en Python utilisant MetaTrader 5 a été publié :

Dans cet article, nous allons créer un système d'arbitrage qui reste légal aux yeux des courtiers, crée des milliers de prix synthétiques sur le marché du Forex, les analyse et effectue des transactions fructueuses.

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

 
метку Toxic Order Flow ставят не столько из-за поглощения ликвидности из рынка в моменте, сколько из-за высоких нагрузок на обслуживание такого потока ордеров.
Le toxique est un commerce rentable. Il n'y a pas de problème de spam.
 

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')
 
pivomoe #:

Quelle est l'offre de la première paire ? La première paire est :

AUDUSD est aussi une paire. AUD vers USD.

 
pivomoe #:

Veuillez expliquer de quoi il s'agit :

Voici les paires :

Quelle est l'offre de la première paire ? La première paire est :

C'est ainsi que les synthétiques se construisent. Pas par la différence, mais par la division. Et non pas simple - mais... lire.....
 
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...

Документация по MQL5: Python интеграция / copy_ticks_from
Документация по MQL5: Python интеграция / copy_ticks_from
  • www.mql5.com
Получает тики из терминала MetaTrader 5, начиная с указанной даты. Параметры symbol [in]  Имя финансового инструмента, например, ...