2025-11-20 16:15:45 +08:00
|
|
|
|
import sys
|
|
|
|
|
|
import argparse
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
from core.manager import StrategyManager, print_status_table
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
|
|
description="策略管理系统 - 批量管理你的交易策略",
|
|
|
|
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
|
|
|
|
epilog="""
|
|
|
|
|
|
示例:
|
|
|
|
|
|
# 查看所有策略状态
|
|
|
|
|
|
python start.py status
|
|
|
|
|
|
|
|
|
|
|
|
# 启动所有策略
|
|
|
|
|
|
python start.py start --all
|
|
|
|
|
|
|
|
|
|
|
|
# 启动单个策略(使用标识符)
|
|
|
|
|
|
python start.py start -n DualModeTrendlineHawkesStrategy2_FG
|
|
|
|
|
|
|
|
|
|
|
|
# 停止单个策略
|
|
|
|
|
|
python start.py stop -n DualModeTrendlineHawkesStrategy2_FG
|
|
|
|
|
|
|
|
|
|
|
|
# 重启策略
|
|
|
|
|
|
python start.py restart -n DualModeTrendlineHawkesStrategy2_FG
|
|
|
|
|
|
|
|
|
|
|
|
# 查看日志(最近50行)
|
|
|
|
|
|
python start.py logs -n DualModeTrendlineHawkesStrategy2_FG -t 50
|
2026-01-26 01:21:46 +08:00
|
|
|
|
|
|
|
|
|
|
# ========== 白名单管理 ==========
|
|
|
|
|
|
# 查看白名单
|
|
|
|
|
|
python start.py whitelist
|
|
|
|
|
|
|
|
|
|
|
|
# 添加策略到白名单
|
|
|
|
|
|
python start.py whitelist add -n DualModeTrendlineHawkesStrategy2_FG
|
|
|
|
|
|
|
|
|
|
|
|
# 从白名单移除策略
|
|
|
|
|
|
python start.py whitelist remove -n DualModeTrendlineHawkesStrategy2_FG
|
|
|
|
|
|
|
|
|
|
|
|
# 启用白名单中的策略
|
|
|
|
|
|
python start.py whitelist enable -n DualModeTrendlineHawkesStrategy2_FG
|
|
|
|
|
|
|
|
|
|
|
|
# 禁用白名单中的策略
|
|
|
|
|
|
python start.py whitelist disable -n DualModeTrendlineHawkesStrategy2_FG
|
|
|
|
|
|
|
|
|
|
|
|
# 手动触发白名单自动启动
|
|
|
|
|
|
python start.py whitelist auto-start
|
2025-11-20 16:15:45 +08:00
|
|
|
|
"""
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2026-01-26 01:21:46 +08:00
|
|
|
|
parser.add_argument("action", choices=["start", "stop", "restart", "status", "logs", "whitelist"])
|
2025-11-20 16:15:45 +08:00
|
|
|
|
parser.add_argument("-n", "--name", help="策略标识符(策略名_品种)")
|
|
|
|
|
|
parser.add_argument("-a", "--all", action="store_true", help="对所有策略执行操作")
|
|
|
|
|
|
parser.add_argument("-c", "--config", default="config/main.json", help="主配置文件路径")
|
|
|
|
|
|
parser.add_argument("-t", "--tail", type=int, default=30, help="查看日志末尾行数")
|
|
|
|
|
|
|
2026-01-26 01:21:46 +08:00
|
|
|
|
# 白名单子命令
|
|
|
|
|
|
whitelist_group = parser.add_argument_group("白名单操作")
|
|
|
|
|
|
whitelist_group.add_argument("whitelist_action", choices=["list", "add", "remove", "enable", "disable", "auto-start"],
|
|
|
|
|
|
help="白名单操作动作", nargs="?")
|
|
|
|
|
|
|
2025-11-20 16:15:45 +08:00
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
manager = StrategyManager(args.config)
|
|
|
|
|
|
|
2026-01-26 01:21:46 +08:00
|
|
|
|
# 白名单管理
|
|
|
|
|
|
if args.action == "whitelist":
|
|
|
|
|
|
if args.whitelist_action == "list" or args.whitelist_action is None:
|
|
|
|
|
|
# 列出白名单
|
|
|
|
|
|
print("\n" + "=" * 80)
|
|
|
|
|
|
print("📋 白名单列表")
|
|
|
|
|
|
print("=" * 80)
|
|
|
|
|
|
|
|
|
|
|
|
whitelist = manager.whitelist_manager.get_all()
|
|
|
|
|
|
auto_status = manager.whitelist_manager.get_auto_start_status()
|
|
|
|
|
|
|
|
|
|
|
|
print(f"白名单策略总数: {auto_status['whitelist_count']}")
|
|
|
|
|
|
print(f"已启用策略数: {auto_status['enabled_count']}")
|
|
|
|
|
|
print(f"今天已自动启动: {'是' if not auto_status['should_auto_start'] else '否'}")
|
|
|
|
|
|
print(f"上次自动启动日期: {auto_status['last_auto_start_date'] or '从未'}")
|
|
|
|
|
|
print("-" * 80)
|
|
|
|
|
|
|
|
|
|
|
|
if not whitelist:
|
|
|
|
|
|
print("白名单为空")
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"{'策略标识':<45} {'状态':<10} {'添加时间'}")
|
|
|
|
|
|
print("-" * 80)
|
|
|
|
|
|
for name, config in whitelist.items():
|
|
|
|
|
|
status = "启用" if config.get("enabled", True) else "禁用"
|
|
|
|
|
|
added_at = config.get("added_at", "")[:19]
|
|
|
|
|
|
print(f"{name:<45} {status:<10} {added_at}")
|
|
|
|
|
|
print("=" * 80)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.whitelist_action == "add":
|
|
|
|
|
|
# 添加到白名单
|
|
|
|
|
|
if not args.name:
|
|
|
|
|
|
print("❌ 错误: 添加操作必须指定策略名称 (-n)")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
if manager.add_to_whitelist(args.name):
|
|
|
|
|
|
print(f"✅ 成功添加到白名单: {args.name}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"❌ 添加失败,策略可能已存在: {args.name}")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.whitelist_action == "remove":
|
|
|
|
|
|
# 从白名单移除
|
|
|
|
|
|
if not args.name:
|
|
|
|
|
|
print("❌ 错误: 移除操作必须指定策略名称 (-n)")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
if manager.remove_from_whitelist(args.name):
|
|
|
|
|
|
print(f"✅ 成功从白名单移除: {args.name}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"❌ 移除失败,策略可能不在白名单中: {args.name}")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.whitelist_action == "enable":
|
|
|
|
|
|
# 启用白名单中的策略
|
|
|
|
|
|
if not args.name:
|
|
|
|
|
|
print("❌ 错误: 启用操作必须指定策略名称 (-n)")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
if manager.set_whitelist_enabled(args.name, True):
|
|
|
|
|
|
print(f"✅ 已启用: {args.name}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"❌ 启用失败,策略可能不在白名单中: {args.name}")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.whitelist_action == "disable":
|
|
|
|
|
|
# 禁用白名单中的策略
|
|
|
|
|
|
if not args.name:
|
|
|
|
|
|
print("❌ 错误: 禁用操作必须指定策略名称 (-n)")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
if manager.set_whitelist_enabled(args.name, False):
|
|
|
|
|
|
print(f"✅ 已禁用: {args.name}")
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"❌ 禁用失败,策略可能不在白名单中: {args.name}")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.whitelist_action == "auto-start":
|
|
|
|
|
|
# 手动触发自动启动
|
|
|
|
|
|
print("\n" + "=" * 80)
|
|
|
|
|
|
print("🚀 手动触发白名单自动启动")
|
|
|
|
|
|
print("=" * 80)
|
|
|
|
|
|
|
|
|
|
|
|
results = manager.auto_start_whitelist_strategies()
|
|
|
|
|
|
|
|
|
|
|
|
if not results:
|
|
|
|
|
|
print("⚠️ 今天已执行过自动启动或白名单为空")
|
|
|
|
|
|
else:
|
|
|
|
|
|
success_count = sum(1 for v in results.values() if v)
|
|
|
|
|
|
fail_count = len(results) - success_count
|
|
|
|
|
|
|
|
|
|
|
|
print(f"📊 结果: 成功 {success_count}, 失败 {fail_count}")
|
|
|
|
|
|
for name, success in results.items():
|
|
|
|
|
|
status = "✅ 成功" if success else "❌ 失败"
|
|
|
|
|
|
print(f" {status}: {name}")
|
|
|
|
|
|
|
|
|
|
|
|
print("=" * 80)
|
|
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
# 原有逻辑
|
2025-11-20 16:15:45 +08:00
|
|
|
|
if args.action == "status":
|
|
|
|
|
|
status = manager.get_status()
|
|
|
|
|
|
print_status_table(status)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.action in ["start", "stop"]:
|
|
|
|
|
|
if args.all:
|
|
|
|
|
|
manager.start_all() if args.action == "start" else manager.stop_all()
|
|
|
|
|
|
elif args.name:
|
|
|
|
|
|
manager.start_strategy(args.name) if args.action == "start" else manager.stop_strategy(args.name)
|
|
|
|
|
|
else:
|
|
|
|
|
|
print("❌ 错误: 请指定策略名称 (-n) 或使用 --all")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.action == "restart":
|
|
|
|
|
|
if not args.name:
|
|
|
|
|
|
print("❌ 错误: 重启操作必须指定策略名称 (-n)")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
manager.restart_strategy(args.name)
|
|
|
|
|
|
|
|
|
|
|
|
elif args.action == "logs":
|
|
|
|
|
|
if not args.name:
|
|
|
|
|
|
print("❌ 错误: 查看日志必须指定策略名称 (-n)")
|
|
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
|
|
|
|
log_file = Path("logs") / f"{args.name}.log"
|
|
|
|
|
|
if not log_file.exists():
|
|
|
|
|
|
print(f"⚠️ 日志文件不存在: {log_file}")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
print(f"\n📄 {args.name} 的日志 (最近{args.tail}行):")
|
|
|
|
|
|
print("=" * 80)
|
|
|
|
|
|
with open(log_file, 'r') as f:
|
|
|
|
|
|
lines = f.readlines()[-args.tail:]
|
|
|
|
|
|
for line in lines:
|
|
|
|
|
|
print(line.rstrip())
|
|
|
|
|
|
print("=" * 80)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
main()
|