Discussione sull’articolo "Sistema di trading di arbitraggio ad alta frequenza in Python utilizzando MetaTrader 5"

 

Il nuovo articolo Sistema di trading di arbitraggio ad alta frequenza in Python utilizzando MetaTrader 5 è stato pubblicato:

In questo articolo creeremo un sistema di arbitraggio che rimane lecito agli occhi dei broker, crea migliaia di prezzi sintetici sul mercato Forex, li analizza e opera con successo per ottenere profitti.

Mercato dei cambi. Strategie algoritmiche. Python e MetaTrader 5. Tutto questo è nato quando ho iniziato a lavorare su un sistema di trading di arbitraggio. L'idea era semplice - creare un sistema ad alta frequenza per individuare gli squilibri di prezzo. A cosa ha portato tutto questo alla fine?

In questo periodo ho utilizzato più spesso le API MetaTrader 5. Ho deciso di calcolare tassi sintetici dei cross. Ho deciso di non limitarmi a dieci o cento. Il numero ha superato il migliaio.

La gestione del rischio era un compito separato. Architettura del sistema, algoritmi, processo decisionale - qui analizzeremo tutto. Mostrerò i risultati del backtesting e del trading live. E naturalmente condividerò idee per il futuro. Chissà, forse qualcuno di voi vuole sviluppare ulteriormente questo argomento? Spero che il mio lavoro sia richiesto. Vorrei credere che contribuirà allo sviluppo del trading algoritmico. Forse qualcuno lo prenderà come base per creare qualcosa di ancora più efficace nel mondo dell'arbitraggio ad alta frequenza. Dopo tutto, questa è l'essenza della scienza - progredire sulla base dell'esperienza dei predecessori. Andiamo subito al punto.


Autore: Yevgeniy Koshtenko

 
метку Toxic Order Flow ставят не столько из-за поглощения ликвидности из рынка в моменте, сколько из-за высоких нагрузок на обслуживание такого потока ордеров.
Il tossico è un commercio redditizio. Non ci sono problemi di spam di ordini.
 

Frainteso. Di solito l'arbitraggio prevede la negoziazione di almeno due strumenti l'uno in direzione dell'altro. In questo caso, sembra che venga generato un ordine per ogni situazione di arbitraggio, cioè la speranza è che lo strumento reale si avvicini a quello sintetico, ma non viceversa. La probabilità che ciò accada è di cinquanta e cinquanta, imho.

Inoltre, per qualche motivo il prezzo bid viene preso per gli acquisti e il prezzo ask per le vendite:

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

Se l'idea è quella di "piegare" il broker sullo spread - gli 8 punti nella condizione di segnale:

arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008

allora nelle proprietà dell'ordine c'è uno slittamento di 30 ("deviazione": 30), che gli dà la possibilità di eseguire con perdite molto maggiori rispetto al profitto previsto.

E non ho visto posizioni chiudersi esattamente alla condizione di successo dell'arbitraggio, e aspettare la chiusura su take profit o stop loss chilometrici è come indovinare i fondi di caffè per una strategia di arbitraggio (che coglie squilibri millimetrici), imho.

 

Si prega di spiegare di cosa si tratta:

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

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

Ecco le coppie:

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 è il Bid della prima coppia? La prima coppia è:

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

Qual è il Bid della prima coppia? La prima coppia è:

AUDUSD è anche una coppia. AUD a USD.

 
pivomoe #:

Per favore, spiegate di cosa si tratta:

Ecco le coppie:

Qual è il Bid della prima coppia? La prima coppia è:

È così che si costruisce il sintetico. Non attraverso la differenza, ma la divisione. E non semplice, ma... leggere.....
 
ticks = mt5.copy_ticks_from(symbol, utc_from, count, mt5.COPY_TICKS_ALL)

Tutti installati. Questo è ciò che viene visualizzato in 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''],

dtype='|V0')


E qui otteniamo già un'uscita in tempo:

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

Anche il codice dell'esempio https://www.mql5.com/it/docs/python_metatrader5/mt5copyticksfrom_py non funziona .

>>>  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("Zecche ricevute:",len(ticks))
Получено тиков: 100000
>>> print("Prendiamo le zecche risultanti così come sono".)
Выведем полученные тики как есть
>>>  count = 0
>>> for tick in ticks:
...     count+=1
...     print(tick)
...     if count >= 100:
...         break
...
b''
b''
b''
b''

Comunque, com'è python? Come prepararlo? Non è chiaro...

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