Bot

仮想通貨botの開発を本格的に始めてみる#7(2023/9/6)

2023年9月7日

前回の内容に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

今回のテーマは「CCXTライブラリを使って注文を出す方法をマスターする」です。

仮想通貨のbot取引において必要になる基本情報を獲得したり、注文を出したりする方法を一つずつ学んでいきます。

そろそろPythonの基本構造にも興味が出てきたので、このサイトで基礎固めもしました。

また、bitFlyerにおけるccxtの利用法について具体的に解説しているサイトを見つけたのでブックマークしました。

【Python】ccxtを活用した仮想通貨・ビットコイン取引の自動売買|板情報・価格・注文・約定APIの利用

価格情報を獲得する

最初に打ち込んだのはこのコード。

import ccxt
from pprint import pprint

bitflyer = ccxt.bitflyer()
ticker = bitflyer.fetch_ticker('BTC/JPY',params = {"product_code" : "FX_BTC_JPY"})
pprint( ticker )

4行目は分からないことだらけだったため、早速調べることになりました。

今回はティッカー情報を取得したいので、fetchでbitflyerの全てのティッカー情報の中からFX取引でのビットコインの日本円価格に関する情報を抜き出しています。

ここでは、fetch_tickerというメソッドを使用していた情報を獲得する指示を出しています。

参考にしたサイト一覧は以下の通り。

特に4番目のサイトは、取引所ごとのCCXTの使い方がまとめられているため、今後もお世話になりそうです。

ティッカー 用語フェッチ 【fetch】フェッチ【DB】ccxtを活用した仮想通貨・ビットコイン取引の自動売買

証拠金残高を確認したり、買い注文を出したりすることに関しては、問題なくさっさとクリアできました。

注文状況の管理

解説サイトのコードではデータが取得できなかったため、コメント欄を確認して修正コードを書くことに。

以下のコードで、注文状況のデータを取得できました。

import ccxt
from pprint import pprint

bitflyer = ccxt.bitflyer()
bitflyer.apiKey = ''
bitflyer.secret = ''

orders = bitflyer.fetch_open_orders(
symbol = "BTC/JPY:JPY",
params = { "product_code" : "FX_BTC_JPY" })
pprint( orders )

赤字の部分が変更箇所。

コメント欄で解決策を見つけた人は「Twitterで検索をかけた」と書き込んでいたため、今後のトラブルシューティングの方法として覚えておきたいです。

注文idの取得は、コードの一部を書き換えれば良いため、すぐに完了しました。

しかし、基本的な構文の理解(for/if/while)はまだ定着していないため、復習が必要です。

まとめ

注文状況を取得したり、細かい部分での理解が不十分だったりする中で、不具合の原因まで特定することが難しいな、と感じています。

特にsymbolの変更がなぜ有効なのか、BTC/JPY:JPYと書き換えれば良いという情報はどこから拾ってきたのか、そもそも注文状況の確認方法はccxtで拾ってくるのかAPIで拾ってくるのかなどがはっきりしていません。

これは、次回以降の重要課題ですね。

とりあえず、次回以降も作業をコツコツ進めていくしかなさそうです。

次回は「注文のキャンセル」から取り組んでいきます。

追記(2024/1/26):疑問の解決

BTC/JPY:JPYと書き換えれば良いという情報はどこから拾ってきたのか

という疑問はコメントを頂いたことがきっかけで解決しました。

Yodaka

情報を下さったHiroさんに感謝です。

#47の記事で掲載した「任意の取引所で取引可能なシンボル(トークンペア)を 獲得するコード」をbitFlyer用に書き換えてコードを実行すると、「BTC/JPY:JPY」が取引可能なシンボルの一覧に表示されました。

import ccxt

def get_exchange_symbols(exchange_name):
    try:
        # 取引所のインスタンスを作成
        exchange = getattr(ccxt, exchange_name)()

        # 取引所のシンボル(トークンのペア)を取得
        symbols = exchange.load_markets().keys()

        return symbols

    except ccxt.NetworkError as e:
        print(f"Network error: {e}")
    except ccxt.ExchangeError as e:
        print(f"Exchange error: {e}")
    except Exception as e:
        print(f"An error occurred: {e}")

# 取引所の名前(KuCoinの場合は 'kucoin' を指定)
exchange_name = 'bitflyer'

# 取引所のシンボル(トークンのペア)を取得
symbols = get_exchange_symbols(exchange_name)

# 結果を表示
print(f"{exchange_name}の取引可能なシンボル(トークンのペア):")
for symbol in symbols:
    print(symbol)
Yodaka

ccxtのコードを読む」ことで解決できる類の問題でした。

今後、同じような疑問を抱いた時には「コードを読んで、何を返り値をしているのか」と「どんなデータ型でやりとりしているのか」を確認することにします。

-Bot