昔つくったSFDBOT
もう今は使えないと思うけど。改良したらMMBOTとかになりそうな予感はする。テンプレにでもどうぞ。API入れても今は注文はできないよ。SFD0%だからね。
#!/usr/bin/python3
# coding: utf-8
import time
import pybitflyer
import logging
class SFDGetter:
#初期情報設定
def __init__(self):
# BitflyerAPI
self.api = pybitflyer.API(api_key="",
api_secret="")
# 現在のポジション
self.p_side = ''
# 注文ロット数
self.BTC_Size = 0.01
# LOGGER設定
self.logger = self.set_Log_config()
# 取得SFD
self.SFD_Price = 0
# 指値注文、注文から1分以内に約定しない場合はキャンセル
def Order(self, Mode, price, size):
return self.api.sendchildorder(product_code="FX_BTC_JPY", child_order_type="LIMIT", side=Mode, size=size,
price=price,
minute_to_expire=1, time_in_force="GTC")
# 成行注文
def n_Order(self, Mode, size):
return self.api.sendchildorder(product_code="FX_BTC_JPY", child_order_type="MARKET", side=Mode, size=size,
minute_to_expire=1, time_in_force="GTC")
# ポジション取得
def Get_Position(self):
# 今ある全ポジション取得
poss = self.api.getpositions(product_code="FX_BTC_JPY")
# ポジションの取得数(1以上だとおかしいはず)
p_size = 0
# 現在のポジションを確認
for p in poss:
if p['side'] == 'BUY':
p_size += p['size']
if p['side'] == 'SELL':
p_size -= p['size']
# sizeが0の場合はノーポジ、1以上の場合はロング、それ以外はショートとする(LONGになることはありえない)
if p_size == 0:
self.p_side = 'NO POSITION'
elif p_size > 0:
self.p_side = 'LONG'
else:
self.p_side = 'SHORT'
return self.p_side
# ログ出力設定
def set_Log_config(self):
# logging設定
# ログの出力名を設定
self.logger = logging.getLogger('SFDLog')
# ログレベルの設定
self.logger.setLevel(10)
# ログ出力先指定
fh = logging.FileHandler('SFD.log')
self.logger.addHandler(fh)
# ログのコンソール出力設定
sh = logging.StreamHandler()
self.logger.addHandler(sh)
# ログの出力形式の設定
formatter = logging.Formatter('%(asctime)s:%(lineno)d:%(levelname)s:%(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)
return self.logger
if __name__ == '__main__':
# 初期処理
getter = SFDGetter()
# 初期ポジションの取得
side = getter.Get_Position()
cnt = 0
BTC_Size = getter.BTC_Size
getter.logger.info("===========SFD Start===========")
try:
# 実行
while True:
# 現物価格の取得
spot = round(getter.api.ticker(product_code="BTC_JPY")['ltp'])
# FX価格の取得
fx = round(getter.api.ticker(product_code="FX_BTC_JPY")['ltp'])
# 現物とFXとの価格差からSFD値を取得
diff = round((fx - spot) / spot * 100, 3)
# SFD値を表示
getter.logger.info("Diff:" + str(diff))
# 現在のポジションを表示
getter.logger.info("Position:" + str(side))
# テスト表示
getter.logger.info("Price counts:" + str(cnt))
# SFDの値が4.99以上で5.02未満の場合
if 4.99 <= diff < 5.02:
# SFDの値が5.0以上で現在のポジションがショート以外の場合(ショートの場合は二重注文になる為)
if diff >= 5.0 and side == 'NO POSITION':
# 現物価格の取得
spot = round(getter.api.ticker(product_code="BTC_JPY")['ltp'])
# SFD値を設定
diff = 5.02
# 指値をするためのFX価格の割り出し
fx = round((spot * diff) / 100 + spot)
# 指値を使い注文処理
Re = getter.Order("SELL", fx, BTC_Size)
#Re = getter.n_Order("SELL", BTC_Size)
getter.logger.info("SELL Order start******************************")
getter.logger.info("SELL Order Price :" + str(fx))
# 注文から60秒間でポジションが取得できるかのチェック
t = int(time.time())
while int(time.time()) < (t + 60):
if getter.Get_Position() == 'SHORT':
getter.logger.info("SELL ORDER Diff:" + str(diff) + " / " + "Price:" + str(fx))
getter.logger.info("SELL:" + str(Re))
# ポジションはショートへ変更
side = 'SHORT'
break
else:
# ポジションが取れなかったのでオーダーキャンセルログ出力
getter.logger.info("Order canceled******************************")
# SFDの値が5.0未満でポジションがロング以外の場合(決済処理)
elif diff < 5.0 and side == 'SHORT':
# 現物価格の取得
spot = round(getter.api.ticker(product_code="BTC_JPY")['ltp'])
# SFD値を設定
diff = 4.99
fx = round((spot * diff) / 100 + spot)
# 指値を使い注文処理
Re = getter.Order("BUY", fx, BTC_Size)
#Re = getter.n_Order("BUY", BTC_Size)
getter.logger.info("BUY Order start******************************")
getter.logger.info("BUY Order Price :" + str(fx))
# 注文から60秒間でポジションが取得できるかのチェック
t = int(time.time())
while int(time.time()) < (t + 60):
if getter.Get_Position() == 'NO POSITION':
getter.logger.info("BUY ORDER Diff:" + str(diff) + " / " + "Price:" + str(fx))
print("BUY:" + str(Re))
# ポジションはノーポジへ変更
side = 'NO POSITION'
cnt += 1
break
else:
# ポジションが取れなかったのでオーダーキャンセルログ出力
getter.logger.info("Order canceled******************************")
# 大幅にSFD値が振れたのですべてのオーダーを閉じる
elif (4.85 > diff or diff > 5.25) and (side != 'NO POSITION'):
# ポジションによって成行決済
if getter.Get_Position() == 'SHORT':
getter.logger.info("Order closed")
getter.logger.info("BUY ORDER Diff:" + str(diff) + " / " + "FXPrice:" + str(fx) + " / " +"Price:" + str(spot))
Re = getter.n_Order("BUY", BTC_Size)
elif getter.Get_Position() == 'LONG':
getter.logger.info("Order closed")
getter.logger.info("SELL ORDER Diff:" + str(diff) + " / " + "FXPrice:" + str(fx) + " / " + "Price:" + str(spot))
Re = getter.n_Order("SELL", BTC_Size)
time.sleep(0.6)
except Exception as x:
getter.logger.error("Error Happend!")
getter.logger.exception(x)
time.sleep(5)
この記事が気に入ったらサポートをしてみませんか?