From 5bb97401822797fcc2c02265d464d3d270815c91 Mon Sep 17 00:00:00 2001 From: zhiyong Date: Wed, 30 Apr 2025 14:31:19 +0800 Subject: [PATCH] feat: add clear strategy positions --- src/example_trade.py | 21 +++++++++++++++++++++ src/trade_server.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/example_trade.py b/src/example_trade.py index 15eb406..fa6e97f 100644 --- a/src/example_trade.py +++ b/src/example_trade.py @@ -51,6 +51,15 @@ def get_positions(strategy_name: str) -> dict: response = requests.get(f"{URL}/positions", params=params) return response.json() +def clear_strategy(strategy_name: str) -> dict: + """清除策略持仓数据 + + Args: + strategy_name: 策略名称 + """ + response = requests.delete(f"{URL}/clear/{strategy_name}") + return response.json() + if __name__ == "__main__": # 示例:查询默认策略的持仓信息 @@ -78,4 +87,16 @@ if __name__ == "__main__": print("交易后持仓:", positions) # 模拟输出: # {'data': [{'601988.SH': {'closeable_amount': 2000, 'total_amount': 2000}}], 'success': True} + + # 示例:清除策略持仓数据 + result = clear_strategy(STRATEGY) + print("清除策略持仓结果:", result) + # 模拟输出: + # {'success': True, 'message': "成功清除策略 '追梦投资港股ETF' 的持仓数据"} + + # 示例:清除后查询持仓 + positions = get_positions(STRATEGY) + print("清除后持仓:", positions) + # 模拟输出: + # {'data': [], 'success': True} \ No newline at end of file diff --git a/src/trade_server.py b/src/trade_server.py index 3207aba..0277b89 100644 --- a/src/trade_server.py +++ b/src/trade_server.py @@ -704,6 +704,44 @@ def get_today_entrust(): abort(500, description="Internal server error") +@app.route("/yu/clear/", methods=["DELETE"]) +def clear_strategy(strategy_name): + """清除指定策略的持仓管理数据""" + logger.info(f"接收到清除策略持仓请求: {strategy_name}") + try: + if not strategy_name: + raise ValueError("缺少策略名称参数") + + # 检查策略是否存在 + if strategy_name in strategy_positions: + # 从策略持仓字典中删除该策略 + del strategy_positions[strategy_name] + # 清除该策略的交易记录 + if strategy_name in strategy_trades: + del strategy_trades[strategy_name] + + # 清除与该策略相关的未完成委托 + for order_id, order_info in list(pending_orders.items()): + if order_info.get('strategy_name') == strategy_name: + del pending_orders[order_id] + + # 保存更新后的策略数据 + save_strategy_data() + + logger.info(f"成功清除策略持仓数据: {strategy_name}") + return jsonify({"success": True, "message": f"成功清除策略 '{strategy_name}' 的持仓数据"}), 200 + else: + logger.info(f"策略不存在或没有持仓数据: {strategy_name}") + return jsonify({"success": True, "message": f"策略 '{strategy_name}' 不存在或没有持仓数据"}), 200 + + except ValueError as e: + logger.error(f"无效的请求参数: {str(e)}") + abort(400, description=str(e)) + except Exception as e: + logger.error(f"清除策略持仓时出错: {str(e)}") + abort(500, description="服务器内部错误") + + # 超时处理函数 def execute_with_timeout(func, timeout, *args, **kwargs): with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor: