文章 "使用 MetaTrader 5 的 Python 高频套利交易系统"

 

新文章 使用 MetaTrader 5 的 Python 高频套利交易系统已发布:

在本文中,我们将创建一个在经纪商眼中仍然合法的套利系统,在外汇市场上创建数千个合成价格,对其进行分析,并成功交易以获取利润。

外汇市场,算法策略,Python 和 MetaTrader 5。当我开始研究套利交易系统时,这一切就发生了。这个想法很简单 —— 创建一个高频系统来发现价格不平衡。这一切最终导致了什么?

这段时间我经常使用 MetaTrader 5 API。我决定计算合成交叉汇率。我决定不再将自己限制在十个或一百个,数字已突破一千。

风险管理是一项独立的任务。系统架构、算法、决策 —— 我们将在这里分析一切。我将展示回溯测试和实时交易的结果。当然,我也会分享未来的思路。谁知道呢,也许你们中有人想进一步发展这个话题?我希望我的工作会受到欢迎。我相信这将有助于算法交易的发展。也许有人会以此为基础,在高频套利的世界里创造出更有效的东西。毕竟,这就是科学的本质 —— 在前人经验的基础上不断前进。让我们直接进入正题。


作者:Yevgeniy Koshtenko

 
метку Toxic Order Flow ставят не столько из-за поглощения ликвидности из рынка в моменте, сколько из-за высоких нагрузок на обслуживание такого потока ордеров.
有毒交易有利可图。不存在垃圾订单问题。
 

误解。通常情况下,套利涉及至少两种方向相反的交易工具。在这里,似乎每种套利情况都会产生一个订单,也就是说,希望真实工具能拉高合成工具,但反之亦然。在我看来,这种概率是五五开。

此外,由于某种原因,买入时采用买入价,卖出时采用卖出价:

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

如果我们的想法是在价差上让经纪商 "屈服"--信号条件中的 8 点:

arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008

那么在订单属性中就有 30 的滑点("偏差": 30),这使他有机会在执行时损失比计划利润大得多。

我并没有看到完全按照成功触发套利的条件平仓的 情况,而等待按千米止盈或止损平仓,在我看来,就像猜测套利策略(捕捉毫米级的不平衡)的咖啡渣一样。

 

请解释一下这是怎么回事:

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

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

这里有一对:

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

第一对的出价是多少?第一对是:

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

第一对的出价是多少?第一对是

AUDUSD 也是一对。澳元兑美元。

 
pivomoe #:

请解释一下这是怎么回事:

这里有一对:

第一对的出价是多少?第一对是:

这就是人工合成的方式。不是通过差异,而是通过分割。不是简单的--而是...阅读.....
 
ticks = mt5.copy_ticks_from(symbol, utc_from, count, mt5.COPY_TICKS_ALL)

全部安装完毕。这是用"√"表示的内容:

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

dtype='|V0')


在这里,我们已经按时得到了一个出口:

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

https://www.mql5.com/zh/docs/python_metatrader5/mt5copyticksfrom_py 示例中的代码也不起作用

>>>  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("收到蜱虫:",len(ticks))
Получено тиков: 100000
>>> print("让我们来看看结果如何吧")
Выведем полученные тики как есть
>>>  count = 0
>>> for tick in ticks:
...     count+=1
...     print(tick)
...     if count >= 100:
...         break
...
b''
b''
b''
b''

总之,Python 是什么样的语言?如何准备?不清楚...

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