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