Bot

仮想通貨botの開発を本格的に始めてみる#36(2023/11/30)「bitbank用サーキットブレーカーBotの開発①ChatGPTによる解説付き」

2023年11月30日

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

今回は、bitbank用のサーキットブレーカーBotをChatGPTtを使って作成してみました。

参考にしたのは、こちらの記事

前回の記事である「#35サーキットブレーカーBotの開発②」もベースにしています。

bitbankのサーキットブレーカー制度」についてはこちらから。

bitbank用サーキットブレーカーBot

ChatGPTに出した指示は以下の通り。貼り付けたコードは「#35」の記事で紹介したものです。

Yodaka

下記のコードをbitbankで利用できるように書き換えなさい。

以下、コードの貼り付け。

提示されたコードは以下の通り。

import ccxt
import datetime
import time

# APIキーとAPIシークレットを直接設定
api_key = 'Your API KEY'
api_secret = 'Your API SECRET'

# bitflyerをbitbankに変更
bitbank = ccxt.bitbank({
    'apiKey': api_key,
    'secret': api_secret,
})

symbol = 'btc_jpy'  # BitbankではFXの場合、通貨ペアが異なります

def get_current_price():
    ticker = bitbank.fetch_ticker(symbol)
    return ticker['last']

def close_order(order_id):
    try:
        bitbank.cancel_order(order_id, symbol)
        print(f"注文 {order_id} が手仕舞いされました。")
    except ccxt.NetworkError as e:
        print(f"手仕舞いエラー(ネットワークエラー): {str(e)}")
    except ccxt.ExchangeError as e:
        print(f"手仕舞いエラー(取引所エラー): {str(e)}")
    except Exception as e:
        print(f"手仕舞いエラー(その他のエラー): {str(e)}")

# メインのループ処理
buy_order = None
sell_order = None

while True:
    try:
        closest_diff = 1000000000
        closest_num = 0

        # 現在のUNIXタイムスタンプを取得
        current_time = datetime.datetime.now().timestamp()

        # 10分前のUNIXタイムスタンプを計算
        ten_minutes_ago = current_time - 600

        # 約定履歴を取得
        trades = bitbank.fetch_trades(symbol, limit=500)
        for i in range(len(trades)):
            time_diff = (trades[i]["timestamp"] - ten_minutes_ago * 1000) / 1000
            if abs(time_diff) < closest_diff:
                closest_diff = abs(time_diff)
                closest_num = i

        past_price = trades[closest_num]["price"]

        current_price = get_current_price()

        # 注文を作成する条件: 過去の価格と現在の価格が20%以上の変動率を超えた場合に注文を作成する
        price_change_ratio = (current_price - past_price) / past_price
        if abs(price_change_ratio) > 0.2:  # 例: 価格変動率が20%以上の場合

            # 既に買い注文が存在しない場合に注文を作成
            if buy_order is None:
                buy_price = int(current_price * 0.8)
                buy_order = bitbank.create_order(symbol, "limit", "buy", 0.01, buy_price)
                print("買い注文が発注されました.")

            # 既に売り注文が存在しない場合に注文を作成
            if sell_order is None:
                sell_price = int(current_price * 1.2)
                sell_order = bitbank.create_order(symbol, "limit", "sell", 0.01, sell_price)
                print("売り注文が発注されました.")

            while True:
                time.sleep(5)  # 注文が発注されてから手仕舞いを試みるまでの待機時間
                current_price = get_current_price()

                # 利益率が一定の閾値を超えた場合に手仕舞いを試みる
                if (current_price - past_price) / past_price > 0.15:  # 例: 利益率がX%以上の場合
                    close_order(buy_order['id'])
                    close_order(sell_order['id'])
                    break  # 手仕舞いが成功したらループを抜ける

    except ccxt.NetworkError as e:
        print(f"ネットワークエラーが発生しました: {str(e)}")
        time.sleep(5)
    except ccxt.ExchangeError as e:
        print(f"取引所エラーが発生しました: {str(e)}")

        # 取引所エラーの場合、エラーメッセージを表示
        print(f"取引所エラーメッセージ: {e}")

        time.sleep(5)
    except Exception as e:
        print(f"予期せぬエラーが発生しました: {str(e)}")
        time.sleep(5)

今後は実際にbitbankで稼働させて、収益の記録をつけていきます。

まずは、bitbankの流動性が充分に保証されているかを調べます。

その後で本格で的に稼働させていくことにします。(勝てないところで戦っても仕方がないので)

このコードを用いる場合は、bitbankのサーキットブレーク制度を熟読してから稼働させることを推奨します。損失等については、自己責任でお願いします。

※本記事を掲載した2023年11月30日の時点では、このコードの効果検証はできていません。

Yodaka

開発のついでに、コードの解説もChatGPTに書かせてみました。

Yodaka

あなたはプログラマーであり教師です。上記のコードをプログラミング初心者に解説するブログ記事を書きなさい。その際、関数やモジュールごとにその意味やコードの果たす役割について項目立てて解説しなさい。 また、初心者にとって専門性の高い言葉があれば、具体例を示して注釈を挟みなさい。

ビットコイン自動取引の基本 - Pythonでの実装解説

こんにちは、みなさん!今回は、Pythonを使ったビットコイン自動取引の基本について解説します。プログラミング初心者の方でも理解しやすいように、コードの各部分を詳しく説明していきます。始める前に、Pythonの基本的な知識があると理解しやすいかもしれませんが、それでも大丈夫です。では、始めましょう!

1. 必要なツールやライブラリの導入

