




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、交易开拓者( TB )期货程序化交易编程本文仅是写给完全不懂编程的朋友的 ,仅是最基本的入门资料。TB里面代码执行1, 代码从第一根 K 线开始执行 ,一直到最后一根 K线;2, 在每一根 K 线上 ,代码都是从第一行开始执行 ,一直到最后一行 ; 我们就写个输出每日的收盘价的例子 ;打开 TB,在左边的 TB 公式里面 ,点击新建技术指标 , 然后在出来的公式编辑器里面输入BeginEnd 注意,除了参数和变量定义外 ,所有的代码都必须包含在 Begin和 End之间我们再在 Begin 和 End 之间输入一些代码 ,完整的就是 :BeginFileAppend("c:"
2、;,Text(Year)+" 年"+Text(Month)+" 月 "+Text(Day)+"日的收盘价等于 "); FileAppend("C:",Text(Close);End 我们再说说这两行代码是什么意思 File 就是文件 ,Append 就是添加 ,现在明白了吧 FileAppend 就是添加一个文件 ,文件名是什么呢就是你后面写的 ,这个文件的路径在哪里呢就是里面的 C 盘 ,且在这个文件里面添加一行东西 , 这行东西的内容就是你后面所写的Text(Year)+"年"+Text(M
3、onth)+" 月"+Text(Day)+" 日的收盘价等于 "当然 ,如果这个文件已经存在 ,他就不会添加文件了 ,仅仅在这个文件的后面添加一行上面你写的内容 好了 ,再看看 Text,Text 的意思就是把那些不是字符串的东西如数字啊,等变成字符串 .而 Year,Month,Day 就代表了正在执行你写的代码的那一根K线的年 ,月,日,年月日是数字 ,我们当然要用 Text把它搞成字符串CloseK线的收盘价啊 ,如果代码执行到最后的那根 K 线我们点公式编辑器上面的工具栏的第五个按钮(打勾的那个东西 ),校验保存公式 ,稍微等一下 ,就 OK 了
4、我们在回到 K 线图里面 ,TB 把 K线图叫做超级图表在 K 线图里面右键 ,选择商品设置 ,然后吧里面的样本数由默认的 300 改成 5, 意思是让在超级图表里面仅仅显示 5 条 K线,点确定后 ,你就看到在 K线图里面只显示了 5跟 K线,当然现在代码还不能被执行 ,因为我们现在还需要把我们刚刚所写的那个指标加到K 线图上面才能被执行的我们上面说了 ,我们这个例子仅仅是把每日的收盘价写到文件里面去啊,那么我们找一找文件在什么地方咯FileAppend("c:", 很明显 ,文件是在 c 盘的 ,文件的名字是 好了,我们到 c 盘找到文件 ,双击打开 ,我们就会看到下面
5、的内容 :2007 年 9 月 24 日的收盘价等于672802007 年 9 月 25 日的收盘价等于678002007 年 9 月 26 日的收盘价等于671602007 年 9 月 27 日的收盘价等于673002007 年 9 月 28 日的收盘价等于68020我们现在来分析下 首先你写的代码在第一根 K线上执行 ,先执行第一行代码 :FileAppend("c:",Text(Year)+" 年 "+Text(Month)+" 月 "+Text(Day)+" 日的收盘价等于 "); 这行代码就输出了第一根
6、K线的年,月,日,就在文件里输出成 "2007年 9月24日的收盘价等于 " 然后执行第二行代码 :FileAppend("C:",Text(Close); 折行代码把第一根 K 线的收盘价输出到文件里面 ,于是就输出了 "67280" 好了 ,代码在第一根 K线上执行完毕 ,于是再转到第二根 K线,再执行第一行代码 ,再执行第二行代码我一直非常愿意帮助客户们解答在编程中的难点,但是却不大愿意帮助客户写完整的公式策略。这其中有三个 原因:1、别人写的交易策略,你难以调整它。据统计, 90%以上的交易策略会在 2 年半之内由于种种原因失
7、效或者效率降低。通常的做法是一个季度左右, 交易员就需要微调其策略,调整参数或改动某些条件。如果策略不是自己编写的,调整起来就会有困难。2、别人写的交易策略,你很难彻底执行它。 系统交易最重要的好处在于它的执行能力。它可以使你的交易摆脱人性的弱点,摆脱心理因素的干扰。然而这 一切的基础,在于自信。人只会信任自己了解的东西,这是人性。如果一个交易策略是别人写的,无论它的测 试报告是多么天花乱坠,你都不会信任它,因为你不了解它。一旦市场出现了危机情况,你就会坐立不安,你 就会总怀疑是不是策略有问题,然后就又把策略扔到一边,回到凭感觉去操作的老路上去了。3、最重要的一点在于: 编程就是理解 ,编写交
8、易策略调试交易策略的过程其实就是理解市场的过程。这是一 种非常宝贵的积累。大多数人都是通过在市场中亏钱,靠爆仓来理解市场的。成本高昂,而且难以总结。使用 这种方法来了解市场,往往就算你亏了很多钱,交了大把学费,你仍然不知道自己到底输在哪里。你总结不出 来,你就不可能有长进,就不可能赢。而通过写交易策略来了解市场你不需要交什么学费,从历史测试报告里 很容易分析出来自己到底错在哪里,如此你就很容易改进。把编好的交易策略与模拟帐户交易结合起来就可以 为你带来足够逼真的实战经验。编程其实是一种思想 ,编程的目的是把你的思想用各种图形表现出来而已 我们期货编程的目的是表现我们的交易思想是为思想而编程 ,
9、不是为编程而编程 !现在开始写数据类型 ,变量和赋值 .数据类型分字符串类型 ,数值型 ,还有布尔型字符串类型很简单 ,用分号 " "括起来的东西就叫做字符串类型的数据,如"I love you", 如"3345", 数值型数据类型也同样的简单 ,数值大家知道吧 ,如 1542 啊 ,啊 这些东西就是数值型的数据类型 当然 ,如果把一个数值型的东西用分号""括起来了那他就不再是数值型数据了,而是字符串类型的数据如 1688 是数值型数据 , 但是 "1688" 就是字符串类型的数据了还有就是布尔
10、型 ,当然 ,没有接触过编程的朋友可能不明白布尔型的意思 说白点 ,布尔型就是真假型 ,意思就是布尔类型的数据只能取真 (True)或假 (False)值. 比如 2>1,这个东西就是布尔类型的数据 ,因为 2 是大于 1 啊 ,所以这个表达式返回 True(真 ) 那么 2<1,大家说这个表达式是不是个布尔类型的数据呢 也是,因为2大于1啊,所以2<1是错误的,就返回 False(假) 大家明白了吧 ,就这三个类型 ,其中最只要的就是数值型数据类型K 线的收盘价用的最多的也是数值型数据类型 如果明白了 ,那么请您就记住在 TB 里面数值型 Numeric 看下 TB的帮助
11、,数据类型里面还有个序列型 ,如果数值序列型 ,字符串序列型 ,布尔序列型 序列这个东西看起来很难理解 比如我们的 K线图上有 10 跟 K线,Close就是收盘价 但是这个 Close包含了第一根 K 线的收盘价 ,也包含了第二根 K线的收盘价 一直包含到第五根也就是说序列型的数据在每根 K 线上都有一个值的说说变量变量就是一个可以改变的东西现在这个变量的值是 100,但是等下我可以把它改成 20, 只要您喜欢 ,你可以随心所欲的改变这个值 能够修改他的值的东西就叫做变量了记住 :在 TB里面变量都是要先定义的 !而且有着他独到的定义方法 ,而且这个定义必须放到 Begin 的前面如我们定义
12、一个数值型变量 a.就应该这样VarsNumeric a;BeginEnd当然你也可以定义两个或者多个变量 ,如VarsNumeric a;Numeric b;更多变量定义BeginEnd大家也许想到了2,也可以在 Begin 下面写 .如我定义这个变量 a,我要让他等于 2,这个东西很简单 你可以在变量定义的时候就给他赋初值让他一开始被定义就等于 VarsNumeric a(2);Numeric b;更多变量定义BeginEnd明白了么 |那么变量 b 呢我们没有用括号 ()扩个东西啊 ,那么这个时候 b这个变量等于什么呢很简单 ,如果你在定义变量的时候没有给他初值,那么 b 这个时候等于
13、0再看在 Begin 里面怎么修改这个变量的值VarsNumeric a(2);Numeric b;更多变量定义Begina = 3;b = 100;End很简单的现在大家应该知道了变量是什么东西了吧对了 ,忘记告诉大家了 ,在 Begin 下面给变量复制仅仅只对当前正在执行你的代码的K线有效 ,到下一根 K 线他就是初始值了啊写个例子吧VarsNumeric a(100); 更多变量定义Begina = 3;b = 100;End现在我们说说 TB 中的流程控制流程控制就是控制代码执行的流程 还说的明白点就是如果满足什么条件就做什么事情 或者不满足什么条件的时候做什么事情 简单说流程控制就是
14、控制语句控制代码 控制语句中分为逻辑控制语句 (就是条件控制语句 )和循环控制语句条件控制语句中大家记住If 这个关键字 , 翻译成中文就是如果循环控制语句中大家记住For,就是开始循环了先说 If.假设一个这样的条件 :如果 (收盘价 >开盘价 )则输出 :今日收红阳线我们先把这个东西翻译成 TB如果翻译成 If 收盘价和开盘价大家都知道会翻译成 Close 和 Open 输出语句就是 FileAppend,则翻译成 TB就是 :If(Close>Open)FileAppend("c:"," 今日收红阳线 ");是不是很简单呢大家记住一点
15、,凡是 if( 如果 )语句中的代码 ,都给我用 括起来我们再把上面的条件加上一点 如果 (收盘价 >开盘价 )则输出 :今日收红阳线否则如果 (收盘价 =开盘价 )则输出 :今日收十字线我们再翻译成 TB,把否则翻译成 Else,如果翻译成 IfIf(Close>Open)FileAppend("c:"," 今日收红阳线 ");Else If(Close=Open)FileAppend("C:"," 今日收十字线 ");同样的简单 ,我们可以再把上面的条件再加 :如果 (收盘价 >开盘价 )则输
16、出 :今日收红阳线否则如果 (收盘价 =开盘价 )则输出 :今日收十字线否则则输出 :今日收绿阴线上面的否则大家知道翻译成 Else吧 ,有两种翻译方法 ,因为收盘价和开盘价的比较只存在着三种情况收盘价大于开盘价 ,收盘价等于开盘价 ,收盘价少于开盘价 ,我们先这样翻译 :If(Close>Open)FileAppend("c:"," 今日收红阳线 ");Else If(Close=Open)FileAppend("C:"," 今日收十字线 ");Else If(Close<Open)FileAppen
17、d("c:"," 今日收绿阴线 ");上面的这个语句是很好理解的但是大家想到了吗开盘价和收盘价的比较, 如果不满足 Close>Open,也不满足 Close=Open那么肯定的一点就是 :Close<Open,所以上面的语句可以写成 :If(Close>Open)FileAppend("c:"," 今日收红阳线 ");Else If(Close=Open)FileAppend("C:"," 今日收十字线 ");ElseFileAppend("c:
18、"," 今日收绿阴线 ");再说 For 循环语句 .先记下 For 语句的语法格式For 循环变量 = 初始值 To 结束值TradeBlazer 公式语句 ;也就是 (假如变量 i 已经定义 ,且循环 5 次 )For i = 0 To 4TradeBlazer 公式语句 ;for 语句的理解稍微复杂点 ,我们先看看 For 语句是如何执行的 :比如上面的例子首先执行 i=0,就是给变量 i 赋值让 i 等于 0,然后判断 i 是不是少于等于 4,这里 i 等于 0,所以小于 4,于是执行 里面 的 TradeBlazer 公式语句 ;执行里面的 TradeB
19、lazer公式语句后 ,TB系统会自动给变量 i 加1,这个时候 i就等于 1了(上面刚刚开始的时候 i 等于 0,加了 1 就是等于 1 了)再判断 i是不是少于等于 To后面的 4,1当然少于 4,于是再执行 里面的 TradeBlazer公式语句 ;执行完里面的 TradeBlazer公式语句后 ,Tb系统又自动给变量 i加1,上面 i已经等于 1了,加 1,于是这个时候 i等 于 2 了 ,于是再判断变量 i 的值 2 是不是少于 To 后面的 4,当然少于拉 ,于是再执行 里面的 TradeBlazer公式语句 ;以此执行 ,当 i 等于 5的时候 ,再与 To后面的 4 进行比较
20、,当然 5>4了,所以不满足条件了 ,于是不再执行 里面的 TradeBlazer 公式语句 ;而开始执行 下面的语句拉大家再研究下下面的 HHV 的写法 ,就会很明白了的 :比如一个这样的函数 请注意 ,这仅仅是个假想的函数 ,仅为了帮助理解函数是什么 :GetCloseFromTrader有点明白了吧 ,但是仔细一想 ,这个东西似乎有点问题 ,比如返回收盘价 ,交易所那么多的品种 ,且每个品种都有那么多的月份 ,他到底返回的是什么东西的收盘价啊那么我们这样写 :GetCloseFromTrader(Cu0801)现在应该完全明白了 ,这个函数就是从交易所返回某个品种的收盘价,到底是什
21、么品种什么月份的收盘价呢Cu0801 就是拉 .其实,这里面的 Cu0801 就是这个函数所需要的参数 !我们于是就可以这样理解 :函数是帮助用户完成某一件事情且返回用户所需要的数据的方法;那么参数呢参数就是参到函数里面去的数 ,也就是说必须要传递给函数的数 ;我们现在不要求一定能够自己写函数 ,但是必须要懂得的是要看懂这个函数是做什么用的,且知道如何去调用这个函数 !我们先看看下面的这个函数 ,这个函数的名字叫 :HHV,是根据轮回老大的建议改写的 ,我们必须要读懂这个函数 , 且知道怎么样去CODE:第 N 天同样如此了 ;这个时候我们就应该想到 ,如果当前 K线的索引小于你需要的周期数的
22、时候就取当前K 线的前面几个周期的最高值于是代码开始写 :minDay = Min(CurrentBar,Length-1);这个大家都很明白吧 ,如果当前 K线索引假设是 3,而你要得到的是 5个周期的最高值 ,因为暂时还没有 5个周期 , 我们我们就取这 3 个周期来获得这三个周期的最高值为什么要 -1 呢因为 K 线的索引是从 0 开始计算的 ,那么前面的 minDay 呢就是个变量 ,我们用这个变量来代表周期 于是我们再到定义变量的地方去定义这个变量 :Numeric minDay;再看代码 :CODE:for i=0 to minDayhighestValue=Max(highest
23、Value,Pricei);很明显,这是一个前面我们所说的 For循环,在 For循环里面我们必须要先定义一个变量i(可以是其他名字 ),代表从什么基数开始循环 ;于是再到定义变量的地方去定义这个 i 变量 :VarsNumeric highestValue(0);Numeric minDay;Numeric i;再看这个 For 循环 ,当 i 是 0 的时候 ,看这个时候 0 是不是小于等于最小周期 minDay,如果条件成立 , 就执行 :CODE: highestValue=Max(highestValue,Pricei);Price0代表今天的价格 ,先比较今天的价格和最高值 ,取最
24、大的那个保存 ;再把 i+1于是这个时候 i 为 1 了 ,再比较是不是小于等于最小周期minDay,如果条件成立 ,再执行 :CODE: highestValue=Max(highestValue,Pricei);这个时候 Price1就代表了昨天的价格 ,把昨天的价格和保存的最高值比较 ,取他们的最高的那个再次保存 ; 依次循环 ,我们是不是就得到了某个周期某个价格的最高值了呢最后面 ,我们用代码 :Return highestValue; 把这个得到的最高值返回给用户 ,Return 就是返回 调用这个函数的时候就更简单了 ,比如求 10 个周期的收盘价的最高值 : HHV(Close,
25、10);求 20 个周期的最高价的最高值 :HHV(High,20); 大家在看看和分析这个文章里面的函数就会完全明白了的我们现在来写一个飞狐的 DMA 函数原文出自这里 :QUOTE:请编飞狐 DMA 函数 .函数: DMA(X,N)别名: 动态移动平均参数: X为数组, N为计算周期返回: 返回数组说明: 求 X 的动态移动平均。算法: 若 Y=DMA(X,N) 则 Y=N*X+(1-N)*Y',其中 Y'表示上一周期 Y值,n 必须小于 1。示例: DMA(CLOSE(, HIGH-LOW) /CLOSE) 表示求以该周期震幅为平滑因子的平均价 很简单 ,我们可以看出 ,
26、如果要写这个用户函数 ,则我们必须要先定义两个参数 , 一个是上面的 X,代表价格 ,我们用 Price 来表示 ,一个是 N,代表动态因子 ,我们用 Length 来表示好的 ,开始吧 !我们先新建一个用户函数 ,简称写 DMA, 名称写 :求动态移动平均 ,分类选用户函数 ,然后确定 ; 出来如下东西 :ParamsNumeric Num(10);VarsBool Con1;BeginCon1 = Close > Num;Return Con1;End 我们把那些没用的东西删除 ,仅留下下面的内容 ParamsVarsBeginEnd 在定义参数的时候我们首先考虑下参数的数据类型 我
27、们先看价格参数 ,很明显我们应该把它定义为数值序列型,因为 Close,Open.啊 ,都是数值序列型的对于动态因子 ,同样简单 ,应该是数值型 ,于是,我们在 Params关键字后面写定义参数的代码 ,如下 : ParamsNumericSeries Price(100);Numeric Length;VarsBeginEnd我们首先应该明白 ,我们写函数的目的是要他帮我们做点事情并且返回个什么东西给我们,所以我们再定义一个变量 ReturnValue, 代表这个函数要返回的数据 ,到时候当这个函数执行完的时候我们就把这个东西返 回给调用者于是我们再在 Vars后面定义一个变量 Return
28、Vlaue, 数据类型是数值序列型 ,因为每根 K线上都有的 ,所以定义成序 列型 ,代码如下 :ParamsNumericSeries Price(100);Numeric Length;VarsNumericSeries ReturnValue(0);BeginEnd 现在我们开始写这个函数的工作代码看看这个函数的意思 ,今日的动态移动平均 =昨日的动态移动平均 *(1-动态因子 )+今日的价格 * 动态因子 ;然后再把 这个值 Return 返回就 Ok 了 ;于是我们在 Begin 后面写代码 :ParamsNumericSeries Price(100);Numeric Length
29、;VarsNumericSeries ReturnValue(0);BeginReturnValue = ReturnValue1*(1-Length)+Price*Length;Return ReturnValue;End好了 ,这个函数就写好了但是细心的朋友可能会发现 ,这个函数还有点小问题 ,就是如果是第一根 K 线,那么这根 K 线的昨日的动态移动平 均没有啊这样做是不是会出错啊对,非常对 ,会出错的啊 ,所以我们要先判断一下这根 K 线是不是第一根 K线,用什么来判断是不是第一根 K线呢请 看这个函数 :Integer BarStatus()当前公式应用商品当前 Bar的状态值,返回
30、值 0 表示为第一个 Bar,返回值为 1 表示为中间的普通 Bar,返回值 为 2 表示最后一个 Bar 。呵呵 ,就用 BarStatus 这个函数 ,如果他返回 0,就代表第一根 K 线啊于是我们再改写完善上面的代码为 :如果你要画红色 K线,那么就先输出 High,Low,Close,Open,很好理解吧 ,大家都知道阳线从上到下是最高 ,收盘 ,开盘, 最低 ,我们这个也一样 ,只是先输出最高最低 ,再输出收盘开盘 ;如果是要画绿色 K线,那么就按照以下顺序输出那 四个价格 :最高,最低,开盘,收盘 ,呵呵下面是画红色 K 线的代码 :PlotNumeric("High&q
31、uot;,High);PlotNumeric("Low",Low);PlotNumeric("Close",Max(Close,Open);PlotNumeric("Open",Min(Close,Open); 大家看到了上面有个 Max 和 Min 函数 ,大家可以想一想为什么咯 , 下面是画绿色 K 线的代码 :PlotNumeric("High",High);PlotNumeric("Low",Low);PlotNumeric("Open",Max(Close,Open
32、);PlotNumeric("Close",Min(Close,Open); 那么就让我先来解释下上面的为什么要用 Max 和 Min 函数吧 ,还是说明白一点好 . 如果我们要把所有 K 线画成红色 K 线,那么是要先输出 High,和 Low,再输出收盘价和开盘价 .但是如果当天Close<Open怎么办于是就用 Max了咯,当然,画绿色K线的Min原理也一样 .明白了吧那么我们先来把前面的 150 根K线全部画成红色 ,后面的 150根 K线全部画成绿色 (呵呵,我是假设超级图表中存 在 300 根 K 线啊 )在右边的 TB公式里面新建个技术指标 ,名称为 MyKLine,简称随意 ,类型随意选 ,模板空 ,确定 ,写下如下代码 : CODE:怎么办我们首先要明白为什么会出现这样的现象的原因是收盘价=开盘价的时候会出现这样的问题 .那么如何去解决这个问题呢下面实现的代码 :CODE:(这两个函数的具体意义以及他们的乘积为什么会得到这个结果请看TB 的函数帮助 )也就是说当开盘 =收盘的时候在收盘价的基础上上下浮动一个变动价位来画K 线,大家看下
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 口腔技术士考试题及答案
- 工商银行2025玉林市数据分析师笔试题及答案
- 农业银行2025通辽市秋招结构化面试经典题及参考答案
- 交通银行2025鄂尔多斯市秋招笔试价值观测评题专练及答案
- 2025年3D打印技术的工业革命
- 农业银行2025半结构化面试15问及话术广西地区
- 2025基因编辑技术的疾病治疗突破
- 建设银行2025台州市结构化面试15问及话术
- 工商银行2025遂宁市秋招无领导小组面试案例题库
- 2025软件工程新发展方向
- 安全生产重要论述课件
- 2025年房东租房合同模板电子版
- 海运订舱流程图
- 《法律职业伦理》课件-第二讲 法官职业伦理
- 大学生劳动教育概论知到智慧树章节测试课后答案2024年秋南昌大学
- 2025苏教版小学数学二年级上册教学计划
- 盆底肌筋膜筛查及手法治疗
- 景观设计客户需求洞察
- 第五讲铸牢中华民族共同体意识-2024年形势与政策
- 车用驱动电机原理与控制基础(第2版)课件:三相交流绕组及其磁场
- 加油站安全费用提取、使用台账
评论
0/150
提交评论