Diskussion zum Artikel "Hochfrequenz-Arbitrage-Handelssystem in Python mit MetaTrader 5"

 

Neuer Artikel Hochfrequenz-Arbitrage-Handelssystem in Python mit MetaTrader 5 :

In diesem Artikel werden wir ein Arbitrationssystem erstellen, das in den Augen der Broker legal bleibt, Tausende von synthetischen Preisen auf dem Forex-Markt erstellt, sie analysiert und erfolgreich mit Gewinn handelt.

Devisenmarkt. Algorithmische Strategien. Python und MetaTrader 5. Das kam zusammen, als ich begann, an einem Arbitrage-Handelssystem zu arbeiten. Die Idee war einfach - ein Hochfrequenzsystem zum Auffinden von Preisungleichgewichten zu schaffen. Wozu hat das alles letztendlich geführt?

In diesem Zeitraum habe ich am häufigsten MetaTrader 5 API verwendet. Ich habe beschlossen, synthetische Umtauschkurse zu berechnen. Ich habe beschlossen, mich nicht auf zehn oder hundert zu beschränken. Die Zahl hat die Tausendergrenze überschritten.

Das Risikomanagement war eine separate Aufgabe. Systemarchitektur, Algorithmen, Entscheidungsfindung - wir werden hier alles analysieren. Ich werde die Ergebnisse von Backtesting und Live-Handel zeigen. Und natürlich werde ich Ideen für die Zukunft mitteilen. Wer weiß, vielleicht hat ja jemand von Ihnen Lust, dieses Thema weiterzuentwickeln? Ich hoffe, dass meine Arbeit gefragt sein wird. Ich würde gerne glauben, dass es zur Entwicklung des algorithmischen Handels beitragen wird. Vielleicht wird sich jemand daran orientieren und etwas noch Effektiveres in der Welt der Hochfrequenz-Arbitrage schaffen. Schließlich ist das das Wesen der Wissenschaft - sich auf der Grundlage der Erfahrungen der Vorgänger weiterzuentwickeln. Kommen wir gleich zur Sache.


Autor: Yevgeniy Koshtenko

 
метку Toxic Order Flow ставят не столько из-за поглощения ликвидности из рынка в моменте, сколько из-за высоких нагрузок на обслуживание такого потока ордеров.
Toxic ist ein profitabler Handel. Es gibt kein Problem mit Auftragsspam.
 

Missverstanden. Bei einer Arbitrage werden in der Regel mindestens zwei Instrumente in entgegengesetzter Richtung gehandelt. Hier scheint es so zu sein, dass für jede Arbitrage-Situation ein Auftrag generiert wird, d.h. man hofft, dass das reale Instrument auf das synthetische aufzieht, aber nicht umgekehrt. Die Wahrscheinlichkeit dafür ist imho fifty-fifty.

Außerdem wird aus irgendeinem Grund der Geldkurs für Käufe und der Briefkurs für Verkäufe verwendet:

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

Wenn die Idee ist, "biegen" den Makler auf den Spread - die 8 Punkte in der Signalbedingung:

arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008

dann gibt es in den Eigenschaften des Auftrags einen Schlupf von 30 ("Abweichung": 30), was ihm die Möglichkeit gibt, mit viel größeren Verlusten als dem geplanten Gewinn auszuführen.

Und ich habe nicht gesehen, dass die Positionen genau unter der Bedingung einer erfolgreichen Arbitrageauslösung geschlossen wurden, und das Warten auf die Schließung bei Kilometer-Take-Profit oder Stop-Loss ist imho wie Kaffeesatzleserei bei einer Arbitragestrategie (die Millimeter-Ungleichgewichte abfängt).

 

Bitte erklären Sie, worum es geht:

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

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

Hier sind die Paare:

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

Was ist das Gebot des ersten Paares? Das erste Paar ist:

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

Was ist das Gebot des ersten Paares? Das erste Paar ist:

AUDUSD ist auch ein Paar. AUD zu USD.

 
pivomoe #:

Bitte erklären Sie, worum es hier geht:

Hier sind die Paare:

Was ist das Gebot des ersten Paares? Das erste Paar ist:

So baut man Kunststoffe auf. Nicht durch Differenz, sondern durch Teilung. Und nicht einfach - sondern... lesen.....
 
ticks = mt5.copy_ticks_from(symbol, utc_from, count, mt5.COPY_TICKS_ALL)

Alle installiert. Dies ist das, was in Ticks auftaucht:

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

dtype='|V0')


Und hier erhalten wir bereits einen Exit auf Zeit:

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

Der Code aus dem Beispiel https://www.mql5.com/de/docs/python_metatrader5/mt5copyticksfrom_py funktioniert auch nicht.

>>>  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("Empfangene Zecken:",len(ticks))
Получено тиков: 100000
>>> print("Nehmen wir die resultierenden Zecken so, wie sie sind.")
Выведем полученные тики как есть
>>>  count = 0
>>> for tick in ticks:
...     count+=1
...     print(tick)
...     if count >= 100:
...         break
...
b''
b''
b''
b''

Wie auch immer, wie ist Python? Wie bereitet man es vor? Es ist unklar...

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

Der neue Artikel Python High Frequency Arbitrage Trading System with MetaTrader 5 wurde veröffentlicht:

Autor: Yevgeniy Koshtenko

Funktioniert das wirklich? Es wird von regulären Brokern nicht unterstützt