《上期CTP封装及应用技术之程序化》 同学们好,今天要讲的是程序化的编程。 这不是简单地写一段代码,而是在CTP接口上写自动交易策略, 写完以后又在自己的程序化软件上测试、跑实盘, 从头到尾都是自己控制的,不依赖第三方平台, 也不需要给任何公司交年费。 关于CTP接口,在头几章已经讲过了。 我们已经知道怎么把上期官方的接口导入到我们的程序里去, 怎么向交易所发指令、收回报,怎么登录、查询、接收行情、下单等等。 前几章学会了CTP的制作以后,我们现在要学习更高级的内容, 怎么编写程序化的代码。 我先说一下示范程序。 这个程序有一个下载地址,大家可以从这儿下载: http://www.quantdreamworks.com/download.htm 我们把这个地址打开,它是一个网页。 这是示范程序的下载链接。 点击以后就可以下载了。 下载、解压之后,大家会看到这么一些文件。 双击它。 就打开了应用程序。在回测这一部分,有普通回测和套利回测。 我们先看一下普通回测。 我们首先看到的是一个表,这是现有历史数据的列表。 在界面上选择一个数据,底下就会显示相应的属性。 这个手续费是测试手续费,不一定是实盘中的手续费。 你可以随便设,如果设成3,测试时就按3块钱来算手续费。 你要设成5也可以。 每次设完之后只要走一遍测试,程序就会自动把这些数据记录下来。 本来每个数据都有固定的日期范围——数据是从哪天记到哪天的。 但是测试时可以自定义日期范围,因为我不一定想测全部数据。 我可以把这儿修改为我自己想要的日期。 “与数据相同”这个勾一般是勾上的,如果不勾就要设显示周期, 这比较复杂,待会儿再举例说明。 现在重要的是选择策略的下拉菜单。 这里面有一系列策略,这是我们预先写好了的。 将来你自己也可以添加你的策略。 我在这儿选择一个策略,底下就会显示它的参数列表。 我可以改参数,比如X改成800至1500,步长为200。 这就意味着对X这个参数,我会测800至1500每隔200的数据, 也就是说我会测800、1000、1200、1400。 现在可以进入测试了。 点一下这个“测试”按钮。 它正在测试。 我们不是说要测800、1000、1200、1400吗,每一个它都会测一遍。 好,结果出来了,现在我们看到的是资金曲线。 而且是不同参数的资金曲线。 这是800的测试结果,这是1000的测试结果。 我在表中选哪个双击,它就显示哪个测试结果。 现在我点这个地方,它可以显示买卖信号。 我现在把它放大一点儿。 当然这里也显示了K线,信号都是附着在K线上的。 大家现在看到的小三角就是信号,绿色的是卖开,红色的是买开。 还有黄色的代表平仓。 有的时候平仓和开仓是同时进行的,黄色和彩色三角就是重叠的。 也有一些时候是单独平仓的,我们就能看到很明显的黄色三角。 这地方是卖开了,在K线上看出,它先有一些浮盈,后来又赔了。 赔了以后到这儿又反手买开了。 我们看它资金是不是这么变化的,应该是先赚后赔。 刚才说的是单周期测试,另外我们还可以做跨周期测试。 我测给大家看,一边测一边解释。 我现在先选一个tick数据,ni2003合约的tick数据。 最重要的是显示周期,这里要取消这个勾,把显示周期设成1分钟。 这意味着,最初读到的是tick数据,但程序会把它捏合成1分钟K线。 然后测1分钟K线。但请注意,这个1分钟K线和一般的1分钟K线不同。 它是内含tick数据的。 现在选一个策略,一个专用于跨周期测试的策略。 它的信号不仅落在K线上,而且也会落在K线内部的tick上。 大家现在看到的进度条,是在读最基本的数据——tick数据。 测完了,资金曲线出来了,我们再看看它的信号。 我们看信号的时候看到的K线还是1分钟K线。 这是刚才所说的“显示周期”。 双击会打开一个更大的窗口。 如果我对着一个K线再双击的话,我就看到了K线内部的情况。 K线内部是由这么一些tick组成的,信号是落在这个位置的。 历史测试也是可以用于套利的,这有套利回测。 比如现在要设镍和锌的套利,镍2手,锌3手,填进去, 之后我也选一个策略,然后测试。 现在我们看到的三个窗口,左边的窗口是套利以后的资金曲线, 右边这两个窗口是套利的每条腿的K线。 这三个窗口的显示有一个特点——它们同步变化。 比如在主图上点出参考线,在左右腿同样的位置也会出现参考线。 如果拖动套利曲线,左右腿的K线也会跟着动。 这就便于我们比较套利组合与它的左右腿的关系。 下面我再说一下实盘方面,跑实盘它是怎么跑的。 实盘是放在“实时方案”区域里的,这里面有几类实时方案。 和程序化有关的是两类——自动交易和自动套利。 至于怎么放进去的,现在不多说了,因为前几章已经讲过, 怎么建立方案,怎么把自动化策略加载到交易方案上。 现在的例子是双均线,有一个策略叫“双均线”,我们已经事先 写好它的逻辑,也测试过它的历史数据,觉得还可以,上实盘了。 到了实盘当中,要是出了这些信号,它是有可能下单的。 至于它是不是真的下单,取决于下面的几个选项。 为什么要设这几个选项呢,因为有的人在上程序化策略时, 并不一定希望它立刻下单,可能还想观察一下。 等到自己觉得这个策略可以下单时,再下单。 好,那就允许他刚开始的时候不勾这个,不下单,只是观察。 同样可以看到这些三角出现,只不过是空心的三角。 等到你勾上了它以后,它再出来,就是实心的三角了。 同时伴随着下单。 还有一种情况,这些选项可以帮助某些人进行交易方向的过滤。 有的人喜欢看大趋势,如果大趋势是向下的,他就只做向下的单子。 对这种红三角就置之不理了。怎么办呢?他可以这么办: 这段时间,他把“自动买开”取消了,而把“自动卖开”勾上。 于是,凡是绿三角卖开信号出来的时候,都会下单, 而这段时间,红三角出来,就不会下单。 这样的话他下的所有开仓单都是符合大趋势的, 他觉得这样胜率会高一点。很多时候也确实如此。 另外,“自动平仓”一般都是勾上的。 因为不管是否符合大趋势,我们有仓位时,通常是需要 按照自动化策略的规则来平仓的, 也就说该平的时候我们一般都要毫不犹豫地平。 我们再看看套利方面。套利的窗口要多两个。我先说上面的窗口。 这是整个套利组合的情况,这条白线是价差曲线。 然后信号是落在价差曲线上的。 另外,底下是套利的每条腿的K线。 其实这个结构和我们刚才在回测中看到的结构是一样的, 都是把两条腿和整个组合同时显示出来给你看,方便你比较。 并且,如果在主图上点击,底下的副图,两条腿的图,会相应变化。 跑实盘时,有些功能是回测中没有的,比如监控功能。 比如“让成交符合信号”。 如果自动化信号出了,但没有成交,这个按钮就会变红, 点击它,就会看到具体哪些单子缺了。 选一个单子,再点“校正所选……”按钮,它可以自动校正此单。 如果点“全部校正”按钮,那么缺的所有单子都会被补上。 此外还有关于账户净仓与策略净仓是否一致的按钮、 有没有使用即将到期的合约……我们都有相应的监控措施。 又比如“无瘸腿”按钮,这是套利专用的。 瘸腿是指套利组合中某个合约没有成交,影响了整个组合的平衡, 一旦产生瘸腿就会破坏套利的本意,实际上就把套利变成单边了, 会产生很大的风险,这个按钮就是用来规避这种风险的。 如果有瘸腿,它就会变红,点它会出现一个对话框, 这里边会有字提醒你瘸了哪些腿,底下的按钮会校正这些瘸腿。 我们来看看源码。 就我们现在使用的这套源码,写策略方面的自由度是很大的。 可以说超过很多程序化编程软件。比如说对转势的处理。 我们有一些函数专门判断行情何时转势、转势后怎样下单。 又比如对K线某些特殊形态的识别,还有相应的特殊处理。 还有历史回测中的变量。大多数软件回测使用的变量是单一的, 一个整数,或一个实数,或一个字符串。 但是我们现在可以使用数组,使用集合。 这样的话我们能够记录的就不限于单个的数据了, 而可以是一组数据,如果这组数据还是某种统计结果, 我们还可以把它写到某个文本文件中,这可用于研究工作。 还有一个强大的功能是条件单, 也就是预先画出一条线,行情到达这条线的时候下单。 我们有多种条件单。 还有软止损。 通常说的止损是画一条线,行情到那儿就平仓,这是硬止损。 但是我们现在还有一种软止损,就是行情没到硬止损线以前, 利用行情的波动,尽量减小损失。 如果你脑洞大开,你还可以想出更多更多的方法来。 我们这些范例,在源码里倒是有示范的。 又比如说交易方向的过滤、大周期套小周期(刚才测过的跨周期)、 资金管理(在我们的买卖函数里有一些关于资金管理的参数, 包括分批止盈、分批止损等条件)。 总的来说,咱们这套源码可以做到的事情比较多,也比较活泛。 它用的是C#语言,而不是很多软件使用的二次开发的简单语言。 C#比较复杂,也比较丰富,能实现的功能更多。 也可以说没有你做不到的,只有你想不到的。 只要你能够量化的东西,C#语言都能写出来。 咱们的编程方法到底能做到些什么,刚才说了它能实现的典型功能。 此外有历史测试,有实盘运行。 在历史测试中可以指定策略、参数范围、K线周期、日期范围等等, 可以考虑到手续费、滑点等等因素,也可以进行组合测试, 在测试结果里可以看到我们关心的很多指标,每天能赚多少钱、 最大回撤是多少、占用多少资金、胜率和盈亏比是多少等等等等。 在实盘当中除了这些还有一些监控功能,来防止像有信号没有成交、 套利的瘸腿等等问题,这个监控功能是非常重要的, 现在这个软件是有一些大公司包括一些基金公司在使用, 上亿的资金在里头跑,如果没有监控功能,是很可怕的。 《期货CTP与程序化编程视频指导》 DreamTrader是期货程序化DIY的模版,和一般商业软件的区别在于,它不是一个已经固定好了的东西, 而是提供给客户的一个模版,客户可以在此基础上进行自己的修改。我们为什么要DIY交易软件呢? 一般有三种用途。一、为了方便。有些功能是一般的软件没有的,我们希望按自己的需要定做。 比如我们现在做的模版上有一些范例,我正在打开它。打开需要读取一些基本信息,所以要消耗一些时间。 上面这排按钮,速买、速卖、速平、速反等,很多软件上并没有,这是为了炒单方便,自己做的按钮。 这样的话我点一个按钮马上就可以买进,不需要填什么对话框,也不需要填数字了。 又比如这个窗口里,也有一些按照我自己的需要定做的按钮,比如平推按钮,一般的软件没有这样的按钮, 但是我在交易中经常需要平推的功能,就是说零损失地把单子平了,可能只是损失一点手续费, 我做了这个按钮之后,在行情变化剧烈时,如果我觉得不对劲了,行情可能逆转,希望没有损失地平仓, 我就挂一个平推单,但我又不想填一堆数字或者在价格表上选价格,就只需要简单地点一下这个按钮, 马上就会挂一个平推单。这只是举一个例子,类似的功能还有很多。这就是为满足我们的需求方便。 二、为了省钱。我们知道程序化在很多商业软件上是要收年费的, 我们自己做了软件以后,就不需要交这些钱了。 三、为了保密。 这个软件是从登录、下单到程序化,一体化的。 我们知道做交易首先要登录交易服务器(对国内期货来说就是CTP),下单要把指令发给这个服务器, 由它撮合成交,软件首先要实现的就是这些,在“登录”这个模块里。 这里面需要设置一些参数,其中最重要的是账号信息。 登录之后需要查询,因为我们做交易需要知道自己有多少钱、有没有持仓、有没有挂单。 这些,软件本地是有记录的,但还需要向交易所查询,每次登录后都要查询, 因为我们相信在交易所备份的数据是万无一失的。“查改报单”、“查改持仓”、“查改资金”勾上后, 每次登录后都会向交易所查询,万一本地记录有错,它会纠正本地记录,尽管这种概率是很小的。 说完登录、查询,再说下单。下单主要体现在风控和实时方案里。 风控是对下单的总体设置。实时方案里面是下单的具体动作,那就是针对K线来下单了。 下一个模块是回测,回测就涉及到程序化了,我们需要用历史数据来测试我们的思路能不能赚钱。 还有“工具”区域,包括下载数据的方法(例如从TB获取数据),还有品种合约基本信息设置。 再来说一下每个环节的稍为详细的内容。 登录这一块,分自动登录和人工登录两种,程序化交易必须自动登录,就要设置每天自动登录、登出时间。 我现在设置的是早上8:45、晚上20:45自动登录。即使人不在,只要这个勾是打上的,程序就开始计时。 在没有登录的时候,账户信息是可以改的,有两部分——开户公司和账户信息,通过双击打开新窗口修改。 再说风控。风控的核心是设置子账户(交易员)。在此例中,子账户是“a”,主账户是“SimNow模拟”。 意思就是“SimNow模拟”这个主账户分配一定资金给“a”这个子账户,让它来操作。 为什么会有这样一个功能呢?因为很多大公司有这种需求——一个账户分给几个操盘手来做。 个人操作不一定需要这么多子账户,那很简单,只设一个子账户,把所有的资金都分配给它就行了。 所以这个功能适用于所有用户,一个交易员被分配了多少钱,赚了多少亏了多少,都有记录。 双击之后还可以修改交易员(子账户)的信息——主账户、资金数额、强平标准等。 每次添加方案的时候,要设一个交易员,必须指定一个交易员。 多个交易员操作一个账户,可能会产生这样的问题:一个人买开,一个人卖开,会是什么样的结果? 风控会对他们的单子进行对冲,如果用快期看主账户,会看到两人的单子已经对冲了,没有仓位了, 但是他们在自己的软件上(在交易方案所用的软件上)还会看到自己有仓位。 这就是说,软件内部把单子分成了两类——风控的单子、交易方案的单子。这是分开的。 交易方案是按照子账户的情况显示的,而风控是主账户实际的情况。这是为了在风控那边节约保证金。 每个交易员的成绩也是可以核查的。点“a”交易员,下面就显示它的交易记录。 交易员的强平、禁止交易、恢复交易等,我也不多说了,无非就是一些风控方面的管理。 勾选“计算所有品种的指数数据”,本程序又担当行情服务器的角色了。再点“登录”。 收到行情后,所有的合约都有了跳动的数字。同时它会筛选主力合约。怎么筛选呢?举例来说, 对于锌这个品种,程序现在订阅了它所有合约的行情,到下午快要收盘的时候, 它会把这些合约的持仓量加以比较,找出最大的那个,排在第一,其他合约也按持仓量从大到小排列, 自然而然地,你就知道最主力的合约是zn1912,因为它的持仓量是最大的。其他的依次往下排。 我们再说下一个话题,交易方面。这个软件的交易是以方案为框架的,和普通的软件很不一样。 比如在文华上直接用键盘敲“rb1912”,K线就出现了,就可以下单了,但我们这里要复杂一些, 我们必须通过添加方案,事先把合约、手数写下来,形成这样的一个窗口,才能运行。 为什么要绕这么大的弯子来做这件事?因为我们面对的是很多程序化交易的公司客户, 他们需要对每个交易员在干什么进行严格的管理,他们不允许有随意的操作。 你想做螺纹钢,想做金,想做镍,就做啊?那不行。你的方案必须通过审查,然后建立了这个方案, 才能运行,因此我们有了这个需求。对此,可能个人交易者觉得麻烦,但没有办法,只能这么做。 交易方案有手工和自动两大类。手工交易没有自动化策略,必须手工点击一个什么东西才能下单。 而自动化策略达到一定条件会出信号,如果勾选了“自动买开”等,就会真的下单。 这两类方案都是通过“添加方案”这个按钮添加进去的。我们先看手工交易区,这是最简单的。 添加手工方案时需要写方案名称,要给它指定交易员(事先已经知道我在风控里设置的交易员名叫“a”), 还有手数倍数(默认手数为1时,这个交易员要下几手单子),如果还有“b”、“c”等交易员, 给他们设置不同的手数倍数,就相当于不同的交易员用不同的倍数同时下单,简单地说就是多子账户。 然后设置合约,这里显示了目前在交易所有效的所有合约,左边这个框是便于你搜索的。 周期是指K线的周期,默认手数是最基本的手数,就是在不修改其他地方时只点买卖按钮就按这个手数下单。 但是这边还有自定手数,如果勾了这个,就会按当前的自定手数来下单(不勾就按默认手数下单)。 底层周期,目前在实盘中还没用上,在测试里用了。在建立实盘方案时,“底层周期”都是不选的。 下单方式有几种。最简单的是市价下单,就是以涨停价或跌停价下单。延时下单是当时不下单, 过了若干秒再下单。连锁挂单,比如现在把单子挂上了,等待180秒,如果成交就罢了,若未成交, 就根据你的选择来做下一个动作(市价补单:以涨跌停价下单力争成交;重新挂单:在新的价位又挂一个单子, 若再不成交,过一段时间又追着挂单……直到成交为止)。 另外,在多图同列模式下,下单方式更多,增加了挂反、挂平、挂买、挂卖等,可以调节价格偏移。 价格偏移为0,就是在盘口的买一价或卖一价挂单,改了数字,它就会偏移,比如在卖二价、卖三价挂单。 回头来说添加方案的问题,对于“使用策略”,手工交易方案只能使用只显示、不下单的策略, 在我的模版里,凡是写了“指标的”(如“染色指标”)策略,都是只显示、不下单的。 选了染色指标后的效果就会是这样的。这只是举个例子。 添加自动交易方案要复杂一些,它使用的策略可以是可以下单的策略,还得填参数。 还有套利,手工套利和自动套利跟刚才说的大同小异,只不过是参数变得复杂了。 添加方案时,套利多了这么一块,左腿右腿。我们现在套利最多支持左腿三个合约、右腿三个合约。 添加方案之后,界面上会出现这样的窗口——非套利方案显示K线,套利方案显示套利组合曲线及各品种K线。 这里还有三个显示选项:K线、价线(收盘价连线)、盈亏线(资金曲线)。还可以选择全局显示。 在交易这方面,手工交易区只能通过刚才说的那些按钮、对话框下单,但在自动交易区,程序自己会下单。 自动交易也就存在信号是不是真的会下单的问题了。我们现在在自动交易区看到的信号是空三角形, 表示这些信号还没有下单,这也是因为我在下面没有勾选“自动买开”和“自动卖开”。 真的下了单的信号,是实心信号。刚刚加载一个程序化策略时,前面的信号全都是空心的,因为都在历史K线上, 在以后的实盘运行中,在实时行情生成的K线上,出现新信号时,要勾选“自动买开”“自动卖开”才会下单。 为什么要有“自动买开”“自动卖开”“自动平仓”这三个选项呢?因为有的客户要对程序化进行人工干预。 他有时想暂停程序化,就关掉“自动买开”、“自动卖开”就可以了。还有些客户要对买卖的方向进行选择, 在大趋势朝上时,他希望短周期的程序化只做向上的单子,就取消“自动卖开”,只勾选“自动买开”。 结果,所有的红色三角形都下单,而绿色三角形不下单(红代表买,绿代表卖,黄代表平仓; 三角形朝上代表买,三角形朝下代表卖,在每一根K线上,开仓信号是画在右边的,平仓信号总是画在左边, 免得它们重叠了你分不清)。K线的放大、缩小,使用键盘上的上下键,和一般的软件一样。也可以拖动。 下面我要讲程序化交易的话题了。首先从回测开始。我现在点的“普通回测”指的是非套利的,单边的回测, 首先我们要有历史数据,我们现在看见的数据是已经保存在软件里的,它保存在哪儿呢?我们来看文件夹。 打开csvTest文件夹,所有用于测试的K线数据都保存在这儿,软件自动分析它的周期、日期范围,显示出来。 选择数据,再点“补所选数据”按钮,可以从我们的服务器补数据(软件内置了该服务器的地址)。 客户可以建立自己的行情服务器,那是很简单的事,我可以教给他一整套东西,把补数据的程序也放上去。 手续费、滑点等,都可以人工设,每次点测试按钮之后,软件就自动把这些数字给记下来。 每个品种的手续费都可以单独设置。这是测试的手续费,不一定是实盘的手续费。 还有日期范围,可以在数据范围以内任意选择。显示周期比较复杂,“与数据相同”只测表层K线。 底下的一系列策略,是软件内置的、事先写好的,它们是在这儿写的,程序员使用源码才会接触到这些。 比如“峰谷”这个策略,写在这儿。这样就回到一开始你咨询过的问题了——我们这个平台是怎么写策略的。 现在你看到了,它完全是在整个软件的源码里把策略写出来的。 问:多个品种,是不是每个品种都要把策略写一遍?答:不是,只需要写一遍,分发给多个品种。 问:对每个品种,策略的细节不一样,参数不同,怎么办?答:只需要在分发策略时设置不同的参数就行了。 如果策略逻辑没有变化,就不需要写很多次。也就是说,代码不变,仅仅是参数变了,代码只需要一份。 选择策略之后,点“修改策略”按钮,每一个参数都有注释,我就会想起来“这个参数原来是这么个意思”。 其实这些话是在这儿写的:有一个配置文件,程序会读这个文件。 问:策略写完之后需要编辑这个文件吗?答:对,每一个策略写完都要在这儿添加这样的信息。 在测试之前,可以确定参数范围,相当于TB或文华的参数优化。在这里可以写最小值、最大值和步长。 再点“测试”按钮,底下会出现一系列测试结果,而且会排名,排名的顺序有三种选择, 默认的是按最大回撤来排名,如果按总净利排名,排在最上面的会是总净利最多的。 对于表格里的一排测试结果,双击任何一个,就可以看到相应的曲线,在曲线下面可以选择看K线或资金曲线。 看K线,就会显示K线和信号,点选信号,下面会显示该信号的具体内容,也可以双击此面板,将整个K线图放大。 还有一个比较重要的是组合测试,可以把不同品种、策略的测试结果放在一起,点“创建组合曲线”按钮, 程序就会把这些曲线合并,我需要看单个曲线时就双击这个,需要看组合曲线时就点击这个, 在这儿可以显示最概括的情况——总净利、回撤等。这还有“查看详情”按钮,可以打开这么一个窗口, 显示组合测试的更详细情况。这里有一个“信号修订”,这是用于手工交易研究或程序化策略优化的。 先把K线大图打开,这时双击K线会打开这么一个窗口,修改测试信号,如果我觉得程序化在这里信号不太合理, 我把它暂时删除,在别的地方把我认为合理的信号加进去,用这种方法修改程序化信号,看总的效果是否变好。 我修改信号时,资金曲线会同步变化。我们曾经把这方法叫“快乐撸单器”,有时候在进行程序化初步研究时, 写出来效果并不理想,我们就会找原因在哪儿,一时半会儿也找不到原因,我们就会产生一些试探性的想法, 是不是用别的方法平仓会好一点?不是自动调整的,是研究人员手工调整这些信号,一个一个调整, 因为这个时候思路还没有确定下来,还没有写成程序,当然没有办法自动调整。人脑把这些调整记下来了。 手工调整后发现资金曲线变好了,就会想一下,我到底调的是什么,再到程序里去改相应的代码。 这要求研究者必须保持一致性,例如在这儿加大止盈,那么在所有的地方都要加大止盈。要对自己负责。 还有,我们曾经把一些人的手工交易方法改成程序化策略,那时也大量用到快乐撸单器, 因为他手工策略太复杂了,写完以后不对不对老不对,他就会想:“到底跟我的手工差在哪儿呢?” 我们把他的手工交易记录跟程序化测试结果比较,就会发现二者信号不一样,就会想到底是为什么不一样, 我们应该做什么样的改变。不能只在一个地方改,一改所有的地方都得改,又不敢马上在代码上改, 万一改了以后没用、改错了,那不是白花时间吗。所以后来就发明了这个撸单器。 修改之后还可以保存,这里可以取一个标题,叫“修改方案1号”“2号”等,保存之后保存到这个地方。 下一次可以从这儿导入,点“导入修订信号”,就可以找到原来导出的文件了。 我再说一下所有这些K线从哪儿来的。在“工具”里,我们最常使用的是从TB得到数据,TB的操作不多说了。 TB把K线导出成csv文件,我们点这个按钮,找到这个文件,打开,再点“转换为本软件……”, 这里有两个选项,这个选项会转换到测试所用文件夹里,前面那个转换到实盘文件夹,我们一般用测试的, 点这个以后,会出现进度条,开始转换数据。 问:我们不是从上期CTP拉数据吗?答:上期会给你历史数据吗?历史K线它怎么会给你。 下面再说一下套利。套利的回测复杂一些,左腿和右腿要分别设,这回就不是一个合约了。 至于周期,最好先在普通回测里看一下,现在硬盘上有几分钟周期的,再在这里选周期,不然可能找不到K线。 我这儿现在镍和锌都有5分钟K线,我们就在这儿选5分钟。然后按数据的实际情况选日期范围。 这个加减符号,一般不需要改,当它为默认值时,左腿总是加,右腿总是减,算价差时总是左腿减右腿。 但如果把这儿改成减,就会左腿减负的右腿,就成了左腿加右腿,就不合理了。 甚至这个地方还有乘,乘法是用于外汇的三角套利的,我们就更少使用了,要使用也要十分小心,研究透彻。 三角套利,以前有客户研究过,但没有研究出来,只是留下了这么一个功能,从来没有使用过。 到现在为止我们使用的都是加号。这儿还可以添加别的东西,比如螺纹钢。我先看一下螺纹钢的数据有没有。 螺纹钢有,那行,可以用。这个地方跟刚才一样选策略,我选一个“双均线”。 左边还有一个很重要的框,“使用指数”,我用的是指数K线,这里就应该勾上。 按照我们填写的内容,程序的计算方法会是:镍的价格乘以3手,乘以镍的合约乘数(1), 再减去锌的价格乘以2手乘以锌的合约乘数(5),再减螺纹钢的价格乘以3乘以螺纹钢的合约乘数(10), 程序拿到这三个品种的K线后,在每根K线上计算,如果各品种的K线不完全对应,它会每接触到一根K线, 看有没有同时的另外两个品种的K线,发现没有就会用这些品种最近的K线的数据来计算。 我们设好参数后,点一下“测试”按钮,它就开始测了,跟刚才普通回测相比,窗口多了两个, 左边的大窗口是套利曲线,右边是每一腿的K线,这几个窗口在拖动、放大、缩小时会同步变化, 在主窗口点出参考线,右边的参考线会同时移动,这是为了便于客户比较,当套利曲线变化时, 左右腿的真实行情发生了什么变化,为什么套利曲线会涨会跌。 刚才我们看到的是资金曲线,现在看到的这是套利曲线,白线是套利曲线(价差线)。 有时我们在价差线上做空,有时在价差线上做多。最后资金曲线是这根黄线。 问:我们写策略时,怎样编写第一腿买、第二腿卖呢? 答:不需要具体地写第一腿买、第二腿卖,只需要写总的来说是买还是卖,再设置各腿的组合, 然后程序会帮你决定左腿是该买还是卖、右腿是该买还是卖。 其实你在写套利策略时,和针对普通行情写策略,是一样的,无非就是规定形态或涨跌达到什么条件就买或卖。 一个策略既可以用于套利,也可以用于普通K线,策略完全一样, 只不过用在套利上时,程序会多干一些事——帮你算出每个合约是该买还是该卖。 好,现在看一下在哪儿编写策略。源代码里有这么一个文件,在它一开始就注释了怎么添加策略。 这里面有一些示范策略,只需要在代码中全文搜索“峰谷”这个名字,就可以找到这个策略的来龙去脉, 就可以知道它在什么地方必须出现,什么地方必须写,然后你照猫画虎把你自己的策略写进去。 其实具体要写的几个地方在这儿…… 首先在这个地方添加策略,把它的名字、有关参数写进来。然后,这个策略具体的内容是写在这个文件里的。 我给的这些示范策略,已经包括了大部分情况,怎么判断行情走势、形态,又怎么下单,都做了一些示范, 其实稍懂程序语言的人,看了很快就明白了,也就照着写了。源码里要写的就这两处。 在源码之外,有这么一个地方,这个文件,“SetStrg”,你照着这个模版把你自己的策略信息写进去就OK了。 你看出来了吧,现在写策略就是分三个地方写的,一个是在这儿写一行字,让程序按名字找到策略, 第二个地方是这个地方,第三个地方是这个地方,就这三个地方。