量化之 win 平台下部署与执行定时任务
该教程在 win 11 的平台下是没问题的,其他版本系统唤醒计算机可能需要自己调试下。创建任务计划执行 python 脚本流程如下:
效果图
每天股市收盘后,任务计划唤醒计算机执行数据更新,指标计算,然后生成自动复盘文档,自动推送到 github ,自动部署静态网站,然后通知到我创建的微信群,这样复盘就省心省力了。
通知到微信群
自动复盘文档归档静态网站
以上效果图全部是由程序自动化完成
创建任务计划
唤醒计算机需要创建任务计划,创建任务计划流程如下:
控制面板,打开任务计划程序
新建任务,并配置重要信息
常规: 使用最高权限
触发器: 设置触发任务条件
操作: 按文件截图配置
条件: 唤醒计算机运行此任务
设置: 按图勾选和选中
唤醒计算机执行 python 脚本所遇到的问题
命令窗口执行 python 脚本环境问题
其实,唤醒计算机执行 python 脚本所在的环境即是命令窗口的 python 环境,所以需要处理命令窗口环境与工程环境一致。
- 查看工程 python 环境
- 配置命令 python 环境的环境变量
- 查看命令 python 环境是否和量化工程环境是否一致
命令窗口执行 python 脚本 ModuleNotFoundError 问题
由于自己写的量化工程代码未能被命令环境识别,所以会出现以上错误,把自己的写的代码被命令窗口发现即可,在任务 python 脚本以下代码即可。
# 添加模块被发现
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
一定要把这代码放在任务脚本的顶部,如下图所示:
执行 python 脚本任务完毕后,win 的任务计划再次触发唤醒计算机唤醒不了的问题
python 脚本执行完毕后,触发计算机睡眠。
触发睡眠的 python 代码,经过测试,这段代码触发的睡眠,任务计划可以再次唤醒计算机,其他的很多代码试验了很多遍,任务计划唤醒不了计算机,不知为啥,直接抄代码即可。
触发睡眠代码
import subprocess
# 执行睡眠命令
subprocess.run(["powershell", "-Command",
"Add-Type -Assembly System.Windows.Forms; [System.Windows.Forms.Application]::SetSuspendState('Suspend', $false, $false)"])
# 结束该进程
os.system('taskkill /f /im python.exe')
如果任务计划还唤醒不了计算机执行 python 脚本,还需要这样操作
- 关闭休眠模式
或许上面的睡眠代码触发了计算机的休眠模式,所以需要关闭休眠模式,命令窗口执行关闭休眠。
关闭休眠模式:Powercfg -H OFF
打开休眠模式:Powercfg -H ON
- 修改电源选项
按以下修改电源计划
经过以上的配置,应该能通过 win 的任务计划唤醒计算机执行量化工程的任务 python 脚本了
python 任务脚本示例:
"""
唤醒任务由 win 任务计划程序唤醒,并执行该脚本,
然后设置定时任务
"""
import os
import sys
import time
# 添加模块被发现
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
import schedule
from app.stockapplication import StockApplication
from review.reviewtask import ReviewTask
from review.wechat import send_link, send_msg
is_stop: bool = False
def wake_up():
global is_stop
is_stop = False
# 距离当前时间 4 秒后执行
job = schedule.every(1).minute
job.do(start_application, job)
time.sleep(30)
send_msg('唤醒计算机成功!')
# schedule.every().day.at("18:13").do(start_review_doc)
# 执行计划中的任务
while True:
if is_stop:
break
schedule.run_pending()
time.sleep(1)
send_msg('跳出了循环...')
def start_application(job):
schedule.cancel_job(job)
# 项目启动类,能脱离ui运行的项目封装类
application = StockApplication()
# 循环执行三次启动
for i in range(3):
try:
application.start(False)
time.sleep(5)
except Exception as e:
print(f'启动失败:{e}')
send_msg(f'application.start 启动失败:{e}')
# 生成文档
start_review_doc()
def start_review_doc():
send_msg('开始生产自动文档了喔')
# 项目启动类
task = ReviewTask()
df = task.review_data.block_review()
# 获取code
code_list = df['code'].tolist()
url_list = []
for code in code_list:
url = task.review_data.block_detail_to_oss(code)
url_list.append(url)
# 列表中的元素添加头部
url_list = list(map(lambda x: f'![]({x})', url_list))
# 删除 code 列
df.drop('code', axis=1, inplace=True)
# 在第二列插入一列
df.insert(1, '详情', url_list)
task.docFile.dataframe_to_md(df)
url = task.docFile.finish_file()
send_link(url)
# 1 分钟后睡眠
job = schedule.every(15).seconds
job.do(sleep, job)
def sleep(job):
schedule.cancel_job(job)
send_msg('计算机开始睡眠中...')
global is_stop
is_stop = True
time.sleep(60)
# 停止任务
# schedule.clear()
# # 唤醒计算机
print('睡眠中...')
# 睡眠
# os.system("rundll32.exe powrprof.dll,SetSuspendState 0,1,0")
import subprocess
# 执行睡眠命令
subprocess.run(["powershell", "-Command",
"Add-Type -Assembly System.Windows.Forms; [System.Windows.Forms.Application]::SetSuspendState('Suspend', $false, $false)"])
# 结束该进程
os.system('taskkill /f /im python.exe')
if __name__ == '__main__':
wake_up()
# time.sleep(10)
# print('执行了程序')
按上面的配置完毕后,其实也已经是部署完毕了,因为已经能通过命令窗口直接运行量化工程的 python 脚本了
下期写写量化界面 PyQt 吧,这部分还没写完
这么好看的界面究竟是怎么搭建的呢?很简单,下期解密
回测界面
右侧回测界面交易股票点击,查看回测策略买卖点是否正确
总结于 2023 年 5 月 16 日 22:27:55
本文由mdnice多平台发布
标签:os,python,win,job,任务,量化,定时,执行,唤醒 From: https://www.cnblogs.com/sykent/p/17407093.html