由利恵?

#八十住さん

目次 

MetaTrader5とPythonによる自動売買 

売買ルールの基礎知識 

1. 目標 

FXのTick情報を収集し、データを用いてテクニカル分析を行い、オンラインのデモトレードで利益や損失を確定していく。

2. pythonのパッケージのインストール 

プログラムの見やすさや、実行のしやすさにおいて、visual stdio codeを使ってpythonを書くのがおすすめ。

【Mac】

Python入門|Macにダウンロード・インストールする基礎知識

VS CodeでPythonを始めよう!【Mac】

Visual Studio CodeでMacにPython開発環境を整える

【Windows】

PythonインストールWindows10(64bit)編

Python+VScode+Windows11の環境構築

(うまくPythonがインストールできない事例があったのでインストールの流れ書いておきます)
リンク先確認:Pythonのインストール方法(Windows)

ubuntuの場合,pipが初期でインストールされていない?からインストールしなきゃいけない.

sudo apt install python3-pip

でインストール.

Win10ではコマンドプロンプトを起動し、必要なライブラリをインストールする。 インストールの仕方はコマンドプロンプトで

pip install MetaTrader5

のように入力してインストールする。

今回インストールが必要なのは、

(インジケータの計算に利用するTA-Libはインストールの仕方が特殊なため、後述する)

3. MT5のインストール 

以下のサイトからMT5をインストールする。
※ここでのMT5は前述したpip install MetaTrader5のMT5とは名前が同じだけで別物。

下記のリンクでインストールするものはアプリ
MetaTrader 5をダウンロードしましょう

PythonとMT5を連携させる
PythonとMT5を連携する方法を現役エンジニアが解説【初心者向け】

MT5での最低取引量は0.01lot(10000通貨)なので残高は大体10万以上にしておくべき

MT5の左上のファイル→デモ口座を開くから残高を増やすことができる

4. TA-Libのインストール 

Windows環境のPythonでTA-Libを使えるようにする

  1. 環境の確認 まず、使っているパソコンが何ビットなのを確認する。
    「スタート」→「コントロールパネル」→「システムとセキュリティ」→「システム」
    ここに書いてある「システムの種類」が32ビットなのか64ビットなのかを覚えておく。
    次に、使っているpythonのバージョンを確認する。コマンドプロンプトを呼び出し、
    python -V
    と入力するとpythonのバージョンが確認できる。

  2. ダウンロード コンパイル済みのTA-Libをダウンロードします。
    Unofficial Windows Binaries for Python Extension Packages
    上記のURLの中に「TA-Lib」があるので探す。 TA-Libにもいろんなバージョンがあり、その中で自分の環境に合ったものをダウンロードする。PCは64ビット、pythonのバージョンは3.6.4の場合、
    TA_Lib‑0.4.17‑cp36‑cp36m‑win_amd64.whl
    これをダウンロードする。「win_amd64」がパソコンのビット数を指し、「cp36」がpythonのバージョンを指している。ここが自分の環境に合ったものをダウンロードする。
    その後、ダウンロードファイルを、さきほどコマンドプロンプトを開いた際に表示されたフォルダに保存する。例えば、C:\Users\user>と出たなら、user直下に保存する

  3. インストール ダウンロードしたので、インストールする。コマンドプロンプトを呼び出し、
    python -m pip install TA_Lib‑0.4.17‑cp36‑cp36m‑win_amd64.whl
    と打ち込む。(TA_Lib以下を自分がインストールしたものに書き換えるのを忘れずに)
    Successfully installed ~~~
    と表示されたら完了。

5. MT5で自動取引を行う~準備~ 

注意点として、口座番号は上記で作ったXMの口座IDである。

今回使うファイルは5つあり、一つ目がpythonのファイルで、残りはMT5用のファイルである。

[pythonのファイル]

[MT5のファイル]

MT5用のファイルの置き場所を下記に示す

