BinanceFutureAPIでローソク足取得&注文するためのPythonコードとアカウント認証について

BinanceFutureAPIでローソク足取得&注文するためのPythonコードプログラミング

「当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

どうもバカルダーです。今回はBinanceFutureのAPIを使ってPythonでローソク足の取得、注文をするためのコードを解説します。ローソク足については、よく使われるCryptowatchAPIにはBinanceFutureがまだありませんのでBot等を作る際の参考にしてください。

BinanceFutureのローソク足(OHLC)を取得

まず、ローソク足(OHLC)を取得します。Pythonコードは以下の通りです。以下のコードでは例としてBTCUSDTの4時間足を31本分取得しています。


import time
import requests
#タイムスタンプの取得
stamps=int(time.time()-446400)*1000
asi="4h"
url="https://fapi.binance.com/fapi/v1/klines?symbol=BTCUSDT&interval="+str(asi)+"&startTime="+str(stamps)
res=requests.get(url)
res=res.json()
print(res)

ローソク足取得のための基本リクエストURLは

『https://fapi.binance.com/fapi/v1/klines?symbol=BTCUSDT&interval=”時間(分)足”&startTime=”いつから取得するか”』

となります。「&endTime=」を追加してどこまで取得するかを指定する事もできます。

取得できる時間足

1m、3m、5m、15m、30m、1h、2h、4h、6h、8h、12h、1d、3d、1w、1M

取得したOHLCデータは古い順に並んでいて、新しいのは最後に表示されます。取得した1本1本のローソク足は以下のような順で並びます。


[
  [
    1499040000000,      // Open time
    "0.01634790",       // Open
    "0.80000000",       // High
    "0.01575800",       // Low
    "0.01577100",       // Close
    "148976.11427815",  // Volume
    1499644799999,      // Close time
    "2434.19055334",    // Quote asset volume
    308,                // Number of trades
    "1756.87402397",    // Taker buy base asset volume
    "28.46694368",      // Taker buy quote asset volume
    "17928899.62484339" // Ignore.
  ]
]

BinanceAPIのタイムスタンプは13桁

BinanceのAPIのタイムスタンプは13桁でなくてはなりません。デフォルトで「time.time()」を使って取得すると10桁になってしまうので1000を掛けています。

また、「-446400」という引き算は4時間足を31本取得したいので現在から「5日+4時間」前のタイムスタンプを計算しています。

最新の移動平均線(MA)とその1つ前を計算

移動平均線(MA)を計算するには終値を全部足してローソク足の本数で割れば求められます。ただ、その前に終値、高値、安値をそれぞれリストにまとめて、計算できるように文字列型からfloat型に変更します。

今回31本のローソク足を取得したのは1つ前のMA30も知りたかったからです。そのコードも書いておきます。


#上のコードの続きから
#リストを準備
closes=[]
high=[]
low=[]
#リストにそれぞれの値を追加
for i in res:
    high.append(i[2])
    low.append(i[3])
    closes.append(i[4])

#文字列型からfloat型に変更  
high=[float(s) for s in high]
low=[float(s) for s in low]
closes=[float(s) for s in closes]

#MA30を計算
ma30=sum(closes[1:31])/30
print("30MA: "+str(ma30))

#1つ前のMA30
oldma30=sum(closes[0:30])/30
print("旧30MA: "+str(oldma30))

一つ前のMAを取得する事によってMAの傾きが上か下かを判別する事ができます。ローソク足については以上です。

BinanceFutureAPIで注文、キャンセル、ポジション確認

次にAPIで注文するためのコードです。ccxt(色々な取引所にAPI注文できるモジュール)があればそっちを使っても良いと思います。今回は個人的に今まで回避していたアカウント認証をちゃんとやってみたかったので公式ガイドの通りにやってみました。

APIキーやシークレットキーの取得については公式ガイドをどうぞ。また、python用に公式SDKもあります。

新規注文するためのPythonコード

以下は逆指値でBTCUSDTを買う場合のpythonコードです。他にLimit,Market,Stopなどそれぞれに必要なパラメータがあります。(必要なパラメータについては公式ガイドへ)


import requests
import hashlib
import hmac
import time
from urllib.parse import urlencode

