スポンサーリンク

【Python×仮想通貨】ビットコイン自動売買の始め方④注文の確認・キャンセルを自動化しよう!

Python×仮想通貨取引

1. はじめに|注文管理も自動化して、よりスマートな取引へ

仮想通貨の自動売買をPythonで始めたあなたへ。
「注文を出すことはできたけど、そのあとの管理やキャンセルってどうやるの?」と疑問に感じたことはありませんか?

実際の取引では、注文を出したあとに「やっぱりキャンセルしたいな」と思うことがよくあります。たとえば、価格が急変してしまったときや、設定ミスに気づいたときなどです。そんなときに、注文の状況を自動で確認して、条件に応じてキャンセルできるしくみがあると、とても便利です。

今回の記事では、PythonとCoincheckのプライベートAPIを使って、以下のような注文管理の自動化を実現する方法を解説します。

  • 現在の注文(未約定)一覧を取得する
  • 特定の注文だけを選んでキャンセルする
  • 条件に応じて自動キャンセル処理を行う

自動売買をより安全に、そしてスマートに運用するために、「注文の見える化」と「自動キャンセル」は欠かせない要素です。

このステップをしっかり押さえることで、誤発注や放置された注文によるリスクを減らし、より効率的な自動売買ライフを送れるようになりますよ!

それでは、さっそくPythonコードを交えて解説していきましょう!




2. Coincheck APIでできる注文管理とは?

自動売買を本格的に進めるためには、売買注文を出すだけでなく、現在の注文状況を把握し、必要に応じてキャンセルする処理も大切です。CoincheckのプライベートAPIを使えば、この注文管理もすべてPythonから操作できます。

ここでは、主に2つの機能を使います。


✅ 1. 注文一覧の取得(open_orders)

まず、現在「未約定(まだ成立していない)」の注文を確認するには、以下のエンドポイントを使います。

GET /api/exchange/orders/opens

このAPIを使うと、次のような注文情報がJSON形式で返されます。

  • id(注文ID)
  • rate(注文価格)
  • amount(注文数量)
  • created_at(注文作成日時)
  • order_type(buy/sellの別)

これらの情報をもとに、「どの注文がいつ、いくらで出されたのか」を一覧で確認できます。


✅ 2. 注文のキャンセル(cancel_order)

「この注文はもういらないな…」というときには、注文をキャンセルするAPIを使います。

POST /api/exchange/orders/cancel

リクエストボディには、キャンセルしたい注文の id を指定するだけでOKです。

{
"order_id": 12345678
}

この操作もPythonから簡単に実行でき、手動でWeb画面にアクセスする手間を完全に省けるのがポイントです。


🔐 注意:プライベートAPIキーが必要

これらの注文管理APIは「プライベートAPI」に分類されるため、Coincheckの管理画面で発行した以下の情報が必要になります。

  • APIキー(Access Key)
  • シークレットキー(Secret Key)

これらは絶対に他人に見せてはいけない機密情報なので、安全な方法でコード内に読み込ませる必要があります(環境変数などを利用)。

次は、これらのAPIを実際にPythonで使う方法を解説していきます。
まずは「注文一覧の取得」から、ステップバイステップで見ていきましょう!




3. Pythonで注文一覧を取得する

それでは実際に、CoincheckのプライベートAPIを使って「現在出されている注文(未約定)」の一覧をPythonで取得してみましょう!


🔧 必要な準備

まずは必要なライブラリをインストールしておきましょう。今回使うのは、API通信に便利な requests ライブラリです。

pip install requests

続いて、APIキーとシークレットキーを安全に扱うために、環境変数などから読み込むようにしましょう(例では直接変数に代入していますが、本番では .env ファイル等を活用するのがおすすめです)。


🧪 注文一覧を取得するPythonコード

import time
import requests
import hmac
import hashlib

# --- 認証情報(※環境変数や秘密ファイルで安全に管理するのが推奨) ---
API_KEY = 'あなたのAPIキー'
API_SECRET = 'あなたのシークレットキー'

# --- エンドポイント設定 ---
url = 'https://coincheck.com/api/exchange/orders/opens'
nonce = str(int(time.time() * 1000))

# --- ヘッダーの作成(認証) ---
message = nonce + url
signature = hmac.new(
API_SECRET.encode(),
message.encode(),
hashlib.sha256
).hexdigest()

headers = {
'ACCESS-KEY': API_KEY,
'ACCESS-NONCE': nonce,
'ACCESS-SIGNATURE': signature
}

# --- APIリクエスト送信 ---
response = requests.get(url, headers=headers)
data = response.json()

# --- 結果表示 ---
if 'orders' in data:
for order in data['orders']:
print(f"注文ID: {order['id']}")
print(f"種類: {order['order_type']}")
print(f"価格: {order['rate']}")
print(f"数量: {order['amount']}")
print(f"作成日時: {order['created_at']}")
print("-" * 40)
else:
print("注文はありません")