まず初めに、ビットコインの取引所としてBitbankを使用しています。そのために、Pythonのライブラリである ccxt を使用します。このライブラリは、さまざまな取引所のAPIを簡単に扱えるものです。また、日時や時間関連の処理に使うために、datetimetime モジュールも使います。

import ccxt
import datetime
import time

2. APIキーの設定

ビットコインの取引を自動で行うためには、取引所のAPIキーが必要です。APIキーとは、外部から取引所にアクセスする際の認証に使用されます。ここでは、自身のBitbankのAPIキーとAPIシークレットを api_keyapi_secret に設定します。

api_key = 'Your API KEY'
api_secret = 'Your API SECRET'

3. 取引所への接続

ccxt ライブラリを使用して、Bitbankに接続します。bitbank オブジェクトは、Bitbankとの通信を管理するためのものです。

bitbank = ccxt.bitbank({
    'apiKey': api_key,
    'secret': api_secret,
})

4. 取引対象の通貨ペアの設定

ビットコインの自動取引では、取引対象の通貨ペアを指定する必要があります。ここでは、BTC/JPYの取引を行うために symbol 変数に btc_jpy を設定しています。

symbol = 'btc_jpy'

5. 現在の価格を取得する関数

次に、現在のビットコインの価格を取得するための関数 get_current_price を定義します。これは、bitbank.fetch_ticker(symbol) を使用して最新の価格情報を取得し、その中から最終価格を取り出しています。

def get_current_price():
    ticker = bitbank.fetch_ticker(symbol)
    return ticker['last']

6. 注文を閉じる関数

取引所で注文を閉じるための関数 close_order も用意しています。これは、指定した注文IDを使用して取引所に対して注文のキャンセルを行います。

def close_order(order_id):
    try:
        bitbank.cancel_order(order_id, symbol)
        print(f"注文 {order_id} が手仕舞いされました。")
    except ccxt.NetworkError as e:
        print(f"手仕舞いエラー(ネットワークエラー): {str(e)}")
    except ccxt.ExchangeError as e:
        print(f"手仕舞いエラー(取引所エラー): {str(e)}")
    except Exception as e:
        print(f"手仕舞いエラー(その他のエラー): {str(e)}")

7. メインのループ処理

これからの部分は、実際にビットコインの自動取引を行うメインの処理になります。以下の項目ごとに解説していきます。

7.1. 購入注文と売却注文の初期化

buy_order = None
sell_order = None

ここでは、購入注文と売却注文を管理するための変数を初期化しています。これらは、まだ注文がないことを示すために None としています。

7.2. メインのループ

while True:
    try:
        # 中略
    except ccxt.NetworkError as e:
        print(f"ネットワークエラーが発生しました: {str(e)}")
        time.sleep(5)
    except ccxt.ExchangeError as e:
        print(f"取引所エラーが発生しました: {str(e)}")
        print(f"取引所エラーメッセージ: {e}")
        time.sleep(5)
    except Exception as e:
        print(f"予期せぬエラーが発生しました: {str(e)}")
        time.sleep(5)

ここでのメインのループでは、取引所との通信やエラーのハンドリングを行います。例外処理を行いつつ、エラーが発生した場合には5秒待機してから再度処理を行います。

7.3. 過去の価格の取得

closest_diff = 1000000000
closest_num = 0

current_time = datetime.datetime.now().timestamp()
ten_minutes_ago = current_time - 600

trades = bitbank.fetch_trades(symbol, limit=500)
for i in range(len(trades)):
    time_diff = (trades[i]["timestamp"] - ten_minutes_ago * 1000) / 1000
    if abs(time_diff) < closest_diff:
        closest_diff = abs(time_diff)
        closest_num = i

past_price = trades[closest_num]["price"]

ここでは、直近10分間の取引履歴から最も近い時刻の価格を past_price として取得しています。これにより、価格の変動率を計算する準備が整います。

7.4. 現在の価格と価格変動率の計算

current_price = get_current_price()

price_change_ratio = (current_price - past_price) / past_price

現在の価格を取得し、過去の価格との変動率を計算しています。これにより、価格変動が一定の閾値を超えたかどうかを判定することができます。

7.5. 注文の発行

if abs(price_change_ratio) > 0.2:
    if buy_order is None:
        buy_price = int(current_price * 0.8)
        buy_order = bitbank.create_order(symbol, "limit", "buy", 0.01, buy_price)
        print("買い注文が発注されました.")

    if sell_order is None:
        sell_price = int(current_price * 1.2)
        sell_order = bitbank.create_order(symbol, "limit", "sell", 0.01, sell_price)
        print("売り注文が発注されました.")

価格変動率が一定の閾値を超えた場合に、買い注文と売り注文を発行します。ただし、既に注文が存在する場合は新たに注文を発行しません。

7.6. 利益が一定の閾値を超えた場合の処理

while True:
    time.sleep(5)
    current_price = get_current_price()

    if (current_price - past_price) / past_price > 0.15:
        close_order(buy_order['id'])
        close_order(sell_order['id'])
        break

一度注文が発行された後、価格の変動により一定の利益が出た場合には、注文を手仕舞い(キャンセル)する処理を行います。注文が手仕舞いされたらループを抜け、新たな価格変動の検証に戻ります。

これで、ビットコインの自動取引の基本的な仕組みが理解できましたね!もちろん、実際の取引においては細かな調整やセキュリティの配慮が必要ですが、このコードをベースにして自分の取引戦略を構築してみてください。

初心者の方も、少しずつ理解を深めながら進めていくことが大切です。成功を祈っています!

まとめ

ChatGPTに指示を出すだけで、簡単に横展開ができるのはすごいことですね。

一つのことをしっかり理解していると応用が効く」ということを実感しました。

今後も引き続き、Bot開発を進めていきます。

-Bot