CCXTを使って仮想通貨のトレードをしてみる(第2回):注文実行と基本戦略の実装

約18分で読めます by ぽんたぬき
CCXTを使って仮想通貨のトレードをしてみる(第2回):注文実行と基本戦略の実装

CCXTを使ってPythonで仮想通貨の自動売買をしてみる(第2回):注文実行と基本戦略の実装

ねえねえ、キミ!!第1回、ちゃんと読んでくれたヨネ!?😆 環境構築からmarket dataの取得まで、ガッツリやりましたヨネ♪ えっ、読んでない? まあ、いいケド!!(笑) 一応リンク貼っとくから、後で見てネ🎵

で、今回はいよいよ本番デスヨ!!実際にオーダーを叩くヤツ。僕さ、初めて自動注文が通った時サ、思わず「オォ!!」って声出ちゃって、夜中の2時に妻に怒鳴られたんだヨネ……😭 でもそれくらい感動するから、キミも覚悟しておいてネ!!✨


⚠️ 超重要な免責事項デスヨ!! この記事のコードはあくまで教育目的デス。仮想通貨取引は元本保証がなく、最悪全損することもアリマス。実際の資金を動かす際は必ず自己責任で、余剰資金のみで行ってくださいネ。僕も財布の中身を見て泣いたことが何度もアリマスヨ……😭💦


1. CCXTで仮想通貨取引を始める前の準備

1-1. サンドボックス(テストネット)で安全に練習する

ねえ、聞いて。いきなり本番環境でコード動かすの、マジでやめてネ!!💦 僕の先輩がサ、テスト用のつもりで書いたコードを本番キーで動かして、5万円溶かしたって言ってたんだヨ……(笑) 笑えないケド。

CCXTにはサンドボックスモードがあってサ、これを使えばニセモノのお金でPython自動売買の練習ができるんデスヨ!!コレ、マジでオススメ!!🔥

import ccxt

# Binance Testnetで練習する例
exchange = ccxt.binance({
    'apiKey': 'YOUR_TESTNET_API_KEY',
    'secret': 'YOUR_TESTNET_SECRET',
    'options': {
        'defaultType': 'spot',
    },
})

# サンドボックスモードを有効化
exchange.set_sandbox_mode(True)

# 接続確認
print(exchange.fetch_time())

テストネット対応している主な取引所はコチラデスヨ♪

取引所 テストネット 備考
Binance ✅ あり Testnet用APIキー要発行
Bybit ✅ あり Testnet環境が充実
bitFlyer ❌ なし 本番環境のみ(注意!!)

BinanceのTestnet APIキーはサ、testnet.binance.vision にアクセスして発行できるんデスヨ。本番のキーとは別物だから間違えないようにネ!!ここ、僕も最初やらかしちゃいましたヨ……😭

1-2. APIレートリミット対策を設定する

これサ、地味だけど超大事ナンデスヨ!!💡 取引所のAPIには「1分間に何回まで」みたいな制限があってサ、それを超えると問答無用でBANされるんデスヨネ。で、CCXTにはそれを自動でコントロールしてくれる機能があるんデス!!

コレ見てよ!!スゴくナイ!?✨

import ccxt

exchange = ccxt.binance({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    'enableRateLimit': True,  # 必ずTrueに設定すること
})

enableRateLimit: True にするだけで、CCXTが自動的にリクエストの間隔を調整してくれるんデスヨ✨ ちなみにサ、それでも心配な時は手動で time.sleep() を挟むのもアリデスヨ。

import ccxt
import time

exchange = ccxt.binance({
    'apiKey': 'YOUR_API_KEY',
    'secret': 'YOUR_SECRET',
    'enableRateLimit': True,
})

# 手動スロットリングの例
time.sleep(exchange.rateLimit / 1000)  # ミリ秒を秒に変換

1-3. 残高(Balance)の取得と確認

注文を出す前にサ、ちゃんと残高確認しとかないと恥ずかしいことになるんデスヨ😅 fetch_balance() を使えば現在の残高が取れマスヨ!!

コレ見てよ!!スゴくナイ!?✨

balance = exchange.fetch_balance()

# USDTの残高を確認
usdt_balance = balance['USDT']

print(f"利用可能残高(free): {usdt_balance['free']}")   # 注文に使える残高
print(f"注文中残高(used): {usdt_balance['used']}")     # 注文に拘束中の残高
print(f"合計残高(total): {usdt_balance['total']}")     # free + used

freeused の違い、ちゃんと理解してる!?キミ、センスあるネ!!😆 free が実際に使える金額でサ、used は未約定の指値注文とかに拘束されてる金額デスヨ。注文を出す時は必ず free の額を確認するクセをつけておくといいデスネ♪


2. CCXTで使えるPython注文の種類と作成方法

2-1. 成行注文(Market Order)

成行注文ってのはサ、「今すぐ、今の値段で買って(売って)!!」ってやつデスヨ🔥 即時約定するけど、スリッページ(思ってたより高く買わされたり安く売らされたりすること)のリスクがあるんデスヨネ。

create_order() の基本構文、コレ見てよ!!スゴくナイ!?✨

