金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2833|回复: 3

Python、VB、PEL相互调用

[复制链接]

31

主题

7734

帖子

7744

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
发表于 2021-6-27 10:20 | 显示全部楼层 |阅读模式
一、vba调用Python
python程序编写在python模块中代码如下
[Python] 复制代码
from PythonApi import *
import numpy as np
def test_vba(x1,x2):
    return x1[-1] 
def test_vba2(x1,x2):
    return x2


然后vba中添加如下代码
[Visual Basic] 复制代码
Sub Test()
      '创建Array外部对象,将对象实例置变量d1中
      Set d1 = CreateObject("Stock.Array")
      d1.AddBack(1)
      d1.AddBack(2)

      Set d2 = CreateObject("Stock.Array")
      d2.AddBack(3)
      d2.AddBack(4)
      '创建外部对象,启用Python引擎
      Set d = CreateObject("Stock.Python")
      '载入Python模块,模块名为MyPython
      ret = d.ImportModule("jzt_MyPython9")
      If ret <> 1 Then
              '载入失败,打印错误原因
              Msg = d.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing  '使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
      End If
      '调用Python模块函数,函数名pytestmodule,参数为Array外部对象d1
      Data = d.CallObject("test_vba",d1,d2)
       If IsEmpty(Data) Then
              Msg = d.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing   '使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
       End If
       set Data2 = d.CallObject("test_vba2",d1,d2)
       If IsEmpty(Data) Then
              Msg = d.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing   '使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
       End If
       '打印返回值
       application.MsgOut Data
       ' 打印数组长度和数组某个元素
       application.MsgOut Data2.count&"____"&Data2.GetAt(1)
       Set d = nothing  '使用完毕需要 Set Nothing销毁以免出现内存泄漏
       set d1 = nothing  '使用完毕需要 Set Nothing销毁以免出现内存泄漏
       set d2 = nothing '使用完毕需要 Set Nothing销毁以免出现内存泄漏
end Sub
call Test




金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

31

主题

7734

帖子

7744

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
 楼主| 发表于 2021-6-27 10:33 | 显示全部楼层
本帖最后由 技术008 于 2021-6-27 12:33 编辑

代码解读:
Set d1 = CreateObject("Stock.Array")
创建array对象的作用是为了传参数时候传列表(只能是基础的列表,python自己的什么numpy\pandas\tensor\datetime这种格式都是不行的)
如果只是传数字或字符串这种基础格式,则不需要array对象,直接调用函数时候传即可

Data = d.CallObject("test_vba",d1,d2)
application.MsgOut Data
set Data2 = d.CallObject("test_vba2",d1,d2)
application.MsgOut Data2.count&"____"&Data2.GetAt(1)
根据返回值不同,代码也有所不同,第一种是返回值是数字字符串这种基础格式的,第二种是返回值是列表,此时列表是不能直接输出的要通过getAt取数组元素方法去获取

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

31

主题

7734

帖子

7744

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
 楼主| 发表于 2021-6-27 10:47 | 显示全部楼层
本帖最后由 技术008 于 2021-6-27 12:04 编辑

二、PEL调用python
在python引用模块中编写如下代码
[Python] 复制代码
from PythonApi import *

# init函数会在PEL公式首次启用时被调用。
# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
def init(context):
    pass

# Pel公式中调用FIREPYHANDLEBAR函数将触发该方法的调用
def handle_bar(context):
    context.y1 = context.alpha
    context.y2 = context.price[-2]
    context.y3 = context.price2

# exit函数会在公式结束时被调用,整个过程只会被调用一次
def exit(context):
    pass
 


然后pel引用上面结果代码如下
[PEL] 复制代码
//引用Python代码模块 "MyPython27", 需要注意大小写敏感
Py_Import MyPython27;

//若置数组,参考下面的代码
variable:x[3]:=0;
x[1]:=1;
x[2]:=2;
x[3]:=3;
input:alpha(1,1,50,1);
SETPYTHONVAL('alpha',0,alpha);
SETPYTHONVAL(x,'price');
SETPYTHONVAL('price2',0,close);

//触发Python中的Handle_bar方法
FIREPYHANDLEBAR;

//得到3个返回值,注意变量名大小写敏感
y1:GETPYTHONVAL('y1'),colorred,LINETHICK4; 
y2:GETPYTHONVAL('y2'),colorred,LINETHICK4;
y3:GETPYTHONVAL('y3'),colorred,LINETHICK4;  

金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

31

主题

7734

帖子

7744

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
 楼主| 发表于 2021-6-27 10:54 | 显示全部楼层
本帖最后由 技术008 于 2021-8-25 10:47 编辑

代码解读:第一种写法传递单个数值
input:alpha(1,1,50,1);
SETPYTHONVAL('alpha',0,alpha);
SETPYTHONVAL('price2',0,close);

第二种写发传递数组
variable:x[3]:=0;
x[1]:=1;
x[2]:=2;
x[3]:=3;
SETPYTHONVAL(x,'price');
这种写法也是传递数组,把整个数据序列直接传入,python用法等同于上面数组x
variable:y[]:=0;
y:=close;
SETPYTHONVAL(y,'price');



金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-12-22 11:40 , Processed in 0.237893 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表