ccxtは何となく分かったんだけどもっと具体的な使い方はないの?
そんな悩みを解決する記事を書きました。
ccxtの使い方をある程度知ったところで、具体的にどう応用していいか分からないですよね。
「応用の効く使い方を知りたい」
そんな方に向け、「自動売買の基礎」となる部分のコードを紹介します。
- この記事で分かること
- 自動売買の最低限の機能
- 非同期処理
- コールバック関数
- 5分に一回板情報の取得コード
板情報を定期的に取得することが自動売買の基礎となります。
なぜなら、自動売買は
価格を取得し続け、条件に合った時に売買を執行するからです。
仮想通貨自動売買の前提条件 APIの取得
自動売買を行うためには仮想通貨取引ののAPIの取得が必要です。
まだの方は以下の記事を参考にAPIを取得してみてください。
国内暗号資産取引所
海外暗号資産取引所
Pythonを実行するための環境設定
以下を参考にディレクトリの環境を整えてください。
国内仮想通貨取引所
海外仮想通貨取引所
ビットコイン自動売買の基礎となる機能
自動売買を作る際に必ず必要になる機能があります。
それは、
ビットコイン・アルトコインの最新価格を取得し続ける
という機能です。
この機能を作るのは意外と難しいですが、ここさえ作り込めば後は取得してきたビットコインの価格に対して条件をつけ、売買を執行するだけとなります。
ビットコインの自動売買に最低限必要な機能
自動売買ツールを開発する際に最低限必要な機能は以下のことが考えられます。
- 1.最新価格情報の取得
-
取引所からビットコインやアルトコインの最新価格をリアルタイムで取得する機能が必要です。
- 2.注文の発行
-
設定された条件に基づいて、自動的に取引所に注文を発行できる機能が必要です。
- 3.資産の管理
-
口座の残高やポートフォリオの状態をトラッキングし、リアルタイムで管理できる機能が必要です。
- 4.エラー処理
-
取引中に発生する可能性のあるエラーに対処するための適切なエラー処理が必要です。
資産の管理、エラー処理がなくても自動売買ツールは完成しますが、一応大事なことなので最低限の機能として入れておきました。
他にも、
- 取引履歴の記録
- 通知機能
- セキュリティ対策
なども考えられます。
「APIの取得」「Pythonを実行するための環境設定」を終えている状態でコードの紹介を進めていますので、まだの方は上部へ戻って取得と設定を終わらして以下本編へ進んでください。
ccxtの使い方がいまいち分からないという方は以下関連記事で基本的なメソッドの使い方を紹介してますのでぜひ参考にしてみてください。
フォルダとファイルの追加
まずはフォルダとファイルの追加を行います。
以下本記事で追加するフォルダとファイルです。
bot
├── app # ←本記事で追加するフォルダ
│ └── controllers # ←本記事で追加するフォルダ
│ └── mexc_stream.py # ←本記事で追加するファイル
├── crypt_api
│ ├── mexc.py
│ └── coincheck.py
│ └── bybit.py
├── main.py
├── settings.ini
└── settings.py
以下のコマンドを実行して作成してみましょう。
mkdir -p app/controllers
touch app/controllers/mexc_stream.py
- プログラミングに興味のある方
- アプリケーション開発をやってみたい方
- 昔プログラミングに挫折した方
- プログラミング学校が高いと思っている方
脱初心者のためには独学だと限界があります。
「買い切り」でコンパクトで質の高い動画を100本以上揃え、受講期間なしで自由に学ぶことのできるオススメのオンラインスクールです!
- 10~20分の動画講義が100本以上
- 回数無制限の質問対応
- 買い切りで受講期間制限なし
\ 脱初心者 /
settings.pyの編集
次にsettings.pyの編集を行います。
処理を実行した後に1分(60秒)待機するコードです。
秒換算なので、
5分待機したい場合は、300(秒)に設定すればOKです。
以下コードを「settings.py」に追加してください。
sleep_time = 60 # 1分の待機時間
# sleep_time = 300 # 5分の待機時間の場合
mexc.pyの編集
以下コードを追記します。
関数「subscribe_order_book」は非同期で実行するため、defの前に「async」をつけることを忘れないでください。
asyncって何?
プログラムがタスクの完了を待たずに次の処理を進める仕組みです。
通常の同期処理では、ある処理が終わるまでプログラム全体が待機するのに対し、非同期処理では待機せずに他の処理を進めることができます。
プログラムがタスクの完了を待たずに他のタスクを実行できるため、効率的なリソース(CPUやメモリ)の利用が可能です。
import asyncio
~~~~~~~~~~~~~~~~
~~ 一部省略 ~~
~~~~~~~~~~~~~~~~
# 板情報を取得するメソッド
def get_order_book(self, symbol):
try:
order_book = self.mexc_client.fetch_order_book(symbol)
return order_book
except InsufficientFunds as e:
print(f"Error: Insufficient funds - {e}")
raise
except InvalidOrder as e:
print(f"Error: Invalid order - {e}")
raise
except NetworkError as e:
print(f"Error: Network issue - {e}")
raise
except Exception as e:
print(f"Error: {e}")
raise
# 指定された通貨ペアのオーダーブックを定期的に取得するメソッド
async def subscribe_order_book(self, callback, symbol):
while True:
order_book = self.get_order_book(symbol=symbol)
callback(order_book)
await asyncio.sleep(settings.sleep_time)
他の関数に引数として渡す関数のことです。
async def subscribe_order_book(self, callback, symbol):
引数「callback」の部分には他で定義した関数が渡され、関数の中で関数が使われている状態となっています。
初心者の方は意味なんか分からなくてOKです。
まずはコードを書いて使える様になりましょう!
app/controller/mexc_stream.pyの編集
以下コードを追記します。
コードを見て分かる通り、コールバックに「mexc_run」という板情報を出力するだけの関数を引数として渡しています。
先ほどmexc.pyで書いた「subscribe_order_book」関数で改めて実行されます。
import logging
import asyncio
from crypt_api.mexc import MexcApiClient
logger = logging.getLogger(__name__)
mexc_api = MexcApiClient()
class MexcStream(object):
def stream_ingestion_data(self):
asyncio.run(mexc_api.subscribe_order_book(callback=self.mexc_run, symbol='BTC/USDC'))
def mexc_run(self, order_book):
print(order_book)
mexc_stream = MexcStream()
ややこしいですが、理解する前にまずは動くコードを書いて体で覚えましょう。
main.pyの編集
最後にmain.pyから実行するコードを書いていきます。
このコードはPythonのthreadingモジュールを使用して、mexc_streamというモジュールからstream_ingestion_dataという関数を非同期に実行するものです。
from threading import Thread
from app.controllers.mexc_stream import mexc_stream
if __name__ == '__main__':
mexc_thread = Thread(target=mexc_stream.stream_ingestion_data)
mexc_thread.start()
mexc_thread.join()
とりあえず「mexc_stream.stream_ingestion_data」を非同期で実行するんだと覚えておけばOKです。
以下コマンドで実行します。
python3 main.py
以下の様に5分ごとに実行されればOKです。
1分の確認は長いので5秒にして動作確認をしてもOKです。
せっかくなので、自身で考えて1分の待機時間を5秒に変更して動作確認してみてください。
Pythonを学ぶならやはりAIスキルにも興味があると思います。
そこでオススメのスクールがAidemy PREMIUMとなります。
未経験でもAIを使いたい人にオススメのスクールです。
無料で相談もできるので迷った方は個別相談をしてみてください。
\ 無料で個別相談 /
板情報を少し見やすくする
このままだと、板情報が読みにくいです。
見やすくするために、買い(bids)と売り(asak)の情報を分けます。
「app/controller/mexc_stream.py」にメソッドを追加します。
# asks, bidsを分けるメソッド
def parse_order_book_data(self, order_book, type):
order_book_data = order_book.get(type, [])
return { type: order_book_data }
表示の仕方に伴い、「mexc_run」のメソッドも少し修正します。
def mexc_run(self, order_book):
# print(order_book)
bids = self.parse_order_book_data(order_book, 'bids')
asks = self.parse_order_book_data(order_book, 'asks')
print(bids)
print('--------------')
print(asks)
bidsとasksのデータが分かれて表示されていればOKです。
ビットコイン自動売買の板情報を取得し続ける方法 まとめ
本記事では「ビットコイン自動売買の板情報を取得し続ける方法」ついて解説しました。
- 自動売買の最低限の機能
- 非同期処理
- コールバック関数
- 1分に一回板情報の取得コード
例えば、毎日12時に価格を考慮しないで購入するだけなら不要ですが、
利益を出すことが前提の自動売買において、定期的に最新のビットコイン価格を取得する機能は、最低限の必須機能と考えられます。
非同期処理やコールバックなど初心者にとってはとっつきにくい内容となっていますが、よく使うので覚えておいて損はしません。
最後まで読んでくださいありがとうございました。
プログラミング初心者を抜け出したい方
未経験でもAIスキルを身につけたい方
\ 無料で個別相談 /
コインチェックのAPI取得がまだの方はこちらを参考にどうぞ。
海外の取引所のAPIを使ってみたい方はこちらを参考にどうぞ。
Cardanoについての記事を書いていますので興味のある方はぜひご覧ください。
まだブログで月1万円稼いでいない方はこちらからの記事を参考にしてみて下さい。
コメント