まず、MT5を起動し、左上のファイルからデータフォルダを開くを押す。

1.png

そのあと、開いたフォルダの

MQL5→includeにinitmq4.mqh、stdlib.mqh、stderror.mqhの三つを入れる。

MQL5→scriptsにTradeAI.mq5を入れる。

MQL5→FilesにTrade.csvを入れる。

demo.pyの場所は任意で大丈夫。

これでファイルの配置は終了。

次に、TradeAI.mq5のコンパイルを行う。

以下の画像のものを立ち上げる。

2.png

ナビゲーターのscriptsからTradeAI.mql5を開く。

3.png

また、修正が2か所あるため以下に示す。

①17行目から25行目までの「extern」を消す。

4.png

②402行目と420行目の{0}の中の0を消す。

5.png

以下の画像のようになればコンパイルを行う。

6.png

これでファイルのコンパイルは終了

次にUSDJPYのチャートを表示する

7.png

次にTradeAIをUSDJPYに入れる。

※もし、ウィンドウが出てきたらで自動売買の許可にチェックを入れる。

8.png

その後、上のタブからツール→オプションで下記の画像の箇所にチェックを入れ、OKを押す。

9.png

これでMT5の設定は終わり。

次にpythonのdemo.pyをテキストエディタなどで開き、Trade.csvのディレクトリを書き換える。

下記の画像の場所を自分に合ったディレクトリに変更する。

10.png

5. MT5で自動取引を行う~プログラムの説明~ 

demo.pyのコード内でできる限りコメントアウトしてるので、そこを参考にして欲しい。

6. MT5で自動取引を行う~実行~ 

MT5を起動した状態でdemo.pyをコマンドプロンプトから実行することで、自動売買が開始される。

上記写真で用いている、Visual Studio Codeで実行する場合右上の緑△ボタン押すことで自動でターミナルが起動され、プログラムを実行できる。

売買の時の音が気になる場合は、MT5画面上のツールタブ→オプション→イベントの音声アラートを有効にするのチェックを外す。

実際に動作している状態の画像を下記に載せる。

11.png
12.png

Ctrl+T上記写真の赤線で囲われた取引履歴などを見るツールボックスが表示される。

また、MT5を閉じると新しいウィンドウで立ち上がるので、

MT5のチャートプロファイル(組表示)の使い方

を参考にウィンドウの保存を行っておく。

チャートは表示されるがナビゲーターなどが立ち上げるたびに消える時は、「全画面表示」を消す。

13.png

 

7. MT5で自動取引を行う~結果~ 

【単純移動平均ゴールデンクロスの実行結果】 

#ref(): File not found: "9.png" at page "動的,時間的データ利活用(FX長短期)"

2020/1/8の1:00~2020/1/8の16:00の間動かした結果 525.86円の損失だった。

#ref(): File not found: "10.png" at page "動的,時間的データ利活用(FX長短期)"

また、短期と長期の間隔を20秒、50秒から100秒、200秒に変更し同じ期間自動売買を行った結果、損失を421.5円減らすことができた。

8. 2020/11/04追加分 

大谷卒業研究 

以下はシステムの流れである.

  1. MT5からTickデータを取得,指定した時間足ごとにリサンプリングし,csvファイルに保存.

    #ref(): File not found: "dataget.png" at page "動的,時間的データ利活用(FX長短期)"

  2. csvファイルから時間足データを取得し,15個のインジケーターそれぞれを同時に最適化,最適なパラメータをそれぞれ保存.

    #ref(): File not found: "paraopt.png" at page "動的,時間的データ利活用(FX長短期)"

  3. 全てのパラメータにおける最適な値をファイルから取得,そのパラメーターを使用し直交表に基づいた16個のルールについてバックテスト,そのときの評価指標を取得.
    直交表と評価指標を回帰分析しそれぞれのインジケーターの主効果を算出し,それらをもちいて2^15通りの組み合わせに対して評価の予測値を算出.
    全ての評価値を用いて最適なルールの組み合わせを選択する.

    #ref(): File not found: "ruleselect.png" at page "動的,時間的データ利活用(FX長短期)"

  4. 最適なルールの組み合わせで実際に売買を行う.

以下は全てのプログラムが入ったファイル.

#ref(): File not found: "MT5.zip" at page "動的,時間的データ利活用(FX長短期)"

1.データ取得 

PythonやMT5等のインストール方法は上記のゼミ引き継ぎ内容と同じ.
Pythonのライブラリは必要なものは少し変わっているため,自分がプログラム内で使用しているもの全てをを以下に示す.

Python標準搭載のものもあるが,インストールが必要なものもあるので各自インストールする.

以下プログラムの説明


コードの細かい説明はコード内にコメントしてあるの見てください.

tickdata.pyの流れは以下のようになっている.

  1. MT5からTickデータを取得し,Tickデータに付随している時間の中でsecが変わったらデータフレームにticks_frameに保存.
  2. 指定秒足(10S,30S,1M,5M,30M,4H)でリサンプリングしticks_frame2〜7へ保存,それぞれの新しい行が増えたら最後から1つ前の行を別のデータフレームtick_10s〜4hに保存.
  3. tick_10s〜4hをcsvファイルに保存(インジケータの数だけ同じデータをcsvファイルの名前を変えて保存).

tickdata.pyはバックグラウンドで常に動かしておき,データを貯め続ける.

2.パラメータの最適化 

コードの細かい説明はコード内にコメントしてあるの見てください.

各インジケーターの最適化プログラム(indi_@@@.py)の流れは以下のようになっている.

  1. それぞれのインジケーターの名前が入ったcsvファイル(OHLCV_10S_@@@.csv)からOHLCVデータを取得
  2. Backtesting.pyをもちいてそれぞれのインジケーターの計算に必要なパラメータ(期間等)と,tpとslの幅に利用するATRの計算に必要な期間・適用時の倍率を最適化する.
  3. 最適化したときのパラメータの結果をcsvファイル(para_@@@.csv)に保存.

各indi_@@@.pyのプログラムはバックグラウンドで常に動かしておき,最適なパラメータを更新し続ける.

3.最適なルール選択 

コードの細かい説明はコード内にコメントしてあるの見てください.

Backtest_rule.pyの流れは以下のようになっている.

  1. それぞれのインジケーターの最適なパラメータの結果をcsvファイル(para_@@@.csv)から,OHLCVデータをOHLCV_10S_RULE.csvから取得.
  2. L15直交表をもちいて16通りのルールを作成(1なら使用,0なら使用しない),それぞれのインジケーターの計算には先ほど取得した最適なパラメータを使用.

    #ref(): File not found: "L15.png" at page "動的,時間的データ利活用(FX長短期)"

  3. 16個のルールでバックテストを行い,その結果得られた評価指標の値をそれぞれデータフレームに保存.
  4. 直交表と評価指標のデータフレームで回帰分析を行い,インジケーターごとの主効果を算出.
  5. 2^15個全ての組み合わせの直交表を作成,その直交表と主効果をまとめたデータフレームを使って全ての組み合わせにおける評価指標の予測値を算出.
  6. 最適な組み合わせを選択し,そのときのデータフレームのindex(15桁の2進数を10進数にした値と同じ)の値をcsvファイル(Strategy.csv)に保存.

4.トレード 

コードの細かい説明はコード内にコメントしてあるの見てください.

Trade.pyの流れは以下のようになっている.

  1. それぞれのインジケーターの最適なパラメータの結果をcsvファイル(para_@@@.csv)から,OHLCVデータをOHLCV_10S_TRADE.csvから,最適な組み合わせの値をStrategy.csvから取得.
  2. 最適なパラメータの結果をもちいてそれぞれのインジケーターの計算を行う.
  3. 取得した最適な組み合わせの値(10進数)を15桁の2進数に変換し,それぞれ一つずつが順番に入ったデータフレームruleを作成.
  4. rule[0]〜rule[14]それぞれの中身が1のとき,それに対応したインジケーターのルールで売買を行う.

技術資料

システムの概要 

  1. MT5からTickデータを取得,指定した時間足ごとにリサンプリングし,csvファイルに保存.

    #ref(): File not found: "detaget.png" at page "動的,時間的データ利活用(FX長短期)"

  2. csvファイルから時間足データを取得し,15個のインジケーターそれぞれを同時に最適化,最適なパラメータをそれぞれ保存.

    #ref(): File not found: "paraopt.png" at page "動的,時間的データ利活用(FX長短期)"

  3. 全てのパラメータにおける最適な値をファイルから取得,そのパラメーターを使用し直交表に基づいた16個のルールについてバックテスト,そのときの評価指標を取得.
    直交表と評価指標を回帰分析しそれぞれのインジケーターの主効果を算出し,それらをもちいて2^15通りの組み合わせに対して評価の予測値を算出.
    全ての評価値を用いて最適なルールの組み合わせを選択する.

    #ref(): File not found: "ruleselect.png" at page "動的,時間的データ利活用(FX長短期)"

  4. 最適なルールの組み合わせで実際に売買を行う.

動作を確認している環境 

以下の環境で,動作を確認している.

OS:Windows 10 Home(Version 20H2)
Python:Version 3.8.10

準備する 

MetaTrader 5 

「MetaTrader 5」(以下,「MT5」)は,外国為替市場(FX)などを取引するためのプラットフォームである.

ダウンロードとインストール 

【公式サイト】からインストーラをダウンロードし,インストールする.

Python 

「Python」は,インタープリタ型のプログラミング言語であり,ほかのプログラミング言語よりも,「ライブラリ」と呼ばれる拡張機能を簡単にダウンロード,インストールし,自身のプログラムに組みこめることが特徴である.

ダウンロードとインストール 

【公式サイト】から,適切なインストーラをダウンロードし,インストールする.

バージョンは,サポート期間中のものであればどれでもよいと思われるが,
この記事を執筆したときのバージョンは,前述のとおり「3.8.10」である.

くわしい手順は,【このページ】あたりを参考にするとよいだろう.

正しくインストールされていれば,コマンドプロンプトで「py -V」とコマンドを実行すると,
インストールされているバージョンが表示されるはずである.

Pythonのライブラリ 

以下は,プログラムで使用しているPythonのライブラリである.

みどりで書かれたライブラリは,コマンドプロンプトで「py -m pip install [パッケージ名]」を実行すると,Pythonに標準で付属しているソフトウェア「pip」が,便利なことに,インターネットから勝手にダウンロードしてインストールしてくれる.

あかで書かれたライブラリ(talib)は,「pip」でもインターネットから拾ってこられないため*1,手動でダウンロードする必要がある.

TA-Lib(talib)のダウンロードとインストール 

【公式サイト】から,適切なものをダウンロードする.

例外もあるが,基本的には以下のようなファイル名になっている.

TA_Lib-x.x.x-cpyy-cpyy-winz.whl

x.x.x:TA-Libのバージョン(「0.4.21」など)
yy:Pythonのバージョン(たとえば,「3.8.10」であれば「38」)
z:Windows OSのビット数(64ビットであれば「_amd64」,32ビットであれば「32」)

Pythonのバージョン,およびWindows OSのビット数は,コマンドプロンプトで,
それぞれ「py -V」,「echo %PROCESSOR_ARCHITECTURE%」を実行することで,確認できる.

ダウンロードしたら,コマンドプロンプトで,
py -m pip install .\Downloads\TA_Lib-x.x.x-cpyy-cpyy-winz.whl
を実行する.正しくインストールされれば,「Successfully installed~~~」と表示される.

プログラム 