# BTC/USDTを成行で0.001BTC買う
order = exchange.create_order(
    symbol='BTC/USDT',  # 取引ペア
    type='market',       # 成行注文
    side='buy',          # buy(買い)or sell(売り)
    amount=0.001,        # 数量
)

print(order)

動いた時サ、思わず声出ちゃいましたヨ😆 妻に怒られたケド!!(笑) ちなみにサ、今日モンブラン食べちゃった🍰 関係ないケド!!

2-2. 指値注文(Limit Order)

指値注文はサ、「この値段になったら買って!!」って事前に指定するヤツデスヨ🎵 成行と違って約定しないリスクはあるケド、希望の価格で入れるのがメリットデスヨネ。

コレ見てよ!!スゴくナイ!?✨

# BTC/USDTを60,000ドルで0.001BTC指値買い
buy_order = exchange.create_order(
    symbol='BTC/USDT',
    type='limit',
    side='buy',
    amount=0.001,
    price=60000,  # 指値価格を指定
)

# BTC/USDTを70,000ドルで0.001BTC指値売り
sell_order = exchange.create_order(
    symbol='BTC/USDT',
    type='limit',
    side='sell',
    amount=0.001,
    price=70000,
)

print(f"買い注文ID: {buy_order['id']}")
print(f"売り注文ID: {sell_order['id']}")

やるじゃん!!😆 price パラメータを指定するだけで指値注文になるんデスヨ。シンプルデショ!?✨

2-3. ストップロス注文(Stop-Loss Order)

ストップロスはサ、損失を限定するための「保険」みたいなもんデスヨ💡 「この値段まで下がったら売って!!」って設定しておくヤツデスネ。ただ——これがナカナカ曲者でサ、取引所によって書き方が全然違うんデスヨ!!😭

Binanceの場合はこんな感じデスヨ。コレ見てよ!!スゴくナイ!?✨

# ストップロス注文(Binanceの場合)
# 現在価格が58,000ドルの時、57,000ドルでストップロスを設定する例
stop_loss_order = exchange.create_order(
    symbol='BTC/USDT',
    type='stop_loss_limit',
    side='sell',
    amount=0.001,
    price=56800,      # 実際に約定させる指値価格
    params={
        'stopPrice': 57000,  # トリガーとなる価格
    }
)

print(stop_loss_order)

取引所によっては stopPx だったり triggerPrice だったりするから要注意デスヨ!! exchange.describe() でサポートしてる注文タイプを確認しておくといいデスネ♪


3. CCXTによる注文管理とポジション管理の実装

3-1. 注文状況の確認

注文出しっぱなしにしてたらダメデスヨ!!😅 ちゃんと状況を確認する習慣をつけてネ。

コレ見てよ!!スゴくナイ!?✨

# 注文IDで個別の注文状況を確認
order_id = buy_order['id']
order_status = exchange.fetch_order(order_id, 'BTC/USDT')

print(f"注文ステータス: {order_status['status']}")
# open     → 未約定(待ち中)
# closed   → 約定済み
# canceled → キャンセル済み

ステータスが open のまま放置してたら資金がずっと拘束されちゃうんデスヨネ……💦 僕も一回指値注文を忘れたまま寝ちゃって、翌朝見たら未約定のまま3日経過してたことがアリマスヨ……(笑) やらかしちゃいましたヨ……😭

3-2. 未決済注文の一覧取得とキャンセル

コレ見てよ!!便利すぎてスゴくナイ!?✨

import time

# 未決済注文を一覧取得
open_orders = exchange.fetch_open_orders('BTC/USDT')
print(f"未決済注文数: {len(open_orders)}件")

# 指定時間内に約定しなければ自動キャンセルする例
timeout_seconds = 300  # 5分

for order in open_orders:
    order_id = order['id']
    created_at = order['timestamp'] / 1000  # ミリ秒→秒

    elapsed = time.time() - created_at
    if elapsed > timeout_seconds:
        canceled = exchange.cancel_order(order_id, 'BTC/USDT')
        print(f"注文 {order_id} をキャンセルしました")

5分経っても約定しなかったら自動キャンセル!! これ地味に便利デスヨ😆 指値注文を出しといて価格が離れちゃった時とかに使えるんデスネ♪

3-3. ポジション管理の基本

自分が今いくら持ってて、平均いくらで買ったのかってのを追跡するためにサ、取引履歴を取得できるんデスヨ!! コレ見てよ!!スゴくナイ!?✨

# 取引履歴から損益を簡易計算する例
trades = exchange.fetch_my_trades('BTC/USDT')

total_cost = 0    # 購入にかかった総コスト
total_amount = 0  # 保有BTC総量

for trade in trades:
    if trade['side'] == 'buy':
        total_cost += trade['cost']      # 購入金額(USDT)
        total_amount += trade['amount']  # 購入数量(BTC)

