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')
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...
- www.mql5.com
Der neue Artikel Python High Frequency Arbitrage Trading System with MetaTrader 5 wurde veröffentlicht:
Autor: Yevgeniy Koshtenko
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Neuer Artikel Hochfrequenz-Arbitrage-Handelssystem in Python mit MetaTrader 5 :
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