Bot

仮想通貨botの開発を本格的に始めてみる#37(2023/12/10)「MMBotの開発②:基本コード&関数まとめ」

前回の記事「MMBotを自分で開発する①:口座データの獲得と選別」に引き続き、今回も仮想通貨botの開発状況をまとめていきます。

今回は、MMbotを稼働させるための基礎的なコードをまとめます。

ティッカーの取得

ティッカー情報を取得します。

#ティッカー情報を取得する
import ccxt
from pprint import pprint

exchange = ccxt.bitflyer()#取引所の名前を入力する

tiker = exchange.fetch_ticker("BTC/JPY")#参照したい通貨ペアを入力する
pprint(tiker)#順序立てて見やすく表示する

このコードを実行すると、Spyderエディタのコンソールには以下のように表示されます。

板情報の取得

以下のコードで板情報を取得します。

#板情報の取得
import ccxt
from pprint import pprint
exchange = ccxt.bitflyer()#取引所の名前を入力

book = exchange.fetch_order_book('BTC/JPY')#参照したい通貨ペアを入力
pprint(book)#順序立てて見やすく表示

実行結果は以下の通り。

板に並んだ価格注文量を獲得することができています。

ローソク足の取得

以下のコードで、ローソク足のデータを取得します。

#ローソク足の取得
import ccxt
import time
from datetime import datetime

bitflyer = ccxt.bitflyer()#取引所の名前を指定

#ローソク足の取得
candles = bitflyer.fetch_ohlcv('BTC/JPY', timeframe = '1m')#取引所の名前、通貨ペア、何分足かを指定

print(candles)#順序立てて書き出す

プライベートAPIの設定

以下のコードでプライベートAPIを設定します。

プライベートAPIは、取引所に口座を持っていると取得できます。

#プライベートAPIの設定
import ccxt

# APIキーの設定:APIキーとAPIシークレットを入力
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
bitflyer = ccxt.bitflyer({
    'apiKey': api_key,
    'secret': api_secret,
})
# 「=」の左部分は自由に設定可能。後のコードに入れる時に分かりやすいものにしておくと良い。
#「=」より右側は使用する取引所の名前を入力する。

この部分は取引所で稼働させる全てのBotの基本です。

口座残高を確認する

以下のコードで、口座情報を確認できます。

#口座情報を確認
import ccxt
from pprint import pprint

# APIキーの設定:APIキーとAPIシークレットを入力
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
bitflyer = ccxt.bitflyer({
    'apiKey': api_key,
    'secret': api_secret,
})
# 「=」の左部分は自由に設定可能。後のコードに入れる時に分かりやすいものにしておくと良い。
#「=」より右側は使用する取引所の名前を入力する。

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

bit_balance = bitflyer.fetchBalance()#ccxtで口座情報を取得するコード

pprint(bit_balance)#口座情報を書き出す

実行するとSpyderエディタでは、以下のように表示されます。

応用版のコードは、こちら。残高が0以上のものだけを書き出すようにしています。

import ccxt
import time

# APIキーの設定
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
exchange = ccxt.bitflyer({
    'apiKey': api_key,
    'secret': api_secret,
})#exchangeはbitflyerなどに書き換えても良い 

# 残高を取得する関数
def get_balance():
    while True:
        try:
            balance = exchange.fetch_balance()
            return balance
        except ccxt.NetworkError as e:
            print(f"Network error: {e}")
            time.sleep(1)
        except ccxt.ExchangeError as e:
            print(f"Exchange error: {e}")
            time.sleep(1)
        except Exception as e:
            print(f"An unexpected error occurred: {e}")
            time.sleep(1)

# JPY残高を取得する関数
def get_jpy_balance():
    try:
        # ビットフライヤーのAPIを使用してJPY残高を取得
        balance_info = get_balance()
        jpy_balance = float(balance_info['total']['JPY'])  # Convert to float
        return jpy_balance
    except Exception as e:
        print(f"An error occurred while getting JPY balance: {e}")
        return None

# 資産の価格が0円以上のものを取得する関数
def get_assets_above_zero():
    try:
        assets_info = get_balance()
        assets = assets_info['total']
        for asset, value in assets.items():
            if value > 0 and asset != 'JPY':  # JPY以外で0円以上の資産を表示
                print(f"{asset}: {value}")
    except Exception as e:
        print(f"An error occurred while getting assets: {e}")

# FX証拠金の残高を取得する関数
def get_fx_colla():
    while True:
        try:
            fx_colla = exchange.privateGetGetcollateral()
            return float(fx_colla['collateral'])  # Convert to float
        except ccxt.NetworkError as e:
            print(f"Network error: {e}")
            time.sleep(1)
        except ccxt.ExchangeError as e:
            print(f"Exchange error: {e}")
            time.sleep(1)
        except Exception as e:
            print(f"An unexpected error occurred: {e}")
            time.sleep(1)