以下のフォルダに,卒論に記載されているシステムのプログラムなどがある.

――――――――――

#ref(): File not found: "MT5.zip" at page "動的,時間的データ利活用(FX長短期)"

――――――――――

ダウンロードののち,解凍して,「C:\Users\[ユーザ名]\」など,
分かりやすいところに置くとよいだろう.

フォルダのなかは,以下のようになっている.


プログラムを修正する 

上記であかで書かれているプログラムは,
「in_dat」内や「out_dat」内のcsvファイルを書きこんだり,読みこんだりするときに,絶対パスを使ってあるが,
そのままでは,「C:/Users/xi/MT5/...」になっているはずである.

その「C:/Users/xi/」のところを,すべてのプログラムにおいて,すべての箇所で,
上記でフォルダ「MT5」を置いた絶対パスに修正する必要がある.

「Visual Studio Code」では,特定の文字列をすべて別の文字列に
置換する機能があるので,それを利用しよう.

MT5の準備 

以下のファイルをダウンロードする

ただし,Trade.csvは以下の手順で保存する.
「右クリック」→「名前を付けてリンク先を保存」
ファイル名は変えずにそのまま保存する.
各ファイルの配置を以下に示す.
MQL5→includeにinitmq4.mqh, stdlib.mqh, stderror.mqhの三つを入れる.

MQL5→scriptsにTradeAI.mq5を入れる.

MQL5→FilesにTrade.csvを入れる.

システムを実行する 

1台のPCで実行する 

common.csvを確認する 

common.csv」は,システムの動作を設定するものである.
そのままでは,以下のようになっているはずである.

#ref(): File not found: "common.jpg" at page "動的,時間的データ利活用(FX長短期)"

以下の項目の値が,次のようになっているか確認する.異なっているときは,変更する.

・「use_data」:「short」または「long
インジケータを計算する期間を選択する

・「data_short」/「data_long」:「10S」,「1T」など
「use_data」が「short」のときは,「data_short」の値を,
「long」のときは,「data_long」の値を期間として,インジケータの計算を行う

・「indi_number」:「7」または「15
計算を行うインジケータの数
インジケータの計算には,ある程度の処理能力を必要とする.
「15」個は,相当のマシンパワーを必要とするので,基本的には「7」個でよい.

・「trend_frag」:「2

1台のPCで実行するときは,上記の画像のままでよい.

各プログラムを実行する 

各プログラムを,以下のとおり,順番に実行する.

――――――――――――――

1. tick_data.py

2. 各インジケータを計算するプログラム(順不同)

 「indi_number」が「7」のとき

 ・indi_EMA.py
 ・indi_BBAND.py
 ・indi_MACD.py
 ・indi_RSI.py
 ・indi_STOCH.py
 ・indi_DMI.py
 ・indi_ULTOSC.py

 「indi_number」が「15」のとき

 ・indi_AROON.py
 ・indi_BBAND.py
 ・indi_CCI.py
 ・indi_DMI.py
 ・indi_EMA.py
 ・indi_MACD.py
 ・indi_MFI.py
 ・indi_MOM.py
 ・indi_ROC.py
 ・indi_RSI.py
 ・indi_STOCH.py
 ・indi_TRIX.py
 ・indi_TSF.py
 ・indi_ULTOSC.py
 ・indi_WillR.py

3. rule_generator.py

4. auto_trade.py

――――――――――――――

2台のPCで実行する 

このシステムでは,PCを2台使い,インジケータの計算に用いる期間を,
一方で長期,もう一方で短期にし,それによって出力されるcsvファイルを,LANを介して共有することで,
長期と短期を組みあわせた取引を行うことができる.

短期側:ファイルをLAN上で公開する 

まず,短期側と長期側が,どちらとも同じルータに接続されていることを確認する.

「エクスプローラ」を開き,フォルダ「MT5」で右クリックし,
アクセスを許可する」から「特定のユーザ...」に進む.