📌 ポイント解説

  • nonce は毎回違う値を使う必要があります。通常はUNIX時間(ミリ秒)を利用します。
  • hmac を使って署名(signature)を作成し、APIの認証に使用します。
  • orders に含まれる情報はリスト形式で返ってくるため、ループ処理でひとつずつ取り出すと便利です。

✅ 実行結果のイメージ

注文ID: 12345678
種類: buy
価格: 4500000.0
数量: 0.01
作成日時: 2025-06-19T10:24:00.000Z
----------------------------------------

このようにして、「現在どんな注文が出ているか」をPythonから簡単にチェックできるようになります。次はこの情報をもとに、「特定の注文をキャンセルする方法」を見ていきましょう!




4. Pythonで注文をキャンセルする方法

前のパートで、現在出ている注文を一覧で取得できましたね。
ここからは、特定の注文をキャンセルする方法を解説していきます。

たとえば、価格が思った方向に動かなかったときや、注文を間違えたときなどに「この注文、やっぱり取り消したいな」と思うことはよくあります。そんなときも、Pythonからワンタッチでキャンセル処理ができます!


🔄 キャンセルAPIの基本

Coincheckでは以下のエンドポイントで注文キャンセルを行います:

POST /api/exchange/orders/cancel

このときに必要なのは、キャンセルしたい注文の order_id(注文ID) だけです。


🧪 実際のPythonコード

以下は、指定した注文IDの注文をキャンセルするPythonコード例です:

import time
import requests
import hmac
import hashlib

# 認証情報(環境変数で管理推奨)
API_KEY = 'あなたのAPIキー'
API_SECRET = 'あなたのシークレットキー'

# キャンセルしたい注文のIDを指定(前の取得結果から取得)
order_id = 12345678

# リクエスト情報
url = 'https://coincheck.com/api/exchange/orders/cancel'
nonce = str(int(time.time() * 1000))
body = f"order_id={order_id}"
message = nonce + url + body

signature = hmac.new(
API_SECRET.encode(),
message.encode(),
hashlib.sha256
).hexdigest()

headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'ACCESS-KEY': API_KEY,
'ACCESS-NONCE': nonce,
'ACCESS-SIGNATURE': signature
}

# リクエスト送信
response = requests.post(url, headers=headers, data={'order_id': order_id})
result = response.json()

# 結果確認
if result.get('success'):
print(f"注文 {order_id} をキャンセルしました。")
else:
print("キャンセルに失敗しました:", result)

✅ ポイント解説

  • キャンセル対象の注文IDは、前章で取得した orders の中から選びます。
  • POSTリクエスト時の body(フォームデータ)も署名対象に含める必要があります。
  • 結果の success: true を確認してキャンセル成功を判断します。

💡 補足:複数注文をまとめてキャンセルするには?

複数の注文を一括でキャンセルしたい場合は、前章で取得した注文一覧をループで処理して、以下のように実装できます:

for order in data['orders']:
if 条件に合致: # 例:古い注文、特定価格の注文など
cancel_order(order['id']) # 上記関数を使ってキャンセル

cancel_order() 関数に分けて整理しておくと便利です。




5. 安全に使うためのポイント

注文を自動でキャンセルできるようになると便利な反面、**「うっかり全部キャンセルしてしまった!」**なんてミスも起こりやすくなります。

ここでは、自動キャンセル処理を安全に使うための3つのポイントを紹介します。


✅ 1. 条件チェックをしっかり入れる

何も考えずに全注文をキャンセルしてしまうと、まだ有効な注文利益を狙っている注文まで消してしまう可能性があります。

たとえば、以下のような条件を設けてからキャンセルするのがおすすめです:

# 注文が30分以上前に出されたものだけキャンセル
from datetime import datetime, timezone
import dateutil.parser

now = datetime.now(timezone.utc)

for order in orders:
created = dateutil.parser.parse(order['created_at'])
if (now - created).seconds > 1800:
cancel_order(order['id'])

✅ 2. ログを出力して記録を残す

自動売買では、「なぜその注文がキャンセルされたのか」を後から確認できることがとても重要です。

with open('cancel_log.txt', 'a') as f:
f.write(f"{datetime.now()}: Canceled order {order_id}\n")

これだけでも、あとからトラブルが起きたときに原因を追跡しやすくなります


✅ 3. メールやLINEで通知を飛ばす

もし間違った注文をキャンセルしてしまっても、すぐ気づければ大事には至りません。
キャンセルのたびに、通知が飛ぶように設定しておくと安心です。

たとえば、Gmail API を使えば、Pythonから簡単にメール通知を送ることができます。

# キャンセル成功時に通知メールを送信(Gmail APIと組み合わせ)
send_email(f"Order {order_id} was canceled.")

※ LINE Notify や Slack API などと連携するのもおすすめです。


🛡 まとめ:自動キャンセルは「慎重」かつ「記録重視」で

キャンセルの自動化は便利ですが、油断すると資金の損失機会の損失にもつながります。

だからこそ、

  • 条件付きでの実行
  • ログ出力
  • 通知連携

といった安全対策を組み合わせて、「信頼できる自動売買システム」を作っていきましょう!




6. 実行例:特定条件の注文だけ自動キャンセルする

