如何将TB程序化交易模型导入tb交易开拓者 数据并进行测试

【交易干货】程序化交易模型的仿真运行
我的图书馆
【交易干货】程序化交易模型的仿真运行
程序化交易模型的仿真运行通过不断修正和完善,建立客观有效的程序化交易系统,实现真正的商业价值&信号闪烁所谓信号闪烁,是指模型在图表上显示的买卖信号时而出现时而消失。出现这种情况,说明模型的策略在判断买卖交易的条件中使用了未来函数。所谓未来函数,是指可能引用未来数据的函数,即引用或利用当时还没有发生的数据,对之前发出的判断进行修正的函数。具体地说,就是本周期结束后显示的指标值(包括线段和买卖提示信号),可能在发生新的数据后改变位置或者干脆消失。对于未来函数可以理解为某一变量依赖另一变量而先期变化。如变量A和变量B,B变化使得A也变化,那么A是B的函数,但如果B是稍后的变量,而A是稍早的变量,A跟着B变化,则A是B的未来函数。其中有三类函数属于未来函数:一是以之字转向为代表的ZIG类函数;二是准未来函数类;三是使用跨周期数据函数类,这是一种最为隐蔽的方法,它的危害性很大。含有未来数据指标的基本特征是买卖信号不确定,常常是某日或某时点发出了买入或卖出信号,第二天或下一个时点如果继续下跌或上涨,则该信号消失,并在以后的时点位置又显示出来。比如,一个策略定义为日K线收盘价大于均线时买入,反之卖出。由于日K线的收盘价在当天交易结束前表现为最新价,它随着行情的变动而变化,盘中的日收盘价以及由此计算出来的均线价格也会变动,当最新价离均线价格非常近时,就会出现盘中的日收盘价忽而高于均线价格,忽而低于均线价格,从而交易模型就会在图表上一会儿发出买进信号,一会儿买进信号消失出现卖出信号,反复交替,即出现信号闪烁现象。信号闪烁反复的问题会对模型设计人员造成极大的困惑,模型策略中一旦使用了未来函数而出现信号闪烁,则实盘中模型会不断地开平仓。但在用历史数据测试时,只会有一次信号出现,导致实盘交易结果和测试结果会有很大差异。很多模型在测试时表现很好,真正拿到实盘上运行就让人大跌眼镜,这就是买卖信号出现反复所引起的。要解决信号闪烁的问题可以采用两种办法:一是用不可逆的条件来作为信号判断条件。比如,模型策略规定,一根K线的最高价高于某个固定价位时,模型发出买入信号。由于一根K线的最高价只能是不断增大的,所以某一刻开始满足条件,就会一直满足这个条件,出现的信号就不会消失,也就不会出现信号闪烁现象。二是使正在变动的未来函数变成已经不再变动的完成函数。由于未来函数有时间周期,有些指标在一个短的周期内可能是未来函数,但在稍长的周期内就不是未来函数。例如,收盘价在一天收市前都是不确定的,所以对于一个日周期的指标在分时周期内具有未来函数特征,但是一旦收盘该指标就是定值,不会随明日及以后的行情而变动,所以该指标在大于一日的周期中就不是未来函数。偷价行为所谓偷价行为是指在开平仓的时候使用了当时已不存在的进出场条件。比如,程序化交易模型策略规定,如果最高价大于某个固定价位即以开盘价买入,如此虽然信号不会闪烁,但是最高价大于某个价位时,价格已经高于开盘价一定距离了,这时用开盘价买入是做不到的。但是在用历史数据进行模型测试时,图表上是有买入信号存在的。有一些偷价行为很隐蔽,还是以最高价大于某个固定价格买入策略为例,如果用此策略作为模型进场买入信号,看起来没有什么问题,但如果行情出现一开盘就跳空高于固定价格的情形,模型就不可能再以这个固定价格买到了。此时,程序化交易模型的交易策略应改为,用开盘价与固定价格之中的最大值作为买入价格,如此就能避免偷价行为的发生。信号闪烁与偷价行为对短线交易模型的影响是致命性的,投资者一定要对模型信号的真伪加以甄别。使用未来数据不用花费任何精力就可以轻松获得表面上非常高的成功率,但发出的买卖信号在实际操作中毫无价值,是一种交易欺骗行为,在实战中给投资者带来的惨痛损失和后果往往不堪设想。检验风控表现能力,优化程序化交易模型交易策略衡量程序化交易模型最重要风险指标包括最大回撤、夏普比率等。由于历史事件与未来将要发生的行情事件,在原因上和波动程度上存在差异,所以,用实盘进行检验模型在各种复杂环境下的风控表现能力,以判断模型在一些风险指标上的波动范围是否与历史测试数据有较大偏差,如果出现偏差,则寻找原因并加以修正。与此同时,要通过实盘运行发现模型交易策略中的缺陷和不足,并进行优化。比如,对不同的期货标的行情进行仿真运行,可以发现模型使用的交易策略在不同标的行情中的适用性。也许模型对农产品(如大豆)适用于日线交易,但在股指期货中却适用于分钟行情。再比如,模型中所用到的一些周期性指标(KD、RSI、MACD等),采用不同的时间参数得到的买卖信号效果是不同的。所以,寻找并调整交易策略中的最佳公式参数,也是对交易模型策略优化的一项重要工作。经过一段时间的仿真运行(短则一个月,长则半年或数年),从不断发现问题到返回模型的策略设计步骤进行修改(有时候问题如果比较严重,还可能需要推翻模型,重新设计),再测试,再运行,循环往复,直至模型功能逐步稳定后,才能真正开始投入实盘交易。但即使是投入实盘交易,模型也还是会被不断地修正和完善,以建立更客观、更有效的程序化交易系统,实现真正的商业价值。“海龟交易法则”编制的程序化交易模型下面以“海龟交易法则”编制成的程序化交易模型为例,展现整个程序化交易模型设计、测试、运行的全过程。在金融界,流传着一个著名的故事。1983年,美国期货界的两个挚友——理查德·丹尼斯与威廉·埃克哈特之间就一个问题产生了分歧:伟大的期货交易者究竟是天生的,还是可以后天培养的?他们就这个问题进行了一场辩论,并为寻找答案进行了一场试验,这就是著名的“海龟交易试验”。丹尼斯和埃克哈特在1000个报名者中甄选了13个“海龟”,并用两周时间给他们传授了交易理念和法则。在随后的四年中,海龟们凭借这些交易法则取得了年均80%的收益。二十多年后,“海龟交易法则”已经公布于众。如何将“海龟交易法则”建成一个程序化交易模型加以实际运用,以检验“海龟交易法则”是不是像传说中的那么神奇呢?第一步归纳交易策略首先是入市,入市是所有交易系统最重要的一个方面。“海龟交易法则”采用通道突破法入市,使用了两个有差异但彼此相关的入市系统:系统1——以20日突破为基础的短期系统。系统2——以55日突破为基础的长期系统。“海龟交易法则”采用波动幅度管理资金,首先要得到20日的价位移动平均真实波动幅度,定义为N。系统1入市信号:只要价格超越20日最高点或最低点一个单位,就买入或者卖出一个头寸单位。但是假如上一次突破是一次盈利性突破,那么系统1的当前入市信号将被忽略。系统2入市信号:只要价格超越55日最高或最低点一个单位即入市。如果价格超越了55日高点,就买入一个头寸单位,开始做多;如果价格跌破了55日低点,就卖出一个头寸单位。所有突破都被视为有效信号,无论上一次突破是亏损性还是盈利性的。其次是增仓。在出现突破时只建立一个单位的多头头寸,在建立头寸后以0.5N的间隔增加头寸,直到达到最大许可建仓单位数。如果市场波动很快,有可能在一天之内就增加到最大四个单位。再次是离场。系统1采用10日突破退出法则,对多头头寸来说,在价格跌破过去10日最低点时退出;对空头头寸来说,在价格超过10日最高点时退出。总之,如果价格发生了不利于头寸的10日突破,所有头寸单位都要退出。系统2则采用20日突破退出法则,对多头来说是20日向下突破;对空头来说是20日向上突破。只要价格发生了不利于头寸的20日突破,所有头寸单位都会退出。最后是止损。以头寸风险为基础设置止损,任何一笔交易都不能出现2%以上的风险,所以容许风险为2%的最大止损就是价格波动2N。同时为了保证全部头寸的风险最小,如果有加仓头寸,则每加仓一次,之前建仓头寸的止损点均向加仓点位方向移动0.5N。第二步编程建模选取交易开拓者(TB)交易平台,将整理好思路的海龟交易策略在该平台的公式编辑器中编写程序。图为海龟交易模型编程第三步程序化交易模型测试假设以股指期货作为测试标的(也可以用别的期货品种作为测试标的),将上述编好程序的模型加载到股指期货指数IF000图中,并设置好相关的测试参数(见模型测试参数设置示意图)。测试用的初始资金设置为1000万元;测试数据选取股指期货从日挂牌至模型测试日期间的全部日线数据;手续费设置为万分之零点五;滑点设置为1跳(0.2点);启动测试按钮。图为模型测试参数设置第四步程序化交易效果评估海龟交易模型对沪深300股指期货指数的交易测试结果中有几个重要的测试指标:年化收益率为39.82%,相当不错;单日最大资产回撤比率仅有3.89%;只是夏普比率偏低,仅有0.0363;总盈亏比为1.61;平均盈亏比为1.83,略显一般。说明该模型虽然是一个赚钱的模型,但还有一些值得改进之处。图为海龟交易模型对沪深300股指期货指数的交易测试结果第五步程序化交易模型仿真运行图为海龟交易策略模型在实盘运行中的买卖信号状态图为海龟交易模型盈亏曲线第六步投入实际应用在经过一段时间的实盘仿真运行且交易比较平稳后,该模型就可以投入真正的实际应用,赚取交易利润了。(来源:量投网)
发表评论:
TA的最新馆藏开拓者TB编程培训-TB编程教学-TB程序化交易编程培训教学/交易开拓者TB编程-西部汇市官方!
交易开拓者TB编程培训教学
分类:TB程序化编程教学
教学简介:
《开拓者TB编程培训视频教学》由西汇国际商务投资有限公司制做,西部汇市与其它有关合作方发布。本教程共分为4章48讲,详细的讲述了TB在期货程序化交易中所使用到的各类编程技巧。学员无需亲临现场就可以学习到完整的TB编程教学,避免了外地学员旅途中的艰辛,也为大家节省了大量不必要的开支。
&&&TB编程教学为FLASH高清课件,可自由的选择每一讲教学内容,可无限制的反复的观看教学中的内容,轻松的学会并撑握TB编程中的技巧与全自动交易模型的编写方法,从而实现编写自已的交易策略。为了让程序化交易爱好者体验TB编程的学习风格与实战,本站特免费开放前11讲教学内容供大家学习。学习中如有任何疑问可与我们联系获得帮助,教学中的详细内容与目录见下方所示:
第一章:TB程序的基本概念(第一章内容免费学习)
第二章:TB程序的功能与实现
1、制作均线及序例值& 2、IF-ELSE条件语句& 3、制作简单的交易模型&
4、计算条件成立的K线位置& 5、获取当天或某天的开盘价
6、计算条件成立的次数&& 7、统计指标背离的次数&& 8、相交函数的应用&
9、计算波段高点与低点&& 10、日内交易中的时间按制
11、将多指标统一起来&& 12、提取指标中的值&& 13、制作多指标统一的交易系统
第三章:TB程序的高级调用方法
1、跨周期公式的应用& 2、制作趋势交易系统& 3、TB交易模型信号稳定的方法&
4、采用开盘价交易的方法& 5、提取当前信号持仓
6、制作突破型交易系统& 7、控制系统的建仓次数&& 8、给模型加入成交量控制&&&
9、控制模型的交易手数&&& 10、加入仓位控制
11、让模型自动获取账户里的资金&&& 12、制作模型的资金管理功能
第四章:特殊功能的实现
1、制作指令价模型&&&&& 2、让系统按策略报价发单&&&&&
3、模型是否可以同一个K线开平仓&&&&& 4、自动寻找有利平仓位置
5、计算指定时间内的盈利次数&&& 6、计算指定时间内的亏损次数&&&
7、滑点与追价的设置&&& 8、给系统加入账号与时间的权限
9、系统的止盈方式&& 10、系统的止损方式&&&&
11、TB模型的正确测试
&&& 当前本套视频课件定价1500元/套,学员在学习过程中有任何困难均可得到神话老师的亲自在线指导!注:由于该TB编程教学视频在上传至媒体网站时被转码,所以网页上观看的免费教学视频质量远不如原版教学课件,观看高清教学请选购原版!
[最新教学内容]
[最新期货咨讯]
[最新实战结果]
相关内容:
&&期货系统交易教学
(免费视频)
& 最新期货交易模型
& 相关专题内容
联系方式:
常务电话:029-
咨询电话:
技术支持:
版权所有@ 推荐:
免责:投资有风险,本站内容仅供参考!
通讯地址:西安市矿山路东方罗马花园12F2406# 邮编:710032 陕ICP备号[tb交易开拓者]从一无所知开始学习交易开拓者(TB)期货程序化交易编程
· · · ·
您当前的位置: → [tb交易开拓者]从一无所知开始学习交易开拓者(TB)期货程序化交易编程
[tb交易开拓者]从一无所知开始学习交易开拓者(TB)期货程序化交易编程
篇一 : 从一无所知开始学习交易开拓者(TB)期货程序化交易编程从一无所知开始学习交易开拓者(TB)期货程序化交易编程经常会看到很多朋友问:帮我写个公式怎么样啊?帮我把某个公式改成TB的怎么样啊?我想出现这种情况的原因有两种:一是真的不会,毕竟做期货的会编程的不多;二是自己如果多花点时间的话是弄的出来,但是有点懒;我想无论是哪种原因,都应该好好的学习下TB,因为真正的你的交易思路只有你自己才清楚而且也只有你自己去把你的交易思路用TB表现出来你才能更清楚的知道你的交易思维中有何缺点但是编程不是一件很容易的事情,当然,如果您入门了,你会发觉TB编程其实和泡妞一样的简单,就看你敢不敢下手了所以本文仅是写给完全不懂编程的朋友的,仅是最基本的入门资料,如果您是高手,请忽略此文,以免耽误您的时间.我先不说那些专业术语,什么变量,函数和语法的,我们先不管他,以免看的头晕.我想先说说在TB中代码的执行顺序,也就是说在TB的K线图(TB把K线叫做Bar)里面你写的公式或者指标是如何得到执行的;我想这个东西是最重要而且也是最好理解的.在其他的期货软件比如文华飞狐一类,我们是无法知道你写的公式是如何执行的,甚至我们不知道我们写出来的公式是不是真的就体现出了我们的思想,因为你写的公式或者指标是被这些软件在幕后进行处理的,是黑箱操作!而TB不同,我们能够清楚的看到你写的代码在任意一根K线上是如何得到执行的!!!!好了,先说说在TB里面代码是如何得到执行的.1,代码从第一根K线开始执行,一直到最后一根K线;2,在每一根K线上,代码都是从第一行开始执行,一直到最后一行;明白了吧,是不是很简单,我们先看一个小例子,如果您还不明白,那只能说我完全没有任何能力写这文章,您就板砖吧我们就写个输出每日的收盘价的例子;打开TB,在左边的TB公式里面,点击新建技术指标,新建其他的也没有关系,然后在出来的对话框的简称里面填入名字,记住,这个名字只能是E文哦在名字里面填入你喜欢的名字,点确定就OK了啊然后在出来的公式编辑器里面输入BeginEnd注意,除了参数和变量定义外,所有的代码都必须包含在Begin和End之间意思很简单就是Begin后,你的代码就开始执行了,End了,你的代码就执行完毕拉呵呵我们再在Begin和End之间输入一些代码,完整的就是:BeginFileAppend("c:\\a.log",Text(Year)+"年"+Text(Month)+"月"+Text(Day)+"日的收盘价等于");FileAppend("C:\\a.log",Text(Close));tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程End我们再说说这两行代码是什么意思File就是文件,Append就是添加,现在明白了吧FileAppend就是添加一个文件,文件名是什么呢?就是你后面写的a.log,这个文件的路径在哪里呢?就是c:\\a.log里面的C盘,且在这个文件里面添加一行东西,这行东西的内容就是你后面所写的Text(Year)+"年"+Text(Month)+"月"+Text(Day)+"日的收盘价等于" 当然,如果这个文件已经存在,他就不会添加文件了,仅仅在这个文件的后面添加一行上面你写的内容好了,再看看Text,Text的意思就是把那些不是字符串的东西如数字啊,等变成字符串.而Year,Month,Day就代表了 正在执行你写的代码的那一根K线的年,月,日,年月日是数字,我们当然要用Text把它搞成字符串,不然Windows会告诉你你犯了错误的Close的意思我不说大家也明白了吧,就是代表了当前正在执行你的代码的那根K线的收盘价啊,呵呵,如果代码执行到最后的那根K线且行情正在走动的时候Close代表的就是现在的最新价了咯.好了我们点公式编辑器上面的工具栏的第五个按钮(打勾的那个东西),校验保存公式,稍微等一下,就OK了我们在回到K线图里面,TB把K线图叫做超级图表,呵呵,有点不习惯在K线图里面右键,选择商品设置,然后吧里面的样本数由默认的300改成5,意思是让在超级图表里面仅仅显示5条K线,当然,你可以搞成任意你喜欢的数字你甚至可以从任意一个你喜欢的时间开始显示K线,我们选择5跟K线仅仅是为了测试的方便点确定后,你就看到在K线图里面只显示了5跟K线,所以我们的代码也仅仅只在这5跟K线上执行了当然现在代码还不能被执行,因为我们现在还需要把我们刚刚所写的那个指标加到K线图上面才能被执行的我们再在超级图表里面右键,选择插入技术分析,在出来的列表里面选择我们刚刚所写的技术指标,然后确定就OKl饿晕死,现在怎么在K线图上没有任何变化啊?呵呵我们上面说了,我们这个例子仅仅是把每日的收盘价写到文件里面去啊,那么我们找一找文件在什么地方咯? FileAppend("c:\\a.log",很明显,文件是在c盘的,文件的名字是a.log好了,我们到c盘找到a.log文件,双击打开,我们就会看到下面的内容:日的收盘价等于67280日的收盘价等于67800日的收盘价等于67160日的收盘价等于67300日的收盘价等于68020我们现在来分析下:首先你写的代码在第一根K线上执行,先执行第一行代码:tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程FileAppend("c:\\a.log",Text(Year)+"年"+Text(Month)+"月"+Text(Day)+"日的收盘价等于");这行代码就输出了第一根K线的年,月,日,就在a.log文件里输出成"日的收盘价等于" 然后执行第二行代码:FileAppend("C:\\a.log",Text(Close));折行代码把第一根K线的收盘价输出到a.log文件里面,于是就输出了"67280"好了,代码在第一根K线上执行完毕,于是再转到第二根K线,再执行第一行代码,再执行第二行代码.........好了,现在代码在第二根,第三根,第四根K线上执行完毕,于是转到第五根也就是最后一根K线上执行第一行代码 再执行第二行代码到此为止,所有的代码在所有的K线上执行完毕了,圆满的完成了党和祖国赋予他的神圣使命,于是也就有了我们上面所看到的结果:日的收盘价等于67280日的收盘价等于67800日的收盘价等于67160日的收盘价等于67300日的收盘价等于68020OK,下回继续我一直非常愿意帮助客户们解答在编程中的难点,但是却不大愿意帮助客户写完整的公式策略。(]这其中有三个原因:1、别人写的交易策略,你难以调整它。据统计,90%以上的交易策略会在2年半之内由于种种原因失效或者效率降低。通常的做法是一个季度左右,交易员就需要微调其策略,调整参数或改动某些条件。如果策略不是自己编写的,调整起来就会有困难。2、别人写的交易策略,你很难彻底执行它。系统交易最重要的好处在于它的执行能力。它可以使你的交易摆脱人性的弱点,摆脱心理因素的干扰。然而这一切的基础,在于自信。人只会信任自己了解的东西,这是人性。如果一个交易策略是别人写的,无论它的测试报告是多么天花乱坠,你都不会信任它,因为你不了解它。一旦市场出现了危机情况,你就会坐立不安,你就会总怀疑是不是策略有问题,然后就又把策略扔到一边,回到凭感觉去操作的老路上去了。3、最重要的一点在于:编程就是理解,编写交易策略调试交易策略的过程其实就是理解市场的过程。这是一种非常宝贵的积累。大多数人都是通过在市场中亏钱,靠爆仓来理解市场的。成本高昂,而且难以总结。使用这种方法来了解市场,往往就算你亏了很多钱,交了大把学费,你仍然不知道自己到底输在哪里。你总结不出来,你就不可能有长进,就不可能赢。而通过写交易策略来了解市场你不需要交什么学费,从历史测试报告里很容易分析出来自己到底错在哪里,如此你就很容易改进。把编好的交易策略与模拟帐户交易结合起来就可以为你带来足够逼真的实战经验。skywalker 说的非常棒!编程其实是一种思想,编程的目的是把你的思想用各种图形表现出来而已tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程我们期货编程的目的是表现我们的交易思想是为思想而编程,不是为编程而编程!说起这点我想起了TB的伟大!不管你用文华还是飞狐,当你把指标公式写完后可能你自己的不是很清楚你的代码所表现出来的东西到底是不是就是你的交易思想呢?因为他们的代码是工作在后台的我们在前面无法得知这些代码如何工作而TB完全不同你可以在任意时候知道你的代码在做什么!所以你也就非常的清楚你的代码是不是真的表现了你的意思!好了现在开始写数据类型,变量和赋值.这是些非常基本的概念,相信您一下就懂的线说数据类型吧数据类型和人的类型差不多人不是分黄种人,白种人,黑种人么?TB里面的数据也一样分字符串类型,数值型,还有布尔型字符串类型很简单,用分号""括起来的东西就叫做字符串类型的数据,如"I love you",如"3345",.....数值型数据类型也同样的简单,数值大家知道吧,如1542啊,1.021啊....这些东西就是数值型的数据类型 当然,如果把一个数值型的东西用分号""括起来了那他就不再是数值型数据了,而是字符串类型的数据 如1688是数值型数据,但是"1688"就是字符串类型的数据了啊还有就是布尔型,当然,没有接触过编程的朋友可能不明白布尔型的意思说白点,布尔型就是真假型,意思就是布尔类型的数据只能取真(True)或假(False)值.比如2&1,这个东西就是布尔类型的数据,因为2是大于1啊,所以这个表达式返回True(真)那么2&1,大家说这个表达式是不是个布尔类型的数据呢?呵呵,也是的,因为2大于1啊,所以2&1是错误的,就返回False(假)咯大家明白了吧,就这三个类型,其中最只要的就是数值型数据类型哦用的最多的也是数值型数据类型如果明白了,那么请您就记住在TB里面数值型的E文是Numeric吧晕死,看下TB的帮助,数据类型里面还有个序列型,如果数值序列型,字符串序列型,布尔序列型序列这个东西看起来很难理解想个办法来理解他吧比如我们的K线图上有10跟K线,Close大家知道吧,就是收盘价但是这个Close包含了第一根K线的收盘价,也包含了第二根K线的收盘价.......一直包含到第五根K线的收盘价也就是说序列型的数据在没根K线上都有一个值的OK了吧?如果不OK也没有关系,慢慢的就懂了tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程再说说变量顾名思义,变量就是一个可以改变的东西现在这个变量的值是100,但是等下我可以把它改成20,只要您喜欢,你可以随心所欲的改变这个值 呵呵,能够修改他的值的东西就叫做变量了记住:在TB里面变量都是要先定义的!而且有着他独到的定义方法,而且这个定义必须放到Begin的前面 如我们定义一个数值型变量a.就应该这样VarsNBegin......End当然你也可以定义两个或者多个变量,如VarsNN//.........更多变量定义Begin......End大家也许想到了我定义这个变量a,我要让他等于2,这个东西很简单你可以在变量定义的时候就给他赋初值让他一开始被定义就等于2,也可以在Begin下面写.如 VarsNumeric a(2);N//.........更多变量定义Begin......End明白了么?那么变量b呢?我们没有用括号()扩个东西啊,那么这个时候b这个变量等于什么呢? 很简单,如果你在定义变量的时候没有给他初值,那么b这个时候等于0咯好了再看在Begin里面怎么修改这个变量的值VarsNumeric a(2);N//.........更多变量定义Begina = 3;b = 100;Endtb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程很简单的现在大家应该知道了变量是什么东西了吧对了,忘记告诉大家了,在Begin下面给变量复制仅仅只对当前正在执行你的代码的K线有效咯,到下一根K线他就是初始值了啊写个例子吧VarsNumeric a(100);//定义一个变量,类型是数值类型,变量名字是a,变量的初始值是100Beginif(CurrentBar == 0)//如果是第一根K线,就把变量a的值变为1{a = 1;}FileAppend("C:\\a.Log",Text(a));End我们再来看看输出结果:1100100100100我们再来理解下这个结果(当然这个时候我们的K线图上面只有5跟K线啊,其实随便多少跟K线都一样)首先代码在第一根K线上面执行,先执行if(CurrentBar == 0)这个东西,CurrentBar代表正在被执行的K线的索引因为代码现在在第一根K线上执行,所以索引就是0拉,于是这个表达式就成立了啊,既然if(CurrentBar == 0)这个表达式成立,那么他就会执行{}里面的东西a = 1;把1赋给变量a,也就是说吧变量a的内容改成1,然后执行FileAppend("C:\\a.Log",Text(a));这个时候变量a的值是1,所以当然输出1了啊代码执行完毕然后转到第二根K线,既然是第二根K线,那么这根K线的索引就是1了啊,1肯定不等于0啊那么表达式if(CurrentBar == 0)就不成立了啊,既然不成立那么他也就不会执行{}里面的东西 a = 1; 于是就直接执行FileAppend("C:\\a.Log",Text(a));那么这个时候a的值是多少呢?很明显是100,就是他的初始值,而不是上一根K线执行代码的时候改变了的a的值!这点千万注意啊 我相信好多朋友会在这里犯下错误的咯再说给变量赋值其实我们上面已经说了,记住=和==的区别吧=就是把=右边的东西赋给=左边的东西如a = 100;就是把=右边的100赋给左边的变量a如b = 9;tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程就是把9赋给变量b我们在日常中一直把=当成等于,千万急着在TB里面=就是赋值!!!真正的等于的符号是==if(a==b)//就是如果a等于b{//做某件事情}好了快11点了睡觉了下次见看了,学了,收获不少,不断消化ING。[)。。 谢谢斑竹!但是编程不是一件很容易的事情,当然,如果您入门了,你会发觉TB编程其实和泡妞一样的简单,就看你敢不敢下手了如1688是数值型数据,但是"1688"就是字符串类型的数据了啊说白点,布尔型就是真假型,意思就是布尔类型的数据只能取真(True)或假(False)值.序列这个东西看起来很难理解想个办法来理解他吧比如我们的K线图上有10跟K线,Close大家知道吧,就是收盘价但是这个Close包含了第一根K线的收盘价,也包含了第二根K线的收盘价.......一直包含到第五根K线的收盘价也就是说序列型的数据在没根K线上都有一个值的在TB里面变量都是要先定义的!而且有着他独到的定义方法,而且这个定义必须放到Begin的前面那么变量b呢?我们没有用括号()扩个东西啊,那么这个时候b这个变量等于什么呢?很简单,如果你在定义变量的时候没有给他初值,那么b这个时候等于0咯好了再看在Begin里面怎么修改这个变量的值VarsNumeric a(2);N//.........更多变量定义Begina = 3;b = 100;tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程End现在大家应该知道了变量是什么东西了吧对了,忘记告诉大家了,在Begin下面给变量复制仅仅只对当前正在执行你的代码的K线有效咯,到下一根K线他就是初始值了啊写个例子吧VarsNumeric a(100);//定义一个变量,类型是数值类型,变量名字是a,变量的初始值是100Beginif(CurrentBar == 0)//如果是第一根K线,就把变量a的值变为1{a = 1;}FileAppend("C:\\a.Log",Text(a));End我们再来看看输出结果:1100100100100我们再来理解下这个结果(当然这个时候我们的K线图上面只有5跟K线啊,其实随便多少跟K线都一样)首先代码在第一根K线上面执行,先执行if(CurrentBar == 0)这个东西,CurrentBar代表正在被执行的K线的索引因为代码现在在第一根K线上执行,所以索引就是0拉,于是这个表达式就成立了啊,既然if(CurrentBar == 0)这个表达式成立,那么他就会执行{}里面的东西a = 1;把1赋给变量a,也就是说吧变量a的内容改成1,然后执行FileAppend("C:\\a.Log",Text(a));这个时候变量a的值是1,所以当然输出1了啊代码执行完毕然后转到第二根K线,既然是第二根K线,那么这根K线的索引就是1了啊,1肯定不等于0啊那么表达式if(CurrentBar == 0)就不成立了啊,既然不成立那么他也就不会执行{}里面的东西 a = 1; 于是就直接执行FileAppend("C:\\a.Log",Text(a));那么这个时候a的值是多少呢?很明显是100,就是他的初始值,而不是上一根K线执行代码的时候改变了的a的值!这点千万注意啊 我相信好多朋友会在这里犯下错误的咯再说给变量赋值其实我们上面已经说了,记住=和==的区别吧=就是把=右边的东西赋给=左边的东西tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程如a = 100;就是把=右边的100赋给左边的变量a如b = 9;就是把9赋给变量b我们在日常中一直把=当成等于,千万急着在TB里面=就是赋值!!! 真正的等于的符号是==if(a==b)//就是如果a等于b{//做某件事情}现在我们说说TB中的流程控制流程控制就是控制代码执行的流程还说的明白点就是如果满足什么阳的条件就做什么事情 或者不满足什么条件的时候做什么事情简单说流程控制就是控制语句控制代码控制语句中分为逻辑控制语句(就是条件控制语句)和循环控制语句 条件控制语句中大家记住If这个关键字,翻译成中文就是如果 循环控制语句中大家记住For,就是开始循环了先说If.假设一个这样的条件:如果(收盘价&开盘价)则输出:今日收红阳线我们先把这个东西翻译成TB如果翻译成If收盘价和开盘价大家都知道会翻译成Close和Open输出语句就是FileAppend,则翻译成TB就是:If(Close&Open){FileAppend("c:\\a.log","今日收红阳线");}是不是很简单呢?大家记住一点,凡是if(如果)语句中的代码,都给我用{}括起来 我们再把上面的条件加上一点:如果(收盘价&开盘价)则输出:今日收红阳线否则如果(收盘价==开盘价)则输出:今日收十字线我们再翻译成TB,把否则翻译成Else,如果翻译成IfIf(Close&Open){FileAppend("c:\\a.log","今日收红阳线");}tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程Else If(Close==Open){FileAppend("C:\\a.log","今日收十字线");}同样的简单,我们可以再把上面的条件再加:如果(收盘价&开盘价)则输出:今日收红阳线否则如果(收盘价==开盘价)则输出:今日收十字线否则则输出:今日收绿阴线上面的否则大家知道翻译成Else吧,有两种翻译方法,因为收盘价和开盘价的比较只存在着三种情况: 收盘价大于开盘价,收盘价等于开盘价,收盘价少于开盘价,我们先这样翻译:If(Close&Open){FileAppend("c:\\a.log","今日收红阳线");}Else If(Close==Open){FileAppend("C:\\a.log","今日收十字线");}Else If(Close&Open){FileAppend("c:\\a.log","今日收绿阴线");}上面的这个语句是很好理解的但是大家想到了吗?开盘价和收盘价的比较,如果不满足Close&Open,也不满足Close==Open 那么肯定的一点就是:Close&Open,所以上面的语句可以写成:If(Close&Open){FileAppend("c:\\a.log","今日收红阳线");}Else If(Close==Open){FileAppend("C:\\a.log","今日收十字线");}Else{FileAppend("c:\\a.log","今日收绿阴线");}再说For循环语句.tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程先记下For语句的语法格式:For 循环变量 = 初始值 To 结束值{TradeBlazer公式语句;}也就是(假如变量i已经定义,且循环5次)For i = 0 To 4{TradeBlazer公式语句;}for语句的理解稍微复杂点,但是大家不要怕,同样的很简单的,我们先看看For语句是如何执行的:比如上面的例子首先执行i=0,就是给变量i赋值让i等于0,然后判断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是不是少于To后面的4,当然少于拉,于是再执行{}里面的TradeBlazer公式语句; ....以此执行,当i等于5的时候,再与To后面的4进行比较,当然5&4了,所以不满足条件了,于是不再执行{}里面的TradeBlazer公式语句;而开始执行{}下面的语句拉明白了么?应该很清楚了大家再研究下下面的HHV的写法,就会很明白了的://------------------------------------------------------------------------// 简称: HHV// 名称: 求N周期的最高值// 类别: 用户函数// 类型: 用户函数// 输出: 数值型//------------------------------------------------------------------------ParamsNumericSeries Price(0);Numeric Length(5);VarsNumeric highestValue(0);Numeric minDNtb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程BeginminDay = Min(CurrentBar,Length-1);for i=0 to minDay{highestValue=Max(highestValue,Price);}Return highestVEnd//------------------------------------------------------------------------// 编译版本 GS// 用户版本
08:29// 版权所有 pwqzc// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TrabeBlazer公式修改和重写的权利//------------------------------------------------------------------------现在说说参数与函数,说完了这个东西,就要进入实践阶段了咯,就要准备开始实打实的独立编写指标了首先我们必须明白,参数仅仅存在于函数里面,如果函数里面存在着参数,那么当你调用这个函数的时候必须要先传递参数给这个函数看起来似乎有点深奥和晦涩,那么我们先来明白函数是什么就很容易明了函数就是帮助我们完成某一件事情,并且完成这件事情以后会返回个东西给我们的一个方法. 比如一个这样的函数GetCloseFromTrader我们就很明白,这个函数就是帮助我们到交易所跑一趟,然后把收盘价返回给我们;有点明白了吧,但是仔细一想,这个东西似乎有点问题,比如返回收盘价,晕死,交易所那么多的品种,且每个品种都有那么多的月份,他到底返回的是什么东西的收盘价啊?呵呵,那么我们这样写:GetCloseFromTrader(Cu0801)现在应该完全明白了,这个函数就是从交易所返回某个品种的收盘价,到底是什么品种什么月份的收盘价呢? Cu0801就是拉.其实,这里面的Cu0801就是这个函数所需要的参数!我们于是就可以这样理解:函数是帮助用户完成某一件事情且返回用户所需要的数据的方法;那么参数呢?参数就是参到函数里面去的数,也就是说必须要传递给函数的数;我们现在不要求一定能够自己写函数,但是必须要懂得的是要看懂这个函数是做什么用的,且知道如何去调用这个函数!我们先看看下面的这个函数,这个函数的名字叫:HHV,是根据轮回老大的建议改写的,我们必须要读懂这个函数,且知道怎么样去调用这个函数,如果真懂了,这课就圆满的完成了! [Copy to clipboard] [ - ]CODE: 请注意,这仅仅是个假想的函数,仅为了帮助理解函数是什么):tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程//------------------------------------------------------------------------// 简称: HHV// 名称: 求N周期的最高值// 类别: 用户函数// 类型: 用户函数// 输出: 数值型//------------------------------------------------------------------------ParamsNumericSeries Price(0);Numeric Length(5);VarsNumeric highestValue(0);Numeric minDNBeginminDay = Min(CurrentBar,Length-1);for i=0 to minDay{highestValue=Max(highestValue,Price[i]);}Return highestVEnd//------------------------------------------------------------------------// 编译版本 GS// 用户版本
08:29// 版权所有 pwqzc// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TrabeBlazer公式修改和重写的权利//------------------------------------------------------------------------我们一行一行的读,一行一行的理解;首先我们都知道,//后面的代表是注释,什么是注释?我狂晕!通过注释我们可以粗略的明白这个函数是干什么的?代表了什么意思:这个函数的名字HHV,他的作用是求N周期的最高值,并且会把这个最高值返回给调用这个函数的用户 通过此,我们就能够想到,这个N是个参数,比如5个周期或者10个周期或者其他周期的最高值,再仔细一想,是什么价格的最高值啊?是收盘价的最高值还是开盘价的最高值?或者是最高价的最高值呢?于是我们也就想到了这个函数的另外个参数:价格,比如5个周期的收盘价的最高值,或者10个周期的最高价的最高值紧接着,这个函数开始定义参数了,Params后面定义的就是参数,一个代表要得到什么价格的最高值,一个代表要得到什么周期的最高值;tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程参数定义完了,这个函数就开始定义变量,对于函数,我们首先定义一个变量highestValue,我们这个函数必须要把这个变量返回给用户的这个变量highestValue就代表了你想得到的最高值!其他的两个变量我们先不要理睬,紧接着就是Begin了,前面我们说过,Begin后面,我们的代码就要开始工作拉我们先想一想,假设我们求5天的收盘价的最高值,在第一根K线上,我们希望得到的收盘价的最高值就是这天的收盘价;到第二根K线的时候我们希望得到的收盘价的最高值是这两天的收盘价中价格最高的那个,第三根就是得到这三根K线里面收盘价最大的那个收盘价,第四天同样如此,第五天同样如此,第六天开始就取前面5天的收盘价的最高价,第七天......第N天同样如此了; 这个时候我们就应该想到,如果当前K线的索引小于你需要的周期数的时候就取当前K线的前面几个周期的最高值于是代码开始写:minDay = Min(CurrentBar,Length-1);这个大家都很明白吧,如果当前K线索引假设是3,而你要得到的是5个周期的最高值,因为暂时还没有5个周期,我们我们就取这3个周期来获得这三个周期的最高值为什么要-1呢?因为K线的索引是从0开始计算的,那么前面的minDay呢?就是个变量,我们用这个变量来代表周期,于是我们再到定义变量的地方去定义这个变量:Numeric minD再看代码: [Copy to clipboard] [ - ]CODE:for i=0 to minDay{highestValue=Max(highestValue,Price[i]);}很明显,这是一个前面我们所说的For循环,在For循环里面我们必须要先定义一个变量i(可以是其他名字),代表从什么基数开始循环;于是再到定义变量的地方去定义这个i变量:VarsNumeric highestValue(0);Numeric minDN再看这个For循环,当i是0的时候,看这个时候0是不是小于等于最小周期minDay,如果条件成立,就执行:[Copy to clipboard] [ - ]CODE:highestValue=Max(highestValue,Price[i]);Price[0]代表今天的价格,先比较今天的价格和最高值,取最大的那个保存;再把i+1于是这个时候i为1了,再比较是不是小于等于最小周期minDay,如果条件成立,再执行:tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程[Copy to clipboard] [ - ]CODE:highestValue=Max(highestValue,Price[i]);这个时候Price[1]就代表了昨天的价格,把昨天的价格和保存的最高值比较,取他们的最高的那个再次保存; 依次循环,我们是不是就得到了某个周期某个价格的最高值了呢?呵呵最后面,我们用代码:Return highestV把这个得到的最高值返回给用户,Return就是返回拉.明白了吗?调用这个函数的时候就更简单了,比如求10个周期的收盘价的最高值:HHV(Close,10);求20个周期的最高价的最高值:HHV(High,20);呵呵大家在看看和分析这个文章里面的函数就会完全明白了的
-520-1-1.html我们现在来写一个飞狐的DMA函数原文出自这里: QUOTE:请编飞狐DMA函数.函数: DMA(X,N)别名: 动态移动平均参数: X为数组,N为计算周期返回: 返回数组说明: 求X的动态移动平均。[]算法: 若Y=DMA(X,N) 则 Y=N*X+(1-N)*Y',其中Y'表示上一周期Y值,A必须小于1。示例: DMA(CLOSE,(HIGH-LOW)/CLOSE)表示求以该周期震幅为平滑因子的平均价他上面的描述有点错误,应该是N必须小于1;且N不是计算周期,我们还是看看文华的关于DMA的描述吧,这样清楚点:[attach]396[/attach]很简单,我们可以看出,如果要写这个用户函数,则我们必须要先定义两个参数,一个是上面的X,代表价格,我们用Price来表示,一个是N,代表动态因子,我们用Length来表示当然,您可以用任意你喜欢的名字来表示;tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程好的,开始吧!我们先新建一个用户函数,简称写DMA,名称写:求动态移动平均,分类选用户函数,模板任意(我选bool),然后确定; 出来如下东西:ParamsNumeric Num(10);VarsBool Con1;BeginCon1 = Close & NReturn Con1;End我们把那些没用的东西删除,仅留下下面的内容ParamsVarsBeginEnd在定义参数的时候我们首先考虑下参数的数据类型我们先看价格参数,很明显我们应该把它定义为数值序列型,因为Close啊,Open...啊,都是数值序列型的 对于动态因子,同样简单,应该是数值型,于是,我们在Params关键字后面写定义参数的代码,如下:ParamsNumericSeries Price(100);Numeric Length(0.5);VarsBeginEnd我们首先应该明白,我们写函数的目的是要他帮我们做点事情并且返回个什么东西给我们,所以我们再定义一个变量ReturnValue,代表这个函数要返回的数据,到时候当这个函数执行完的时候我们就把这个东西返回给调用者于是我们再在Vars后面定义一个变量ReturnVlaue,数据类型是数值序列型,因为每根K线上都有的,所以定义成序列型,代码如下:ParamsNumericSeries Price(100);Numeric Length(0.5);VarsNumericSeries ReturnValue(0);BeginEnd好拉,现在我们开始写这个函数的工作代码了;tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程看看这个函数的意思,我们就很明白,今日的动态移动平均=昨日的动态移动平均*(1-动态因子)+今日的价格*动态因子;然后再把这个值Return返回就Ok了;于是我们在Begin后面写代码:ParamsNumericSeries Price(100);Numeric Length(0.5);VarsNumericSeries ReturnValue(0);BeginReturnValue = ReturnValue[1]*(1-Length)+Price*LReturn ReturnVEnd好了,这个函数就写好了啊,是不是very very 简单啊?呵呵但是细心的朋友可能会发现,这个函数还有点小问题,就是如果是第一根K线,那么这根K线的昨日的动态移动平均没有啊?这样做是不是会出错啊?对,非常对,会出错的啊,所以我们要先判断一下这根K线是不是第一根K线,用什么来判断是不是第一根K线呢?请看这个函数:Integer BarStatus()当前公式应用商品当前Bar的状态值,返回值0表示为第一个Bar,返回值为1表示为中间的普通Bar,返回值为2表示最后一个Bar。[]呵呵,就用BarStatus这个函数,如果他返回0,就代表第一根K线啊于是我们再改写完善上面的代码为://------------------------------------------------------------------------// 简称: DMA// 名称: 求动态移动平均// 类别: 用户函数// 类型: 用户函数// 输出: 数值型//------------------------------------------------------------------------ParamsNumericSeries Price(100);Numeric Length(0.5);VarsNumericSeries ReturnValue(0);BeginIf(BarStatus==0){ReturnValue = P//如果是第一根K线就直接把Price赋值}Elsetb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程{ReturnValue = ReturnValue[1]*(1-Length)+Price*L}Return ReturnVEnd//------------------------------------------------------------------------// 编译版本 GS// 用户版本
11:57// 版权所有 pwqzc// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TrabeBlazer公式修改和重写的权利//------------------------------------------------------------------------在编译这个用户函数的时候我碰到了一个小麻烦,大家都知道,我在上面新建这个函数的时候模板选择的是布尔型所以我编译的时候老是提示:C0122 Return语句的返回值类型与公式定义的返回值类型不符非常郁闷,后面我在公式编辑器里面的文件----属性设置-----返回类型里面改成数值型确定后,再编译通过, 不知道这是不是TB的一个小Bug,难道模板决定一切?这是个很郁闷的问题啊写这么久了,下次我们就整一个交易模型出来啊这段时间,寒舍装修了一下,还有这段时间朋友的电脑出问题特别多,加之其他一些莫名其妙的问题,让本文更新的速度极慢,连自己都感觉到很过意不去了,让我严肃的对大家说一声,用洋玩意儿来说一声:Sorry这篇文章我将写一个简单的交易模型,说起交易模型,大家都会想到在K线上的那些信号箭头,但是对于TB,我似乎不喜欢这样做.基于以下两点:一是如果把K线比喻成多姿多彩的美女,那么这个信号箭头应该是这个美女头上的一朵花,但是TB的那些箭头我怎么看都不舒服,就好比妓女的叫床:哦啊快点,啊哦快点,让人兴奋但又无可奈何,恶心极了;二是TB支持全自动下单,我对TB的这个方面还没有任何研究,且暂时现在也没有进行全自动交易的打算,没有调查就没有发言权啊,呵呵俺不是学文学的,俺现在能够找到的唯一能够证明俺有那么一把刷子的东西就仅存一个初中毕业证了,不好,俺要回家看看才好,不会被俺小崽拿去折四角板玩吧?如果真是那样,我可要狠狠的批评且严肃的警告他:现在你把老子的毕业证折四角板玩,等你小学毕业了,老子要把你的毕业证拿来卷烟抽!言归正题,我比较喜欢而且非常喜欢把交易模型做成变色的K线,红色代表买,绿色代表卖,非常的简单明了,但是一看就又很能明白是什么意思,K线本来就是一位大大的美女,如果把红色的K线练成一块,把绿色的K线练成一块,那是多少爽的一件事情啊!!!tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程于是我们就要先学会画K线,在文华中画K线是STICKLINE,在TB中很简单,就用PlotNumeric吧.如果你要画红色K线,那么就先输出High,Low,Close,Open,很好理解吧,大家都知道阳线从上到下是最高,收盘,开盘,最低,我们这个也一样,只是先输出最高最低,再输出收盘开盘;如果是要画绿色K线,那么就按照以下顺序输出那四个价格:最高,最低,开盘,收盘,呵呵下面是画红色K线的代码:PlotNumeric("High",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));PlotNumeric("Close",Min(Close,Open));终于看到有朋友UP了,是多么的感动啊!那么就让我先来解释下上面的为什么要用Max和Min函数吧,还是说明白一点好.如果我们要把所有K线画成红色K线,那么是要先输出High,和Low,再输出收盘价和开盘价.但是如果当天Close&Open怎么办?于是就用Max了咯,当然,画绿色K线的Min原理也一样.明白了吧那么我们先来把前面的150根K线全部画成红色,后面的150根K线全部画成绿色(呵呵,我是假设超级图表中存在300根K线啊)在右边的TB公式里面新建个技术指标,名称为MyKLine,简称随意,俺写成哈哈,类型随意选,模板空,确定,写下如下代码: [Copy to clipboard] [ - ]CODE://------------------------------------------------------------------------// 简称: MyKLine// 名称: 哈哈// 类别: 技术指标// 类型: 其它类// 输出://------------------------------------------------------------------------Beginif(CurrentBar&150){//如果是第151根K线画绿色PlotNumeric("High",High);PlotNumeric("Low",Low);PlotNumeric("Open",Max(Close,Open));PlotNumeric("Close",Min(Close,Open));tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程}Else{//如果是151根K线以前的Kurtosis线画红色PlotNumeric("High",High);PlotNumeric("Low",Low);PlotNumeric("Close",Max(Close,Open));PlotNumeric("Open",Min(Close,Open));}End//------------------------------------------------------------------------// 编译版本 GS// 用户版本
13:51// 版权所有 pwqzc// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TrabeBlazer公式修改和重写的权利//------------------------------------------------------------------------然后在文件---属性设置----默认-----默认显示改成主图显示,点编译按钮完成编译,然后再在超级图表里面调用这个技术指标,娃哈哈,效果出来了咯!!很爽对不?呵呵,但是如果你是个完美主义者,肯定你会发觉这中间稍有缺陷?在哪里?就是当K线是十字星的时候K线会是白色的拉.怎么办?我们首先要明白为什么会出现这样的现象的原因是收盘价=开盘价的时候会出现这样的问题.那么如何去解决这个问题呢?有两种方法:第一种是强烈要求TB修改系统的底层去实现,怕怕.还有就是自己向办法实现,nopain老大提供了个思路,very very good!真的是长江后浪推前浪,前浪死在沙滩上啊,俺们老了,还是nopain这样的年轻人脑子反应快咯~~~下面是按照nopain老大的思路实现的代码:[Copy to clipboard] [ - ]CODE://------------------------------------------------------------------------// 简称: MyKLine// 名称: 哈哈// 类别: 技术指标// 类型: 其它类// 输出://------------------------------------------------------------------------VarsNumeric OpenIsC//当开盘等于收盘价的时候Beginif(CurrentBar&150){tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程//如果是第151根K线画绿色PlotNumeric("High",High);PlotNumeric("Low",Low);if(Open==Close){//如果收盘价等于开盘价OpenIsClose = Close-PriceScale*MinMPlotNumeric("Open",Open);PlotNumeric("Close",OpenIsClose);}Else{PlotNumeric("Open",Max(Close,Open));PlotNumeric("Close",Min(Close,Open));}}Else{//如果是151根K线以前的Kurtosis线画红色PlotNumeric("High",High);PlotNumeric("Low",Low);if(Open==Close){OpenIsClose = Close+PriceScale*MinMPlotNumeric("Close",OpenIsClose);PlotNumeric("Open",Open);}Else{PlotNumeric("Close",Max(Close,Open));PlotNumeric("Open",Min(Close,Open));}}End//------------------------------------------------------------------------ // 编译版本 GS// 用户版本
13:51// 版权所有 pwqzc// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TrabeBlazer公式修改和重写的权利 //------------------------------------------------------------------------上面有两个函数PriceScale和MinMove,他们相乘的结果得到当前品种的最小变动价位,比如铜是10,胶是tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程5......(这两个函数的具体意义以及他们的乘积为什么会得到这个结果请看TB的函数帮助)也就是说当开盘==收盘的时候在收盘价的基础上上下浮动一个变动价位来画K线,呵呵大家看下效果,是不是很完美的解决了这个问题呢?本想晚上继续,但是晚上约了个客户,完后又上同事家弄电脑,我完全被郁闷死了,那个讨嫌的没有半点良心的雨过天晴电脑保护系统可把我害死了!记得我买那个硬盘的时候硬盘厂家送了个雨过天晴保护系统,明明说可以使用一年,但是3个月后就提示到期了无法使用了,于是只好卸载雨过天晴,在卸载过程中我选择了回复电脑到最开始的状态,当重新启动后,我的大脑一片空白!!!!!!天啊,所有的数据没有了!!!!!!花了几个小时才把数据找回,到半夜12点才完全弄好,本来俺的睡眠就非常差劲,于是......不说了,我们有了上面的画变色K线的基础,现在来做个简单的变色K线系统吧,是非常非常简单的;曾听说有人用两条均线打天下,我们就做这个打天下的变色K线交易模型;假设两条均线是5日均线和10日均线,于是就有两个变量,MaFive和MaTen,5日上穿10日买,5日下穿10日卖; 写成代码如下: [Copy to clipboard] [ - ]CODE://------------------------------------------------------------------------// 简称: MyKLine// 名称: 哈哈// 类别: 技术指标// 类型: 其它类// 输出://------------------------------------------------------------------------VarsNumeric OpenIsC//当开盘等于收盘价的时候NumericSeries MaF//5日均线NumericSeries MaT//10日均线BeginMaFive = SAverage(Close,5);//5天移动平均MaTen = SAverage(Close,10);//10天移动平均if(MaFive&MaTen){//如果是第151根K线画绿色PlotNumeric("High",High);PlotNumeric("Low",Low);if(Open==Close){//如果收盘价等于开盘价OpenIsClose = Close-PriceScale*MinMPlotNumeric("Open",Open);PlotNumeric("Close",OpenIsClose);}Else{tb交易开拓者 从一无所知开始学习交易开拓者(TB)期货程序化交易编程PlotNumeric("Open",Max(Close,Open));PlotNumeric("Close",Min(Close,Open));}}Else If(MaFive&MaTen){//如果是151根K线以前的Kurtosis线画红色PlotNumeric("High",High);PlotNumeric("Low",Low);if(Open==Close){OpenIsClose = Close+PriceScale*MinMPlotNumeric("Close",OpenIsClose);PlotNumeric("Open",Open);}Else{PlotNumeric("Close",Max(Close,Open));PlotNumeric("Open",Min(Close,Open));}}End//------------------------------------------------------------------------// 编译版本 GS// 用户版本
13:51// 版权所有 pwqzc// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TrabeBlazer公式修改和重写的权利 //------------------------------------------------------------------------好了,编译,然后插入这个技术指标,看看效果,天啊,效果是非常的不错的拉!!! 呵呵;请注意上面的一个函数:SAverage的帮助说明:Numeric SAverage(NumericSeries Price,Numeric Length)比如:SAverage (Close, 12); 计算12周期以来的收盘价的平滑平均值;该函数计算指定周期内的数值型序列值的平滑平均值,返回值为浮点数; 当序列值的CurrentBar小于Length时,该函数返回无效值。[]篇二 : 交易开拓者TB夜盘编程技术集一、夜盘交易的基本情况目前期货市场上,越来越多的品种都加入了夜盘交易大军。截止7月23日,目前已经确定在夜盘交易的有:上海期货交易所:白银ag,铜cu,金au,锌zu大连商品交易所:棕榈油p、焦炭J另外,根据郑州商品交易所的公告,日也将会启用白糖、棉花和甲醇三个品种的夜盘交易。二、交易开拓者与夜盘相关的几个函数1、Date属于系统函数,使用时类似于序列变量回溯值的使用。如Date,Date[1],Date[2]。在无夜盘的情况下,我们经常使用这种语句来表示一天的开始初始化:If(Date!=Date[1]){}Else{}这种语句,在有夜盘的情况下不能使用。原因是晚上2:00的bar的date值,与早上9:00的bar的date值是一样。晚上21:00的bar的值,也与下午3:00的bar的date值一样。Date!=Date[1]只发生在晚上0:00的时候。2、CurrentDate获取交易开拓者平台的当前日期。获取的是当前时间,与bar值无关。3、Truedate交易开拓者TB平台自带的“用户函数”,但在TB手册中没有介绍。由于是用户函数,引用方法是:Truedate(0), truedate(1), truedate(2)等。truedate返回指定Bar的真正交易日期。所谓真正交易日期,简单而言就是所有夜盘算入一一个白天的交易日日期。周一晚上21:00开始的夜盘,其truedate属于周二的日期;周五晚上开始的夜盘,其truedate属于下周一。用以下语句可以作为一天的初始化If(trueDate!=trueDate[1]){}Else{}4、OpenD交易开拓者TB平台自带的“用户函数”,但在TB手册中也有介绍。其引用方法是OpenD(0), OpenD(2), OpenD(3)等。OpenD是求N天前的开盘价,语法是:Numeric OpenD(Numeric daysAgo)有夜盘的品种的开盘价OpenD是取晚上9:00的开盘价,而没有夜盘的品种的开盘价OpenD是取早上9:00的开盘价。而highD,lowD,其意义是相同的,即是取一个完整truedate的最高、最低值。5、Time系统函数,返回当前公式应用商品在当前Bar的时间。语法NumericTime()。三、几个问题的编程实现1、如何过滤掉集合竞价采用以下语句,过滤掉两个时间的集合竞价,适合于夜盘与非夜盘品种一起用。If(BarStatus==2 && Time==0.090000 &&High==Low)If(BarStatus==2 && Time==0.210000 &&High==Low)2、是否可以用bar的数目来判断当天的情况虽然当使用的K线周期确定,一天bar的数目也是确定的。但是在遇到节假日时,当天晚上经常没有夜盘,所以会导致bar的数目混乱,不宜使用。3、如何用交易开拓者查看各函数值的情况当不清楚各函数,如前文所说的openD,truedate的取值时,建议使用以下公式应用,放在具体的超级图表上,则可以看到各函数的取值情况。ParamsVarsBeginFileAppend ("d:\\print2.log",DateTimeToString(Date+Time)+" Date="+Text(Date)+" Date[1]="+Text(Date[1])+"CurrentDate="+Text(CurrentDate)+" OpenD(0)="+Text(OpenD(0))+"OpenD(1)="+Text(OpenD(1))+" OpenD(2)="+Text(OpenD(2))+"truedate(0)="+Text(truedate(0))+"truedate(1)="+Text(truedate(1))+"\t");End4、将以往程序修改成为适应夜盘程序的思路主要看使用的策略情况,以下是几个可能影响到的点:(1)交易日bar的数目,bar的时间(2)是否使用(Date!=Date[1])的判断(3)使用openD,HighD, LowD的逻辑判断,如有夜盘,会指到21:00开盘后的一天的价格。
上一篇文章:
下一篇文章:
本文标题:[tb交易开拓者]从一无所知开始学习交易开拓者(TB)期货程序化交易编程&版权说明
文章标题: 文章地址:
1、《[tb交易开拓者]从一无所知开始学习交易开拓者(TB)期货程序化交易编程》一文由262阅读网()网友提供,版权归原作者本人所有,转载请注明出处!
2、转载或引用本网内容必须是以新闻性或资料性公共免费信息为使用目的的合理、善意引用,不得对本网内容原意进行曲解、修改,同时必须保留本网注明的"稿件来源",并自负版权等法律责任。
3、对于不当转载或引用本网内容而引起的民事纷争、行政处理或其他损失,本网不承担责任。

我要回帖

更多关于 tb程序化交易模型源码 的文章

 

随机推荐