#ref(): File not found: "01.jpg" at page "動的,時間的データ利活用(FX長短期)"

「共有する相手」から「Everyone」を選択し,「追加」する.

#ref(): File not found: "02.jpg" at page "動的,時間的データ利活用(FX長短期)"

さらに,「Everyone」の「アクセス許可レベル」を「読み取り/書き込み」にし,
共有」する.

#ref(): File not found: "02-1.jpg" at page "動的,時間的データ利活用(FX長短期)"

「ユーザのフォルダーは共有されています.」と表示されたら,完了である.
ここで,以下の画像で,オレンジの枠で囲われたパスは,のちに使うため,
転記しておくとよいだろう.

#ref(): File not found: "03.jpg" at page "動的,時間的データ利活用(FX長短期)"


長期側:共有されたフォルダにアクセスできるか確認する 

「Windows」+「R」を押し,
「ファイル名を指定して実行」で,上記で転記したパスを入力する.

#ref(): File not found: "04.jpg" at page "動的,時間的データ利活用(FX長短期)"

「ネットワーク資格情報の入力」を求められるため,
通常どおり,短期側でデスクトップにログインするときの,ユーザ名パスワードを入力する.

#ref(): File not found: "05.jpg" at page "動的,時間的データ利活用(FX長短期)"

エクスプローラで,短期側に保存されているフォルダ「MT5」が,
長期側から閲覧できれば,完了である.

#ref(): File not found: "06.jpg" at page "動的,時間的データ利活用(FX長短期)"


長期側:プログラムを修正する 

以下のプログラムの,以下の行にある絶対パスのうち,
「MT5」以上を,短期側の絶対パスに変更する.

indi_EMA.py25行目)
indi_BBAND.py26行目)
indi_MACD.py25行目)
indi_RSI.py25行目)
indi_STOCH.py25行目)
indi_DMI.py25行目)
indi_ULTOSC.py25行目)
rule_generator.py37行目)
auto_trade.py264344行目)

たとえば,以下の画像のように変更する.

#ref(): File not found: "07.jpg" at page "動的,時間的データ利活用(FX長短期)"


長期側common.csvを確認する 

common.csvのうち,以下の項目の値が,
次のようになっているか確認する.異なっているときは,変更する.

・「use_data」:「long
・「data_short」:「10S
・「data_long」:「1T
・「indi_number」:「7
・「trend_frag」:「1

短期側common.csvを変更する 

common.csvのうち,以下の項目の値が,
次のようになっているか確認する.異なっているときは,変更する.

・「use_data」:「short
・「data_short」:「10S
・「data_long」:「1T
・「indi_number」:「7
・「trend_frag」:「0

短期側長期側:各プログラムを実行する 

各プログラムを,短期側長期側それぞれにおいて,
以下のとおり,順番に実行する.

――――――――――――――

1. tick_data.py

2. 各インジケータを計算するプログラム(順不同)

 「indi_number」が「7」のとき

 ・indi_EMA.py
 ・indi_BBAND.py
 ・indi_MACD.py
 ・indi_RSI.py
 ・indi_STOCH.py
 ・indi_DMI.py
 ・indi_ULTOSC.py

 「indi_number」が「15」のとき

 ・indi_AROON.py
 ・indi_BBAND.py
 ・indi_CCI.py
 ・indi_DMI.py
 ・indi_EMA.py
 ・indi_MACD.py
 ・indi_MFI.py
 ・indi_MOM.py
 ・indi_ROC.py
 ・indi_RSI.py
 ・indi_STOCH.py
 ・indi_TRIX.py
 ・indi_TSF.py
 ・indi_ULTOSC.py
 ・indi_WillR.py

3. rule_generator.py

4. auto_trade.py

――――――――――――――


*1 厳密にいうと,「pip」でダウンロードできるライブラリは,「Python Package Index(PyPI)」に登録されているものだけであり,「talib」はそこに登録されていない.

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS