Ejemplo n.º 1
0
    async def call_phone(cls, access_key, secret_key, _from, to, code, region_id="cn-hangzhou"):
        """ Initialize. """
        def percent_encode(s):
            res = parse.quote_plus(s.encode("utf8"))
            res = res.replace("+", "%20").replace("*", "%2A").replace("%7E", "~")
            return res

        url = "http://dyvmsapi.aliyuncs.com/"
        out_id = tools.get_uuid1()
        nonce = tools.get_uuid1()
        timestamp = tools.dt_to_date_str(tools.get_utc_time(), fmt="%Y-%m-%dT%H:%M:%S.%fZ")

        params = {
            "VoiceCode": code,
            "OutId": out_id,
            "CalledNumber": to,
            "CalledShowNumber": _from,
            "Version": "2017-05-25",
            "Action": "SingleCallByVoice",
            "Format": "JSON",
            "RegionId": region_id,
            "Timestamp": timestamp,
            "SignatureMethod": "HMAC-SHA1",
            "SignatureType": "",
            "SignatureVersion": "1.0",
            "SignatureNonce": nonce,
            "AccessKeyId": access_key
        }
        query = "&".join(["{}={}".format(percent_encode(k), percent_encode(params[k])) for k in sorted(params.keys())])
        str_to_sign = "GET&%2F&" + percent_encode(query)
        h = hmac.new(bytes(secret_key + "&", "utf8"), bytes(str_to_sign, "utf8"), digestmod=hashlib.sha1)
        signature = base64.b64encode(h.digest()).decode()
        params["Signature"] = signature
        await AsyncHttpRequests.fetch("GET", url, params=params)
Ejemplo n.º 2
0
    async def create_order(self, action, price, quantity, *args, **kwargs):
        """ Create an order.

        Args:
            action: Trade direction, BUY or SELL.
            price: Price of each contract.
            quantity: The buying or selling quantity.

        Returns:
            order_no: Order ID if created successfully, otherwise it's None.
            error: Error information, otherwise it's None.
        """
        if float(quantity) > 0:
            if action == ORDER_ACTION_BUY:
                trade_type = TRADE_TYPE_BUY_OPEN
            else:
                trade_type = TRADE_TYPE_SELL_CLOSE
        else:
            if action == ORDER_ACTION_BUY:
                trade_type = TRADE_TYPE_BUY_CLOSE
            else:
                trade_type = TRADE_TYPE_SELL_OPEN
        quantity = abs(float(quantity))
        price = tools.float_to_str(price)
        quantity = tools.float_to_str(quantity)
        client_order_id = tools.get_uuid1().replace("-",
                                                    "")[:21] + str(trade_type)
        result, error = await self._rest_api.create_order(
            action, self._raw_symbol, price, quantity, client_order_id)
        if error:
            return None, error
        order_no = "{}_{}".format(result["orderId"], result["clientOrderId"])
        return order_no, None
Ejemplo n.º 3
0
    def decorating_function(method):

        locker_name = 'global_locker:' + name
        random_value = tools.get_uuid1()  # 获取一个随机值

        @functools.wraps(method)
        async def wrapper(*args, **kwargs):
            try:
                ok = 0
                ct = time.time()
                while not ok:
                    # 如果不存在才执行创建,并且在1秒后自动删除
                    ok = await exec_redis_cmd('SET', locker_name, random_value,
                                              'PX', '1000', 'NX')
                    if ok:
                        break
                    else:
                        if time.time() - ct > 1.0:  # 如果1秒之后还没有获取到全局锁,那么就返回错误
                            raise GlobalLockerException()
                        else:
                            await asyncio.sleep(0.01)
                return await method(*args, **kwargs)
            finally:
                await exec_redis_cmd('EVAL', GLOBAL_UNLOCK_SCRIPT, 1,
                                     locker_name, random_value)

        return wrapper
