30分で作るSFD Botの売り部分

こんばんは。でめきんです。今日から30分で何かを作る遊びを始めます。このNoteを書くのを含めて30分の予定です。

島根県民大好きRubyが好きだったので、Pythonはあまり手を出して来ませんでした。なので、今日からPythonの練習がてら、仮想通貨に関係ありそうなものを作っていきます。

基本、他人のソースコードをインスパイアしてプログラムを作ります。

さて、今回のプログラムですが、現物の約定情報が流れて来たら、SFD価格に指値で0.01枚、少しの時間だけ出すものです。

API_KEYとAPI_SECRETにご自分のものを入れてください。そしたら一応動きます。

インスパイア元:https://qiita.com/Avocado/items/55a0dd6aed0d2bbf7b94

import math
import pybitflyer
import json
import websocket
from time import sleep
from logging import getLogger,INFO,StreamHandler
logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(INFO)
logger.setLevel(INFO)
logger.addHandler(handler)

API_KEY="API_KEY"
API_SECRET ="API_SECRET"
api = pybitflyer.API(api_key=API_KEY, api_secret=API_SECRET)

ltp = 0.0
last_ltp = 0.0
sfd_target = 0.0

"""
This program calls Bitflyer real time API JSON-RPC2.0 over Websocket
"""
class RealtimeAPI(object):

    def __init__(self, url, channel):
        self.url = url
        self.channel = channel

        #Define Websocket
        self.ws = websocket.WebSocketApp(self.url,header=None,on_open=self.on_open, on_message=self.on_message, on_error=self.on_error, on_close=self.on_close)

        websocket.enableTrace(True)

    def run(self):
        #ws has loop. To break this press ctrl + c to occur Keyboard Interruption Exception.
        self.ws.run_forever()
        logger.info('Web Socket process ended.')

    """
    Below are callback functions of websocket.
    """
    # when we get message
    def on_message(self, ws, message):
        global ltp,last_ltp
        ltp = json.loads(message)['params']['message'][0]['price']
        sfd_target = math.ceil(float(ltp)*1.05)

        if(float(ltp) != float(last_ltp)):
            callback = api.sendchildorder(product_code='FX_BTC_JPY', child_order_type='LIMIT', side='SELL', price=sfd_target, size=0.01)
            api.cancelallchildorders(product_code= 'FX_BTC_JPY')
        else:
            callback = "NONE"
        last_ltp = float(ltp)

        logger.info(callback)

    # when error occurs
    def on_error(self, ws, error):
        logger.error(error)

    # when websocket closed.
    def on_close(self, ws):
        logger.info('disconnected streaming server')

    # when websocket opened.
    def on_open(self, ws):
        logger.info('connected streaming server')
        output_json = json.dumps(
                {'method' : 'subscribe',
                'params' : {'channel' : self.channel}
                },
        )

        ws.send(output_json)

if __name__ == '__main__':
    #API endpoint
    url = 'wss://ws.lightstream.bitflyer.com/json-rpc'
    channels = ['lightning_executions_BTC_JPY','lightning_executions_FX_BTC_JPY']
    json_rpc = RealtimeAPI(url=url, channel=channels[0])
    #ctrl + cで終了
    json_rpc.run()

ちなみに下の方をこんな感じにすると、現物とFXの情報が両方取得できます。

    # when websocket opened.
    def on_open(self, ws):
        logger.info('connected streaming server')
        output_json = json.dumps(
                {'method' : 'subscribe',
                'params' : {'channel' : self.channel[0]}
                },
        )
        output_json_fx = json.dumps(
                {'method' : 'subscribe',
                'params' : {'channel' : self.channel[1]}
                },
        )
        ws.send(output_json)
        ws.send(output_json_fx)

if __name__ == '__main__':
    #API endpoint
    url = 'wss://ws.lightstream.bitflyer.com/json-rpc'
    channel = ['lightning_executions_BTC_JPY','lightning_executions_FX_BTC_JPY']
    json_rpc = RealtimeAPI(url=url, channel=channel)
    #ctrl + cで終了
    json_rpc.run()

所要時間37分(7分オーバー)

この記事が気に入ったらサポートをしてみませんか?