記事「MetaTrader 5を使用したPythonの高頻度裁定取引システム」についてのディスカッション

 

新しい記事「MetaTrader 5を使用したPythonの高頻度裁定取引システム」はパブリッシュされました:

この記事では、ブローカーの観点から見て合法であり、外国為替市場において数千もの合成価格を生成・分析し、利益を上げるために取引をおこなう裁定取引システムの構築方法について解説します。

外国為替市場、アルゴリズム戦略、Python、そしてMetaTrader 5。これらすべてが、私が裁定取引システムに取り組み始めたときに一つに結びつきました。アイデアはシンプルで、高頻度で価格の不均衡を検出するシステムを構築するというものでした。では、この取り組みは最終的に何をもたらしたのでしょうか。

この期間中、私はMetaTrader 5のAPIを最も多く活用しました。そして、合成クロスレートの計算に取り組みました。10や100といった数では満足せず、その数は1000を超えました。

リスク管理は、また別の課題でした。システムアーキテクチャやアルゴリズム、意思決定のプロセスなど、本記事ではそのすべてを詳細に解説します。バックテストや実際の取引結果もお見せします。そしてもちろん、今後の展望や新たなアイデアについても共有します。もしかすると、この記事をきっかけに、このテーマをさらに発展させたいと思う方がいらっしゃるかもしれません。私の取り組みが少しでも需要があり、アルゴリズム取引の発展に貢献できることを願っています。そして誰かがこれをベースに、より効果的な高頻度アービトラージ戦略を生み出してくれることを信じています。結局のところ、科学とは先人の経験を踏まえて前進していくことに他なりません。それでは、本題に入りましょう。


作者: Yevgeniy Koshtenko

 
метку Toxic Order Flow ставят не столько из-за поглощения ликвидности из рынка в моменте, сколько из-за высоких нагрузок на обслуживание такого потока ордеров.
毒性は有益な取引である。注文スパムの問題はない。
 

誤解されている。通常、裁定取引では少なくとも2つの商品を互いに反対方向に取引する。ここでは、裁定取引の状況ごとに1つの注文が生成されるようだ。つまり、実際の商品が合成に引き上げられることを期待するが、その逆はない。この確率は半々だと思う。

また、なぜか買いの場合は買値が、売りの場合は売値が採用されている:

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

ブローカーをスプレッドで「曲げる」ことが目的なら、シグナル条件の8ポイント:

arbitrage_opportunities = pd.DataFrame(spreads) > 0.00008

もしブローカーがスプレッド(シグナル条件の8ポイント)を「曲げる」ことを意図しているのであれば、注文の性質上、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 もペアです。AUDからUSDへ。

 
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''、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/ja/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]  Имя финансового инструмента, например, ...
 
これは本当に機能するのでしょうか?通常のブローカーではサポートされていません。