Contents
ビットコインTicker情報を取得するプログラムを作ったよ
各ビットコイン取引所のAPIを呼び出し
Ticker情報を取得、データベースに
保存するプログラムを作成しました。
今回使用するAPIは下記です。
bitFlyerだけは前々回と同様にPubNubから
現物とFX両方のTickerを取得しています。
では早速プログラムソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# -*- 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/」の場合、
以下の内容のテキストファイルを作成します。
1 |
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」ボタンを押すとボックスが閉じ
アクティブなタスクに表示されます。
以上で、各ビットコイン取引所の
価格情報を取得するプログラムを
定期的に実行する環境構築が完成です。