【実践編】簡単、BinanceのAPIを使った自動売買の方法公開!

Binance Program For SEO Agency.

BINANCE(公式)はこちら

※【2018/09/24 追記】新規にBinanceから価格取得するアプリを開発致しました。→ こちら



※※注意※※
今回ご紹介する方法は実際に取引が発生します。
それに加え損失が出る可能性も御座います。
その点を理解された上での利用をお願い致します。
取引で損失を出されてもこちらでは責任を負いかねますのでご了承ください。

今回は実践編ということで、実際にAPIを使用して
・現在の価格と7秒前の価格の差を比較し数%下がっていたら購入注文を出す。
 ※下がり幅のパーセンテージはご自身で変更できます。
・購入注文を出して10秒以上経ったらキャンセルオーダーを出す。
・購入できたら10秒待って現時点の価格で売り注文を出す。
・売りが終了したら、最初に戻って繰り返し
という処理を行うコードをご紹介します。

今回作成するコードをGithubに公開しておりますので、こちらから
ダウンロードをお願い致します。
ダウンロードを行って頂いたコードを元に説明を進めて参ります。

なお、言い訳になりますが、今回はとりあえずトレードを行うことに焦点を当てているため
エラー処理やコードの書き方があまりよろしくなく、
買いと売りがうまく実行されない場合がございます。
※全てのパターンのエラー処理を実装していないため。

その為、本記事では感覚をつかむ程度の感じで
参考にして頂ければ幸いです。

まだ「Python」と「BinanceのAPI」の準備を行っていない方はこちらから準備をお願い致します。

【2018/10/12 追記】イーサリウムのアプリ作成関連記事を作成いたしました。
【初心者】イーサリウムでアプリを作ろう!【準備編】

※【2018/09/24 追記】新規にBinanceから価格取得するアプリを開発致しました。→ こちら

※【1月28日 追記】CoinExchangeのAPIデータ取得方法をこちらに公開致しました。

step01. 設定ファイルの変更とテスト

早速トレードといきたいところですが、
まずはダウンロードしたファイルにBinanceのAPIを設定するところから始めましょう。

ダウンロードいただいたフォルダに「config」フォルダがありますが、
その中の「config.ini」ファイルを開いてください。

中にAPIキーとシークレットキーを保存します。

次のように文字を置き換えて保存します。
<API_KEY> = APIキー
<API_SECRET> = シークレットキー

[settings] API_KEY = <API_KEY>
API_SECRET = <API_SECRET>

次に「src」フォルダの「step01.py」というファイルを開きます。
こちらは7秒ごとに
・自分の使用できるBTCを表示
・全ての価格を表示
するプログラムです。

ソースコードの主な処理を行っている部分を
下に抜き出しました。

処理に関しては各コメントのとおりになります。

# ~~ 上記省略 ~~

 while 1:
    # 自分のBTCを取得
    balance = client.get_asset_balance(asset='BTC')
    # Freeは「現在使用できるBTC」
    print("free myBTC : " + str(balance['free']))
    # 7秒待ち
    time.sleep(7)
    # すべての価格を取得
    prices = client.get_all_tickers()
    # 取得した価格を表示
    print(prices)

こちらを使ってテストを行っていきます。
コマンドプロンプトより下のコマンドを実行しましょう。

python step01.py

実行すると「自分の使用できるBTC」と「全ての価格」が表示されればテスト成功です。
次に実際に買いを入れるプログラムを作成しましょう。

※ちなみに「binance.exceptions.BinanceAPIException: APIError(code=-1021): Timestamp for this request was 1000ms ahead of the server’s time.」
 というエラーが出た場合にはWindowsの時刻同期を行ってください。

Windows7ですと
「右下の時間」> 「日付と時刻」 > 「インターネット時刻」> 「設定の変更」> 「今すぐ更新」
をクリックして時刻を同期してください。

step02. テストで買いを入れてみる

このステップではテストで買いを入れて見ましょう。

現在の価格と7秒前の価格差の比率が下がったら買いを
入れます。
まずは実際に買いが行われるか確認するため、
価格差が「0」パーセント以上で買いを入れるようにします。
買いの注文はテスト注文で行ってみます。

step02.pyを開いてください。

コードの28、29行は配列に「現在の価格」と「ゼロで初期化」した
値を代入しておきます。

# before, after prices
beforePrices = [prices[i]['price'] for i in range(symbolLen)]
afterPrices = [0 for i in range(symbolLen)]

下はコードの48行目からです。
7秒経ったら「afterPrices」に価格をいれ、
28行目で「beforePrices」に入れた価格を比較して価格差を算出しております。

価格差が「0」パーセント以上なら買いを入れます。

while 1:
    # 自分のBTCを取得
    balance = client.get_asset_balance(asset='BTC')
    # Freeは「現在使用できるBTC」
    print("free myBTC : " + str(balance['free']))
    # 7秒待ち
    time.sleep(7)
    # すべての価格を取得
    prices = client.get_all_tickers()
    # 取得した価格を表示
    # print(prices)
    for i in range(symbolLen):
        # 7秒後の現在の価格を取得
        afterPrices[i] = prices[i]['price']
        # 前回の価格と現在の価格を比較し、パーセンテージを計算
        pricePropotion = 100 - (float(afterPrices[i]) / float(beforePrices[i])) * 100
        # BTCのそれぞれの銘柄で指定パーセンテージ下がったら買いを入れる。今回はテストの為0パーセントで買いを入れる。
        if ( pricePropotion ) > 0.0: 
            # Ticker BTC
            if re.search(r'BTC', prices[i]['symbol']) and (round (float(balance['free']) / (float(afterPrices[i]) * 1.03)) ) > 0.0:
                # 買いを入れたときの情報を表示
                print('time: ' + datetime.now().strftime("%Y/%m/%d %H:%M:%S") + ' , ticker: ' + prices[i]['symbol'] + ' , PricePropotion: ' + str(pricePropotion) + ' , afterprice: ' + afterPrices[i] + ' , beforePrice: ' + beforePrices[i])
                # 買いを入れるときにTickerの「シンボル」、「現在の価格」、「ループの番号」をbuyCoin関数に渡す
                buyCoin(prices[i]['symbol'], afterPrices[i], i)
                break

次に実際に買いを入れる処理です。
31行目の「buyCoin」関数です。
今回はテストで買いを入れてみます。

def buyCoin( symbol, afterPrice, tickerCount ):
    print("called buy")

    order = client.create_test_order(
        symbol=symbol,
        side=SIDE_BUY,
        type=ORDER_TYPE_LIMIT,
        timeInForce=TIME_IN_FORCE_GTC,
        price=100,
        quantity=10)

    print(order)

    return

実際に実行して「called buy」と表示されれば成功です。
コマンドプロンプトより下のコマンドを実行しましょう。

python step02.py
E:\MyStorage\01-PrimaryTasks\01-Mine\010-PrimaryTasks\03-Github\binance-python-api-trade\src>python step02-1.py
free myBTC : 0.00008020
time: 2018/01/21 02:25:56 , ticker: ZRXBTC , PricePropotion: 0.006529119874628009 , afterprice: 0.00015315 , beforePrice: 0.00015316
called buy
{}
free myBTC : 0.00008020
time: 2018/01/21 02:26:17 , ticker: TRXBTC , PricePropotion: 0.15600624024961007 , afterprice: 0.00000640 , beforePrice: 0.00000641
called buy
{}
free myBTC : 0.00008020

買い注文が呼ばれていますね。
次のステップでは実際の買いと売り注文を見ていきましょう。

step03. 自動売買

このステップでは実際に買いと売りを自動で行う処理を
見ていきましょう。

「tradeSystem.py」では最初に書いた
・現在の価格と7秒前の価格の差を比較し数%下がっていたら購入注文を出す。
 ※下がり幅のパーセンテージはご自身で変更できます。
  初期設定は5%としております。
・購入注文を出して10秒以上経ったらキャンセルオーダーを出す。
・購入できたら10秒待って現時点の価格で売り注文を出す。
・売りが終了したら、最初に戻って繰り返し
という処理が盛り込まれております。

「tradeSystem.py」を開き中を見てみたら実際に実行してみてください。

python tradeSystem.py

コマンドプロンプトでは「ctrl + C」キーを押すまで処理が続けられます。
「ctrl + C」で終了すると「log」フォルダの中にログが抽出されます。

おわりに

いかがだったでしょうか?
駆け足で紹介した部分が多々あり、
内容を理解することが困難なところがあったかもしれません。

