Python

  • 设置Python策略程序使用的Python解释器 使用Python编写的策略,在回测或实盘时,如果托管者所在系统环境同时安装了Python2和Python3,可以在策略开始的第一行设置策略运行时启动的Python版本。例如:#!python3#!python2,系统将自动查找相应的解释器。也可以指定绝对路径,例如:#!/usr/bin/python3
  • 基于Python的策略安全性 在优宽量化交易平台上开发的策略,仅对优宽量化交易平台账户持有者可见。在优宽量化交易平台上可以实现策略代码的完全本地化,例如将策略封装成一个Python库,在策略代码中加载,从而实现策略代码本地化。

Python代码的安全性: 由于Python是开源且易于反编译的语言,如果策略非自用而是出租,担心策略泄露可以让策略运行在自己部署的托管者上,并以子账号或全托管管理的形式出租。

Python策略代码加密: 默认情况下,Python策略代码作者自用时不加密,租给他人使用时加密。在Python策略开头编写如下代码,可以指定自用或租出Python策略运行时是否加密策略代码。支持策略代码加密的Python版本为:Python 2.7版本、Python 3.5版本、Python 3.6版本。

  • 策略作者自己运行、通过注册码给他人使用时,均加密策略代码: 使用代码#!python指定Python解释器版本,之后使用逗号,间隔,输入加密指令encrypt。如果不指定Python版本,可以直接添加#!encrypt

    #!python,encrypt
    

    #!encrypt
    
  • 策略作者自己运行、通过注册码给他人使用时均不加密策略代码:

    #!python,not encrypted
    

    或者

    #!not encrypted
    

判断Python策略代码加密是否生效,使用代码os.getenv('__FMZ_ENV__'),返回字符串"encrypt"表示已经生效。仅在实盘有效,回测不会加密Python策略代码。

  #!encrypt
  def main():
      ret = os.getenv('__FMZ_ENV__')
      # 打印变量ret为字符串encrypt或者ret == "encrypt"为真,即代表加密生效
      Log(ret, ret == "encrypt")
  • Python自定义模块导入功能 FMZ平台支持在Python策略中导入自定义模块,实现代码的模块化开发和复用。

例如,我们需要设计一个模块:mymath,将mymath.py保存为一个单独的文件。

  # mymath.py - 保存为一个单独的文件
  """
  简单的数学工具模块
  """

  def add(a, b):
      """加法"""
      return a + b

部署模块文件,将mymath.py文件放置到托管者程序目录下的指定位置(storage目录中的文件夹名称是实盘Id,以实盘Id为123456为例):

托管者程序目录/logs/storage/123456/mymath.py

最后在FMZ平台上的Python策略中直接导入mymath模块。

  import mymath

  def main():
      Log("mymath.add(1, 2):", mymath.add(1, 2))

Id为123456的实盘(策略实例)所绑定的策略中即可调用mymath模块中的方法。