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分オーバー)
この記事が気に入ったらサポートをしてみませんか?