FX / EA Python 個人開発

【Python】DockerでFX自動売買Botを定期実行する方法

本ページにはプロモーションが含まれています。

PythonでFX自動売買Botを作成しても、毎回手動でスクリプトを実行していては、完全な自動売買とはいえません。

ローソク足の更新やエントリー判定、注文処理などを決められた時間に自動で実行できれば、PC操作をせずにFX自動売買Botを動かせるようになります。

しかし、実際にPythonスクリプトを定期実行しようとすると、

  • DockerでPythonスクリプトをどうやって定期実行するのか
  • Dockerfileやdocker-compose.ymlはどのように使うのか
  • Supercronicで実行時間をどう設定するのか
  • FX自動売買Botが正常に動いているかどうやって確認するのか

といった疑問を持つ方も多いのではないでしょうか。

そこで本記事では、DockerとSupercronicを使って、Pythonで作成したFX自動売買Botを定期実行する方法を3ステップで解説します。

これまで作成してきたlive_trade.pyをDocker上で動かし、毎時決められた時間に自動で実行できる環境を作成していきます。

Docker用のファイルも用意しているので、Dockerを使ってPythonのFX自動売買Botを定期実行したい方は、ぜひ参考にしてください!

FX自動売買BotをDockerで定期実行する仕組み

FX自動売買Botを運用するには、ローソク足の更新やエントリー判定、注文処理などを決められた時間に自動で実行する必要があります。

毎回Pythonスクリプトを手動で実行していては、自動売買とはいえません。

そこで今回は、Docker上でFX自動売買Botを起動し、Supercronicを使って各Pythonスクリプトを定期実行できる環境を作成します。

今回のイメージは以下のとおりです。

Dockerコンテナを起動
        ↓
Supercronicがスケジュールを監視
        ↓
決められた時間にPythonスクリプトを実行
        ↓
ローソク足を更新
        ↓
エントリー条件を判定・注文
        ↓
注文結果を取得
        ↓
Discordへ通知

Dockerコンテナを起動しておけば、あらかじめ設定したスケジュールに沿って各処理が自動で実行されます。

Dockerを利用するメリット

FX自動売買BotをDockerで動かす大きなメリットは、実行環境をまとめて管理できることです。

通常、Pythonスクリプトを実行するには、Pythonのバージョンや必要なライブラリなどをPC側に準備する必要があります。

Dockerを利用すると、これらの実行環境をDockerfileなどで管理できるため、環境の違いによるトラブルを減らせます。

また、FX自動売買Botでは複数のPythonスクリプトを継続的に実行するため、Dockerコンテナとしてまとめて動かしておくと管理しやすくなります。

主なメリットは以下のとおりです。

  • Pythonやライブラリの実行環境をまとめて管理できる
  • PC環境の違いによるエラーを減らせる
  • Botの起動・停止をDockerコマンドで管理できる
  • 複数のPythonスクリプトを同じ環境で実行できる
  • 将来的にVPSやクラウド環境へ移行しやすい

今回は、これまで作成してきたFX自動売買用のPythonスクリプトをDockerコンテナ内で動かし、決められた時間に自動実行できるようにします。

今回使用するSupercronicとは

Supercronicは、Dockerコンテナ内で定期処理を実行するために利用できるcron互換のツールです。

一般的にLinuxでは、cronを使って「毎日9時に実行する」「15分ごとに実行する」といったスケジュールを設定できます。

今回のFX自動売買Botでも、同じように決められた時間にPythonスクリプトを実行する必要があります。

そこで使用するのがSupercronicです。

Supercronicでは、cronと似た形式で実行時間を設定できます。

例えば、以下のようなイメージです。

2,17,32,47 * * * * python ローソク足更新スクリプト.py
6,21,36,51 * * * * python エントリー判定スクリプト.py

このように設定しておけば、ローソク足更新とエントリー判定を少し時間をずらして自動実行できます。

FX自動売買では、ローソク足が更新される前にエントリー判定を実行してしまうと、古いデータを使って判定してしまう可能性があります。

そのため、単純に「15分ごとにすべての処理を実行する」のではなく、処理の順番を考えてスケジュールを設定することが重要です。

今回の記事では、Supercronicを使ってFX自動売買Botの各処理を定期実行する方法を紹介していきます。

Dockerで定期実行する前に準備するもの

今回の記事では、すでに作成したFX自動売買用のPythonスクリプトをDocker上で定期実行していきます。

そのため、Docker環境を作成する前に、定期実行するPythonファイルを準備しておきましょう。

