ビットコイン×シストレ

Bitcoinのシステムトレードに関するメモ

Bitflyer Streaming APIをPythonから使う

bitFlyerのAPIドキュメントにはサンプルがないので、Streaming APIのサンプルを載せます。 Streaming APIを使用するときは、bitFlyerへリクエストを送りません。代わりにpubnubというサービスへリクエストを送ります。 pubnubを使用するときは、

と4つの方法がありますが、ここではtornadoを使用することにします。pythonのバージョンは2.7です。 基本的にはpubnubのサンプルそのままで大丈夫なはず。

pip install tornado
pip install pubnub

でライブラリをインストールすることを忘れずに。

from pubnub.callbacks import SubscribeCallback
from pubnub.enums import PNStatusCategory
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub_tornado import PubNubTornado
from pubnub.pnconfiguration import PNReconnectionPolicy

config = PNConfiguration()
config.subscribe_key = 'sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f'
config.reconnect_policy = PNReconnectionPolicy.LINEAR
pubnub = PubNubTornado(config)

from tornado import gen

@gen.coroutine
def main(channels):
    class BitflyerSubscriberCallback(SubscribeCallback):
        def presence(self, pubnub, presence):
            pass  # handle incoming presence data

        def status(self, pubnub, status):
            if status.category == PNStatusCategory.PNUnexpectedDisconnectCategory:
                pass  # This event happens when radio / connectivity is lost

            elif status.category == PNStatusCategory.PNConnectedCategory:
                # Connect event. You can do stuff like publish, and know you'll get it.
                # Or just use the connected event to confirm you are subscribed for
                # UI / internal notifications, etc
                pass
            elif status.category == PNStatusCategory.PNReconnectedCategory:
                pass
                # Happens as part of our regular operation. This event happens when
                # radio / connectivity is lost, then regained.
            elif status.category == PNStatusCategory.PNDecryptionErrorCategory:
                pass
                # Handle message decryption error. Probably client configured to
                # encrypt messages and on live data feed it received plain text.

        def message(self, pubnub, message):
            # Handle new message stored in message.message
            # メインの処理はここで書きます
            # 登録したチャンネルからメッセージ(価格の変化など)がくるたび、この関数が呼ばれます
            print("%s : %s" % (message.channel, message.message))

    listener = BitflyerSubscriberCallback()
    pubnub.add_listener(listener)
    pubnub.subscribe().channels(channels).execute()

if __name__ == '__main__':
    channels = [
        'lightning_ticker_BTC_JPY',
        'lightning_ticker_FX_BTC_JPY',
        'lightning_ticker_ETH_BTC',
    ]
    main(channels)
    pubnub.start()

参考