1、自动化交易教程历经 16 年金融风雨,经历了全球市场所有商品的真实磨练准确、迅速、无所不能是投资家的目标自动化交易教程 11. 把交易思路告诉计算机 - 交易公式的创造 12. 让公式跑起来 - 组装交易策略 53. 多种入仓方式 - 灵活使用先进的武器 10入仓 11出仓 134. 各取所需 - 价位驱动和时间驱动 145. 不可或缺的所见所得的创作手段 - 仿真测试 156. 图形化交易 - 手工和自动的完美结合,让机器完成团队的工作 167. 附录一 博雅语言教材 19Boya 说明 19变量、数组与序列变量 19系统关键词、注释和说明 20输入数据 21运算符、表达式和赋值 22控制语
2、句 23系统函数 24子程序 25隐含执行过程和自控循环 26DLL 方式 .26举例 278. 附录二 多周期共振公式代码 441. 把交易思路告诉计算机 - 交易公式的创造交易者一般都有自己一套完备的交易思路,这套思路包括什么条件下开仓、什么条件下加仓、什么条件下平仓、什么条件下止盈止损等等。如果要想把这套思路让计算机自动执行,必须得描述给计算机。这个描述的手段有不少,最主要的手段就是创造交易公式。创造好了交易公式,自动化的工作就完成的大部分。本小节我们就以一个例子为代表,描述一下交易公式的创作过程,具体的语法大家参考附录一。假设一个期货交易者,交易思路如下:开多仓的条件:1 分钟 5 分
3、钟 15 分钟的 MACD 的 DIFF 都高于 MEA平多仓的条件:1 分钟 MACD 的 DIFF 低于 MEA开空仓的条件:1 分钟 5 分钟 15 分钟的 MACD 的 DIFF 都低于 MEA平空仓的条件:1 分钟 MACD 的 DIFF 高于 MEA止盈的条件:无止损的条件:5 个步长动态止损鉴于商品期货和大盘指数的对应关系,还希望平仓条件加入大盘的因素,比如,大盘 1 分钟、5 分钟均线向上也作为平空单的条件,1 分钟、5 分钟均线向下也作为平多单的条件。这个公式怎么创作呢? 为了高效,我们先创作两个子公式,一个 MACD 的公式,一个是大盘均线方向的描述的公式。当然,MACD
4、这个公式系统里有,我们不需再创作,只是展示出来让大家看一下。MACD 的子公式:/MACD 的算法DIFF = 对数平均(收盘价,P1) - 对数平均(收盘价,P2);DEA=对数平均(DIFF,P3);MACDV=2*(DIFF-DEA);/三个输出连线(DIFF,0);#outportdef(“DIFF“,0xff8040,1,1,1,0,0)连线(DEA,0);#outportdef(“DEA“,0xff0080,1,1,1,0,0)色棒线(MACDV,0);#outportdef(“MACD“,0x8080ff,1,1,1,0,0,2)大盘方向的子公式,我们命名它叫”大盘方向”:/加载
5、上证指数的收盘价a = 加载数据(0, 1, 收盘价);/求5周期均线b = 算术平均(a,5);/判断均线的方向d = 0;if(ab if(aDEA1 /平多仓条件sCcnd = DIF1DEA1 | (DP10 /买开仓,使用系统隐含数量和价位策略买开仓(bOcnd, 0, 0, 1, 0, 0);/卖开仓,使用系统隐含数量和价位策略卖开仓(sOcnd, 0, 0, 1, 0, 0);if(bCcnd)/得到空单仓位scw = 得到仓位(0,0,1,0);/买平仓,也就是平空仓,使用系统隐含数量和价位策略买平仓(scw0, 0, scw, 1, 0, 0);if(sCcnd)/得到多单仓
6、位bcw = 得到仓位(0,0,0,0);/卖平仓,也就是平多仓,使用系统隐含数量和价位策略买平仓(bcw0, 0, bcw, 1, 0, 0);到此为止,这个公式就基本描述完了。这个思路基本上都是使用的价格趋势类指标作为决策的依据,这类指标有随价格变化而变化的属性,原则上讲不能做到料敌机先,所以存在交易信号的来回变化的问题,一些朋友希望用在每根K线结束的时候再发出信号,还有,一旦有了仓位,在一个价格区间内不要来回交易,突破指定的2个步长的价格带,再做平仓和反手的操作,怎么改写? 下面改写过的公式作为附件2供大家参考,这里只简单截图如下:基于该投资者的止盈止损比较简单,5个步长动态止损,这个系
7、统设置很容易实现,故就不在公式里编写了。这个例子虽然简单,但是书写起来还是需要一定的编程技术,投资家平台另外提供了一个图形化的公式创造环境,不熟悉编程语言编写的朋友,可以尝试使用这个图形化平台。2. 让公式跑起来 - 组装交易策略如果想让自动跑起来,怎么办?那就要把交易公式组装成一个交易策略,主要要指定监控哪些品种,止盈止损的设定,仓位的隐含信息设定等等。我们还是举例说明,还是以上面的公式为例。交易策略只需组装一次,以后每次交易直接登入交易系统就行了。组装成交易策略的步骤如下:1. 打开巫师选股平台2. 指定筛选范围,也就是设定同时监控几个合约:3. 指定使用的公式和跟踪的周期设定完范围后,按
8、“下一步” ,指定交易公式。设置周期为 5 秒钟。为什么要这么短的周期?因为对提高利润率很有帮助。确定后,再按”下一步 ”,设定选股结果直接到交易平台和多空都做。之后保存选股方案到”多周期共振.sel”,如下图:4. 打开交易平台,配置并生成交易策略:用热键ALD+D或者工具条上的图标或者菜单,打开交易平台,如下图:按下设置按钮,进行交易策略配置,如下:指定入仓方案为”多周期共振.sel” 并填写完其他的选项后,确认返回即可。因为我们的公式中,既有入仓也有出仓,所以,出仓方案可以空置。如果出仓和入仓使用独立的方案,那就都需要填写。我们也可以把这些所有的设置保存为一个交易策略,比如叫”多周期共振
9、.tpc”,以备切换策略的时候,方便调用。确定返回后,登入交易系统,自动交易就开始了。当然,没必要每次打开系统都配置交易策略,软件打开后可直接登入交易系统,登入的时候,总是隐含调入最后一次使用的交易策略。登入交易系统后,监控将在后台运行,和界面上任何操作互不影响。当然,界面的图形也可以自动或者手工下单,这个后面再介绍。本节只是介绍了价位驱动方式的自动交易方法,投资家还有多种入仓的方式,这些内容将在下一节介绍,进入下一节之前,先给大家介绍几个概念。 仓 指的是和该平台连接的交易系统持有的所有品种,包括股票、期货、股指期货、权证、外汇、期权等所有金融品种。 入仓是指向仓内输送满足条件的金融品种,也
10、就是买入和开仓的过程。 出仓是指向将仓内满足条件的金融品种卖出或平仓。 选股方案和预警方案是多层投资家公式的组合。这些公式可以是不同的理念,不同的周期。方案有一个监控或者选择的范围,比如可以是监控所有 A 股,也可是以监控所有的期货主力合约,也可以只监控一个股指期货品种。选股方案和预警方案可以通用,选股方案文件名以“.sel”结尾,预警方案文件名以“.war ”结尾,两种文件可以互换。两者都存放在 plan 目录下. 价位驱动实时选股平台是投资家多层次选股平台,每笔价位到达时都会实时检测是否有满足方案的品种出现,如果有满足买入或卖出条件的品种出现,则提示或者自动送入交易平台(入仓) 。 价位驱
11、动实时预警平台是投资家多层次监控预警平台,每笔价位到达时都会实时检测是否有满足方案的品种出现,如果有满足买入或卖出条件的品种出现,则提示或者自动出仓。 时间驱动选股平台是投资家多层次选股平台,不是每笔价位到达都驱动选股,而是一定时间间隔筛选一次,时间间隔可以设定。其公式的选股范围的设定和价位驱动平台类似。本平台可以运行多个而不像价位驱动只能运行一个。和价位驱动一样,品种一旦选出,则提示或者自动送入交易平台(入仓) 。这种方案的文件名是“.tds”结尾,他和“.sel ”可以互相转换。Tds 文件和 sel 文件一样,存放在 plan 目录下. 选股巫师设计筛选方案,手工运行方案的筛选工具。 画
12、线告警所画之线大都可以设置穿越告警,穿越告警之时,也可以形成入仓的动作。 价位告警所设置价位告警满足时,也可以形成入仓的动作。 短线精灵单公式(非多层)价位驱动的实时监控工具,每笔价位到达时都会公式运行。如果有满足买入或卖出条件的品种出现,则提示或者自动送入交易平台(入仓) 。 公式直接入仓通过公式平台里的四个函数(买开仓、卖开仓、买平仓、卖平仓) ,也可以直接从公式入仓。 手工操作是手工入仓或出仓。 交易策略是指平台的整个交易配置的总和,包括出入仓方案,止盈止损方法,多空隐含量,登录需要暂停与否等等交易参数。交易策略文件名以“.tpc”结尾, 从放在config 目录下 .3. 多种入仓方式
13、 - 灵活使用先进的武器投资家的自动交易平台是一个功能强大的平台,也是一个经过多年验证和考验的平台,支持多种多个入仓和出仓的方式。投资家自动交易的体系结构如下图所示:价位驱动实时股选平台时间驱动选股平台 1时间驱动选股平台 N手工确认环节(可省略)持仓等数据库手工操作柜台接口价位驱动预警方案止盈止损监控图表公式画线预警 价位告警入仓入仓的方法有以下几个:价位驱动实时选股平台、时间驱动实时选股平台、短线精灵、选股巫师、画线预警、价位告警。当然还有手工下单,比如输入一些压力支撑位或者阻力位的买卖单。1. 价位驱动实时选股平台此平台已经在上一节里介绍过,故从略。2. 时间驱动实时选股平台如下图所示,
14、 “工具”菜单可以调出相应功能。3. 短线精灵如下图所示, “工具”菜单可以调出相应功能。4. 选股巫师如果选股巫师选择了“结果到交易平台” ,那么每次手工选股,最后的结果都会入仓。5. 画线预警所画之线大都可以设置穿越告警,穿越告警之时,也可以形成入仓的动作。首先需要在画的线上设置告警(具体设置方法是在线条之上点鼠标右键,通过菜单实现) ,如下图:如果希望价格上穿或者下穿次线条的时候,给出买入卖出的动作,还需要在画笔属性里面选中相应选项,如下图。注意, “穿越告警线到交易平台”和“交易结束再给交易信号”可以针对某个线段独立设置,线段之间互不干扰,但是最后一个的属性将作为隐含属性被记忆。当“交
15、易结束再给交易信号”设置之时,信号如果在周期结束之时仍然是穿越状态,才会发出指令。但是交易之外的系统的告警并不受此限制。6. 价位预警当价位告警满足条件是,也可以作为入仓的条件。价位告警的设置在系统菜单里。每条价位告警可以单独设置是不是触发下单,每条之间各自独立,互不干扰。如下图所示。出仓出仓的方法可以有以下几个:价位驱动实时预警方案,止盈止损,手工干预。1. 价位驱动实时预警方案和价位驱动实时选股方案入仓相似,只不过它所监控的范围不是固定死的,而是随着持仓的变化而动态变化,始终监控持仓内容,如果有满足条件的品种,马上出仓,如果需要手工确认,则放入确认队列。2. 止盈止损系统开启止盈止损原则后
16、,一旦满足条件,自动出仓。系统的止盈止损原则在交易系统的设置里面完成设置。如下图。3. 手工干预 在双击键为交易状态时(子窗菜单之双击鼠标左键下单) ,打开交易平台后,在任何子窗双击鼠标左键,调出下单对话框。 快捷键下单:i. 点击某品种(可以是报价窗口,技术分析、单品种等任何窗口中的品种) ,然后 Alt+C, 则可以平掉本品种所有的开仓或者卖出该品种。Alt+B 是买开仓,Alt+S 是卖开仓。ii. 双击交易平台的持仓列表和历史交易列表可以手工开平仓iii. Alt+M 可以调出手工下单界面进行下单操作iv. Alt+T 可以以指定价位调出手工下单界面进行下单操作v. Alt+W 撤掉所
17、有挂单,Shift+B Shift+S Shift+O Shift+C 分别是撤掉所有的买单,卖单,开仓单,平仓单。 vi. Alt+K 是平掉所有仓位,Shift+KCtrl+K 分别是平掉所有多单和空单。等等。vii. Shift+T 是反手所有多单,Ctrl+T 是反手所有空单。4. 各取所需 - 价位驱动和时间驱动所谓价位驱动,就是每一笔数据到达都要驱动平台筛选一次。对一些激烈变化的品种,每天大概有几万笔的数据,比如橡胶合约就是如此。于自动交易而言,我们当然希望尽可能抓到起点,如果使用隔一段时间筛选一次,而不是每笔价位都筛选,那么可能漏掉很大利润或者造成很大损失。因为很多激烈品种的价格
18、变动可能在几十秒之间就已经完成了大部分内容。所以价位驱动是利润提升的不可缺少的手段。一个好的交易公式,不仅要检测大周期的数据,也要检测 tick 等这样最基本的数据,这样才能见微知著,做好自动交易。当然,对于股票等 T+1 以上的商品而言,价位驱动是不太必要的,因为股价的变化要慢得多,这时候,时间驱动可能又成了合适的选择。所以根据自己的需求,使用不同的入仓方法,才是正确的自动交易之道。比如对于对冲基金而言,可以用时间驱动大范围筛选股票,用价位驱动完成对变化快的商品的筛选,比如股指期货。这样,各种方案在一台机器上就可以运行,各取所需,完成利润的最大化。投资家同时支持价位驱动方式和时间驱动方式,他
19、们都可以是多层次筛选,同时都可以跟踪多个品种,跟踪数目可以上万个。5. 不可或缺的所见所得的创作手段 - 仿真测试要想创造一个收益好的交易公式,需要反复的验证,这就需要测试,我们当然不能只有在实盘中测试,我们需要加快研究周期,进行非现场测试,也就是非交易过程中测试,并且要知道准确的测试结果。一个自动交易软件,有测试的功能不难,难得是结果准确,和实际跑的结果相差无几。要想做到这一点,必须有仿真测试才成。还是以第一节的例子公式作为讲解的对象。比如多周期共振,一般的交易软件,涉及到多周期的情况(如果能够的话) ,测试的结果必然效果很好,比如我们先不加仿真测试的指令,以橡胶商品为例,测试一下它的收益,
20、你会看到,一天操作了 3 次,收益居然到了 6%,如下图。但是如果加上仿真测试又如何呢?只剩下 3%多了。请看下图:所谓的仿真测试,就是在测试的过程中,重建当时的交易过程,这里面各个周期的数据都需要重建,不同品种的数据也需要重建。换句话讲,它就是要搭建当时真实的交易过程,以保证测试的结果准确。仿真测试虽然比较费时,但是也是秒级的,总比经历真实的交易要快得多。能不能进行仿真测试,是一个创作环境好不好的重要标志。6. 图形化交易 - 手工和自动的完美结合,让机器完成团队的工作人性的优点很多,但是缺点也不少。在期货市场,恐惧、贪婪等缺点都会转化成亏损,并且往往是大亏,不是经常听说“辛辛苦苦又一年,一
21、夜回到解放前”吗?100次的成功,可能让一次亏损全部葬送。分析、研究、决策如果这三个行为都由一个人来完成,那么除非这个人非常有天分,否则,往往会上演“千里江陵一日还”的悲剧。没有自动交易以前,为了能稳定赚钱,分析、研究、决策三个行为都是要不同人负责,形成一个团队,这样,胜算的机会大大增长。但是,对于中小户而言,因为成本的问题,不可能形成团队。还好,现在有了自动交易,纪律的部分可以交给计算机来完成,这样,稳定赚钱的可能性大大增加了。那怎么做到呢?那就是设置好止损方案,启动自动交易,就可以放心的下单了,换句话说,在图表上去交易,让自动和手工结合一下。话又说回来,即使一个自动方案编写完了,也不可能一
22、下把任何交易的情况都包容进入,人看到的机会,公式可能没考虑到,这很正常。当然,我们可以继续完善公式。在公式止盈止损完备的情况下,即使所有机会不是都抓住,也可以用人工的方式放心下单,来补偿公式暂时的入仓策略的不足,危险到来时,让自动方案自动止损,这样,也能达到机器能坚决执行纪律的要求。让机器完成执行纪律的工作,交易起来也可以从容的多。如何做到在图表上自动下单呢?下面我们来说明一下:在子窗菜单上,有一个菜单选项, “双击鼠标左键下单” ,如果此菜单被选中,那么,在任何窗口上,在交易系统打开的情况下,双击鼠标左键,都会调出下单对话框。并隐含填写买卖开平价位和数量等的选项。如下图:“双击鼠标左键下单”
23、选择也可以在工具条上操作,见下图:投资家双击鼠标左键下单的窗口可以是以下窗口: 技术分析窗口 报价窗口 单品种报价窗口 买卖队列窗口 传统盯盘窗口填写隐含交易参数的原则是:1 高于现价的,填卖,低于的,填买。2 有相反方向仓位的,填平仓,否则,填开仓。3 在图表上,拾取鼠标所在价位,如果无意义,填最新价。4 在买卖队列和单品种报价以及报价窗口的价位位置上,填写拾取的价位。该对话框中, “埋单在本机”不是直接下单到交易所,而是埋单在本机,当价位到达时候,自动再下到交易所。在技术分析窗口,大家也可以也看到历史交易的情况,以及需要确认的单子,如图所示,真正做到在图表上交易。鼠标双击需要确认的小图标,
24、还可以在图标上确认下单。如下图:另外,挂单(未成交单)也会在图标上显示,也可以通过双击进行撤单操作。轻松拖动挂单的图标,可以完成重新挂单改变价位的操作,一切都可以图形化,方便直观快捷。如下图:7. 附录一 博雅语言教材Boya 说明Boya 语言是在 C 语言上基础上发展而来。虽然不包括 C 语言的全集,但是在和金融证券的结合上有所扩充,除了具有速度快捷,效率高等优点外,还有增加了容易上手,简单易学的特点。熟悉 C 语言的朋友,可以直接使用。变量、数组与序列变量所谓的变量,就是在内存中指定一个空间并命名,以便使用。根据计数范围的不同,变量有很多种,比如字符型,整形,浮点型,布尔类型等。Boya
25、 语言基本延用 C 语言的变量声明方法,列举如下:char - 字符型byte - 无符号字符型int-整形DWORD - 无符号整形float - 浮点型BOOL - 布尔型如果我们需要一个浮点型变量 A,如下声明即可:float A;如果想声明多个浮点型变量,下面的语句也行:float A,B,C;声明一个变量的时候,可以赋初值,比如:float A=1,B=2,C=3;注意一句话的结尾都是用;结束。所谓的数组,就是一种变量的组合,这组数公用一个名字,用下标区分它们在里面的位置。声明的方式和变量类似,如下所示:float A100;这就声明了 100 个浮点数类型的变量,也就是一个数组,使
26、用过程中,A0代表数组中的第 1 个数值,A2 代表第三个,注意, Boya 语言是从 0 开始计数的。金融数据有他自己的特点,它们都是时间序列数据,无论是 1 分钟,5 分钟还是日线等,都是一个时间序列的数据,这种数据用的很多,我们根据金融数据的特点,隐含声明一种数组,叫“序列变量” ,如果不加声明就是用的变量,都视为序列变量。序列变量是一种特殊的数组,他的长度就是该分析周期数据的长度,可以用系统的相应关键词获得。公式隐含周期的序列长度的关键词是“数据长度” 。序列变量既然是一个数组,当然,下标是可以使用的。比如A = (open+close+high+low)/4;A6就可以作为一个变量使
27、用,可以运算也可以被赋值。这在自控循环的模式里面经常被用到。当然,非自动循环也可以使用,代替后面讲到的 ref 函数,A当前位置-5和ref(A,5)是等效的。如果 A 变量没有声明,直接拿来使用,则系统隐含声明成序列变量。比如:A = (open+close+high+low)/4;那么,A 就是一个序列变量了。变量的命名必须以字符开始,因为空格,TAB 是语言的分隔符,所以也不能包含,当然,运算符也不能在其中,下划线倒是可以的。为了节省资源,Boya 规定变量名称不能超过 8 字符。系统关键词、注释和说明系统的关键词是系统留给自己使用的词。关键词比较多,比如各种输入数据,各种数据长度,执行
28、的位置等等,给变量其名的时候,要避开他们。Boya 的注释和 C 完全一样,单行注释用/实现,多行用/* */实现。如图:输入数据输入数据是金融数据的一个特殊内容。输入的数据包括很多,在公式平台的左下角可以选择,如下图。可以直接点右键引入。除了报价等数据外,输入数据都可以当成一个序列变量对待,只是不能被赋值。输入数据都不能被赋值。我们的服务器上,每个周期都保存有很多投资家自己统计的特殊数据,这些数据对于做好交易方案关系重大,也可以直接使用。如下图:运算符、表达式和赋值Boya 的运算符和 C 一致,主要有以下几种:数学运算符:+、-、*、/比较运算符:、=、open)A = 1;elseA =
29、 0;else 语句组也被省略,比如:A = 0;if(closeopen)A = 1;while 语句结构while(cond)bodya;如果 cond 条件成立,则执行 bodya, 直到 cond 不满足条件为止。如果 body 中有 break语句,当执行 break 时,也可以从循环中跳出。举例:while(当前位置=0 if(sellflag vs = vc0;else/开卖仓isclose = 0;if(vs0=0)/没有卖出仓位才开。vs = 1;else/有卖出仓位不开了。vs=0;/现在vs得到的是需要动作的量,如果是零,不用买股票。if(vs0)value = vs*3
30、00*close;v100c = 向下取整(value*sz100etf/P100/100)*100;v50c=向下取整(value*sh50etf/P50/100)*100;v180c=向下取整(value*sh180etf/P180/100)*100;smleft = 得到资金情况(2); /股票可用资金fmleft = 得到资金情况(4); /期货可用资金ratio = 得到保证金比率(0, 0, 1, 0);if(ratio0)ret = 卖平仓(sellflag,DC,vs,p,0,0);elseret = 卖开仓(sellflag,DC,vs,p,0,0);if(ret)ret1 = 买开仓(sellflag,DC,v180c,p,0,510180);ret2 = 买开仓(sellflag,DC,v100c,p,1,159901);ret3 = 买开仓(sellflag,DC,v50c,p,0,510050);if(ret1=FALSE | ret2=FALSE | ret3=FALSE)/下单失败,提示一下