すでに取得している方は、この章はとばして次の「DockerでFX自動売買Botを定期実行する3ステップ」からご覧ください!

FX自動売買用のPythonファイルを準備する

まだFX自動売買用のPythonファイルを作成していない方は、先に以下の記事をご覧ください。

この記事では、GMO FX APIから最新のローソク足を取得し、作成したコンフィグを使ってエントリー条件を判定・注文するところまで解説しています。

今回の記事では、ここで作成したPythonファイルをDocker上から定期的に実行していきます。

そのため、まずは上記の記事を参考に必要なファイルを準備してください。

Discord通知を利用する場合は通知機能を準備する

FX自動売買Botの実行結果をDiscordへ通知したい場合は、以下の記事もあわせてご覧ください。

Discord通知を設定しておくことで、Botの処理結果などをDiscordから確認できるようになります。

ただし、Discord通知は必須ではありません。

通知機能を使用しない場合は、この準備を飛ばしてそのままDocker環境の作成へ進んでください。

必要なPythonファイルを準備できたら、Dockerを使って定期実行する環境を作成していきましょう。

Docker Desktopをインストールする

WindowsでDockerを使用する場合は、事前にDocker Desktopをインストールしておきましょう。

Docker Desktopをインストールすると、Dockerコンテナの作成・起動に必要な環境や、この記事で使用するDocker Composeを利用できるようになります。

まだインストールしていない方は、Docker公式サイトからDocker Desktopをダウンロードしてください。

インストールが完了したらDocker Desktopを起動し、PowerShellやコマンドプロンプトで以下を実行します。

docker --version

続いて、Docker Composeも確認します。

docker compose version

それぞれバージョン情報が表示されれば、Dockerを使用する準備は完了です。

なお、WindowsではWSL 2を利用してDocker Desktopを動かす構成が一般的です。

Docker Desktopのインストール時にWSL 2に関する設定が表示された場合は、案内に沿って有効化してください。

Dockerの準備ができたら、FX自動売買Botを定期実行するためのDockerfileを作成していきます。

DockerでFX自動売買Botを定期実行する3ステップ

ここからは、これまで作成したFX自動売買BotをDocker上で定期実行できるようにしていきます。

今回の流れは、以下の3ステップです。

  • Docker用のファイルをダウンロードして配置する
  • Supercronicの実行スケジュールを設定する
  • 環境変数を設定してDockerコンテナを起動する

Docker関連のファイルはあらかじめ用意しているため、1からコードを書く必要はありません。

ダウンロードしたファイルを指定した場所へ配置し、必要な設定を変更してDockerコンテナを起動していきます。

ステップ1|Docker用のファイルをダウンロードして配置する

まずは、FX自動売買BotをDockerで定期実行するために必要なファイルを準備します。

今回使用するDocker関連ファイルは以下の4つです。

Dockerfile
docker-compose.yml
requirements.txt
crontab

以下からファイルをダウンロードしてください。

Dockerfile
# Python 3.12が入った軽量なLinuxイメージを、コンテナの土台にします。
FROM python:3.12-slim

# Pythonのキャッシュファイルを作らず、ログをすぐ画面へ出力します。
# タイムゾーンは、FX Botの実行時刻に合わせて日本時間へ設定します。
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    TZ=Asia/Tokyo

# これ以降のコマンドは、コンテナ内の/appフォルダで実行します。
WORKDIR /app

