こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- 暗号資産(仮想通貨)の自動取引に興味がある
- Coincheck APIの取得方法が知りたい
- Python環境でAPI機能を利用する方法が知りたい
- 仮想通貨(ビットコイン等)の自動売買ツールを自作したい
暗号資産(仮想通貨)の自動取引とは
仮想通貨の自動取引とは、通貨情報参照・決済・送金等の取引に関連する操作をプログラムで代替することを指します。
システム化された自動取引ツールを作成することで、手動操作による手間削減はもちろんのこと、仮想通貨収益化プロセスの効率化にも繋がります。
自動取引ツールの実装には「取引所が提供するAPI」が欠かせません。
APIと聞くと、難しく感じるかもしれませんが、実際に使ってみると意外と簡単!と思えるはずです。
本記事では仮想通貨の自動取引ツール作成に挑戦してみたい方向けに、Python環境でCoincheckのAPIを活用し、仮想通貨自動取引ツールを作成する方法について解説します。
なお、後述のPythonプログラムは、ビットコイン取引を例に言及しますが、ビットコイン以外の通貨にも横展開できる内容となっております。ビットトコイン以外の自作ツールを作成したい方も必見です!
様々な仮想通貨の自動売買手法はこちらの記事で解説しています。合わせてご覧下さい。
【仮想通貨】自動売買ツールの自作方法とおすすめ暗号資産取引所|無料で実践できるビットコイン自動取引の仕組みも徹底解説
「仮想通貨(暗号資産)の自動売買ツール作成に興味がある」「自動売買の仕組み・作り方を知りたい」「どこの仮想通貨取引所がおすすめなのか知りたい」本記事ではこのような要望にお応えします。
コインチェック(Coincheck)取引所の概要・API取得方法
Coincheck取引所のAPIを用いて自動売買ツールを作成する前に、Coincheckの概要とAPIを利用する上で必要となる事前準備について言及します。
Coincheckとは、東証プライム上場マネックスグループ会社が運用する暗号資産取引所です。
2023年時点で国内最大級の仮想通貨を取扱っていたり、Coincheckが提供する仮想通貨アプリは、アプリ画面の見やすさや使い勝手の良さに定評があることから、2019年仮想通貨アプリダウンロード数No1を記録したりなど、評判高い特徴を多数有しています。
Coincheckが提供するサービスのセキュリティレベルや安全性は非常に高く、金融庁に登録もされている暗号資産交換業者であるため、安心して活用できる点も好評です。
【参考】主要な仮想通貨取引所の比較情報
取引所名 | 最低取引量 | 現物取引手数料*1 | 入金手数料[円] | 入金手数料[BTC] | 出金手数料[円] | 送金手数料[BTC] | 信用取引 | API提供 | ccxt | 自動売買おすすめ |
---|---|---|---|---|---|---|---|---|---|---|
Coincheck | 0.005 BTC | 無料 | 無料 | 無料 | 407円 | 0.0005 BTC | × | ○ | ○ | ★★★★★ |
GMOコイン | 0.0001BTC | Maker:-0.01% Taker:0.05% | 無料 | 無料 | 0円/ 400円(大口出金) | 無料 | ○ | ○ | × | ★★★★☆ |
bitbank | 0.0001BTC | Maker:-0.02% Taker:0.12% | 無料 | 無料 | 550円/ 770円(3万円以上) | 0.0006 BTC | × | ○ | ○ | ★★★★☆ |
BITPOINT | 0.0001 BTC | 無料 | 無料 | 無料 | 330 円 | 無料 | × | ○ | × | ★★★☆☆ |
- 現物取引手数料の対象通貨はBTC/JPY。手数料は約定数量 × 上記記載の割合[%]として算出可能。
Coincheckの取引所は取引時の手数料が無料であり、最低取引数量も低いという特徴から、仮想通貨取引未経験者にも優しい条件が揃っていると言えます。
また、ビットコイン価格取得や売買機能だけでなく送金系のAPI機能も提供しているため、高度かつ柔軟な自動取引ツールを作成したい方も必見です。
Coincheckの口座開設
仮想通貨の自動売買ツールには、APIの利用が必須です。
Coincheck APIを使うには、事前にCoincheckの口座開設をしておく必要があります。
Coincheckの口座開設が未済の方は下記より開設手続きを行いましょう。口座開設はスマホと本人確認書類さえあれば10分で手続き完了でき、即日口座開設および暗号資産取引も瞬時に開始できます。
Coincheck APIアクセスキー・シークレットを取得
口座開設完了後は、APIを利用するための認証情報をCoincheckマイページから入手する必要があります。
以下、APIアクセスキーとシークレットキーの取得手順を示します。
(1) Coincheck取引アカウントにログインする
(2) 2段階認証ページを開く
(3) 2段階認証を完了する
(4) APIキーページを開く
(5) API認証情報(APIアクセスキーとシークレットキー)を獲得する
利用したいAPI機能は上記チェックボックスにマークをつけましょう。
グローバルIPアドレスと取引所アカウントのパスワードを入力して「OK」をクリックします。
その後「APIアクセスキー」と「シークレットキー」が取得できます。これらは後述のプログラミング実践で利用しますので、お手元にメモを残しておきましょう。
【Python】Coincheck APIの使い方解説とビットコイン自動売買実践
仮想通貨自動取引をPythonで実現するために、次のようなCoincheck API機能の使い方を解説します。
No | 作成する自動売買機能 |
---|---|
必須 | APIキー・シークレットキー設定 |
1 | 取引通貨情報の取得 |
2 | 板情報の取得 |
3 | 残高情報の取得 |
4 | 仮想通貨を注文 |
5 | 仮想通貨の注文内容キャンセル |
6 | 注文内容の照会 |
7 | 約定結果の確認 |
8 | 入出金記録を確認 |
9 | ビットコインの送金 |
※Coincheck APIはccxtという暗号資産APIを容易に扱えるパッケージに対応しているため、そちらを用いることします。
事前にccxtをインストールしておきましょう!
pip install ccxt
APIキー・シークレットキーの設定
仮想通貨自動売買ツールの動作実行に必要なAPI認証情報を記述します。必要となるPythonパッケージも合わせてインポートしましょう。
import ccxt
from pprint import pprint
apiKey = "APIアクセスキーを入力"
secret = "シークレットキーを入力"
# Coincheck取引所のインスタンス作成
coincheck = ccxt.coincheck({'apiKey':apiKey,'secret':secret})
取引通貨情報の取得
Coincheckが取り扱う暗号資産情報は下記を実行することで確認可能です。
# 取引通貨
def market_info():
result = coincheck.load_markets()
return result
# 出力
pprint(market_info())
# 出力イメージ
# {'BTC/JPY': {'base': 'BTC',
# 'baseId': 'btc',
# 'id': 'btc_jpy',
# 'limits': {'amount': {'max': None, 'min': None},
# 'cost': {'max': None, 'min': None},
# 'leverage': {'max': None, 'min': None},
# 'price': {'max': None, 'min': None}},
# 'maker': 0.0,
# 'percentage': True,
# 'precision': {},
# 'quote': 'JPY',
# 'quoteId': 'jpy',
# 'spot': True,
# 'symbol': 'BTC/JPY',
# 'taker': 0.0,
# 'tierBased': False,
# 'type': 'spot'},
# 'ETC/BTC': {'base': 'ETC',
# 'baseId': 'etc',
# 'id': 'etc_btc',
# 'limits': {'amount': {'max': None, 'min': None},
# 'cost': {'max': None, 'min': None},
# 'leverage': {'max': None, 'min': None},
# 'price': {'max': None, 'min': None}},
# 'maker': 0.0,
# 'percentage': True,
# 'precision': {},
# 'quote': 'BTC',
# 'quoteId': 'btc',
# 'spot': True,
# 'symbol': 'ETC/BTC',
# 'taker': 0.0,
# 'tierBased': False,
# 'type': 'spot'},
# 'ETC/JPY': {'base': 'ETC',
# 'baseId': 'etc',
# 'id': 'etc_jpy',
# 'limits': {'amount': {'max': None, 'min': None},
# 'cost': {'max': None, 'min': None},
# 'leverage': {'max': None, 'min': None},
# 'price': {'max': None, 'min': None}},
# 'maker': 0.0,
# 'percentage': True,
# 'precision': {},
# 'quote': 'JPY',
# 'quoteId': 'jpy',
# 'spot': True,
# 'symbol': 'ETC/JPY',
# 'taker': 0.0,
# 'tierBased': False,
# 'type': 'spot'},
# 'FCT/JPY': {'base': 'FCT',
# 'baseId': 'fct',
# 'id': 'fct_jpy',
# 'limits': {'amount': {'max': None, 'min': None},
# 'cost': {'max': None, 'min': None},
# 'leverage': {'max': None, 'min': None},
# 'price': {'max': None, 'min': None}},
# 'maker': 0.0,
# 'percentage': True,
# 'precision': {},
# 'quote': 'JPY',
# 'quoteId': 'jpy',
# 'spot': True,
# 'symbol': 'FCT/JPY',
# 'taker': 0.0,
# 'tierBased': False,
# 'type': 'spot'},
# 'MONA/JPY': {'base': 'MONA',
# 'baseId': 'mona',
# 'id': 'mona_jpy',
# 'limits': {'amount': {'max': None, 'min': None},
# 'cost': {'max': None, 'min': None},
# 'leverage': {'max': None, 'min': None},
# 'price': {'max': None, 'min': None}},
# 'maker': 0.0,
# 'percentage': True,
# 'precision': {},
# 'quote': 'JPY',
# 'quoteId': 'jpy',
# 'spot': True,
# 'symbol': 'MONA/JPY',
# 'taker': 0.0,
# 'tierBased': False,
# 'type': 'spot'}}
板情報の取得
板情報は次のコードを実行して取得します。関数の引数には、通貨情報(symbol)を指定しましょう。
# 板情報
def ticker_info(symbol):
result = coincheck.fetch_ticker(symbol=symbol)
return result
# 引数情報
symbol = "BTC/JPY"
# 出力
pprint(ticker_info(symbol))
# 出力イメージ
# {'ask': 5560505.0,
# 'askVolume': None,
# 'average': None,
# 'baseVolume': 1780.57586135,
# 'bid': 5561750.0,
# 'bidVolume': None,
# 'change': None,
# 'close': 5560926.0,
# 'datetime': '2022-04-06T00:31:02.000Z',
# 'high': 5795245.0,
# 'info': {'ask': '5560505.0',
# 'bid': '5561750.0',
# 'high': '5795245.0',
# 'last': '5560926.0',
# 'low': '5505328.0',
# 'timestamp': '1649205062',
# 'volume': '1780.57586135'},
# 'last': 5560926.0,
# 'low': 5505328.0,
# 'open': None,
# 'percentage': None,
# 'previousClose': None,
# 'quoteVolume': None,
# 'symbol': 'BTC/JPY',
# 'timestamp': 1649205062000,
# 'vwap': None}
残高情報の取得
Coincheckに入金した日本円残高や仮想通貨残高情報を確認したい場合、次のように実行します。
# 残高
def balance_info():
result = coincheck.fetchBalance()
return result
# 出力
pprint(balance_info())
# 出力イメージ
# {'BTC': {'free': 3.0, 'total': 3.0, 'used': 0.0},
# 'ETC': {'free': 0.0, 'total': 0.0, 'used': 0.0},
# 'FCT': {'free': 0.0, 'total': 0.0, 'used': 0.0},
# 'JPY': {'free': 1000000, 'total': 1000000, 'used': 0.0},
# 'MONA': {'free': 0.0, 'total': 0.0, 'used': 0.0},
# 'free': {'BTC': 0.0,
# 'ETC': 0.0,
# 'FCT': 0.0,
# 'JPY': 110910.95445186,
# 'MONA': 0.0},
# 'total': {'BTC': 0.0,
# 'ETC': 0.0,
# 'FCT': 0.0,
# 'JPY': 1000000,
# 'MONA': 0.0},
# 'used': {'BTC': 0.0, 'ETC': 0.0, 'FCT': 0.0, 'JPY': 0.0, 'MONA': 0.0}}
仮想通貨の注文
仮想通貨を注文できるコードは以下になります。
コード実行で実際に注文が走ります。取り扱いには十分注意です。
# 引数情報
order_symbol = 'BTC/JPY' # 取引通貨
type_value = 'limit' # 注文タイプ(limit:指値注文, market:成行注文)
side_value = 'buy' # 買い(buy) or 売り(sell)
price_value = 4000000 # 指値価格[円/BTC]
amount_value = 0.005 # 取引数量[BTC]
# 注文コード
order = coincheck.create_order(
symbol = order_symbol, # 取引通貨
type = type_value, # 注文タイプ
side= side_value, # 買 or 売
amount= amount_value, # 取引数量
price=price_value, # 指値価格
)
# 結果出力
pprint(order)
# 出力イメージ
{'id': '1000000000',
'info': {'amount': '0.005',
'created_at': '2022-12-12T00:00:00.000Z',
'id': '1000000000',
'market_buy_amount': None,
'order_type': 'buy',
'pair': 'btc_jpy',
'rate': '4000000.0',
'stop_loss_rate': None,
'success': True}}
ccxt.create_order()に次のような引数を渡してビットコインの注文を行なっています。
引数名 | 概要 | 必須or任意 |
---|---|---|
symbol | 取引通貨 | 必須 |
type | 成行(market)or指値(limit) | 必須 |
price | 指値価格 | 指値注文では必須 |
side | 売買(buy or sell) | 必須 |
amount(またはquantity) | 仮想通貨取引数量 | 必須 |
ビットコインの注文内容キャンセル
注文のキャンセルには、注文IDを引数に指定し、次のように実行します。
def OrderCancel(order_id, symbol):
result = coincheck.cancel_order(
symbol = symbol, # 取引通貨
id = order_id, # 注文ID
)
return result
# 引数情報
order_id = '1000000001'
symbol = 'BTC/JPY'
# 出力
pprint(OrderCancel(order_id,symbol))
# 出力イメージ
# {'id': '1000000001', 'success': True}
注文の照会
指値注文した際、約定せずに注文が残り続ける場合があります。そのような未約定の注文照会は、次のようなコードが有効です。
関数の引数には、通貨情報(symbol)を指定しましょう。
def OpenOrder(symbol):
result = coincheck.fetchOpenOrders(symbol = symbol)
return result
# 引数情報
symbol = 'BTC/JPY'
# 出力
pprint(OpenOrder(symbol))
# 出力イメージ
# [{'amount': -0.0015,
# 'cost': 5839.7265,
# 'datetime': '2022-06-00T00:00:00.000Z',
# 'fee': {'cost': 0.0, 'currency': None},
# 'fees': [{'cost': 0.0, 'currency': None}],
# 'id': '1000000001',
# 'info': {'created_at': '2022-06-00T00:00:00.000Z',
# 'fee': '0.0',
# 'fee_currency': None,
# 'funds': {'btc': '-0.0015', 'jpy': '500.0000'},
# 'id': '1000000001',
# 'liquidity': 'T',
# 'order_id': '1000000001',
# 'pair': 'btc_jpy',
# 'rate': '5000000.0',
# 'side': 'sell'},
# 'order': '1000000001',
# 'price': 3893151.0,
# 'side': 'sell',
# 'symbol': 'BTC/JPY',
# 'takerOrMaker': 'taker',
# 'timestamp': 111111111111,
# 'type': None},
# ]
約定結果の確認
約定した取引結果は、次に示すコードで確認できます。
通貨情報(symbol)を引数に指定しましょう。
def Yakujo(symbol):
result = coincheck.fetchMyTrades(symbol = symbol)
return result
# 引数情報
symbol = 'BTC/JPY'
# 出力
pprint(Yakujo(symbol))
# 出力イメージ
# [{'amount': -0.0015,
# 'cost': 5839.7265,
# 'datetime': '2022-06-00T00:00:00.000Z',
# 'fee': {'cost': 0.0, 'currency': None},
# 'fees': [{'cost': 0.0, 'currency': None}],
# 'id': '1000000001',
# 'info': {'created_at': '2022-06-00T00:00:00.000Z',
# 'fee': '0.0',
# 'fee_currency': None,
# 'funds': {'btc': '-0.0015', 'jpy': '500.0000'},
# 'id': '1000000001',
# 'liquidity': 'T',
# 'order_id': '1000000001',
# 'pair': 'btc_jpy',
# 'rate': '5000000.0',
# 'side': 'sell'},
# 'order': '1000000001',
# 'price': 3893151.0,
# 'side': 'sell',
# 'symbol': 'BTC/JPY',
# 'takerOrMaker': 'taker',
# 'timestamp': 111111111111,
# 'type': None},
# ]
ビットコインの送金
ビットコインの送金には、送り先のアドレスと送付数量[BTC]を引数に渡して次のように実行します。
ビットコインの送金はccxtに対応していないため、request
モジュールを用いて記述しています。
import json
import requests
import time
import hmac
import hashlib
def send_bitcoin(address,amount):
# 認証情報
timestamp = str(int(time.time()))
base_url = 'https://coincheck.com'
path = '/api/send_money'
# 送付先情報
params = json.dumps({
"address": address,
"amount": amount,
})
# リクエストメッセージ
message = timestamp + base_url + path + params
# 署名:シークレットキーを用いて、上記messageをHMAC-SHA256 hash形式で署名した結果
signature = hmac.new(
bytes(secret.encode('ascii')),
bytes(message.encode('ascii')),
hashlib.sha256
).hexdigest()
# HTTPヘッダー作成
headers = {
'ACCESS-KEY': apiKey,
'ACCESS-NONCE': timestamp, # リクエスト毎に増加する必要のある正の整数。UNIXタイムスタンプを利用。
'ACCESS-SIGNATURE': signature, # 署名
'Content-Type': 'application/json' # APIでサポートするデータ形式
}
return requests.post(base_url+path, # リクエスト先
data=params, # Post情報
headers=headers # ヘッダー情報
).json()
# 引数情報
address = '送り先のアドレス' # 送り先のアドレス
amount = 0.1 # 送付数量[BTC]
# 関数実行
send_bitcoin(address,amount)
# 出力イメージ
# {'success': True, 'address': 'xxxxxxxxxx'}
たまに以下のようなエラーに遭遇することがあるかもしれません。
{'success': False, 'error': 'Nonce must be incremented'}
このエラーに遭遇した場合、一度APIキーを新しく作成することで解消されることが多々あります。
暗号資産の取引経験があり、レバレッジ取引もしたい方には、GMOコインのAPIもおすすめです。
レバレッジ取引のAPI機能を活用すると、自作ツールでできることが大幅に広がります。
Coincheck同様「API機能が豊富」「最低取引単位を小さく設定できる」「取引時の手数料が低い」という特徴があるため、使い勝手が良いと言えます。
【Python】GMOコインAPIで仮想通貨取引の自動売買|ビットコイン等の板情報・残高・現物信用注文の自動化方法解説
本記事は「仮想通貨の自動売買に興味がある」「自動売買ツールを自作したい」という方を対象としたプログラム解説記事です。
【仮想通貨・ビットコイン】自動取引実践法・その他優良情報
最後までご覧いただきありがとうございました。当サイトでは仮想通貨・ビットコインにおける多様な自動取引手法の解説記事を多数取り扱っております。
取引所別:APIの取得手順と使い方の解説記事
対応言語 | 記事名 |
---|---|
Python | 【GMOコイン】 APIで仮想通貨取引の自動化 |
Python | 【BitTrade】 APIで仮想通貨取引の自動化 |
Python | 【bitbank】 APIで仮想通貨取引の自動化 |
Python | 【Coincheck】APIで仮想通貨取引の自動化 |
Python | 【bitFlyer】APIで仮想通貨取引を自動化 |
Python | 【BITPOINT】APIで仮想通貨取引の自動化 |
機械学習やテクニカル分析を採用した仮想通貨取引の解説記事
対応言語 | 記事名 | 指標 |
---|---|---|
共通 | 自動売買の種類・自作時のポイント | 全て |
Python | リアルタイムチャート分析基礎 | トレンド |
Python | 移動平均線 | トレンド |
Python | ゴールデンクロス・デッドクロス | トレンド |
Python | アービトラージ(裁定取引) | 時間・値幅 |
Python | ボリンジャーバンド | オシレータ |
Python | MACD | オシレータ |
Python | RSI | オシレータ |
Python | 時系列予測モデルの構築 | 機械学習・AI |
【オシレータ】:現在の相場に対する買われすぎ・売られすぎの判断に有効
その他仮想通貨自動トレード解説記事
対応言語 | 記事名 |
---|---|
Python | 【データ収集】仮想通貨の過去データを大量取得する方法 |
Python | 【初心者向け】ccxtを活用した仮想通貨の自動取引 |
Node.js | 【初心者向け】ccxtを活用した仮想通貨の自動取引 |
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら