・約4分で読めます
更新:

PythonでFX自動売買Botを作る入門ガイド — GMOコインAPIで実際に動かす


PRDMM FXスプレッド業界最狭水準。口座開設数国内トップクラス。最短即日で取引開始。
DMM FX 無料口座開設 →

この記事で作れるもの

Python + GMOコイン REST API を使って、FX の自動売買 Bot を作ります。

完成イメージ:

[GMOコイン API] ←→ [Python Bot] ←→ [あなたの戦略ロジック]

                 [ログ出力 / 通知]

できあがるもの:

  • ローソク足データの取得
  • テクニカル指標の計算
  • 条件に合致したときの自動注文
  • 基本的なリスク管理(損切り・ポジション制限)

前提

項目 内容
Python 3.10 以上(3.12 推奨)
プログラミング経験 基本的な Python が読める程度
FX の知識 「通貨ペア」「レバレッジ」が分かる程度
費用 すべて無料(口座維持費・API利用料ともに¥0)

GMOコインでFX口座を開設する

Bot を動かすには API 対応の FX 口座 が必要です。国内で Bot 開発者に最も使われているのが GMOコイン。REST API と WebSocket の両方に対応していて、最小 1,000 通貨から取引できます。

口座開設の手順

  1. GMOコイン公式サイト にアクセスして無料口座開設
  2. 本人確認(マイナンバーカード or 運転免許証、スマホで完結)
  3. 審査通過(最短当日)
  4. ログイン後、外国為替FXを有効化(マイページから申込み、追加審査なし)

口座開設は無料で、維持費もかかりません。

口座のスペック詳細は GMOコイン外国為替FX レビュー にまとめています。 他の口座と比較したい方は FX自動売買 口座比較 2026年版 をどうぞ。

APIキーの発行

