1、从一无所知开始学习交易开拓者(TB)期货程序化交易编程经常会看到很多朋友问:帮我写个公式怎么样啊?帮我把某个公式改成 TB 的怎么样啊?我想出现这种情况的原因有两种:一是真的不会,毕竟做期货的会编程的不多;二是自己如果多花点时间的话是弄的出来,但是有点懒;我想无论是哪种原因,都应该好好的学习下 TB,因为真正的你的交易思路只有你自己才清楚而且也只有你自己去把你的交易思路用 TB 表现出来你才能更清楚的知道你的交易思维中有何缺点但是编程不是一件很容易的事情,当然, 如果您入门了,你会发觉 TB 编程其实和泡妞一样的简单,就看你敢不敢下手了 所以本文仅是写给完全不懂编程的朋友的,仅是最基本的入门资
2、料, 如果您是高手, 请忽略此文,以免耽误您的时间.我先不说那些专业术语,什么变量 ,函数和语法的,我们先不管他, 以免看的头晕 .我想先说说在 TB 中代码的执行顺序,也就是说在 TB 的 K 线图(TB 把 K 线叫做 Bar)里面你写的公式或者指标是如何得到执行的;我想这个东西是最重要而且也是最好理解的.在其他的期货软件比如文华飞狐一类,我们是无法知道你写的公式是如何执行的 ,甚至我们不知道我们写出来的公式是不是真的就体现出了我们的思想,因为你写的公式或者指标是被这些软件在幕后进行处理的 ,是黑箱操作!而 TB 不同,我们能够清楚的看到你写的代码在任意一根 K 线上是如何得到执行的!好了
3、,先说说在 TB 里面代码是如何得到执行的.1,代码从第一根 K 线开始执行,一直到最后一根 K 线;2,在每一根 K 线上,代码都是从第一行开始执行, 一直到最后一行;明白了吧,是不是很简单 ,我们先看一个小例子,如果您还不明白, 那只能说我完全没有任何能力写这文章 ,您就板砖吧我们就写个输出每日的收盘价的例子;打开 TB,在左边的 TB 公式里面,点击新建技术指标 ,新建其他的也没有关系 ,然后在出来的对话框的简称里面填入名字,记住 ,这个名字只能是 E 文哦在名字里面填入你喜欢的名字,点确定就 OK 了啊然后在出来的公式编辑器里面输入BeginEnd注意,除了参数和变量定义外 ,所有的代
4、码都必须包含在 Begin 和 End 之间意思很简单就是 Begin 后, 你的代码就开始执行了 ,End 了,你的代码就执行完毕拉呵呵我们再在 Begin 和 End 之间输入一些代码 ,完整的就是:BeginFileAppend(“c:a.log“,Text(Year)+“年“+Text(Month)+“月“+Text(Day)+“ 日的收盘价等于“);FileAppend(“C:a.log“,Text(Close);End我们再说说这两行代码是什么意思File 就是文件,Append 就是添加,现在明白了吧FileAppend 就是添加一个文件 ,文件名是什么呢?就是你后面写的 a.l
5、og,这个文件的路径在哪里呢?就是 c:a.log里面的 C 盘, 且在这个文件里面添加一行东西,这行东西的内容就是你后面所写的 Text(Year)+“年“+Text(Month)+“月“+Text(Day)+“ 日的收盘价等于“当然,如果这个文件已经存在,他就不会添加文件了,仅仅在这个文件的后面添加一行上面你写的内容好了,再看看 Text,Text 的意思就是把那些不是字符串的东西如数字啊 ,等变成字符串.而 Year,Month,Day 就代表了正在执行你写的代码的那一根 K 线的年,月, 日,年月日是数字, 我们当然要用 Text 把它搞成字符串,不然 Windows会告诉你你犯了错误
6、的Close 的意思我不说大家也明白了吧,就是代表了当前正在执行你的代码的那根 K 线的收盘价啊,呵呵,如果代码执行到最后的那根 K 线且行情正在走动的时候 Close 代表的就是现在的最新价了咯.好了我们点公式编辑器上面的工具栏的第五个按钮(打勾的那个东西),校验保存公式,稍微等一下,就 OK 了我们在回到 K 线图里面,TB 把 K 线图叫做超级图表, 呵呵,有点不习惯在 K 线图里面右键,选择商品设置 ,然后吧里面的样本数由默认的 300 改成 5,意思是让在超级图表里面仅仅显示5 条 K 线 ,当然,你可以搞成任意你喜欢的数字你甚至可以从任意一个你喜欢的时间开始显示 K 线,我们选择
7、5 跟 K 线仅仅是为了测试的方便点确定后,你就看到在 K 线图里面只显示了 5 跟 K 线,所以我们的代码也仅仅只在这 5 跟 K 线上执行了当然现在代码还不能被执行,因为我们现在还需要把我们刚刚所写的那个指标加到 K 线图上面才能被执行的我们再在超级图表里面右键,选择插入技术分析, 在出来的列表里面选择我们刚刚所写的技术指标, 然后确定就OKl 饿晕死,现在怎么在 K 线图上没有任何变化啊 ?呵呵我们上面说了,我们这个例子仅仅是把每日的收盘价写到文件里面去啊,那么我们找一找文件在什么地方咯?FileAppend(“c:a.log“,很明显,文件是在 c 盘的,文件的名字是 a.log好了,
8、我们到 c 盘找到 a.log 文件,双击打开,我们就会看到下面的内容:2007 年 9 月 24 日的收盘价等于672802007 年 9 月 25 日的收盘价等于678002007 年 9 月 26 日的收盘价等于671602007 年 9 月 27 日的收盘价等于673002007 年 9 月 28 日的收盘价等于68020我们现在来分析下:首先你写的代码在第一根 K 线上执行,先执行第一行代码:FileAppend(“c:a.log“,Text(Year)+“年“+Text(Month)+“月“+Text(Day)+“日的收盘价等于“);这行代码就输出了第一根 K 线的年,月, 日,就
9、在 a.log 文件里输出成“2007 年 9 月 24 日的收盘价等于“然后执行第二行代码:FileAppend(“C:a.log“,Text(Close);折行代码把第一根 K 线的收盘价输出到 a.log 文件里面, 于是就输出了“67280“好了,代码在第一根 K 线上执行完毕 ,于是再转到第二根 K 线,再执行第一行代码 ,再执行第二行代码.好了,现在代码在第二根,第三根, 第四根 K 线上执行完毕, 于是转到第五根也就是最后一根 K 线上执行第一行代码再执行第二行代码到此为止,所有的代码在所有的 K 线上执行完毕了, 圆满的完成了党和祖国赋予他的神圣使命,于是也就有了我们上面所看到
10、的结果:2007 年 9 月 24 日的收盘价等于672802007 年 9 月 25 日的收盘价等于678002007 年 9 月 26 日的收盘价等于671602007 年 9 月 27 日的收盘价等于673002007 年 9 月 28 日的收盘价等于68020OK,下回继续我一直非常愿意帮助客户们解答在编程中的难点,但是却不大愿意帮助客户写完整的公式策略。这其中有三个原因:1、别人写的交易策略,你难以调整它。据统计,90% 以上的交易策略会在 2 年半之内由于种种原因失效或者效率降低。通常的做法是一个季度左右,交易员就需要微调其策略,调整参数或改动某些条件。如果策略不是自己编写的,调整
11、起来就会有困难。2、别人写的交易策略,你很难彻底执行它。系统交易最重要的好处在于它的执行能力。它可以使你的交易摆脱人性的弱点,摆脱心理因素的干扰。然而这一切的基础,在于自信。人只会信任自己了解的东西,这是人性。如果一个交易策略是别人写的,无论它的测试报告是多么天花乱坠,你都不会信任它,因为你不了解它。一旦市场出现了危机情况,你就会坐立不安,你就会总怀疑是不是策略有问题,然后就又把策略扔到一边,回到凭感觉去操作的老路上去了。3、最重要的一点在于:编程就是理解,编写交易策略调试交易策略的过程其实就是理解市场的过程。这是一种非常宝贵的积累。大多数人都是通过在市场中亏钱,靠爆仓来理解市场的。成本高昂,
12、而且难以总结。使用这种方法来了解市场,往往就算你亏了很多钱,交了大把学费,你仍然不知道自己到底输在哪里。你总结不出来,你就不可能有长进,就不可能赢。而通过写交易策略来了解市场你不需要交什么学费,从历史测试报告里很容易分析出来自己到底错在哪里,如此你就很容易改进。把编好的交易策略与模拟帐户交易结合起来就可以为你带来足够逼真的实战经验。skywalker 说的非常棒!编程其实是一种思想,编程的目的是把你的思想用各种图形表现出来而已我们期货编程的目的是表现我们的交易思想是为思想而编程,不是为编程而编程!说起这点我想起了 TB 的伟大!不管你用文华还是飞狐,当你把指标公式写完后可能你自己的不是很清楚你
13、的代码所表现出来的东西到底是不是就是你的交易思想呢?因为他们的代码是工作在后台的我们在前面无法得知这些代码如何工作而 TB 完全不同你可以在任意时候知道你的代码在做什么!所以你也就非常的清楚你的代码是不是真的表现了你的意思!好了现在开始写数据类型,变量和赋值.这是些非常基本的概念,相信您一下就懂的线说数据类型吧数据类型和人的类型差不多人不是分黄种人,白种人,黑种人么?TB 里面的数据也一样分字符串类型,数值型,还有布尔型字符串类型很简单,用分号“括起来的东西就叫做字符串类型的数据, 如“I love you“,如“3345“,.数值型数据类型也同样的简单,数值大家知道吧, 如 1542 啊,1
14、.021 啊 .这些东西就是数值型的数据类型当然,如果把一个数值型的东西用分号“ 括起来了那他就不再是数值型数据了, 而是字符串类型的数据如 1688 是数值型数据,但是“1688“就是字符串类型的数据了啊还有就是布尔型,当然,没有接触过编程的朋友可能不明白布尔型的意思说白点,布尔型就是真假型,意思就是布尔类型的数据只能取真(True)或假(False)值.比如 21,这个东西就是布尔类型的数据,因为 2 是大于 1 啊,所以这个表达式返回 True(真)那么 2开盘价)则输出:今日收红阳线我们先把这个东西翻译成 TB如果翻译成 If收盘价和开盘价大家都知道会翻译成 Close 和 Open输
15、出语句就是 FileAppend,则翻译成 TB 就是:If(CloseOpen)FileAppend(“c:a.log“,“今日收红阳线 “);是不是很简单呢?大家记住一点,凡是 if(如果)语句中的代码, 都给我用 括起来我们再把上面的条件加上一点:如果(收盘价开盘价)则输出:今日收红阳线否则如果(收盘价=开盘价)则输出:今日收十字线我们再翻译成 TB,把否则翻译成 Else,如果翻译成 IfIf(CloseOpen)FileAppend(“c:a.log“,“今日收红阳线 “);Else If(Close=Open)FileAppend(“C:a.log“,“今日收十字线“);同样的简单
16、,我们可以再把上面的条件再加:如果(收盘价开盘价)则输出:今日收红阳线否则如果(收盘价=开盘价)则输出:今日收十字线否则则输出:今日收绿阴线上面的否则大家知道翻译成 Else 吧,有两种翻译方法, 因为收盘价和开盘价的比较只存在着三种情况:收盘价大于开盘价,收盘价等于开盘价, 收盘价少于开盘价,我们先这样翻译:If(CloseOpen)FileAppend(“c:a.log“,“今日收红阳线 “);Else If(Close=Open)FileAppend(“C:a.log“,“今日收十字线“);Else If(CloseOpen,也不满足 Close=Open那么肯定的一点就是:CloseOpen)FileAppend(“c:a.log“,“今日收红阳线 “);Else If(Close=Open)FileAppend(“C:a.log“,“今日收十字线“);ElseFileAppend(“c:a.log“,“今日收绿阴线 “);