使用预编译加密你的核心代码
使用预编译加密你的核心代码
当前的真个量化平台可支持将核心代码预编译成so文件,然后让策略调用的方式,让您的策略核心算法更加安全。这里介绍一下这个方式。
1、下载虚拟机
预编译需要一个和真格量化平台一致的python环境,这里我们直接给您提供一个配置好环境的linux虚拟机。
虚拟机下载地址
https://pan.baidu.com/s/1jIda1MNLR3ARZa6fdTagSQ
提取码 zvsw
2、登录虚拟机
打开VMWare,选择打开虚拟机,找到刚下载解压好的vmx文件打开
用用户pobo登录
用户名 pobo 密码 zhengelianghua
3、启动对应的环境
进入到/home/miniconda3/bin
根据需要编译的python代码版本启动对应环境 source activate pobo_py35胡总和source activate pobo_py27,如果您的策略是3.5就是py35版本,2.7就是py27,范例中采用py35,您可以自行改为py27
如下图
cd /home/miniconda3/bin
source activate pobo_py35
4、编译核心代码文件
然后回到工作目录
准备好您需要编译加密的核心代码,范例中的核心代码是一个简单的函数,最新价在20日均线上方则给出多信号(return 1),在20均线下方则给出空信号(return -1),否则不给信号(return 0)
如下
from PoboAPI import *
def CalcSignal(code):
dyndata = GetQuote(code)
if dyndata is None or dyndata.now == 0:
log.info('当前%s无行情'%code)
return 0
else:
hisdata = GetHisDataAsDF(code,BarType.Day,count = 50)
hisdata['ma20'] = hisdata['close'].rolling(window = 20).mean()
if dyndata.now>hisdata['ma20'].iloc[-1]:
return 1
else :
return -1
将上述代码保存为zhenge_testso.py
然后准备一个编译用的py文件compile.py
代码如下
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["zhenge_testso.py"])) # 这里写你要加密的程序文件
# 推荐使用相对路径,编译出的so文件在引用其他模块时可能会出现路径问题
将这两个文件放到同一个目录下后,执行以下的shell命令
python compile.py build_ext
执行完成后可以看到当前目录下生成了一个叫build的文件夹,在build/lib.***/文件夹下
有一个zhenge_testso.***.so文件,这就是我们加好密的核心代码文件了。
5、在策略中使用加密的so文件
接下来就是在策略中调用我们刚刚编译好的so文件了。
首先到策略编辑页面,选择上传附件
这里需要注意的是,上传附件文件名最大需要小于40个字符,在范例中,将so文件改名为zhenge_testso.so进行上传
上传后可以在管理附件列表中看到文件
这就表示上传成功了。
然后就可以在策略中进行引入了,这里附上测试策略代码
# coding:utf-8
from PoboAPI import *
from zhenge_testso import *
#开始事件,用于初始化一些参数
def OnStart(context) :
log.info('策略启动...')
#登录交易账号,需在主页用户管理中设置账号,并把「回测期货」替换成您的账户名称
context.myacc = None
if '回测期货' in context.accounts :
log.info('登录交易账号[回测期货]')
if context.accounts['回测期货'].Login() :
context.myacc = context.accounts['回测期货']
# sayhello()
# test2('rb2205.SHFE')
def OnMarketQuotationInitialEx(context,exchange,daynight):
if exchange != 'SHFE':
return
SubscribeBar('rb2205.SHFE',BarType.Day)
def OnBar(context,code,type):
signal = CalcSignal('rb2205.SHFE')
if signal == 0:
print('无信号')
elif signal == 1:
print('开多信号')
elif signal == -1:
print('开空信号')
测试策略结果如下图
加密后的SO文件,还有办法再打开查看吗?
qqq
qq
q