如何借助AWS实现Python交易机器人仅在特定时段自动启停?
基于AWS实现Python交易机器人定时启停方案
方案1:EC2实例 + EventBridge(推荐,适合持续运行的机器人)
这种方案适配需要长时间运行的交易机器人,通过定时启停EC2实例控制运行时段,同时确保实例启动后自动拉起机器人。
步骤1:配置EC2实例自动启动机器人
将Python交易机器人注册为系统服务,保证EC2实例启动后自动运行:
- 在EC2实例上创建systemd服务文件
/etc/systemd/system/trading-bot.service,内容如下:
[Unit] Description=Trading Bot Service After=network.target [Service] User=ec2-user # 根据你的实例用户调整 WorkingDirectory=/home/ec2-user/trading-bot # 机器人代码所在目录 ExecStart=/usr/bin/python3 bot.py # 机器人启动命令 Restart=on-failure # 机器人崩溃时自动重启 RestartSec=5 StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target
- 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable trading-bot sudo systemctl start trading-bot
验证服务状态:sudo systemctl status trading-bot
步骤2:用EventBridge创建定时启停规则
EventBridge(原CloudWatch Events)可按指定时间触发EC2实例的启动/停止操作,务必设置交易时段对应的时区(比如美股交易用America/New_York):
创建启动规则
- 规则名称:
Start-Trading-Bot-Instance - 规则类型:Schedule expression
- 调度表达式:
cron(25 9 ? * MON-FRI *)(每周一到周五9:25启动,提前5分钟确保实例就绪) - 目标:选择EC2实例,动作选启动实例,指定你的EC2实例ID
- 时区:设置为
America/New_York
创建停止规则
- 规则名称:
Stop-Trading-Bot-Instance - 规则类型:Schedule expression
- 调度表达式:
cron(35 16 ? * MON-FRI *)(每周一到周五16:35停止,延后5分钟让机器人完成收尾) - 目标:选择EC2实例,动作选停止实例,指定你的EC2实例ID
- 时区:设置为
America/New_York
方案2:ECS Fargate + EventBridge(更灵活,按运行时长计费)
若不想长期占用EC2实例,可将机器人打包为Docker镜像,用ECS Fargate运行,通过EventBridge定时启动/停止任务:
步骤1:打包机器人为Docker镜像
创建Dockerfile:
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY bot.py . CMD ["python", "bot.py"]
构建并推送到ECR(AWS容器镜像仓库)。
步骤2:配置ECS任务定义
创建Fargate类型的任务定义,指定你的镜像、资源配置(CPU/内存)。
步骤3:EventBridge定时触发任务
- 启动规则:调度表达式
cron(30 9 ? * MON-FRI *),目标选择ECS任务,指定集群、任务定义、启动数量1 - 停止规则:调度表达式
cron(30 16 ? * MON-FRI *),目标选择ECS任务,动作选停止任务,指定集群和任务标识
补充:代码层面的时段校验(双重保障)
为避免意外情况(比如实例提前启动),可在机器人代码中加入时段检查逻辑,不在交易时段时自动退出:
import datetime import time import pytz def is_trading_hours(): tz = pytz.timezone('America/New_York') now = datetime.datetime.now(tz) # 周一到周五,9:30-16:30 if now.weekday() not in range(5): return False start_time = datetime.time(9, 30) end_time = datetime.time(16, 30) return start_time <= now.time() <= end_time while True: if not is_trading_hours(): print("不在交易时段,退出机器人") break # 机器人核心逻辑 run_trading_strategy() time.sleep(60) # 按需求调整间隔
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