ですが、自動トレードを実装するハードルが
本記事によって少しでも下がったと感じていただければ
幸いです。

理解が出来なかった部分や質問等があれば、コメント等でいただければ
お答えさせて頂きます。

みなさま、もうけてくださいね!

9 件のコメント

    • ほんとーにごめんなさい!メジャー銘柄なのでXRPとBNBのペアがあると勝手に思い込んでいてエラーを出していました;;先ほどのコメントは無視してください。

      • aguseさん

        コメントありがとうございます。
        大丈夫です~( ˙ө˙)

        また何かありましたら、ご遠慮なくコメントください(* ̄▽ ̄)ノ~~

  • いくつか質問させてください。

    トレード初心者の者です。先日、binance apiにて、get_all_tickers()を実行して、オルトコインの価格表示をさせることに成功しました。

    get_all_tickers()で7秒前より、価格が下がったコインを買って10後に売るというのが、今回の処理ですね。

    (1)10秒後に価格が上がり利益がでることを期待した動作のようですが、10秒後に価格は上がりやすいのですか?

    (2)ソースを全て読めていないので、売買の数量やコインの種類がよくわかりません。

    売買数量は利用可能なBTCの一分ですか?それとも100%ですか?

    売買するコインは最初に見つけた7秒前かかっていますがX%(デフォルト5%)下がったコインになりますか?

    • コメントありがとうございます!

      質問頂いたことへ回答させていただきます。

      ご質問 : (1)10秒後に価格が上がり利益がでることを期待した動作のようですが、10秒後に価格は上がりやすいのですか?
      回答 : 色々試したり市場の動きを見た所、7秒の間に急激に下がった銘柄のコインは10秒ほどで元の価格へ戻ろうとする
      動きをするものが多かったです。
      ですが、この調査をしたのは2018年2月頃であり現在の市場は違った動きをするかもしれません。

      ご質問 : (2)ソースを全て読めていないので、売買の数量やコインの種類がよくわかりません。
      回答 : 説明不足ですみませんでした。。
      こちらに関しまして、所持しているBTCを全て価格の下がった銘柄のコインを購入するプログラムとなっております。

      # 下の処理で現在所持しているBTCをAPIを使って取得し,
      # 「所持しているBTCの数量 ÷ 取得コインのBTC価格」で購入できるコインの数量を計算し、
      # 購入オーダーを出します。
      37 : def buyCoin( symbol, afterPrice, tickerCount ):
      ...
      40 :         balance = client.get_asset_balance(asset='BTC')
      41 :         orderQuantity = round(float(balance['free']) / (float(afterPrice) * 1.01))
      ... 
      

      ご質問 : 売買数量は利用可能なBTCの一分ですか?それとも100%ですか?
      回答 : 上記の回答と重複しますが、100%となります。
      ただし、プログラムを改造することによって所持BTCの一部を使うことも可能です。

      ご質問 : 売買するコインは最初に見つけた7秒前かかっていますがX%(デフォルト5%)下がったコインになりますか?
      回答 : プログラムの意図としては
      「7秒後にX%下がったコインを購入」-> 「購入できた or キャンセルになったら再びループ」-> 「再度全てのコインデータを取得し7秒後にX%下がったコインを購入」
      となっております。
      ただし、半年以上前に書いたコードになりまして
      現在はBinanceのAPIの仕様が変わっていたりした場合
      意図通りに動作するか保証することは出来兼ねますので参考程度にしていただければ
      幸いです。

      以上になります!
      他に何かありましたら、再度コメントいただければ幸いです。

  • 【実践編】簡単、BinanceのAPIを使った自動売買の方法公開!

    に記載されてル
    Githubに公開されたソースをダウンロードしましたが
    configファイルがみあたりません。別の場所にあるのでしょうか?

    • コメントありがとうございます!

      「config」フォルダ内の「config.ini」というファイルがありまして、
      そちらを変更していただければ動作するはずですがいかがでしょうか?

      「master」リポジトリに切り替えてご確認いただければ幸いです。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    ABOUTこの記事をかいた人

    日々、ひたすららくして生きる為に試行錯誤しながら生きております。

    ブログでは主に仮想通貨やコンピュータの話題が中心と
    なりますがたまにそれた内容を書くこともしばしば。

    温かい目で見守ってくだされば幸いです。