Ejemplo n.º 4
0
    async def create_order(self,
                           action,
                           price,
                           quantity,
                           order_type=ORDER_TYPE_LIMIT,
                           *args,
                           **kwargs):
        """ Create an order.

        Args:
            action: Trade direction, BUY or SELL.
            price: Price of order.
            quantity: The buying or selling quantity.
            order_type: order type, MARKET or LIMIT.

        Returns:
            order_no: Order ID if created successfully, otherwise it's None.
            error: Error information, otherwise it's None.
        """
        if action == ORDER_ACTION_BUY:
            action_type = "buy"
        elif action == ORDER_ACTION_SELL:
            action_type = "sell"
        else:
            return None, "action error"
        if order_type == ORDER_TYPE_MARKET:
            order_type_2 = "market"
        elif order_type == ORDER_TYPE_LIMIT:
            order_type_2 = "limit"
        else:
            return None, "order_type error"

        client_id = tools.get_uuid1()
        price = tools.float_to_str(price)
        quantity = tools.float_to_str(quantity)
        success, error = await self._rest_api.create_order(
            client_id, action_type, self._raw_symbol, order_type_2, price,
            quantity)
        if error:
            return None, error
        order_no = success["orderId"]
        infos = {
            "account": self._account,
            "platform": self._platform,
            "strategy": self._strategy,
            "order_no": order_no,
            "symbol": self._symbol,
            "action": action,
            "price": price,
            "quantity": quantity,
            "order_type": order_type
        }
        order = Order(**infos)
        self._orders[order_no] = order
        if self._order_update_callback:
            SingleTask.run(self._order_update_callback, copy.copy(order))
        return order_no, None
Ejemplo n.º 5
0
 async def do_request(self, option, params):
     """ 发送请求
     """
     request_id = tools.get_uuid1()
     data = {"request_id": request_id, "option": option, "params": params}
     await self.ws.send_json(data)
     f = asyncio.futures.Future()
     self._querys[request_id] = f
     result = await f
     if result["code"] == 0:
         return True, result["data"]
     else:
         return False, result["data"]
Ejemplo n.º 6
0
    async def auth_callback(self, data):
        if data["err-code"] != 0:
            e = Error("Websocket connection authorized failed: {}".format(data))
            logger.error(e, caller=self)
            SingleTask.run(self._init_success_callback, False, e)
            return

        # subscribe order
        data = {
            "op": "sub",
            "cid": tools.get_uuid1(),
            "topic": self._order_channel
        }
        await self._ws.send(data)

        # subscribe position
        data = {
            "op": "sub",
            "cid": tools.get_uuid1(),
            "topic": self._position_channel
        }
        await self._ws.send(data)
Ejemplo n.º 7
0
 def register(self, func, interval=1, *args, **kwargs):
     """ 注册一个任务,在每次心跳的时候执行调用
     @param func 心跳的时候执行的函数
     @param interval 执行回调的时间间隔(秒)
     @return task_id 任务id
     """
     t = {
         "func": func,
         "interval": interval,
         "args": args,
         "kwargs": kwargs
     }
     task_id = tools.get_uuid1()
     self._tasks[task_id] = t
     return task_id
Ejemplo n.º 8
0
 def register(self, func, interval=1, *args, **kwargs):
     """ 注册一个任务,在每次心跳的时候执行调用
     @param func 心跳的时候执行的函数
     @param interval 执行回调的时间间隔(秒)
     @return task_id 任务id
     """
     t = {
         'func': func,
         'interval': interval,
         'args': args,
         'kwargs': kwargs
     }
     task_id = tools.get_uuid1()
     self._tasks[task_id] = t
     return task_id
Ejemplo n.º 9
0
    def _update(self, update_fields):
        """ Update config attributes.

        Args:
            update_fields: Update fields.
        """
        self.server_id = update_fields.get("SERVER_ID", tools.get_uuid1())
        self.log = update_fields.get("LOG", {})
        self.rabbitmq = update_fields.get("RABBITMQ", None)
        self.accounts = update_fields.get("ACCOUNTS", [])
        self.markets = update_fields.get("MARKETS", {})
        self.heartbeat = update_fields.get("HEARTBEAT", {})
        self.proxy = update_fields.get("PROXY", None)

        for k, v in update_fields.items():
            setattr(self, k, v)
