BF注文サンプルコードpython編

python人気みたいなんで勉強して書き直しました、、、w

トレール以外の注文に対応(後で追加しておきます)

python初心者なんでコードが汚いです、、、?

#Order
import requests
import time
import hmac
import hashlib

#Assist
import json

###############
class Order:
   def __init__(self):
       self.key = "キー"
       self.secret = "シークレット"
       self.symbol = "FX_BTC_JPY"
       self.api = BitFlyer(self.key, self.secret)
       self.assist = Assist()

   def sendOrder(self, type, body):
       if type == "special":
           path = "/v1/me/sendparentorder"
       else:
           path = "/v1/me/sendchildorder"

       response = None
       while (response is None):
           try:
               response = self.api.requestStart("POST", path, body)
           except:
               print("retry")
               pass
               time.sleep(3)
       return self.assist.purseJSON(response)

   def createOrderBody(self, params = {}):
       if params["type"] == "LIMIT":
           body = {
                   "product_code": self.symbol,
                   "condition_type": "LIMIT",
                   "side": params["side"],
                   "price": params["price"],
                   "size": params["size"]
                   }
       elif params["type"] == "STOP":
           body = {
                   "product_code": self.symbol,
                   "condition_type": "STOP",
                   "side": params["side"],
                   "trigger_price": params["trigger"],
                   "size": params["size"]
               }
       elif params["type"] == "MARKET":
           body = {
                   "product_code": self.symbol,
                   "condition_type": "MARKET",
                   "side": params["side"],
                   "price": 0,
                   "size": params["size"]
               }
       elif params["type"] == "STOP_LIMIT":
           body = {
                   "product_code": self.symbol,
                   "condition_type": "STOP_LIMIT",
                   "side": params["side"],
                   "price": params["price"],
                   "trigger_price": params["trigger"],
                   "size": params["size"]
               }
        elif params["type"] == "TRAIL":
            body = {
                    "product_code": self.symbol,
                    "condition_type": "TRAIL",
                    "side": params["side"],
                    "offset": params["offset"],
                    "size": params["size"]
                }

       else:
           print("Type ERROR")
           return

       return body

   def createSIMPLEOrder(self, order1 = {}, minute_to_expire = 99999, time_in_force = "GTC"):
       print("Order : SIMPLE")
       if order1["type"] == "LIMIT":
           bodys = {
               "product_code": self.symbol,
               "child_order_type": "LIMIT",
               "side": order1["side"],
               "price": order1["price"],
               "size": order1["size"],
               "minute_to_expire": minute_to_expire,
               "time_in_force": time_in_force
                   }
           return self.sendOrder("nomal", bodys)
       elif order1["type"] == "MARKET":
           bodys = {
                   "product_code": self.symbol,
                   "child_order_type": "MARKET",
                   "side": order1["side"],
                   "size": order1["size"],
                   "minute_to_expire": minute_to_expire,
                   "time_in_force": time_in_force
                   }
           return self.sendOrder("nomal", bodys)
       else:
           bodys = {
               "order_method": "SIMPLE",
               "minute_to_expire": minute_to_expire,
               "time_in_force": time_in_force,
               "parameters": [self.createOrderBody(order1)]
                   }
           return self.sendOrder("special", bodys)
   def createIFDOrder(self, order1 = {}, order2 = {}, minute_to_expire = 99999, time_in_force = "GTC"):
       print("Order : IFD")
       bodys = {
               "order_method": "IFD",
               "minute_to_expire": minute_to_expire,
               "time_in_force": time_in_force,
               "parameters": [self.createOrderBody(order1), self.createOrderBody(order2)]
               }
       return self.sendOrder("special", bodys)
   def createOCOOrder(self, order1 = {}, order2 = {}, minute_to_expire = 99999, time_in_force = "GTC"):
       print("Order : OCO")
       bodys = {
               "order_method": "OCO",
               "minute_to_expire": minute_to_expire,
               "time_in_force": time_in_force,
               "parameters": [self.createOrderBody(order1), self.createOrderBody(order2)]
               }
       return self.sendOrder("special", bodys)
   def createIFDOCOOrder(self, order1 = {}, order2 = {}, order3 = {}, minute_to_expire = 99999, time_in_force = "GTC"):
       print("Order : IFDOCO")
       bodys = {
               "order_method": "IFDOCO",
               "minute_to_expire": minute_to_expire,
               "time_in_force": time_in_force,
               "parameters": [self.createOrderBody(order1), self.createOrderBody(order2), self.createOrderBody(order3)]
               }
       return self.sendOrder("special", bodys)

class BitFlyer:
   def __init__(self, key, secret):
       self.key = key
       self.secret = secret
       self.url = "https://lightning.bitflyer.jp"
   def requestStart(self, method, path, params):
       if method == 'POST':
           url = self.url + path
           timestamp = str(int(time.time()))
           json_data = json.dumps(params).encode("utf-8")
           sign = self.createSign(timestamp, method, path, json.dumps(params))
           headers = {
               'ACCESS-KEY': self.key,
               'ACCESS-TIMESTAMP': timestamp,
               'ACCESS-SIGN': sign,
               'Content-Type': 'application/json',
               'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
               }
           r = requests.post(url, data=json_data, headers=headers)
       elif method == 'GET':
           url = self.url + path
           json_data = json.dumps(params).encode("utf-8")
           r = requests.get(url, params=json_data)
       return r.text

   def createSign(self, timestamp, method, path, params):

       text = timestamp + method + path + params
       return hmac.new(self.secret.encode('utf-8'), text.encode('utf-8'), hashlib.sha256).hexdigest()

class Assist:
   def purseJSON(self, line):
       obj = None
       while (obj is None):
           try:
               obj = json.loads(line)
           except:
               line = {"error" : "purseJSON error", "value" : line}
               pass
       return obj

if __name__ == '__main__':
   print("START")

    #注文オブジェ    order = Order()

   orderbody1 = {"type" : "LIMIT", "side" : "SELL", "price" : 999999, "size" : 0.001}
   orderbody2 = {"type" : "LIMIT", "side" : "BUY", "price" : 666666, "size" : 0.001}
   orderbody3 = {"type" : "STOP", "side" : "BUY","trigger" : 1111111, "size" : 0.001}

    #orderbody = {"type" : "STOP_LIMIT", "side" : "BUY", "price" : 999999, "trigger" : 1111111, "size" : 0.001}
    #orderbody = {"type" : "MARKET", "side" : "BUY", "size" : 0.001}

   re = order.createIFDOCOOrder(orderbody1, orderbody2, orderbody3)
   print(re)
    #re = order.createIFDOrder(orderbody1, orderbody2)
    #re = order.createOCOOrder(orderbody1, orderbody2)
    #re = order.createSIMPLEOrder(orderbody1)

   #トレール 現在より5000変動で注文
   orderbodyByTrail = {"type" : "TRAIL", "side" : "SELL", "offset" : 5000, "size" : 0.001}
   result = order.createSIMPLEOrder(orderbodyByTrail)
   print(result)
   


コメントアウトしてるやつを使えばトレール以外全て網羅できます

詳しい説明は省略します、というか言わなくてもつかえるようになってほしいです!

本当に困ったらツイッターで聞いてください



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