api="apikey"
secret="secret"
#ヘッダーにapikeyを含める
headers={"X-MBX-APIKEY":api}

#注文量
od_size=0.01
#タイムスタンプ
stamp=int(time.time() * 1000)
#逆指値で買う場合の関数
def order():
    #パラメーターの設定
    params={"symbol":"BTCUSDT",
        #BUY or SELL
        "side":"BUY",
     #逆指値
        "type":"STOP_MARKET",
        #逆指値の価格
        "stopPrice":10000,
        #注文量
        "quantity":float(od_size),
        "timestamp":stamp
        }
    url="https://fapi.binance.com/fapi/v1/order?"
    #パラメーターをURLエンコード
    enco = urlencode(params)
    #パラメーターとシークレットキーを合わせてハッシュ化
    signature = hmac.new(bytes(secret, 'UTF-8'), bytes(enco, 'UTF-8'),digestmod=hashlib.sha256)
    #ハッシュ値を求める
    sha=signature.hexdigest()
    sig="&signature="+str(sha)
    try:
        #ヘッダーを追加してポスト送信
        res=requests.post(url+enco+sig,headers=headers)
        res=res.json()
        #オーダーIDを取得
        ordr=res["orderId"]
        print(ordr)
    except:
        print("注文エラー")

BinanceAPIのアカウント認証について

新規注文などに必要なアカウント認証を通すためのモジュールは「hashlib、hmac、urllib」です。リクエスト時にパラメータと一緒にハッシュ値なるものと併せてポスト送信する必要があります。

バイナンスでは「SHA256」でハッシュ化する必要があります。ハッシュ値の求め方は以下の手順です。

  1. 必要なパラメータを設定
  2. パラメーターをURLエンコード
  3. URLエンコードした物とシークレットキーをhashlib.sha256でハッシュ化
  4. hexdigest()でハッシュ値を求める。

この手順で求めたハッシュ値を使って、

『https://fapi.binance.com/fapi/v1/order?”パラメーターをURLエンコードしたもの”&signature=”ハッシュ値”』

というURLにリクエストでポスト送信(ヘッダーも追加)します。

最後に全ての注文をキャンセルするコードと現在のポジションを取得するコードを書いておきます。

全ての注文(オープンオーダー)をキャンセルするpythonコード

注文キャンセルが成功すると「The operation of cancel all open order is done」という文字が返ってきます。


#上のコードの続きから
#注文キャンセル関数
def all_cancel():
    url="https://fapi.binance.com/fapi/v1/allOpenOrders?"
    params={"symbol":"BTCUSDT",
            "timestamp":stamp
            }

    enco = urlencode(params)
    signature = hmac.new(bytes(secret, 'UTF-8'), bytes(enco, 'UTF-8'),digestmod=hashlib.sha256)
    sha=signature.hexdigest()
    sig="&signature="+str(sha)
    try:
        res=requests.delete(url+enco+sig,headers=headers)
        res=res.json()
        print(res["msg"])
    except:
        print("注文キャンセルエラー")

現在のポジション量と方向を取得するpythonコード

ポジションが取得できるとロングなら正の数字が、ショートなら負の数字が取得でき、ノーポジなら0が取得できます。


#上のコードの続きから
#ポジション確認関数
def pos():
    msg="timestamp="+str(stamp)
    signature = hmac.new(bytes(secret, 'UTF-8'), bytes(msg, 'UTF-8'),digestmod=hashlib.sha256)
    sha=signature.hexdigest()
    url="https://fapi.binance.com/fapi/v1/positionRisk?"+msg+"&signature="+str(sha)
    try:
        res=requests.get(url,headers=headers)
        res=res.json()
        size=res[0]["positionAmt"]
        print(size)
    except:
        print("エラー")

自動売買Botにするには

これらのコードを使えば自動売買Botを作成する事が可能です。自動化にはAWSやGoogleCloudPlatformが初期費用も掛からないのでお勧めです。パソコンを起動し続けても構わない方はBATファイル等を作ってタスクスケジューラで自動化しても良いと思います。

自動化についての相談等も問合せページやTwitterのDMでも受付中です。以上となります。

コメント