自动构建主力合约--自动实现历史测试之前的数据选取工作 [开拓者 TB]
- 咨询内容:
笔者踏入期货市场多年,学习了不少技术分析方法,也接触了一些前沿理念,而期货市场日益兴起的程序化交易方法就是其中重要的一种。
程序化交易,即是指将人的操作理念和风险控制原则等编制为计算机的某种特定软件可执行的代码,由计算机代为执行。从而减少因为人性的弱点而执行起来产生偏差的情况。同时,使用程序化交易系统也可以对人的操作起到有益的辅助作用,减轻人的负担。
愿望是美好的,程序化交易理念的产生应该也是基于以上的美好目标。可是要编制出一套完整有效和稳定的程序化交易系统出来,却并非易事。先不说前期的量化和代码转化等问题,即使是这些问题都已经解决了,那也只能说是我们的程序化交易系统才完成一小半。为什么呢?因为我们还有更重要的测试工作要做。一个没有经过测试并优化改进的系统,是万万不可贸贸然投入实战的。
由于我们是立足于对过去已经发生的事件和行情所编制的系统,所以第一步我们应该测试在历史行情上的表现如何,如果在历史测试中都表现平平,那大概就是我们总结归纳出来的方法有问题,是没有任何实际使用价值的。在此基础上,如果测试效果不错,我们再将系统应用于实盘上跟踪观测一段时间。在确保没有新的问题和不稳定因素出现的情况下,我们才可以投入真金白银进去。
可见第一步的历史测试相当重要,它的结果几乎就决定了后续工作的开展与否。了解程序化交易的朋友们都知道,目前国内普遍使用的可支持程序化交易的交易软件也就那么2-3家,他们分别是文华财经、金狐交易师和交易开拓者。其中最为普遍的还是文华财经的WebStock,目前最新版本是2008版。可是笔者却不怎么喜欢该软件:函数少,自定义扩展功能也不怎么样,数据还经常变来变去不真实。而金狐交易师是由鼎鼎大名的飞狐交易师演变而来,由于其本身固有的特点以及营销模式的问题,目前国内似乎只有中国国际期货公司才为客户提供该软件,一般客户难以享受到该软件的强大功能。那么,就剩下最后一款软件了:交易开拓者,又称TB。事实上,笔者该次的试验就是建立在该软件之上的,没有该软件,就不会有本文的产生。
为什么要选择交易开拓者做为我们本次分析研究的平台,这要归因于历史数据的选取上。很多步入程序化交易领域的交易员——有些甚至已经堪称“元老”级人物,却还是不知道该如何来进行历史测试。常见的就是看到有人说自己研发出一套系统,宣称盈利和各方面表现都非常可观,再一看他的测试周期——直接跨度几年。我们都知道,期货市场不同于股票,是存在换月和主力合约与非主力合约一说的。我很怀疑他们的方法难道在一天成交量不足1手的情况下也能发挥出系统本人宣称的“奇效”。所以我比较赞同的,是程序化交易中一直存在的另一种理性的声音:分段截取主力合约数据来检验系统的有效性。
数据收集工作,看似简单。如果历史测试回溯时间不长,那我们大可以人工选择并截取,但是如果测试时间跨度长达几年呢?如果能够用电脑程序来自动筛选提取那是最好不过了。而要实现编程自动实现这一目的,目前来看,只有运用TB强大的合约叠加功能才能实现。
附完成图:
1.JPG (126.11 KB, 下载次数: 9) 2009-3-9 14:10:30 上传 - TB技术人员:
- //------------------------------------------------------------------------
- // 简称: ZLHY
- // 名称: 主力合约
- // 类别: 技术指标
- // 类型: 其它类
- // 输出:
- //------------------------------------------------------------------------
- Vars
- Numeric Major(0);
- Numeric Con0;
- Numeric Con1;
- Numeric Con2;
- Numeric Con3;
- Numeric Con4;
- Numeric Con5;
- Numeric Con6;
- Numeric Con7;
- Numeric Con8;
- Numeric Con9;
- Numeric Con10;
- Numeric Con11;
- Numeric MyOpen;
- Numeric MyHigh;
- Numeric MyLow;
- Numeric MyClose;
- Begin
- CON0=AverageFC(DATA0.OPENINT(),5);
- CON1=AVERAGEFC(DATA1.OPENINT(),5);
- CON2=AVERAGEFC(DATA2.OPENINT(),5);
- CON3=AVERAGEFC(DATA3.OPENINT(),5);
- CON4=AVERAGEFC(DATA4.OPENINT(),5);
- CON5=AVERAGEFC(DATA5.OPENINT(),5);
- CON6=AVERAGEFC(DATA6.OPENINT(),5);
- CON7=AVERAGEFC(DATA7.OPENINT(),5);
- CON8=AVERAGEFC(DATA8.OPENINT(),5);
- CON9=AVERAGEFC(DATA9.OPENINT(),5);
- CON10=AVERAGEFC(DATA10.OPENINT(),5);
- CON11=AVERAGEFC(DATA11.OPENINT(),5);
- If(Con0 > Major)
- {
- Major = Con0;
- MyOpen = Data0.Open;
- MyHigh = Data0.High;
- MyLow = Data0.Low;
- MyClose = Data0.Close;
- }
- If(Con1 > Major)
- {
- Major = Con1;
- MyOpen = Data1.Open;
- MyHigh = Data1.High;
- MyLow = Data1.Low;
- MyClose = Data1.Close;
- }
- If(Con2 > Major)
- {
- Major = Con2;
- MyOpen = Data2.Open;
- MyHigh = Data2.High;
- MyLow = Data2.Low;
- MyClose = Data2.Close;
- }
- If(Con3 > Major)
- {
- Major = Con3;
- MyOpen = Data3.Open;
- MyHigh = Data3.High;
- MyLow = Data3.Low;
- MyClose = Data3.Close;
- }
- If(Con4 > Major)
- {
- Major = Con4;
- MyOpen = Data4.Open;
- MyHigh = Data4.High;
- MyLow = Data4.Low;
- MyClose = Data4.Close;
- }
- If(Con5 > Major)
- {
- Major = Con5;
- MyOpen = Data5.Open;
- MyHigh = Data5.High;
- MyLow = Data5.Low;
- MyClose = Data5.Close;
- }
- If(Con6 > Major)
- {
- Major = Con6;
- MyOpen = Data6.Open;
- MyHigh = Data6.High;
- MyLow = Data6.Low;
- MyClose = Data6.Close;
- }
- If(Con7 > Major)
- {
- Major = Con7;
- MyOpen = Data7.Open;
- MyHigh = Data7.High;
- MyLow = Data7.Low;
- MyClose = Data7.Close;
- }
- If(Con8 > Major)
- {
- Major = Con8;
- MyOpen = Data8.Open;
- MyHigh = Data8.High;
- MyLow = Data8.Low;
- MyClose = Data8.Close;
- }
- If(Con9 > Major)
- {
- Major = Con9;
- MyOpen = Data9.Open;
- MyHigh = Data9.High;
- MyLow = Data9.Low;
- MyClose = Data9.Close;
- }
- If(Con10 > Major)
- {
- Major = Con10;
- MyOpen = Data10.Open;
- MyHigh = Data10.High;
- MyLow = Data10.Low;
- MyClose = Data10.Close;
- }
- If(Con11 > Major)
- {
- Major = Con11;
- MyOpen = Data11.Open;
- MyHigh = Data11.High;
- MyLow = Data11.Low;
- MyClose = Data11.Close;
- }
- PlotNumeric("High",MyHigh);
- PlotNumeric("Open",MyOpen);
- PlotNumeric("Low",MyLow);
- PlotNumeric("Close",MyClose);
- End
- //------------------------------------------------------------------------
- // 编译版本 GS2004.06.12
- // 用户版本 2008/08/21 16:15
- // 版权所有 hedgehog
- // 更改声明 TradeBlazer Software保留对TradeBlazer平台
- // 每一版本的TrabeBlazer公式修改和重写的权利
- //------------------------------------------------------------------------
- //------------------------------------------------------------------------
- TB客服:
已经附上指标代码
有需要的可自行稍作修改,加入文字提示,这样就可以大大方便系统历史测试之前的数据选取工作了。
明眼人一眼就可以看出来,我的构建依据是持仓量的5日平均,以最大的那个合约作为主力合约
实际中发现 把OPENINT()换成VOL()可能更好,因为在主力合约的变换上面,成交量的变化更先于持仓量。
本文仅做抛砖引玉只用,欢迎斧正
[ 本帖最后由 hedgehog 于 2009-3-9 14:26 编辑 ] - 网友回复:
很不错.谢谢hedgehog 分享.
- 网友回复:
不错,加精
如果以上指标公式不适用于您常用的行情软件
或者您想改编成选股公式,以便快速选出某种形态个股的话,
- 上一篇:加仓问题
- 下一篇:咨询一些CTP的问题 - TradeBlazer公式
相关文章
-
指定的模型还没有相关内容!