# メイン処理
try:
    # JPY残高を取得
    jpy_balance = get_jpy_balance()

    # 取得した残高が0以上の場合にコンソールに表示
    if jpy_balance is not None and jpy_balance > 0:
        print(f"JPY Balance: {jpy_balance}")

    # JPY以外の残高が0円以上の場合にコンソールに表示
    get_assets_above_zero()

    # FX証拠金の残高を取得
    fx_colla = get_fx_colla()
    
    # 取得したFX証拠金が0以上の場合にコンソールに表示
    if fx_colla is not None and fx_colla > 0:
        print(f"FX Collateral: {fx_colla}")

except Exception as e:
    print(f"An error occurred: {e}")

実行結果は以下の通り。

このコードの開発については、こちらの記事にもまとめています。「MMBotを自分で開発する①:口座データの獲得と選別」

新規注文を出す

このコードを実行すると、bitFlyerに新規注文を出すことができます。

ccxtのマニュアルを参考にしました。

#新規注文を出す
import ccxt
from pprint import pprint

# APIキーの設定:APIキーとAPIシークレットを入力
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
bitflyer = ccxt.bitflyer({
    'apiKey': api_key,
    'secret': api_secret,
})
# 「=」の左部分は自由に設定可能。後のコードに入れる時に分かりやすいものにしておくと良い。
#「=」より右側は使用する取引所の名前を入力する。

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

#ccxtライブラリを使って新規注文を出す
bitflyer.create_order(
    symbol = 'BTC/JPY',#取引する通貨ペアを入力
    type = 'limit',#limitなら指値、marketなら成行
    side = 'buy',#buyなら買い、sellなら売り
    price = 'X',#指値を入れる場合の価格
    amount = 'Y',#注文数量
    params = { "priduct_code" : "BTC_JPY"})#各取引所のAPIに渡せるパラメーター

pprint( order )#

テストとして、以下のステータスを入力して注文を出してみましょう。

BTC /JPYを指値、0.001BTCを300万円のレートで購入する」という指示を出しています。

※これを実行している2023年11月26日時点では1BTC=560万円程度の価格がついているため、この状態は即座に約定することはありません。実行する際には、価格設定には十分注意して下さい。

実行結果は、以下の通り。

注文が入っているので、成功です。

なお、ここでコンソールに表示されている「id」が自動売買Botを作ることにおいては特に重要な意味を持ちます。

注文をキャンセルする

以下のコードを実行すると、注文をキャンセルすることができます。

#注文をキャンセルする
import ccxt
from pprint import pprint

# APIキーの設定:APIキーとAPIシークレットを入力
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
bitflyer = ccxt.bitflyer({
    'apiKey': api_key,
    'secret': api_secret,
})
# 「=」の左部分は自由に設定可能。後のコードに入れる時に分かりやすいものにしておくと良い。
#「=」より右側は使用する取引所の名前を入力する。

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

#ccxtライブラリを使って注文をキャンセルする
bitflyer.cancel_order(
	symbol = "BTC/JPY",
	id = "ここに注文idを入力",#注文idを入力する
	params = { "product_code" : "BTC_JPY" })

「ここに注文idを入力」としている部分には、コンソール画面に表示されたidを入力します。

キャンセル自体はこれでできるのですが、実際に自動売買Botを稼働させる場合には「このidを取得しつつ注文をキャンセルする」ということをする必要があります。

そのため、注文を自動キャンセルするためには「①注文idの獲得②注文idの入力③注文をキャンセルする指示を出す」という流れを設定する必要があります。

注文状況を獲得・確認する

#未約定の注文情報を獲得する
import ccxt
from pprint import pprint

# APIキーの設定:APIキーとAPIシークレットを入力
api_key = 'YOUR_API_KYE'
api_secret = 'YOUR_API_SECRET'
bitflyer = ccxt.bitflyer({
    'apiKey': api_key,
    'secret': api_secret,
})
# 「=」の左部分は自由に設定可能。後のコードに入れる時に分かりやすいものにしておくと良い。
#「=」より右側は使用する取引所の名前を入力する。


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

for o in open_orders_info:
        pprint( o["id"] )

上記のコードと注文キャンセルのコードを組み合わせれば、条件を満たした時に自動で注文をキャンセルすることができるようになります。

まとめ

今回は、基礎的な部分の紹介でした。

次回以降は、戦略のロジック解説とそれに伴ったコードの実装・実行についてまとめていきます。

-Bot