Contents
ビットコインTicker情報を取得するプログラムを作ったよ
各ビットコイン取引所のAPIを呼び出し
Ticker情報を取得、データベースに
保存するプログラムを作成しました。
今回使用するAPIは下記です。
bitFlyerだけは前々回と同様にPubNubから
現物とFX両方のTickerを取得しています。
では早速プログラムソースです。
# -*- coding: utf-8 -*- """ Created on Fri Mar 3 15:24:33 2017 @author: ichizo """ import requests from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub, SubscribeListener import pymysql import datetime dbh = pymysql.connect( host='localhost', user='root', password='', db='bitcoin', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) COINCHECK = 'https://coincheck.com/api/ticker' QUOINE = 'https://api.quoine.com/products/5' ZAIF = 'https://api.zaif.jp/api/1/ticker/btc_jpy' BTCBOX = 'https://www.btcbox.co.jp/api/v1/ticker/' if __name__ == '__main__': pnconfig = PNConfiguration() pnconfig.subscribe_key = "sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f" pnconfig.ssl = False pubnub = PubNub(pnconfig) my_listener = SubscribeListener() pubnub.add_listener(my_listener) pubnub.subscribe().channels(['lightning_ticker_BTC_JPY', 'lightning_ticker_FX_BTC_JPY']).execute() my_listener.wait_for_connect() bf_result = my_listener.wait_for_message_on('lightning_ticker_BTC_JPY') bf_data = bf_result.message bf_timestamp = bf_data['timestamp'][:26].replace('T',' ') fx_result = my_listener.wait_for_message_on('lightning_ticker_FX_BTC_JPY') fx_data = fx_result.message fx_timestamp = fx_data['timestamp'][:26].replace('T',' ') pubnub.unsubscribe().channels(['lightning_ticker_BTC_JPY', 'lightning_ticker_FX_BTC_JPY']).execute() my_listener.wait_for_disconnect() cc_req = requests.get(COINCHECK) cc_data = cc_req.json() qo_req = requests.get(QUOINE) qo_data = qo_req.json() zf_req = requests.get(ZAIF) zf_data = zf_req.json() bb_req = requests.get(BTCBOX) bb_data = bb_req.json() """ bidを集計(FX,krは除外) """ bf_bid = bf_data['best_bid'] cc_bid = cc_data['bid'] qo_bid = qo_data['market_bid'] zf_bid = zf_data['bid'] bb_bid = bb_data['buy'] bid_max = bf_bid bid_max_code = 'BF' if (bid_max < cc_bid): bid_max = cc_bid bid_max_code = 'CC' if (bid_max < qo_bid): bid_max = qo_bid bid_max_code = 'QO' if (bid_max < zf_bid): bid_max = zf_bid bid_max_code = 'ZF' if (bid_max < bb_bid): bid_max = bb_bid bid_max_code = 'BB' bid_min = bf_bid bid_min_code = 'BF' if (bid_min > cc_bid and cc_bid > 0): bid_min = cc_bid bid_min_code = 'CC' if (bid_min > qo_bid and qo_bid > 0): bid_min = qo_bid bid_min_code = 'QO' if (bid_min > zf_bid and zf_bid > 0): bid_min = zf_bid bid_min_code = 'ZF' if (bid_min > bb_bid and bb_bid > 0): bid_min = bb_bid bid_min_code = 'BB' bid_diff = bid_max - bid_min """ askを集計(FX,krは除外) """ bf_ask = bf_data['best_ask'] cc_ask = cc_data['ask'] qo_ask = qo_data['market_ask'] zf_ask = zf_data['ask'] bb_ask = bb_data['sell'] ask_max = bf_ask ask_max_code = 'BF' if (ask_max < cc_ask): ask_max = cc_ask ask_max_code = 'CC' if (ask_max < qo_ask): ask_max = qo_ask ask_max_code = 'QO' if (ask_max < zf_ask): ask_max = zf_ask ask_max_code = 'ZF' if (ask_max < bb_ask): ask_max = bb_ask ask_max_code = 'BB' ask_min = bf_ask ask_min_code = 'BF' if (ask_min > cc_ask and cc_ask > 0): ask_min = cc_ask ask_min_code = 'CC' if (ask_min > qo_ask and qo_ask > 0): ask_min = qo_ask ask_min_code = 'QO' if (ask_min > zf_ask and zf_ask > 0): ask_min = zf_ask ask_min_code = 'ZF' if (ask_min > bb_ask and bb_ask > 0): ask_min = bb_ask ask_min_code = 'BB' ask_diff = ask_max - ask_min sql = "INSERT INTO btc (bf_total_bid_depth, bf_total_ask_depth, bf_ltp, \ bf_tick_id, bf_volume, bf_best_bid, bf_best_ask_size, \ bf_volume_by_product, bf_product_code, bf_timestamp, \ bf_best_bid_size, bf_best_ask, \ fx_total_bid_depth, fx_total_ask_depth, fx_ltp, \ fx_tick_id, fx_volume, fx_best_bid, fx_best_ask_size, \ fx_volume_by_product, fx_product_code, fx_timestamp, \ fx_best_bid_size, fx_best_ask, \ cc_last,cc_bid,cc_ask,cc_high,cc_low,cc_volume,cc_timestamp, \ qo_id,qo_product_type,qo_code,qo_name,qo_market_ask,qo_market_bid, \ qo_indicator,qo_currency,qo_currency_pair_code,qo_symbol,qo_fiat_minimum_withdraw, \ qo_pusher_channel,qo_taker_fee,qo_maker_fee,qo_low_market_bid,qo_high_market_ask, \ qo_volume_24h,qo_last_price_24h,qo_last_traded_price,qo_last_traded_quantity, \ qo_quoted_currency,qo_base_currency,qo_exchange_rate, \ zf_last,zf_high,zf_low,zf_vwap,zf_volume,zf_bid,zf_ask, \ bb_high,bb_low,bb_buy,bb_sell,bb_last,bb_vol, \ bid_max, bid_max_code, bid_min, bid_min_code, bid_diff, \ ask_max, ask_max_code, ask_min, ask_min_code, ask_diff, created) \ VALUES ( \ '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',\ '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',\ '%s','%s','%s','%s','%s','%s','%s', \ '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', \ '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s', \ '%s','%s','%s', \ '%s','%s','%s','%s','%s','%s','%s', \ '%s','%s','%s','%s','%s','%s', \ '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',CURRENT_TIMESTAMP \ )" \ % (bf_data['total_bid_depth'], bf_data['total_ask_depth'], bf_data['ltp'], \ bf_data['tick_id'], bf_data['volume'], bf_data['best_bid'], bf_data['best_ask_size'], \ bf_data['volume_by_product'], bf_data['product_code'], bf_timestamp, \ bf_data['best_bid_size'], bf_data['best_ask'], \ fx_data['total_bid_depth'], fx_data['total_ask_depth'], fx_data['ltp'], \ fx_data['tick_id'], fx_data['volume'], fx_data['best_bid'], fx_data['best_ask_size'], \ fx_data['volume_by_product'], fx_data['product_code'], fx_timestamp, \ fx_data['best_bid_size'], fx_data['best_ask'], \ cc_data['last'],cc_data['bid'],cc_data['ask'],cc_data['high'],cc_data['low'],cc_data['volume'],datetime.datetime.fromtimestamp(cc_data['timestamp']), \ qo_data['id'],qo_data['product_type'],qo_data['code'],qo_data['name'],qo_data['market_ask'],qo_data['market_bid'], \ qo_data['indicator'],qo_data['currency'],qo_data['currency_pair_code'],qo_data['symbol'],qo_data['fiat_minimum_withdraw'], \ qo_data['pusher_channel'],qo_data['taker_fee'],qo_data['maker_fee'],qo_data['low_market_bid'],qo_data['high_market_ask'], \ qo_data['volume_24h'],qo_data['last_price_24h'],qo_data['last_traded_price'],qo_data['last_traded_quantity'], \ qo_data['quoted_currency'],qo_data['base_currency'],qo_data['exchange_rate'], \ zf_data['last'],zf_data['high'],zf_data['low'],zf_data['vwap'],zf_data['volume'],zf_data['bid'],zf_data['ask'], \ bb_data['high'],bb_data['low'],bb_data['buy'],bb_data['sell'],bb_data['last'],bb_data['vol'], \ bid_max, bid_max_code, bid_min, bid_min_code, bid_diff, ask_max, ask_max_code, ask_min, ask_min_code, ask_diff) stmt = dbh.cursor() stmt.execute(sql) dbh.commit() stmt.close() dbh.close()
bitFlyerの現物、FXのみPubNubで
bitFlyer以外の取引所のTickerは
それぞれのAPIを呼び出します。
やっているのはAPIから値を取得して
その値でもってINSERT文を作り、
DBに登録するというものです。
bidとaskの最小値と最大値、およびその差分も
同時に計算して登録するようにしています。
ビットコインTicker取得プログラムを定期的に実行する
プログラムを定期的に実行して
データを登録するのは
できればLinuxとかのサーバーでやりたいのですが、
今個人的に使用できるサーバーがないので
Windows10 PCで設定します。
定期的に実行するためには、
Windowsの機能の「タスクスケジューラ」を使用します。
その前に、Pythonを実行するバッチファイルを作っておきます。
Pythonを実行するバッチを作成する
作成したプログラムが、「getBitcoinTicker.py」で
保管場所が「C:/python/bitcoin/」の場合、
以下の内容のテキストファイルを作成します。
python C:/python/bitcoin/getBitcoinTicker.py
このファイルを例えば「getBitcoinTicker.bat」
というような名前にします。
(拡張子を「bat」にします)
これをPythonファイルと同じ「C:/python/bitcoin/」
に保存します(場所はお好きなところでかまいません)。
このバッチファイルのパスは以下のようになります。
「C:/python/bitcoin/getBitcoinTicker.bat」
タスクスケジューラを設定する
次に、先ほど作成したgetBitcoinTicker.batを
定期的に実行するように設定します。
Windows10だと、左下のウィンドウボタンをクリックします。
アプリの一覧で「Windows 管理ツール」をクリックします。
ここに表示される「タスクスケジューラ」をクリックします。
タスクスケジューラ画面の右側にある
「タスクの作成」をクリックします。
タスクの作成ボックスが立ち上がるので、
「全般」タブでは「名前」を入力して
「ユーザーがログオンしているかどうかに関わらず実行する」
を選択します。
「新規」ボタンをクリックします。
「新しいトリガー」ボックスが立ち上がります。
「設定」では、「毎日」を指定して「間隔」を「1」日にします。
「開始」では、時刻を「 0:00:00」に変更しておきます。
「詳細設定」では、「繰り返し間隔」を指定して
最小の「5 分間」を選び、継続時間を「無期限」にします。
その他、「遅延時間を指定する」、「停止するまでの時間」、
「有効期限」は設定しません。
(期限を設定したい方は自由に設定ください)
「OK」ボタンを押して閉じます。
トリガーに先ほど登録した条件が表示されます。
「新規」ボタンをクリックします。
「新しい操作」ボックスが立ち上がります。
「プログラム/スクリプト」に先ほど作成したバッチファイル
「C:/python/bitcoin/getBitcoinTicker.bat」を入力します。
(参照ボタンからの指定も可能です)
「OK」ボタンを押して閉じます。
操作に先ほど登録した条件が表示されます。
「条件」タブを開いて設定内容を確認します。
ここは初期値のままでよいでしょう。
「設定」タブを開きます。
以下の項目にチェックを入れます。
「スケジュールされた時刻にタスクを開始できなかった場合、すぐにタスクを実行する」
「タスクが失敗した場合の再起動の間隔」
そして以下の項目からはチェックを外します。
「タスクを停止するまでの時間」
「OK」ボタンを押すとボックスが閉じ
アクティブなタスクに表示されます。
以上で、各ビットコイン取引所の
価格情報を取得するプログラムを
定期的に実行する環境構築が完成です。