Python
平台支持用Python 3编写策略,不支持 Python 2。实盘以及在托管者上进行的回测,使用托管者所在机器上安装的 Python 解释器运行策略。
解释器
实盘按以下顺序查找解释器,使用第一个能启动、并且版本为 Python 3 的程序:
- 策略代码首行
#!指定的解释器,例如#!/opt/venv/bin/python3;写成#!/usr/bin/env python3.11时取python3.11; - 环境变量
PYTHON_BIN指定的解释器; python3;python。
首行指定的解释器不可用时,托管者退回后面的候选,并在实盘目录的stderr.log中留一行说明。不想改策略代码时,也可以在启动托管者之前设置环境变量来指定解释器(例如虚拟环境中的 Python):
bash
export PYTHON_BIN=/opt/venv/bin/python3
在托管者上进行的回测不读PYTHON_BIN:按首行#!指定的解释器、python3、python的顺序,在PATH中查找第一个存在的程序。
策略结构与参数
策略入口为def main(),可选的init()、onexit()由托管者自动调用(Python 不支持onerror()),见「策略入口函数」一节。界面参数是同名的全局变量;在函数中给参数重新赋值时,需要先用global声明。
错误与返回值
API 函数调用失败时返回None,并在日志中输出错误信息。使用返回值之前先判断,或者用_C()重试。策略中未捕获的异常会结束运行,错误信息记录在日志中。
输出
print()的输出写入托管者目录下的logs/storage/<实盘ID>/stdout.log(错误输出写入同目录的stderr.log),不会出现在实盘日志里。需要显示在日志中的内容请用 Log。
第三方库
策略可以导入解释器中已经安装的任何库。安装时要使用托管者运行策略的那个解释器,例如:
bash
python3 -m pip install numpy
# 首行用 #! 指定了解释器时,用该解释器安装,例如
/opt/venv/bin/python3 -m pip install numpy
# 设置了 PYTHON_BIN 时
$PYTHON_BIN -m pip install numpy
使用talib需要在托管者所在机器上安装 TA-Lib(talib包)和numpy。
自定义模块
策略运行时的当前目录是实盘目录logs/storage/<实盘ID>/(用相对路径打开的文件落在这里,随实盘保留);PYTHONPATH是托管者为本次运行创建的临时目录,运行结束后会被删除。当前目录不在模块搜索路径中,放在实盘目录下的.py文件不会被自动找到。导入自己编写的模块有两种方式:
- 把模块安装到解释器的
site-packages中(例如做成包用pip install安装,或者直接复制到site-packages目录); - 在策略中先把模块所在目录的绝对路径加入
sys.path,再导入。
例如模块文件/home/user/my_modules/mymath.py:
python
# mymath.py
def add(a, b):
return a + b
策略代码:
python
import sys
sys.path.append("/home/user/my_modules") # 模块所在目录的绝对路径
import mymath
def main():
Log("mymath.add(1, 2):", mymath.add(1, 2))
把核心代码做成模块放在自己的托管者上,策略代码中只保留调用部分,也是一种不把核心代码上传到平台的做法。