口座開設後、管理画面から API キーを発行します。

  1. GMOコインにログイン
  2. 「API」メニューへ移動
  3. 「新しい API キーを作成」をクリック
  4. 権限は「注文」「建玉照会」「資産残高」を有効化
  5. API キーと API シークレットをメモ(シークレットは二度と表示されない
# .env ファイルに保存(Git にコミットしないこと)
GMO_API_KEY=your_api_key_here
GMO_API_SECRET=your_api_secret_here

最小構成のBot実装

実装に入る前に、本番運用でつまずきやすい API のエラー処理はGMOコインAPIでFX自動売買Botを作る際のエラー対処法にまとめています。あわせて読むと、後述のコードの例外処理の意図が掴みやすくなります。

ファイル構成

fx-bot/
├── main.py           # メインスクリプト
├── .env              # APIキー(.gitignore に追加)
└── requirements.txt  # 依存ライブラリ
# requirements.txt
requests
python-dotenv
pandas
ta

API認証の仕組み

GMOコイン API は HMAC-SHA256 による署名認証を使います。

import hashlib
import hmac
import time
import requests
from dotenv import load_dotenv
import os

load_dotenv()

API_KEY = os.environ["GMO_API_KEY"]
API_SECRET = os.environ["GMO_API_SECRET"]
BASE_URL = "https://forex-api.coin.z.com"

def call_api(method: str, path: str, body: str = "") -> dict:
    timestamp = str(int(time.time() * 1000))
    text = timestamp + method + path + body
    sign = hmac.new(
        API_SECRET.encode(), text.encode(), hashlib.sha256
    ).hexdigest()

    headers = {
        "API-KEY": API_KEY,
        "API-TIMESTAMP": timestamp,
        "API-SIGN": sign,
    }

    url = BASE_URL + path
    if method == "GET":
        res = requests.get(url, headers=headers)
    else:
        headers["Content-Type"] = "application/json"
        res = requests.post(url, headers=headers, data=body)

    return res.json()

ローソク足データの取得

import pandas as pd

def get_candles(symbol: str = "USD_JPY", interval: str = "1hour", count: int = 100) -> pd.DataFrame:
    path = f"/public/v1/klines?symbol={symbol}&interval={interval}&count={count}"
    data = requests.get(BASE_URL + path).json()

    candles = data["data"]
    df = pd.DataFrame(candles)
    df["open"] = df["open"].astype(float)
    df["high"] = df["high"].astype(float)
    df["low"] = df["low"].astype(float)
    df["close"] = df["close"].astype(float)
    df["volume"] = df["volume"].astype(float)
    return df

テクニカル指標の計算

import ta

def add_indicators(df: pd.DataFrame) -> pd.DataFrame:
    # EMA(トレンド方向)
    df["ema20"] = ta.trend.ema_indicator(df["close"], window=20)
    df["ema50"] = ta.trend.ema_indicator(df["close"], window=50)

    # RSI(過熱度)
    df["rsi"] = ta.momentum.rsi(df["close"], window=14)

    return df

シグナル判定と注文

import json

def check_signal(df: pd.DataFrame) -> str | None:
    latest = df.iloc[-1]

    # 買いシグナル: EMA20 > EMA50 かつ RSI が 40〜70
    if latest["ema20"] > latest["ema50"] and 40 < latest["rsi"] < 70:
        return "BUY"

    # 売りシグナル: EMA20 < EMA50 かつ RSI が 30〜60
    if latest["ema20"] < latest["ema50"] and 30 < latest["rsi"] < 60:
        return "SELL"

    return None

def place_order(side: str, size: int = 1000) -> dict:
    body = json.dumps({
        "symbol": "USD_JPY",
        "side": side,
        "executionType": "MARKET",
        "size": str(size),
    })
    return call_api("POST", "/private/v1/order", body)

メインループ

import time as t

def main():
    print("Bot 起動")
    while True:
        try:
            df = get_candles()
            df = add_indicators(df)
            signal = check_signal(df)

            if signal:
                result = place_order(signal)
                print(f"注文実行: {signal}{result}")
            else:
                print("シグナルなし、待機中...")

        except Exception as e:
            print(f"エラー: {e}")

        t.sleep(3600)  # 1時間ごとにチェック

if __name__ == "__main__":
    main()

これで最小限の自動売買 Bot が動きます。

コードの詳細解説は Python + REST API でFX自動売買を始める最小構成 を参照してください。

本番環境で動かす

ローカル PC で動かすと、PC を閉じた瞬間に Bot が止まります。24 時間稼働させるには、クラウド上にデプロイするのが現実的です。

選択肢

環境 コスト 特徴
Oracle Cloud Always Free 無料 ARM 4コア 24GB メモリ。個人 Bot には十分すぎるスペック
自宅サーバー 電気代のみ ネットワーク障害リスクあり
VPS 月¥500〜 手軽だが費用がかかる

自分は Oracle Cloud の Always Free インスタンスで 24 時間稼働させています。無料で ARM 4コア + 24GB メモリが使えるので、Bot の運用先としてはベスト。

構築手順は Oracle Cloud Always Free で FX Bot を24時間無料運用する方法 にまとめています。

環境変数の管理

本番環境では .env ファイルではなく、OS の環境変数やシークレット管理サービスを使います。

# Linux / Oracle Cloud の場合
export GMO_API_KEY="your_key"
export GMO_API_SECRET="your_secret"

API キーをコードに直接書くのは絶対にNG。Git に push した瞬間に漏洩リスクが生まれます。

リスク管理を組み込む

コードが動くことと利益が出ることは別問題です。Bot を本番で動かすなら、リスク管理は最低限組み込んでおく必要があります。

1トレードあたりのリスク制限

MAX_RISK_PERCENT = 2  # 資金の2%まで

def calc_position_size(balance: float, stop_loss_pips: float) -> int:
    risk_amount = balance * (MAX_RISK_PERCENT / 100)
    # 1pip = ¥10 (1,000通貨、USD/JPYの場合)
    size = int(risk_amount / (stop_loss_pips * 10))
    return max(size, 1000)  # 最小1,000通貨

最大ドローダウンでの停止

MAX_DRAWDOWN = 0.10  # 10%で停止

def check_drawdown(current_balance: float, peak_balance: float) -> bool:
    drawdown = (peak_balance - current_balance) / peak_balance
    if drawdown >= MAX_DRAWDOWN:
        print(f"最大DD到達 ({drawdown:.1%})。Bot 停止。")
        return True
    return False

Bot が暴走して資金を溶かさないために、ドローダウン上限は必ず入れてください。

リスク管理の詳細は FX Bot のドローダウン管理と自動停止の仕組み で解説しています。

次のステップ

最小構成の Bot が動いたら、次に取り組むべきことは:

  1. 戦略を高度化する — EMA + MACD + RSI を組み合わせたトレンドフォロー戦略など。自分が使っている戦略は AutoTrade Bot の戦略を全公開 で公開しています

  2. バックテストを行う — 過去データで戦略の有効性を検証してから本番投入する

  3. 成績を記録・評価する — 勝率やシャープレシオの読み方は FX自動売買の成績評価 を参照

  4. 月次レポートで振り返る — Bot の運用実績は 月次レポート 2026年5月 で公開予定

まとめ

  • Python + GMOコイン API で FX 自動売買 Bot は作れる
  • 最小構成なら ファイル1つ + 無料口座 で始められる
  • Oracle Cloud Always Free を使えば 24時間稼働も無料
  • リスク管理(損切り・DD制限)は必ず入れる
  • まずは少額(1,000通貨)で動作確認してから徐々に拡大する

自動売買の全体像を把握したい方は FX自動売買の始め方 完全ガイド もあわせてどうぞ。

Bot を動かすために必要な口座

この記事のコードを実行するには、GMOコインのAPIキーが必要です。口座開設は無料で、最短10分で完了します。

GMOコイン 無料口座開設はこちら →

※ 口座開設後、マイページの「API」メニューからAPIキーを発行してください。

関連記事

※ 当記事のリンクにはアフィリエイトリンクを含む場合があります。口座開設の費用には影響しません。

DMM FX無料口座開設