Python暗号資産自動取引ソフトの設計図

2021/08/29

IoT Python ガジェット ラズパイ 暗号資産 開発

ラズパイで暗号資産自動取引

こんにちはICHIKENです。

Pythonで暗号資産の自動取引を開始して約2ヶ月半。(自動取引Pythonスクリプトは未公開)

簡易的なスクリプトのアクティビティ図を公開しますので、これから自動取引ソフトを組む人は参考にしてください。また、PlantUMLのコードをそのまま置いてますので、アクティビティ図のサンプルコードとしてもどうぞ。

この記事でわかること

BinanceAPIを使った自作の暗号資産自動取引ソフトのおおまかな流れがわかります。

  • Binance暗号資産自動取引ソフトの流れ
  • Binanceで自動取引する時のポイント

前提条件

まず前提条件となる私の環境です。

取引所 Binance US
Raspberry Pi 4 Model B 2GB
OS Raspbian GNU/Linux 10 (buster)
VSCode 1.55.2
Python 3.7.3
python-binance 1.0.10

もともとは8GBを使っていましたが、常時自動取引ソフトを走らせておく専用機として2GBに置き換えました。

REST API

大前提としてBinanceのPythonライブラリを使用しています。これ使っちゃうと他の取引所でソフト組む気になれないですね〜

Welcome to python-binance v1.0.12 - python-binance 0.2.0 documentation

インストール

python-binanceはpipでインストールできます。

pip3 install python-binance

ラズパイではすんなり入りましたが、WindowsはVisual C++ Build Toolsがないとビルドエラーになるかも、と書いてますね。

はじめに - python-binance 0.2.0 ドキュメント

使い方の参考サイト

米国以外は本家Binanceですのでそのまま使用可能です。米国はBinanceUSですのでそのままだとダメですが、インスタンス生成時にUS指定すればいけます。お世話になっているたのじぃさんが紹介されてますね。

ラズパイで仮想通貨トレーダーをつくろう

基本的にクライアントのインスタンス作って、メソッド叩くだけですので、めっちゃ簡単です。使っているメソッドはアクティビティ図に示してますので参考にしてください。

クライアントインスタンスの作り方や、主なメソッドのまとめはこちら。

Binance(バイナンス)の公式APIの始め方(Python用コード)|dot blog

自動取引の流れ

では本題の暗号資産自動取引のアクティビティ図へ行きましょう。

アクティビティ図

図はPlantUMLで作成したものをpng出力したものです。Pythonコードはみなさんで考えて実装してくださいね。

暗号資産自動取引ソフトのアクティビティ図

サクサク解説

基本的な流れは

「未成立の注文確認と削除」→「現在の資産状態確認」→「条件に合えば売買注文」

これの繰り返しです。

まずは注文状況を確認して未成立の古い注文を削除

注文状況を確認して未成立の注文を削除する流れ

市場情報と現在の保有資産確認

市場情報と現在の保有資産を確認するフロー

市場分析に基づき判断し売買を実行

市場分析に基づき売買する流れ

あとは定期的にデータ出力してます。そのままループさせるとウェイトリミットに到達してしまうため、毎サイクル数秒待機させています。

これに関連しますが、Binanceで自動取引するにあたり、いくつかポイントがあります。

ウェイトのリミットには気をつける必要があります。高速で問い合わせし続けると上限に到達して一定時間閉め出されます。したがって通常時はリミットに達しないようにする、誤って達してしまったらしばらく休ませる、というようなハンドリングが必要です。

また最低額を下回るとエラーになりますのでご注意ください。

PlantUMLコード

参考にPlantUMLのコードを置いておきます。設計図を作る参考にどうぞ。

@startuml

    title Cryptocurrency trader
    
    start
    
    :初期化;
    :取引通貨設定;
    :市場分析初期化;
    
    repeat
    
        '注文確認
    
        package 注文確認 {
            :サーバー時間取得
            get_server_time();
            :注文状況取得
            get_open_oders();
            :各オーダー毎に保持期間計算;
    
            if (保持期間 > 閾値) then (No)
                :注文保持;
            else (Yes)
                :注文削除
                cancel_order(symbol, orderId);
            endif
        }
    
        :UI情報更新;
    
        package 資産確認 {
            :アカウント情報取得
            get_account();
            :各通貨毎に市場情報取得
            get_orderbook_ticker(symbol);
            :保有資産算出
            保有通貨のfreeとlockedを基軸通貨換算;
        }
        
        package トレード {
            :市場分析;
    
            if (買い判定値 > 閾値) then (Yes)
                :取引数量計算;
                :order_limit_buy(symbol, quantity, price);
            elseif (売り判定値 > 閾値) then (Yes)
                :取引数量計算;
                :order_limit_sell(symbol, quantity, price);
            endif
        }
        :UI情報更新;
    
        package データ出力 {
            if (送信間隔 > 閾値) then (Yes)
                :LINE送信;
            else (No)
            endif
    
            if (出力間隔 > 閾値) then (Yes)
                :CSV出力;
            else (No)
            endif
        }    
    backward:待機;
    repeatwhile (停止フラグ.is_set() ?)
    
    stop
    
    @enduml

最後に

いかがでしたか?

もし役に立ったよーって方でBinanceUSにこれから登録されるのでしたら、こちらのコードから登録していただけるとうれしいです。

BinanceUS登録: https://accounts.binance.us/en/register?ref=54270085

スポンサーリンク

フォロワー

Labels

Amazon (3) Apache (3) Apple (9) AppleSilicon (7) Bloggerカスタマイズ (12) EchoShow15 (1) IoT (25) Jetson (1) MySQL (1) PHP (3) Python (20) Web (3) アウトドア (11) アメリカ生活 (19) ガジェット (35) キャンプ (9) ディープラーニング (1) らずキャン△ (11) ラズパイ (24) 暗号資産 (5) 開発 (31) 旅行 (8)

QooQ