アロイログ

節約、家庭菜園、教育、投資、転職などの雑記メディア

Zaif AirFXの自動取引bot(Python)を作ったので基本的な書き方やポイントをまとめる

f:id:peppersack:20180212225905p:plain こんにちは、アロイです。

先日からZaifのAirFXでビットコインFXに挑戦しているのですが、感情的に動いてしまいなかなか利益が出ないのでビットコインFX自動売買のbotを作成してみることにしました。

Pythonは初めてでしたが、4~5時間試行錯誤してようやく自動売買のbotが稼働。

bitflyerに比べてZaifは情報源が少ないのでちょこちょこハマるポイントもありました。

そこで、ZaifのAirFXでbotを作る上での基本的な書き方やポイントを解説します。

ちなみに、Windows7で作成しましたが、Windows10でも基本的には同様です。

まずはここから

Zaifのbotを作るための環境構築をします。

まだZaifに登録をしていない方はまず登録をしておいてください。

Zaifの公式サイトで登録をする

その後、

  1. APIキーの登録
  2. Python環境の準備
  3. APIの準備

を行う必要がありますが、やり方は以下のサイトが参考になります。 qiita.com

注意点として、Pythonは上記記事にある2系ではなく、3系を入れておいた方がよいです。

2系では動きませんでした。

Zaif AirFX のAPIの書き方

いくつかAPIの書き方のサンプルを置いておきます。

詳細はZaifのAPI公式ドキュメントを見ておきましょう。

現在価格の取得

Zaif AirFXでは、ZaifPublicApiではなくZaifFuturesPublicApiを使って取引の公開情報を取得します。

ちょっと面倒なのが、ZaifFuturesPublicApiはAirFXだけでなく、先物の取引内容も含まれています。

そのため、AirFXの情報を取得するためには、group_id=1を指定する必要があります。

※ここ、実はやり方が分からずにハマりました。

例えば、現在のAirFXの終値を取得するには下記のように記述します。

    zaif_future = ZaifFuturesPublicApi()
    Last_trade_price = int(zaif_future.last_price(group_id=1, currency_pair='btc_jpy')["last_price"])

注文を出す

注文を出すには、ZaifLeverageTradeApicreate_positionを使用します。

例えば、1BTC=900,000円のレートで0.001BTCを10倍レバレッジで注文する場合は下記のようにします。

    zaif_leverage = ZaifLeverageTradeApi(KEY, SECRET)
    trade_result = zaif_leverage.create_position(
                        type='futures',
                        group_id=1,
                        currency_pair='btc_jpy',
                        action='bid',
                        price=900000,
                        amount=0.001,
                        leverage=10,
                        limit=Decimal(900000* 1.0025 / 10).quantize(Decimal('1.')) * 10,
                        stop=Decimal(900000* 0.9985 / 10).quantize(Decimal('1.')) * 10
                    )

売り注文の場合はaction='bid'の部分がaction='ask'になります。

また、Zaif AirFXは注文に対する反対注文(利確や損切り)は注文内容のlimit、stopで指定します。(指定しなくても注文自体は可能です。)

limitは利確、stopは損切りの価格と認識しておけばOKです。

Zaifの仕様上、5円単位指定しないとエラーになるため、10の倍数の価格になるように数字を(無理やり)調整しました。

もう少しキレイに書きたい。

ポイント

例外処理は必須

APIなので例外処理は最低限必要ですが、Zaifが本当によくエラーを返してきます。

502エラーや504エラー、他には「trade temporarily unavailable.」のようなレスポンスも発生します。

そこで、エラーが発生することは見越したプログラム設計にしておいた方がよいでしょう。

ちょっと乱暴ですが下記のように記述すると大体のエラー内容はキャッチできます。

        try:
             ~処理~
        except Exception as e:
            print('取引に失敗しました')
            print(str(e))

私の場合は、とりあえずキャッチしておいて処理を再トライするようなプログラムにしています。