if total_amount > 0:
    avg_price = total_cost / total_amount
    print(f"平均取得単価: {avg_price:.2f} USDT")
    print(f"保有量: {total_amount:.6f} BTC")

    # 現在価格を取得して含み損益を計算
    ticker = exchange.fetch_ticker('BTC/USDT')
    current_price = ticker['last']
    unrealized_pnl = (current_price - avg_price) * total_amount
    print(f"含み損益: {unrealized_pnl:.2f} USDT")

4. 自動売買APIのエラーハンドリング実装

4-1. CCXTの主要例外クラス一覧

ねえ、聞いて。エラーハンドリングをナメてたら痛い目を見るからネ!!😭 僕もサ、エラー処理ゼロのコードで自動売買を動かして、夜中にエラーで止まってたのを翌朝知ったことが……(笑) もう二度とやらないケド!!

CCXTで頻出する例外クラスはコチラデスヨ♪

例外クラス 発生条件
InsufficientFunds 残高不足で注文できない
RateLimitExceeded APIリクエストが制限を超えた
InvalidOrder 注文パラメータが不正
NetworkError ネットワーク接続エラー
ExchangeError 取引所側のエラー全般

4-2. try-exceptを使った堅牢な注文処理

コレ見てよ!!本番運用を想定したエラーハンドリングのテンプレートデスヨ!!🔥

import ccxt
import time
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def place_order_with_retry(exchange, symbol, order_type, side, amount, price=None, max_retries=3):
    """
    リトライ機能付きの注文関数
    指数バックオフでリトライする
    """
    for attempt in range(max_retries):
        try:
            if order_type == 'market':
                order = exchange.create_order(symbol, order_type, side, amount)
            else:
                order = exchange.create_order(symbol, order_type, side, amount, price)

            logger.info(f"注文成功: {order['id']}")
            return order

        except ccxt.InsufficientFunds as e:
            # 残高不足はリトライしても意味がないため即終了
            logger.error(f"残高不足: {e}")
            raise

        except ccxt.RateLimitExceeded as e:
            # レートリミットは待機してからリトライ
            wait_time = (2 ** attempt) * 1  # 指数バックオフ: 1秒 → 2秒 → 4秒
            logger.warning(f"レートリミット超過。{wait_time}秒待機してリトライ... (試行{attempt + 1}/{max_retries})")
            time.sleep(wait_time)

        except ccxt.InvalidOrder as e:
            # 注文パラメータが不正はリトライしても意味なし
            logger.error(f"不正な注文パラメータ: {e}")
            raise

        except ccxt.NetworkError as e:
            # ネットワークエラーはリトライ
            wait_time = (2 ** attempt) * 2
            logger.warning(f"ネットワークエラー。{wait_time}秒待機してリトライ... (試行{attempt + 1}/{max_retries})")
            time.sleep(wait_time)

        except ccxt.ExchangeError as e:
            logger.error(f"取引所エラー: {e}")
            raise

    raise Exception(f"最大リトライ回数({max_retries}回)を超えました")

指数バックオフってのはサ、エラーが起きるたびに待ち時間を2倍にしていく手法デスヨ💡 1秒→2秒→4秒って感じで。サーバーへの負荷を減らしつつリトライできるんデスネ。コレをサボると、夜中に自動売買botが静かに息絶えて、翌朝ポジションがグチャグチャになってたりするんデスヨ……僕は3回経験済みデスヨ……やらかしちゃいましたヨ……😭


まとめ:CCXTを使ったPython仮想通貨自動売買の基礎固め

キミ、ここまでよく頑張ったネ!!✨ 今回カバーしたのはコチラデスヨ♪

  • サンドボックス環境でのテストネット設定
  • APIレートリミット対策の実装
  • 成行・指値・ストップロス注文の作成方法
  • 注文状況の確認・キャンセル処理
  • ポジション管理と含み損益の計算
  • エラーハンドリングとリトライ処理

次回はいよいよ、これらの部品を組み合わせて実際に動くトレードボットの骨格を作っていくデスヨ!!😆 移動平均クロスとかRSIとかのシグナルを組み込んで、自動で売り買いする仕組みを一緒に作っていくから楽しみにしといてネ!!🔥

コード書いてて詰まったら、ぜひコメント欄で教えてネ。キミのやらかし話、僕も聞きたいデスヨ!!(笑)✨

関連記事

CCXTを使って仮想通貨のトレードをしてみる(第4回):バックテストから本番運用へ
投資・トレード

CCXTを使って仮想通貨のトレードをしてみる(第4回):バックテストから本番運用へ

CCXTを使った仮想通貨ライブトレードの完全実装ガイド。Binance Testnetでのサンドボックス検証、CCXT ProのWebSocketによるリアルタイム取引、asyncioでの並列管理、Telegram通知・AWS EC2本番運用まで徹底解説。

CCXTを使って仮想通貨のトレードをしてみる(第3回):リスク管理とバックテストの完全ガイド
投資・トレード

CCXTを使って仮想通貨のトレードをしてみる(第3回):リスク管理とバックテストの完全ガイド

CCXTを使った仮想通貨トレードボット第3回。バックテストの実装方法からシャープレシオ・最大ドローダウンなどの評価指標、リスク管理の実践まで初心者にもわかりやすく解説します。

コメント

0/2000