昔つくった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)

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