Ejemplo n.º 10
0
    def update(self, update_fields):
        """ 更新配置
        @param update_fields 更新字段
        """
        self.server_id = update_fields.get("SERVER_ID",
                                           tools.get_uuid1())  # 服务id
        self.run_time_update = update_fields.get("RUN_TIME_UPDATE",
                                                 False)  # 是否支持配置动态更新
        self.log = update_fields.get("LOG", {})  # 日志配置
        self.rabbitmq = update_fields.get("RABBITMQ", None)  # RabbitMQ配置
        self.mongodb = update_fields.get("MONGODB", None)  # mongodb配置
        self.redis = update_fields.get("REDIS", None)  # redis配置
        self.platforms = update_fields.get("PLATFORMS", {})  # 交易所配置
        self.heartbeat = update_fields.get("HEARTBEAT", {})  # 服务心跳配置
        self.proxy = update_fields.get("PROXY", None)  # HTTP代理配置

        # 将配置文件中的数据按照dict格式解析并设置成config的属性
        for k, v in update_fields.items():
            setattr(self, k, v)
Ejemplo n.º 11
0
    def _update(self, update_fields):
        """ Update config attributes.

        Args:
            update_fields: Update fields.
        """
        self.server_id = update_fields.get("SERVER_ID", tools.get_uuid1())
        self.run_time_update = update_fields.get("RUN_TIME_UPDATE", False)
        self.log = update_fields.get("LOG", {})
        self.rabbitmq = update_fields.get("RABBITMQ", None)
        self.mongodb = update_fields.get("MONGODB", None)
        self.redis = update_fields.get("REDIS", None)
        self.platforms = update_fields.get("PLATFORMS", {})
        self.accounts = update_fields.get("ACCOUNTS", [])
        self.heartbeat = update_fields.get("HEARTBEAT", {})
        self.http_server = update_fields.get("HTTP_SERVER", None)
        self.proxy = update_fields.get("PROXY", None)

        if self.http_server:
            port = self.http_server.get("port")
            apis = self.http_server.get("apis")
            middlewares = self.http_server.get("middlewares", [])
            ext_uri = self.http_server.get("ext_uri", [])
            if not isinstance(port, int) or port < 1024 or port > 65535:
                logger.error("http port error! port:", port, caller=self)
                exit(0)
            if not isinstance(apis, list):
                logger.error("http api pathes error! apis:", apis, caller=self)
                exit(0)
            if not isinstance(middlewares, list):
                logger.error("http middlewares error! middlewares:",
                             middlewares,
                             caller=self)
                exit(0)
            if not isinstance(ext_uri, list):
                logger.error("http ext_uri error! ext_uri:",
                             ext_uri,
                             caller=self)
                exit(0)

        for k, v in update_fields.items():
            setattr(self, k, v)
Ejemplo n.º 12
0
    def _update(self, update_fields):
        """ Update config attributes.

        Args:
            update_fields: Update fields.
        """
        self.server_id = update_fields.get("SERVER_ID", tools.get_uuid1())
        self.run_time_update = update_fields.get("RUN_TIME_UPDATE", False)
        self.log = update_fields.get("LOG", {})
        self.rabbitmq = update_fields.get("RABBITMQ", None)
        self.mongodb = update_fields.get("MONGODB", None)
        self.redis = update_fields.get("REDIS", None)
        self.platforms = update_fields.get("PLATFORMS", {})
        self.accounts = update_fields.get("ACCOUNTS", [])
        self.markets = update_fields.get("MARKETS", [])
        self.heartbeat = update_fields.get("HEARTBEAT", {})
        self.proxy = update_fields.get("PROXY", None)

        for k, v in update_fields.items():
            setattr(self, k, v)
Ejemplo n.º 13
0
    async def create_order(self,
                           action,
                           price,
                           quantity,
                           order_type=ORDER_TYPE_LIMIT,
                           *args,
                           **kwargs):
        """ Create an order.

        Args:
            action: Trade direction, `BUY` or `SELL`.
            price: Price of each contract.
            quantity: The buying or selling quantity.
            order_type: Specific type of order, `LIMIT` or `MARKET`. (default is `LIMIT`)

        Returns:
            order_no: Order ID if created successfully, otherwise it's None.
            error: Error information, otherwise it's None.
        """
        if not kwargs.get("client_order_id"):
            kwargs["client_order_id"] = tools.get_uuid1().replace("-", "")
        order_no, error = await self._t.create_order(action, price, quantity,
                                                     order_type, **kwargs)
        return order_no, error