ここまでの内容を活かして、実際に「条件を満たす注文だけを自動キャンセルする」Pythonスクリプトを作ってみましょう。

今回は例として、**「30分以上前に出された未約定の注文だけをキャンセルする」**というケースを扱います。


🔁 処理の流れ

  1. 未約定注文を取得する(/orders/opens
  2. 各注文の作成日時を確認
  3. 30分以上経過していればキャンセルする
  4. ログ出力 or 通知を行う

💻 実装コード

import time
import requests
import hmac
import hashlib
from datetime import datetime, timezone
import dateutil.parser

# --- API認証情報(安全に管理を!) ---
API_KEY = 'あなたのAPIキー'
API_SECRET = 'あなたのシークレットキー'

# --- 注文一覧の取得 ---
def get_open_orders():
url = 'https://coincheck.com/api/exchange/orders/opens'
nonce = str(int(time.time() * 1000))
message = nonce + url
signature = hmac.new(API_SECRET.encode(), message.encode(), hashlib.sha256).hexdigest()

headers = {
'ACCESS-KEY': API_KEY,
'ACCESS-NONCE': nonce,
'ACCESS-SIGNATURE': signature
}

res = requests.get(url, headers=headers)
return res.json().get('orders', [])

# --- 注文キャンセル ---
def cancel_order(order_id):
url = 'https://coincheck.com/api/exchange/orders/cancel'
nonce = str(int(time.time() * 1000))
body = f"order_id={order_id}"
message = nonce + url + body
signature = hmac.new(API_SECRET.encode(), message.encode(), hashlib.sha256).hexdigest()

headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'ACCESS-KEY': API_KEY,
'ACCESS-NONCE': nonce,
'ACCESS-SIGNATURE': signature
}

response = requests.post(url, headers=headers, data={'order_id': order_id})
result = response.json()
if result.get('success'):
print(f"[OK] 注文ID {order_id} をキャンセルしました")
with open("cancel_log.txt", "a") as f:
f.write(f"{datetime.now()}: Canceled order {order_id}\n")
else:
print(f"[ERROR] 注文ID {order_id} のキャンセル失敗: {result}")

# --- 条件に基づく自動キャンセル処理 ---
def auto_cancel_old_orders():
now = datetime.now(timezone.utc)
orders = get_open_orders()

for order in orders:
created_at = dateutil.parser.parse(order['created_at'])
elapsed_sec = (now - created_at).total_seconds()

# 30分(1800秒)以上経過していたらキャンセル
if elapsed_sec > 1800:
cancel_order(order['id'])
else:
print(f"注文ID {order['id']} はまだ新しいためスキップ")

# --- メイン処理実行 ---
if __name__ == "__main__":
auto_cancel_old_orders()

📌 補足:カスタマイズのヒント

  • 「買い注文のみ」「売り注文のみ」など、order_typeでフィルター可能。
  • 「価格が◯◯円より高い場合のみ」などの条件を組み合わせることで、より細かいコントロールが可能です。

このスクリプトをターミナルから定期実行すれば、古くなった注文が自動で整理される仕組みを作れます。
cronやタスクスケジューラーを使って、10分おきに実行するのもおすすめです。




7. まとめ|自動売買は「注文の最適化」も重要!

ここまで、PythonとCoincheck APIを使って注文を確認・キャンセルする方法を紹介してきました。

自動売買というと「売る」「買う」といったアクションが注目されがちですが、実はその裏で、「不要な注文をどう処理するか」も同じくらい重要です。


📌 今回のポイントをおさらい

  • 注文一覧の取得:未約定の注文をAPIから取得できる
  • 注文のキャンセル:特定の注文をPythonコードで安全に取り消せる
  • 条件付きの自動化:注文の経過時間やタイプに応じて柔軟に処理できる
  • 安全設計が大事:誤操作を防ぐためのフィルター・ログ・通知も実装しよう

🧠 注文管理の自動化で、次のステージへ!

注文を「出すだけ」ではなく、「管理して最適化」することで、自動売買の仕組みは一段と進化します。

放置された注文を放っておくと、資金が拘束されたまま機会損失が発生することもあります。
だからこそ、今回紹介したような処理を組み込んで、クリーンで効率的なトレード環境を整えていきましょう。


よくある質問(Q&A)

Q
間違って全部の注文をキャンセルしてしまうのが怖いのですが…
A

条件付きで絞り込む処理を必ず入れましょう。
本記事では「30分以上前の注文だけキャンセルする」例を紹介しましたが、order_type(buy/sell)やrate(価格)など、他の条件も組み合わせて誤キャンセルを防ぐことが可能です。

Q
キャンセルできない注文があるのはなぜですか?
A

注文がすでに約定(成立)済みの可能性があります。
/orders/opens APIで取得できるのは「未約定」の注文だけです。すでに取引が成立した注文にはキャンセル処理は行えません。

Q
注文の作成時間をどうやって比較すればいいですか?
A

created_at の値を datetime 型に変換して現在時刻と比較します。
Pythonの dateutil.parser.parse() 関数を使えばISO形式の日時を簡単に扱えるので便利です。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク