利用金字塔的VBA与C++的混合编程来实现复杂的二次开发及交易功能

Discussion in '金字塔决策交易系统' started by ytweiwei, May 6, 2012.

  1. 金字塔的除了提供基础的PEL语言外,基于VBA和C++二次开发功能无疑是所有程序化交易软件中最强的一个了,VBA金字塔完全兼容OFFICE的VBA开发习惯,C++也是很多专业用户的开发语言,能将这2点融合成一体,无疑是金字塔用户的最高境界了。

    金字塔几乎将所有内部的对象接口都暴露给了VBA对象,包括数据,界面操作,下单管理等,用户可以用VBA做大部分的事情,但是VBA也有其不完美的一面,包括不能向C++那样使用指针,金字塔VBA对网络的操作支持力度有限,及VBA是解析性的语言脚本系统,对安全性没有C++哪种编译性的高等等,因此很多专业的程序化大都会选择C++语言做为编写对象,但是C++除了给我们的编程便利性带来好处外,也带来了学习困难,编写专业要求程度高等缺点,由于金字塔未能将所有内部操作接口对象完全暴露给C++接口,因此做为用户来说,使用VBA与C++进行混合编程无疑是很好的一种解决方案。利用系统暴露给VBA的接口进行通讯,VBA再将其参数传递给C++接口,内部的复杂运算通过C++来实现,最后将计算结果返回给VBA进行界面上的处理。

    金字塔暴露给VBA主要有下面几个对象



    Application 对象

    代表 金字塔证券分析系统 应用程序。整个应用程序运行过程中,只有一个Application对象存在。利用该对象可以对整个金字塔程序进行控制。



    ReportData 对象

    证券行情数据对象,该对象用于表示该证券最新行情数据。

    MarketData 对象

    该对象描述了市场行情数据。可以通过这个对象来访问指定的品种的各种数据,也可以维护接收数据的设置。




    Frame 对象

    表示一个“框架”对像。每个框架都有一个这样的对象与之相对应。

    你可以横向或者纵向切分一个窗格,还可以在当前窗格位置处添加一个窗格,此时两个窗格将会自动分页显示。



    Order 对象

    Order 对象负责定单管理和查询等操作,接收委托服务器发送来的各种帐户持仓信息。该Order对象还支持多帐户的下单模式,用户可以在闪电下单时截获该事件,并处理成自己的操作方式以达到可以实现比如赢损下单的目的。除此之外,该对象还支持多帐户操作。



    事件处理

    上述对象除了可以直接控制金字塔软件外,还可以被动的接收来自软件的各种事件,比如用户下单后,Order 对象 就可以接收来自这个对象的事件,有了事件功能后,用户可以就可以不用总是去不断查询是否有最新行情数据过来,是否下单了等等,完全可以在程序中设立条件来主动接收事件,提高了软件的运行效率。



    使用VISUAL C++开发ACTIVEX自动化接口,与VBA进行通信

    我们要写一个能与VBA通信的接口程序,通过ACTIVEX无疑是最好的方案,使用VISUAL C++开发ACTIVEX是件非常简单的事情,本教程就以此为范例制作一个可以与VBA交互使用的ACTIVEX,步骤如下:



    我们以VC6.0为例。

    第一步我们需要用VISUAL C++创建一个DLL工程,工程名称为MyActiveXDemo
    [​IMG]


    第二步我们需要选择是MFC标准DLL程序,并要勾选“Automation” 也就是ACTIVEX自动化的接口选项。

    [​IMG]

    然后我们点“Finish” 按钮后完成项目的初建



    项目框架创建完毕后,我们就要建立一个可以与VBA通信的ACTIVEX接口,步骤如下:

    Inster -> New Class 弹出新建类窗口,我们选择MFC接口

    [​IMG]

    我们将接口类起名为VBSAddin,并指定基类是CCmdTarget,并在下方选择类接口的创建方式为 type id 方式

    接口类创建好了后,剩下的就是我们通过 Class Wizard类添加属性和方法了

    比如我们创建一个方法函数,名称为“MyTest”,返回值可以根据项目的要求来任意指定,参数我们输入一个数值参数,并且在ActiveX中通过MSG打印出来

    [​IMG]

    项目创建完毕后,系统会自动为我们添加代码,加上我们的打印输出后代码如下:



    float VBSAddin::MyTest(double Value)
    {
    CString strValue;
    strValue.Format("%f",Value);
    AfxMessageBox(strValue);

    return 0.0f;
    }



    最后编译我们的ActiveX,编译完毕后一定注意需要注册这个ActiveX我们才能在本地电脑中使用,比如我们将其拷贝到C盘根目录后,通过命令行做如下注册即可: regsvr32 c:\MyActiveXDemo.dll



    最后,我们在VBA中来调用我们刚才所建立的ActiveX控件

    例如我们在Test宏中输入如下代码



    Sub Test()
    Dim MyAddin '创建一个变量

    Set MyAddin = CreateObject("MyActiveXDemo.VBSAddin")
    MyAddin.MyTest(400)

    End Sub



    注意MyActiveXDemo.VBSAddin是我们在刚才创建时所指定的标识符,通过这个标识符系统才能找到我们所建立的Activex

    指定宏后,看看效果吧。


    附带C++演示示例工程

    http://www.weistock.com/bbs/viewFile.asp?BoardID=5&ID=547