3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在PTrade量化交易平台中,由于安全限制,严禁使用 import os 模块。因此,不能使用 Python 标准库中的 os.mkdir 或 os.makedirs 来创建文件夹。
PTrade 提供了专用的 API 接口 create_dir() 来替代此功能,配合 get_research_path() 获取研究根目录路径,即可实现文件夹的创建和日志文件的保存。
以下是具体的实现方案和代码示例。
get_research_path() 获取策略允许读写的研究根目录。create_dir(path) 创建文件夹。open() 函数配合 write() 方法将日志写入文件。通常建议在 after_trading_end(盘后)或 handle_data(盘中)进行写入。以下代码展示了如何在策略初始化时创建一个名为 my_strategy_logs 的文件夹,并在每天收盘后将当天的资产信息写入以日期命名的文本文件中。
def initialize(context):
"""
初始化函数
"""
# 1. 获取研究根目录路径
root_path = get_research_path()
# 2. 定义日志文件夹名称和完整路径
# 注意:路径拼接建议使用字符串拼接,确保兼容性
folder_name = "my_strategy_logs"
g.log_dir = root_path + folder_name + "/"
# 3. 使用 PTrade 专用 API 创建文件夹
# 如果文件夹已存在,该函数通常不会报错,或者会直接忽略
create_dir(g.log_dir)
# 设置要操作的股票(示例)
g.security = '600570.SS'
set_universe(g.security)
log.info("日志文件夹已准备就绪: %s" % g.log_dir)
def handle_data(context, data):
"""
盘中运行函数
"""
# 示例交易逻辑:简单买入
if not context.portfolio.positions:
order(g.security, 100)
def after_trading_end(context, data):
"""
盘后运行函数:用于每天收盘后保存日志
"""
# 1. 获取当前日期,格式化为 YYYYMMDD
current_date = context.blotter.current_dt.strftime("%Y%m%d")
# 2. 构建当天的日志文件名
file_name = "log_" + current_date + ".txt"
full_file_path = g.log_dir + file_name
# 3. 准备要写入的日志内容
# 获取当前总资产和持仓市值
total_value = context.portfolio.portfolio_value
cash = context.portfolio.cash
log_content = "日期: %s\n总资产: %.2f\n可用现金: %.2f\n" % (current_date, total_value, cash)
# 4. 写入文件
# 使用 'w' 模式覆盖写入,或 'a' 模式追加写入
try:
with open(full_file_path, 'w') as f:
f.write(log_content)
log.info("今日日志已保存至: %s" % full_file_path)
except Exception as e:
log.error("写入日志文件失败: %s" % str(e))
get_research_path()
/home/user/research/)。create_dir(path)
os.makedirs。path (str) - 需要创建的完整文件夹路径。/。open 函数中指定 encoding='utf-8'(但在 Python 3.5+ 的默认环境中通常不需要)。Q: 为什么不能使用 import os 来创建文件夹?
A: PTrade 为了保证交易系统的安全性和稳定性,对策略代码进行了沙箱隔离,禁用了 os、sys 等可能操作系统底层的标准库。必须使用 PTrade 提供的专用 API(如 create_dir)来替代。
Q: 生成的日志文件在哪里可以查看?
A: 生成的文件通常位于 PTrade 客户端的“研究”模块的文件列表中。您可以在“研究”界面的左侧文件树中找到您创建的文件夹(如示例中的 my_strategy_logs)并查看其中的文件。
Q: create_dir 如果文件夹已经存在会报错吗?
A: 根据 PTrade 的机制,如果目标文件夹已经存在,create_dir 通常会忽略该操作而不会抛出异常,因此您可以放心地在 initialize 中调用它。
Q: 我可以将日志保存为 CSV 格式吗?
A: 可以。只需将文件名后缀改为 .csv,并按照 CSV 的格式(使用逗号分隔数据,换行符分隔行)构建字符串并写入即可。例如:f.write("Date,Value\n20230101,100000\n")。