# curlはSupercronicのダウンロード、tzdataは日本時間の設定に使用します。
# Supercronicは、crontabに書いた時刻にPythonを実行するためのツールです。
RUN apt-get update \
    && apt-get install -y --no-install-recommends curl tzdata \
    && curl -fsSLo /usr/local/bin/supercronic \
       https://github.com/aptible/supercronic/releases/latest/download/supercronic-linux-amd64 \
    && chmod +x /usr/local/bin/supercronic \
    && rm -rf /var/lib/apt/lists/*

# Pythonで必要なライブラリ一覧を先にコピーし、コンテナへインストールします。
COPY Docker/requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Botの実行に必要なPythonファイルと実行スケジュールだけをコピーします。
# .envやdataフォルダはコピーしないため、Dockerイメージには入りません。
COPY *.py ./
COPY Docker/crontab ./crontab

# コンテナ起動後はSupercronicを動かし、crontabの実行時刻を監視します。
CMD ["supercronic", "/app/crontab"]
docker-compose.yml
# Dockerコンテナの作成方法や、PCと共有するデータを設定します。
services:
  # FX自動売買Botを動かすサービスです。
  fx-bot:
    # GMO-APIフォルダを対象に、Docker/Dockerfileからイメージを作ります。
    build:
      context: ..
      dockerfile: Docker/Dockerfile

    # PCやDockerを再起動した場合も、コンテナを自動で再起動します。
    restart: unless-stopped

    # .envから読み込んだ値を、コンテナ内の環境変数へ渡します。
    # 「:-」は、.envに値がない場合に空文字を使う指定です。
    environment:
      TZ: Asia/Tokyo
      GMO_FX_API_KEY: ${GMO_FX_API_KEY:-}
      GMO_FX_SECRET_KEY: ${GMO_FX_SECRET_KEY:-}
      DISCORD_WEBHOOK_URL: ${DISCORD_WEBHOOK_URL:-}

    # PC側のdataフォルダをコンテナと共有します。
    # コンテナを作り直しても、ローソク足や注文履歴がPC側に残ります。
    volumes:
      - ../data:/app/data
requirements.txt
# HTTPS通信でサーバー証明書を確認するために使用します。
# live_trade.pyやcandle_updater.pyから読み込まれます。
certifi
crontab
# 「分 時 日 月 曜日 コマンド」の順に、定期実行する時刻を書きます。
# 毎時2分・17分・32分・47分に、更新・判定・発注をまとめて実行します。
# -uを付けるとPythonのログがすぐに出力され、docker compose logsで確認できます。
2,17,32,47 * * * * cd /app && python -u live_trade.py
.env
GMO_FX_API_KEY=your_gmo_fx_api_key
GMO_FX_SECRET_KEY=your_gmo_fx_secret_key
DISCORD_WEBHOOK_URL=your_discord_webhook_url

ファイルをダウンロードしたら、live_trade.pyが保存されているGMO-APIフォルダの中に、Dockerフォルダを作成します。

フォルダ構成は以下のようにしてください。

Dockerフォルダを作成したら、ダウンロードした4つのファイルをその中へ移動します。

GMO-API/
├─ live_trade.py
├─ candle_updater.py
├─ entry_signal.py
├─ data/
│
└─ Docker/
   ├─ Dockerfile
   ├─ docker-compose.yml
   ├─ requirements.txt
   ├─ crontab
   └─ .env

ダウンロードした5つのファイルは、すべてDockerフォルダの中へ配置してください。

.envには、GMO FX APIキーやDiscord Webhook URLなどを設定しますが、ここではまだ変更する必要はありません。

具体的な設定方法については、ステップ3で解説します。

ファイルを正しい場所へ配置できたら、次にSupercronicの実行スケジュールを確認していきましょう。

ステップ2|Supercronicの実行スケジュールを設定する

次に、crontabを使ってFX自動売買Botを実行する時間を設定します。

今回使用するcrontabは以下のとおりです。

2,17,32,47 * * * * cd /app && python -u live_trade.py

この設定では、毎時、

  • 2分
  • 17分
  • 32分
  • 47分

live_trade.pyを実行します。

15分足を使用する場合、ローソク足は基本的に、

00分
15分
30分
45分

に切り替わります。

今回は、ローソク足が切り替わった直後ではなく、2分後にlive_trade.pyを実行する設定にしています。

例えば、以下のようなイメージです。

00分 15分足が切り替わる
 ↓
02分 live_trade.pyを実行

15分 15分足が切り替わる
 ↓
17分 live_trade.pyを実行

live_trade.pyを実行すると、ローソク足の更新からエントリー判定・注文までをまとめて処理します。

そのため、ローソク足更新用のスクリプトとエントリー判定用のスクリプトを、それぞれ別の時間に実行する必要はありません。

なお、crontabの基本的な書き方は以下のとおりです。

分 時 日 月 曜日 コマンド

今回の、

2,17,32,47 * * * *

は、「毎日・毎時間の2分、17分、32分、47分に実行する」という意味です。

また、Pythonの実行時に-uを付けています。

python -u live_trade.py

-uを付けることでPythonの出力がすぐにログへ反映されるため、後ほどdocker compose logsから実行状況を確認しやすくなります。

今回の実行時間をそのまま使用する場合は、crontabを編集する必要はありません。

実行時間を変更したい場合のみ、自分のBotに合わせて設定を変更してください。

ステップ3|環境変数を設定してDockerコンテナを起動する

最後に、GMO FX APIやDiscord通知で使用する環境変数を設定して、Dockerコンテナを起動します。

ステップ1でDockerフォルダ内に配置した.envを開いてください。

GMO-API/
└─ Docker/
   ├─ Dockerfile
   ├─ docker-compose.yml
   ├─ requirements.txt
   ├─ crontab
   └─ .env

.envには、以下の項目を設定します。

GMO_FX_API_KEY=your_gmo_fx_api_key
GMO_FX_SECRET_KEY=your_gmo_fx_secret_key
DISCORD_WEBHOOK_URL=your_discord_webhook_url

your_gmo_fx_api_keyなどの部分を、自分で取得した情報へ変更してください。

設定が完了したら、PowerShellやターミナルでDockerフォルダへ移動します。

cd GMO-API\Docker

続いて、Dockerイメージを作成します。

docker compose build

ビルドが完了したら、Dockerコンテナを起動します。

docker compose up -d

正常に起動しているか確認する場合は、以下を実行します。

docker compose ps

fx-botが起動していれば、Dockerコンテナの起動は完了です。

Dockerコンテナのログを確認する方法

Dockerコンテナを起動したら、FX自動売買Botが正常に動いているか確認しておきましょう。

主に確認するのは以下の2点です。

  • Dockerコンテナが正常に起動しているか
  • live_trade.pyが設定した時間に実行されているか

Dockerでは、コンテナの状態やPythonスクリプトの実行ログをコマンドから確認できます。

Dockerコンテナが起動しているか確認する

まずは、Dockerコンテナが正常に起動しているか確認します。

PowerShellやターミナルでDockerフォルダへ移動し、以下のコマンドを実行してください。

docker compose ps

正常に起動していれば、fx-botの状態が表示されます。

今回のdocker-compose.ymlでは、FX自動売買Botを動かすサービス名としてfx-botを設定しています。

services:
  fx-bot:

また、

restart: unless-stopped

を設定しているため、自分で停止しない限り、DockerやPCの再起動後もコンテナが再起動する構成になっています。

docker compose psを実行してコンテナが起動していることを確認できれば、次にFX自動売買Botの実行ログを確認します。

FX自動売買Botの実行ログを確認する

コンテナが正常に起動していても、live_trade.pyが正しく定期実行されているとは限りません。

そこで、以下のコマンドを使ってDockerコンテナのログを確認します。

docker compose logs -f

-fを付けることで、新しいログが出力されるたびにリアルタイムで表示できます。

今回のcrontabでは、以下のスケジュールを設定しています。

2,17,32,47 * * * * cd /app && python -u live_trade.py

そのため、毎時2分・17分・32分・47分になると、live_trade.pyが実行され、その処理内容がログへ出力されます。

例えば、以下のような流れで確認します。

00分 15分足が切り替わる
 ↓
02分 live_trade.pyが実行される
 ↓
Dockerのログに実行結果が表示される

今回のcrontabでは、

python -u live_trade.py

のように-uオプションを付けています。

-uを付けることでPythonの標準出力がバッファリングされにくくなり、docker compose logsから実行結果を確認しやすくなります。

FX自動売買Botを起動した直後は、最低でも一度は設定した実行時間までログを確認し、live_trade.pyが正常に実行されていることを確認しておくと安心です。

ログの確認を終了する場合は、

Ctrl + C

を押してください。

Ctrl + Cで終了するのはログの表示だけなので、バックグラウンドで起動しているDockerコンテナ自体はそのまま動き続けます。

Dockerコンテナの起動状態とlive_trade.pyの実行ログの両方を確認できれば、FX自動売買Botの定期実行が正常に動いているか判断できます。

DockerでFX自動売買Botを定期実行する際の注意点

Dockerを使えばFX自動売買Botを定期実行できますが、運用する際にはいくつか注意点があります。

特に、PCの稼働状態と.envの管理には注意してください。

PCをスリープ・シャットダウンするとBotも停止する

今回の構成では、Windows PC上でDocker Desktopを起動し、その中でFX自動売買Botを動かします。

そのため、PCをスリープしたりシャットダウンしたりすると、Docker上のBotも実行されません。

docker-compose.ymlには以下の設定があります。

restart: unless-stopped

この設定により、Dockerが再起動した際にコンテナも自動で再起動する構成になっています。

ただし、PCがスリープしている間や電源が切れている間もBotが動き続けるわけではありません。

FX自動売買Botを継続して動かす場合は、PCがスリープしないようにWindowsの電源設定も確認しておきましょう。

また、長期間24時間稼働させたい場合は、将来的にVPSやクラウド環境へ移行する方法もあります。

.envをGitHubなどへ公開しない

今回使用する.envには、GMO FX APIのAPIキーやシークレットキー、DiscordのWebhook URLを設定します。

GMO_FX_API_KEY=your_gmo_fx_api_key
GMO_FX_SECRET_KEY=your_gmo_fx_secret_key
DISCORD_WEBHOOK_URL=your_discord_webhook_url

これらは外部に公開しないようにしてください。

特に、GitHubなどでソースコードを管理する場合は、.envを誤ってアップロードしないよう注意が必要です。

Gitを使用する場合は、.gitignoreに以下を追加しておくと安心です。

.env

APIキーやWebhook URLが第三者に知られると、不正利用される可能性があります。

そのため、.envは自分のPC内で管理し、ブログやGitHubなどへ公開しないようにしましょう。

DockerによるPythonの定期実行に関するよくある質問

ここでは、Dockerを使ってPythonスクリプトを定期実行する際によくある質問をまとめます。

Docker Desktopは起動したままにする必要がありますか?

はい。

今回の構成では、Windows上のDocker DesktopでFX自動売買Botを動かしています。

そのため、Docker Desktopを終了すると、Dockerコンテナも動作しなくなります。

FX自動売買Botを定期実行する場合は、Docker Desktopを起動した状態にしておいてください。

Dockerコンテナを毎回手動で起動する必要がありますか?

基本的には毎回起動する必要はありません。

今回のdocker-compose.ymlでは、以下の設定を使用しています。

restart: unless-stopped

この設定により、自分でコンテナを停止しない限り、Dockerの再起動後もコンテナが自動で起動する構成になっています。

ただし、PCがスリープしている間やシャットダウンしている間はBotも動作しません。

Pythonスクリプトの実行時間は変更できますか?

はい。

Dockerフォルダ内のcrontabを変更することで、Pythonスクリプトを実行する時間を変更できます。

今回の記事では、以下の設定を使用しています。

2,17,32,47 * * * * cd /app && python -u live_trade.py

これは、毎時2分・17分・32分・47分にlive_trade.pyを実行する設定です。

自分の使用する時間足やBotの処理内容に合わせて変更してください。

crontabを変更したらDockerを再起動する必要がありますか?

はい。

今回の構成では、crontabをDockerイメージ内へコピーしています。

COPY Docker/crontab ./crontab

そのため、crontabを変更した場合はDockerイメージを再ビルドしてください。

docker compose up -d --build

これで変更したcrontabを反映した状態でコンテナを起動できます。

Pythonファイルを変更した場合も再ビルドが必要ですか?

はい。

今回のDockerfileでは、GMO-APIフォルダ内のPythonファイルをDockerイメージへコピーしています。

COPY *.py ./

そのため、live_trade.pyなどを変更した場合は再ビルドが必要です。

docker compose up -d --build

コードを変更したのに動作が変わらない場合は、Dockerイメージを再ビルドしているか確認してみてください。

Dockerを使えばPCを閉じても自動売買できますか?

いいえ。

今回の構成では、自分のWindows PC上でDockerを動かしています。

そのため、PCをシャットダウンしたりスリープ状態にしたりすると、FX自動売買Botも停止します。

PCを常時起動せずに24時間運用したい場合は、VPSやクラウドサーバーなどでDockerを動かす方法を検討する必要があります。

Discord通知は必須ですか?

いいえ。Discord通知は必須ではありません。

FX自動売買Botの処理だけをDockerで定期実行することもできます。

Discord通知を使用する場合のみ、.envへWebhook URLを設定し、通知処理を組み込んでください。

まとめ

今回は、DockerとSupercronicを使って、Pythonで作成したFX自動売買Botを定期実行する方法を紹介しました。

今回の流れをまとめると、以下のとおりです。

  • Docker用のファイルをダウンロードして配置する
  • Supercronicでlive_trade.pyの実行時間を設定する
  • .envにGMO FX APIキーなどを設定する
  • Dockerコンテナを起動する
  • ログから定期実行されていることを確認する

今回の設定では、live_trade.pyを毎時2分・17分・32分・47分に実行し、ローソク足の更新からエントリー判定・注文までを自動で行います。

Dockerを利用することで、これまで手動で実行していたPythonスクリプトを、決められた時間に自動で動かせるようになります。

ただし、今回の構成はWindows PC上のDocker Desktopで動かしているため、PCをスリープ・シャットダウンするとFX自動売買Botも停止します。

継続して運用する場合は、PCの電源設定やDockerの起動状態もあわせて確認しておきましょう。

これで、ローソク足の取得・エントリー判定・注文・結果確認・Discord通知・Dockerによる定期実行まで、Pythonを使ったFX自動売買Botの基本的な仕組みを構築できました。

-FX / EA, Python, 個人開発