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)
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
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
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
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"]
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)
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
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
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)
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)
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)
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)
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