《2022年用C++编写易盛程序化交易指令 .pdf》由会员分享,可在线阅读,更多相关《2022年用C++编写易盛程序化交易指令 .pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、用 C+编写易盛程序化交易指令(易盛程序化交易 VS2008环境开发指引)郑州易盛信息技术有限公司名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 15 页 -1综述本文介绍怎样在Visual Studio 2008 平台上使用易盛程序化交易客户端(2.0)提供的接口开发交易指令。使用 VS2008开发交易指令有下列优势:使用纯 C+方式编程,符合高级程序员的开发习惯方便使用第三方库。如:STL等可以利用 VS2008强大的 Debug功能进行调试,跟踪代码执行。使用 VS2008开发易盛程序化交易指令相对采用易盛公式编辑器稍显复杂,需要进行一些环境配置;另外,参数、变量、特别是序
2、列变量的定义,以及函数的调用均需采用标准的C+方式。这些差异将在以下内容做详细介绍。2程序安装目录假设易盛程序化交易客户端被安装在:“易盛程序化交易系统”。在客户端安装目录下,找到EXPERTS 目录并打开,可以看到以下两个目录:include:易盛程序化交易系统 expertsincludelib:易盛程序化交易系统 expertslib3VS2008开发环境配置3.1创建项目打开 vs2008,点击菜单文件-新建-项目,弹出如下对话框:名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 15 页 -选择左侧树形菜单:VisualC+-Win32,在右侧模板里,选择“Win32 项
3、目”,并填写项目名称、位置,点击确定按钮,弹出如下对话框:名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 15 页 -点击“下一步”,界面如下图:应用程序类型请选择DLL点 击“完 成”按 钮 后,生 成 的新 项 目 目 录 结构 如下 图(左)所示。其中,dllmain.cpp文件我们不需要,可以删除。删除该文件后项目目录结构如下图(右)所示3.2 环境配置右键点击项目名称,选择菜单属性,弹出如下图所示窗口名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 15 页 -选择左侧属性菜单“常规,将右侧面板中的“字符集”设置为“使用多字节字符集”,如下图选择左侧属性菜单
4、“调试,将右侧面板中的“命令”设置为“易盛程序化交易系统EsunnyTrader.exe”,如下图:名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 15 页 -选择左侧属性菜单“C/C+,将右侧面板中的“附加包含目录”设置为“易盛程序化交易系统 expertsinclude”,如下图选择左侧属性菜单“C/C+-“代码生成,将右侧面板中的“运行库”设置为“多线程调试(/MTd)”;如下图。(编译 Release版,请将这项设置为“多线程(MT)”)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 15 页 -选择左侧属性菜单“连接器,将右侧面板中的 输出文件 设置为 易
5、盛程序化交易系统 ExpertsdllSample.dll;将附加库目录 设置为“易盛程序化交易系统 expertslib”;选择左侧属性菜单“连接器-“输入,将右侧面板中的“附加依赖项”设置为“fmllibd.lib”;如下图。(编译 Release版,请将这项设置为fmllib.lib)名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 15 页 -点击“确定”按钮完成设置3.3 编写代码打开 Sample,输入如下代码:/该示例演示怎样使用 VisualStudio进行易盛程序化动态库开发/在VS 2008环境下编译测试通过/编译完成后可以直接按F5 调试运行/#include
6、stdafx.h#includeuserlib.hclassMFML:publicUserLibpublic:/定义成员变量Numeric P1;Numeric P2;NumericSeriesMA1;NumericSeriesMA2;/将P1,P2声明为数字型参数BEGIN_PARAMETE_MAP(4)PARAMETE_FLOAT(P1,10,5,20,参数一)/格式(名称,默认值,最小值,最大值,注释)PARAMETE_FLOAT(P2,2.5,0.5,5.5,参数二)/格式(名称,默认值,最小值,最大值,注释)END_PARAMETE_MAP()/构造函数,构造函数中必须完成以下两件事
7、情:/1.调用InitParams 进行参数初始化,否则参数无法使用/2.给每个序列变量设置运行信息(m_gInfo),否则序列变量无法正常工作MFML()InitParams();/该句用于初始化参数值MA1.m_gInfo=&m_gInfo;/所有的序列变量都需要设置运行信息gInfoMA2.m_gInfo=&m_gInfo;/所有的序列变量都需要设置运行信息gInfo/Exec 函数为该 DLL 的调用入口。相当于 ETL 语言的Begin.End区域voidExec()MA1=Average(Close(),5);MA2=Average(Close(),20);PlotNumeric(
8、MA1,MA1);PlotNumeric(MA2,MA2);if(CrossOver(MA1,MA2)名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 15 页 -Buy(1,Q_AskPrice();elseif(CrossUnder(MA1,MA2)Sell(1,Q_BidPrice();/EndOf Exec Function;/EndOf ClassEXPORT(MFML);/该行必须保留,用于导出公式右键点击项目名称,在弹出菜单中选择“生成”,开始编译程序,如下图所示。如编译成功,点击按钮(或按 F5键)开始调试运行程序,如下图:名师资料总结-精品资料欢迎下载-名师精心整
9、理-第 9 页,共 15 页 -登录客户端,您将发现左侧“交易指令”列表中出现一个新的项目Sample,可以加载该交易指令到K线图上,如下图所示:若您在代码中设置了调试断点,Sample加载到图表后,当客户端调用该交易指令时,就会触发您的断点,如下图所示:名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 15 页 -4与 ETL语言的区别与联系从语言风格来看,主要区别在于:ETL语 言 不 区 分 大 小 写,C+必 须 区 分 大 小 写,如:ETL可 以 写 成numeric,Numeric,NUMERIC等。但 C+必须写成 NumericETL调用函数可以不加小括号,C+
10、必须加小括号。以下将 ETL语言的各区域内容与C+进行对照,以便用户对ETL做进一步的了解。4.1 参数定义ETL的参数定义和 C+参数定义对照关系如下:ETL语言:ParamsInteger P1(10);/参数一Numeric P2(0.5);/参数二String P3(Hello);/参数三Bool P4(True);/参数四Vars.名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 15 页 -C+语言classMFML:publicUserLibpublic:/定义成员变量Numeric P1;/ETL 即使定义的是 Integer,这里也使用 Numeric进行存储。
11、Numeric P2;StringP3;BoolP4;BEGIN_PARAMETE_MAP(4)PARAMETE_INT(P1,10,10,10,参数一)/(名称,默认值,最小值,最大值,注释)PARAMETE_FLOAT(P2,0.5,0.5,0.5,参数二)/(名称,默认值,最小值,最大值,注释)PARAMETE_STRING(P3,你好,参数三)/(参数名,默认值,注释)PARAMETE_BOOL(P4,True,True,True,参数四)/(参数名,默认值,最小值,最大值,注释)END_PARAMETE_MAP().可见,ETL的 Params区域被解析成两部分,一部分为成员变量的定
12、义,另一部分为参数的声明。值得注意的是,ETL中的整型和浮点型,在C+中都被定义为 Numeric,只是声明部分不一样而已。4.2 局部变量ETL中的 Vars区域与 C+对应关系如下图(除序列变量):ETL语言:VarsInteger a(50);Numeric b(10);Stringc(Hello);Bool v(True);NumericArray arr;Begin.C+语言voidExec()Integer a(50);Numericb(10);Stringc(Hello);Boolv(True);NumericArrayarr;名师资料总结-精品资料欢迎下载-名师精心整理-第 1
13、2 页,共 15 页 -4.3 全局变量ETL的全局变量被解析为C+的类成员变量,举例如下:ETL语言GlobalVarsInteger a(50);Numeric b(10);String c(Hello);Bool v(True);NumericArray arr;Begin.C+classMFML:publicUserLibpublic:/定义成员变量Integera;Numeric b;Stringc;Boolv;MFML():a(50),b(10),c(Hello),v(True).4.4 序列变量序列变量需要按 K线周期将数据保存下来,因此每个序列变量必须清楚的知道交易指令目前运行
14、到了第几跟K线。因此,我们在序列变量中定义了一个指针:global_info*m_gInfo;通过该指针,序列变量可以很方便地知道交易指令目前执行到了第几跟K线。这就要求交易指令在初始化阶段(构造函数中)为每个序列变量的m_gInfo 进行设置,让它指向交易指令自身的m_gInfo,例如:名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 15 页 -classMFML:publicUserLibpublic:/定义成员变量NumericSeriesMA1;NumericSeriesMA2;MFML()InitParams();/该句用于初始化参数值MA1.m_gInfo=&m_g
15、Info;/所有的序列变量都需要设置运行信息gInfoMA2.m_gInfo=&m_gInfo;/所有的序列变量都需要设置运行信息gInfo.众所周期,一个函数的局部变量会在函数结束后被释放。因此,如果在函数中定义一个序列变量,它并不能将历史数据保存下来供下次回溯使用。若将函数中的序列变量定义为static,虽然可以将数据进行保存,但在该函数被多个交易指令调用时,序列变量的数据会发生混乱,因此不要这样做。在函数中定义序列变量的正确做法是使用LoadSeries函数。LoadSeries函数可以自动将您对序列变量的赋值按照K线周期正确保存下来。LoadSeries函数的调用格式为LoadSeri
16、es(函数名称,初始值,示例如下:Numeric Average(Numeric Price,Numeric Length)/注意,调用 LoadSeries 函数,一定要用引用类型(&),否则序列变量发生的更改将不能被自动保存下来。NumericSeries&Price=LoadSeries(Average,Price,True);NumericAvgValue(0);AvgValue=Summation(Price,Length)/Length;ReturnAvgValue;5常见问题编译出现以下问题:1正在链接.1msvcprtd.lib(MSVCP90D.dll):errorLNK20
17、05:public:void_thiscallstd:_Container_base_secure:_Orphan_all(void)const(?_Orphan_all_Container_base_securestdQBEXXZ)已经在fmllibd.lib(mstring.obj)中定义名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 15 页 -1msvcprtd.lib(MSVCP90D.dll):errorLNK2005:public:_thiscallstd:_Container_base_secure:_Container_base_secure(void)(?1
18、_Container_base_securestdQAEXZ)已经在fmllibd.lib(mstring.obj)中定义1正在创建库 D:易盛程序化交易系统 ExpertsdllSample.lib和对象D:易盛程序化交易系统ExpertsdllSample.exp1LINK:warningLNK4098:默认库“LIBCMTD”与其他库的使用冲突;请使用/NODEFAULTLIB:library1D:易盛程序化交易系统 ExpertsdllSample.dll:fatalerrorLNK1169:找到一个或多个多重定义的符号1生成日志保存在“file:/e:workSampleSampleDebugBuildLog.htm”1Sample-3 个错误,个警告=生成:成功 0 个,失败 1 个,最新 0 个,跳过 0 个=原因:请将运行库设置为/MTd,如下图:名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 15 页 -