交易开拓者(TB)编程初级篇.doc

上传人:sk****8 文档编号:3222792 上传时间:2019-05-26 格式:DOC 页数:16 大小:108.50KB
下载 相关 举报
交易开拓者(TB)编程初级篇.doc_第1页
第1页 / 共16页
交易开拓者(TB)编程初级篇.doc_第2页
第2页 / 共16页
交易开拓者(TB)编程初级篇.doc_第3页
第3页 / 共16页
交易开拓者(TB)编程初级篇.doc_第4页
第4页 / 共16页
交易开拓者(TB)编程初级篇.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、交易开拓者(TB)期货程序化交易编程本文仅是写给完全不懂编程的朋友的,仅是最基本的入门资料。TB 里面代码执行1,代码从第一根 K 线开始执行,一直到最后一根 K 线;2,在每一根 K 线上,代码都是从第一行开始执行,一直到最后一行 ;我们就写个输出每日的收盘价的例子;打开 TB,在左边的 TB 公式里面,点击新建技术指标,然后在出来的公式编辑器里面输入BeginEnd注意,除了参数和变量定义外,所有的代码都必须包含在 Begin 和 End 之间我们再在 Begin 和 End 之间输入一些代码,完整的就是:BeginFileAppend(“c:a.log“,Text(Year)+“年“+T

2、ext(Month)+“月“+Text(Day)+“日的收盘价等于“);FileAppend(“C:a.log“,Text(Close);End我们再说说这两行代码是什么意思File 就是文件 ,Append 就是添加,现在明白了吧FileAppend 就是添加一个文件,文件名是什么呢?就是你后面写的 a.log,这个文件的路径在哪里呢?就是c:a.log 里面的 C 盘,且在这个文件里面添加一行东西 ,这行东西的内容就是你后面所写的 Text(Year)+“年“+Text(Month)+“月“+Text(Day)+“日的收盘价等于“当然,如果这个文件已经存在,他就不会添加文件了,仅仅在这个文

3、件的后面添加一行上面你写的内容好了,再看看 Text,Text 的意思就是把那些不是字符串的东西如数字啊,等变成字符串. 而 Year,Month,Day 就代表了正在执行你写的代码的那一根 K 线的年,月,日,年月日是数字 ,我们当然要用 Text 把它搞成字符串CloseK 线的收盘价啊,如果代码执行到最后的那根 K 线我们点公式编辑器上面的工具栏的第五个按钮(打勾的那个东西 ),校验保存公式, 稍微等一下,就 OK 了我们在回到 K 线图里面 ,TB 把 K 线图叫做超级图表在 K 线图里面右键 ,选择商品设置 ,然后吧里面的样本数由默认的 300 改成 5,意思是让在超级图表里面仅仅显

4、示5 条 K 线,点确定后,你就看到在 K 线图里面只显示了 5 跟 K 线,当然现在代码还不能被执行,因为我们现在还需要把我们刚刚所写的那个指标加到 K 线图上面才能被执行的我们上面说了,我们这个例子仅仅是把每日的收盘价写到文件里面去啊 ,那么我们找一找文件在什么地方咯?FileAppend(“c:a.log“,很明显 ,文件是在 c 盘的,文件的名字是 a.log好了,我们到 c 盘找到 a.log 文件,双击打开,我们就会看到下面的内容:2007 年 9 月 24 日的收盘价等于672802007 年 9 月 25 日的收盘价等于678002007 年 9 月 26 日的收盘价等于671

5、602007 年 9 月 27 日的收盘价等于673002007 年 9 月 28 日的收盘价等于68020我们现在来分析下:首先你写的代码在第一根 K 线上执行,先执行第一行代码:FileAppend(“c:a.log“,Text(Year)+“年“+Text(Month)+“月“+Text(Day)+“日的收盘价等于“);这行代码就输出了第一根 K 线的年,月,日,就在 a.log 文件里输出成 “2007 年 9 月 24 日的收盘价等于“然后执行第二行代码:FileAppend(“C:a.log“,Text(Close);折行代码把第一根 K 线的收盘价输出到 a.log 文件里面,于

6、是就输出了 “67280“好了,代码在第一根 K 线上执行完毕 ,于是再转到第二根 K 线,再执行第一行代码, 再执行第二行代码.我一直非常愿意帮助客户们解答在编程中的难点,但是却不大愿意帮助客户写完整的公式策略。这其中有三个原因:1、别人写的交易策略,你难以调整它。据统计,90% 以上的交易策略会在 2 年半之内由于种种原因失效或者效率降低。通常的做法是一个季度左右,交易员就需要微调其策略,调整参数或改动某些条件。如果策略不是自己编写的,调整起来就会有困难。2、别人写的交易策略,你很难彻底执行它。系统交易最重要的好处在于它的执行能力。它可以使你的交易摆脱人性的弱点,摆脱心理因素的干扰。然而这

7、一切的基础,在于自信。人只会信任自己了解的东西,这是人性。如果一个交易策略是别人写的,无论它的测试报告是多么天花乱坠,你都不会信任它,因为你不了解它。一旦市场出现了危机情况,你就会坐立不安,你就会总怀疑是不是策略有问题,然后就又把策略扔到一边,回到凭感觉去操作的老路上去了。3、最重要的一点在于:编程就是理解,编写交易策略调试交易策略的过程其实就是理解市场的过程。这是一种非常宝贵的积累。大多数人都是通过在市场中亏钱,靠爆仓来理解市场的。成本高昂,而且难以总结。使用这种方法来了解市场,往往就算你亏了很多钱,交了大把学费,你仍然不知道自己到底输在哪里。你总结不出来,你就不可能有长进,就不可能赢。而通

8、过写交易策略来了解市场你不需要交什么学费,从历史测试报告里很容易分析出来自己到底错在哪里,如此你就很容易改进。把编好的交易策略与模拟帐户交易结合起来就可以为你带来足够逼真的实战经验。编程其实是一种思想,编程的目的是把你的思想用各种图形表现出来而已我们期货编程的目的是表现我们的交易思想是为思想而编程,不是为编程而编程!现在开始写数据类型,变量和赋值.数据类型分字符串类型,数值型,还有布尔型字符串类型很简单,用分号“ “括起来的东西就叫做字符串类型的数据, 如“I love you“,如“3345“,.数值型数据类型也同样的简单,数值大家知道吧,如 1542 啊,1.021 啊.这些东西就是数值型

9、的数据类型当然,如果把一个数值型的东西用分号“括起来了那他就不再是数值型数据了,而是字符串类型的数据如 1688 是数值型数据,但是“1688“就是字符串类型的数据了还有就是布尔型,当然,没有接触过编程的朋友可能不明白布尔型的意思说白点,布尔型就是真假型,意思就是布尔类型的数据只能取真(True)或假(False)值.比如 21,这个东西就是布尔类型的数据,因为 2 是大于 1 啊, 所以这个表达式返回 True(真)那么 2开盘价)则输出: 今日收红阳线我们先把这个东西翻译成 TB如果翻译成 If收盘价和开盘价大家都知道会翻译成 Close 和 Open输出语句就是 FileAppend,则

10、翻译成 TB 就是:If(CloseOpen)FileAppend(“c:a.log“,“今日收红阳线“);是不是很简单呢?大家记住一点,凡是 if(如果)语句中的代码,都给我用括起来我们再把上面的条件加上一点:如果(收盘价开盘价)则输出: 今日收红阳线否则如果(收盘价 =开盘价)则输出: 今日收十字线我们再翻译成 TB,把否则翻译成 Else,如果翻译成 IfIf(CloseOpen)FileAppend(“c:a.log“,“今日收红阳线“);Else If(Close=Open)FileAppend(“C:a.log“,“今日收十字线“);同样的简单,我们可以再把上面的条件再加:如果(收

11、盘价开盘价)则输出: 今日收红阳线否则如果(收盘价 =开盘价)则输出: 今日收十字线否则则输出: 今日收绿阴线上面的否则大家知道翻译成 Else 吧,有两种翻译方法, 因为收盘价和开盘价的比较只存在着三种情况:收盘价大于开盘价,收盘价等于开盘价,收盘价少于开盘价,我们先这样翻译:If(CloseOpen)FileAppend(“c:a.log“,“今日收红阳线“);Else If(Close=Open)FileAppend(“C:a.log“,“今日收十字线“);Else If(CloseOpen,也不满足 Close=Open那么肯定的一点就是:CloseOpen)FileAppend(“c

12、:a.log“,“今日收红阳线“);Else If(Close=Open)FileAppend(“C:a.log“,“今日收十字线“);ElseFileAppend(“c:a.log“,“今日收绿阴线“);再说 For 循环语句.先记下 For 语句的语法格式:For 循环变量 = 初始值 To 结束值TradeBlazer 公式语句;也就是(假如变量 i 已经定义, 且循环 5 次)For i = 0 To 4TradeBlazer 公式语句;for 语句的理解稍微复杂点,我们先看看 For 语句是如何执行的 :比如上面的例子首先执行 i=0,就是给变量 i 赋值让 i 等于 0,然后判断

13、i 是不是少于等于 4,这里 i 等于 0,所以小于 4,于是执行里面的 TradeBlazer 公式语句 ;执行里面的 TradeBlazer 公式语句后,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 是不是少于 T

14、o 后面的 4,当然少于拉,于是再执行 里面的 TradeBlazer 公式语句;.以此执行,当 i 等于 5 的时候,再与 To 后面的 4 进行比较,当然 54 了, 所以不满足条件了,于是不再执行里面的 TradeBlazer 公式语句;而开始执行下面的语句拉大家再研究下下面的 HHV 的写法,就会很明白了的:/-/ 简称: HHV/ 名称: 求 N 周期的最高值/ 类别: 用户函数/ 类型: 用户函数/ 输出: 数值型/-ParamsNumeric Length(5); VarsNumeric highestValue(0);Numeric minDay;Numeric i;Begin

15、minDay = Min(CurrentBar,Length-1);for i=0 to minDay highestValue=Max(highestValue,ci);Commentary(“最高价“+text(highestValue);End现在说说参数与函数,说完了这个东西,就要进入实践阶段了,就要准备开始实打实的独立编写指标了首先我们必须明白,参数仅仅存在于函数里面,如果函数里面存在着参数,那么当你调用这个函数的时候必须要先传递参数给这个函数函数就是帮助我们完成某一件事情,并且完成这件事情以后会返回个东西给我们的一个方法 .比如一个这样的函数 请注意,这仅仅是个假想的函数,仅为了帮

16、助理解函数是什么:GetCloseFromTrader我们就很明白,这个函数就是帮助我们到交易所跑一趟,然后把收盘价返回给我们;有点明白了吧,但是仔细一想,这个东西似乎有点问题,比如返回收盘价, 交易所那么多的品种,且每个品种都有那么多的月份,他到底返回的是什么东西的收盘价啊?那么我们这样写:GetCloseFromTrader(Cu0801)现在应该完全明白了,这个函数就是从交易所返回某个品种的收盘价 ,到底是什么品种什么月份的收盘价呢?Cu0801 就是拉 .其实,这里面的 Cu0801 就是这个函数所需要的参数!我们于是就可以这样理解:函数是帮助用户完成某一件事情且返回用户所需要的数据的

17、方法;那么参数呢?参数就是参到函数里面去的数 ,也就是说必须要传递给函数的数 ;我们现在不要求一定能够自己写函数,但是必须要懂得的是要看懂这个函数是做什么用的 ,且知道如何去调用这个函数!我们先看看下面的这个函数,这个函数的名字叫:HHV,是根据轮回老大的建议改写的, 我们必须要读懂这个函数,且知道怎么样去CODE:/-/ 简称: HHV/ 名称: 求 N 周期的最高值/ 类别: 用户函数/ 类型: 用户函数/ 输出: 数值型/-ParamsNumericSeries Price(0);Numeric Length(5); VarsNumeric highestValue(0);Numeric

18、 minDay;Numeric i;BeginminDay = Min(CurrentBar,Length-1);for i=0 to minDayhighestValue=Max(highestValue,Pricei);Return highestValue;End我们一行一行的读,一行一行的理解;首先我们都知道,/后面的代表是注释 ,什么是注释通过注释我们可以粗略的明白这个函数是干什么的?代表了什么意思 :这个函数的名字 HHV,他的作用是求 N 周期的最高值,并且会把这个最高值返回给调用这个函数的用户通过此,我们就能够想到,这个 N 是个参数,比如 5 个周期或者 10 个周期或者其他

19、周期的最高值,再仔细一想,是什么价格的最高值啊? 是收盘价的最高值还是开盘价的最高值 ?或者是最高价的最高值呢?于是我们也就想到了这个函数的另外个参数:价格,比如 5 个周期的收盘价的最高值, 或者 10 个周期的最高价的最高值紧接着,这个函数开始定义参数了,Params 后面定义的就是参数,一个代表要得到什么价格的最高值,一个代表要得到什么周期的最高值;参数定义完了,这个函数就开始定义变量,对于函数,我们首先定义一个变量 highestValue,我们这个函数必须要把这个变量返回给用户的这个变量 highestValue 就代表了你想得到的最高值!其他的两个变量我们先不要理睬,紧接着就是 B

20、egin 了,前面我们说过,Begin 后面, 我们的代码就要开始工作我们先想一想,假设我们求 5 天的收盘价的最高值,在第一根 K 线上,我们希望得到的收盘价的最高值就是这天的收盘价;到第二根 K 线的时候我们希望得到的收盘价的最高值是这两天的收盘价中价格最高的那个,第三根就是得到这三根 K 线里面收盘价最大的那个收盘价,第四天同样如此,第五天同样如此,第六天开始就取前面 5 天的收盘价的最高价, 第七天.第 N 天同样如此了;这个时候我们就应该想到,如果当前 K 线的索引小于你需要的周期数的时候就取当前 K 线的前面几个周期的最高值于是代码开始写:minDay = Min(CurrentB

21、ar,Length-1);这个大家都很明白吧,如果当前 K 线索引假设是 3,而你要得到的是 5 个周期的最高值, 因为暂时还没有 5 个周期,我们我们就取这 3 个周期来获得这三个周期的最高值为什么要-1 呢 ?因为 K 线的索引是从 0 开始计算的,那么前面的 minDay 呢?就是个变量, 我们用这个变量来代表周期,于是我们再到定义变量的地方去定义这个变量:Numeric minDay;再看代码:CODE:for i=0 to minDayhighestValue=Max(highestValue,Pricei);很明显,这是一个前面我们所说的 For 循环, 在 For 循环里面我们必

22、须要先定义一个变量 i(可以是其他名字),代表从什么基数开始循环;于是再到定义变量的地方去定义这个 i 变量:VarsNumeric highestValue(0);Numeric minDay;Numeric i;再看这个 For 循环,当 i 是 0 的时候,看这个时候 0 是不是小于等于最小周期 minDay,如果条件成立,就执行:CODE:highestValue=Max(highestValue,Pricei);Price0代表今天的价格,先比较今天的价格和最高值,取最大的那个保存;再把 i+1于是这个时候 i 为 1 了,再比较是不是小于等于最小周期 minDay,如果条件成立,再

23、执行:CODE:highestValue=Max(highestValue,Pricei);这个时候 Price1就代表了昨天的价格,把昨天的价格和保存的最高值比较,取他们的最高的那个再次保存;依次循环,我们是不是就得到了某个周期某个价格的最高值了呢 ?最后面,我们用代码:Return highestValue;把这个得到的最高值返回给用户,Return 就是返回调用这个函数的时候就更简单了,比如求 10 个周期的收盘价的最高值:HHV(Close,10);求 20 个周期的最高价的最高值:HHV(High,20);大家在看看和分析这个文章里面的函数就会完全明白了的我们现在来写一个飞狐的 DM

24、A 函数原文出自这里: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)表示求以该周期震幅为平滑因子的平均价很简单,我们可以看出,如果要写这个用户函数,则我们必须要先定义两个参数,一个是上面的 X,代表价格,我们用 Price 来表示,一个是 N,代表动态因子, 我们用 Length 来表示好的,开始吧!我们先新建一个用户函数,简称写 DMA,名称写: 求动态移动平均, 分类选用户函数,然后确定;出来如下东西:ParamsNumeric Num(10);VarsBool Con1;BeginCon1 = Close Num;Return Con1;End我们把那些没用的东西删除,仅留下下面的内容Params

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。