交易开拓者(TB)编程初级篇
交易开拓者代码学习各种买卖指令及实例
![交易开拓者代码学习各种买卖指令及实例](https://img.taocdn.com/s3/m/bec752117f1922791788e8a0.png)
交易开拓者代码学习各种买卖指令及实例(TB)(转)2012年07月27日22:35原文地址:交易开拓者代码学习各种买卖指令及实例(TB)(转)作者:竹本无青各种买卖指令Buy说明产生一个多头建仓操作。
语法Buy(Numeric Share=0,Numeric Price=0,Bool Delay=False)参数Share 买入数量,为整型值,默认为使用系统设置参数;Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
备注产生一个多头建仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于多头建仓,其处理规则如下:如果当前持仓状态为持平,即MarketPosition = 0 时,该函数按照参数进行多头建仓。
如果当前持仓状态为空仓,即MarketPosition = -1 时,该函数首先平掉所有空仓,达到持平的状态,然后再按照参数进行多头建仓。
如果当前持仓状态为多仓,即MarketPosition = 1 时,该函数将继续建仓,但具体是否能够成功建仓要取决于系统中关于连续建仓的设置,以及资金,最大持仓量等限制。
示例在MarketPosition=0的情况下:Buy(50,10.2,1) 表示用10.2的价格买入50张合约,延迟到下一个Bar发送委托。
Buy(10,Close) 表示用当前Bar收盘价买入10张合约,马上发送委托。
Buy(5,0) 表示用现价买入5张合约,马上发送委托。
BuyToCover说明产生一个空头平仓操作。
语法BuyToCover(Numeric Share=0,Numeric Price=0,Bool Delay=False)参数Share 买入数量,为整型值,默认为平掉当前所有持仓;Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
TB使用说明书及程序开发、交易策略
![TB使用说明书及程序开发、交易策略](https://img.taocdn.com/s3/m/3a856f0f02020740be1e9bb0.png)
公式应用在输出数据时,我们是通过输出值的名称来进行识别,名称相同则认为是一个数据,如下的代码,后面语句的输出数据将会覆盖前面语句的输出数 据。
file://C:\Documents and Settings\Administrator\Local Settings\Temp\~hh71F6.htm 2014-10-25
用户函数
Page 4 of 16
PlotNumeric("Test",10); PlotNumeric("Test",20);
最后"Test"输出的数据为20,而不是10。 PlotNumeric
参见PlotNumeric。 PlotBool
参见PlotBool。 PlotString
参见PlotString。 UnPlot
用默认参数调用用户函数
用户函数在被调用的时候,如果传入的参数和参数的默认值一样,可以省略输出参数,使用默认值来调用用户参数。只能够对排列在后面的那些参数使用默认 参数,默认参数的定义参见参数。
公式系统 - TradeBlazer公式的使用 - 公式应用
公式应用
TradeBlazer公式通过公式应用来实现技术分析输出和交易策略的执行,根据使用目的的不同,我们将公式应用分为两类(技术分析和交易策略)进行单独描述。
用户函数的类型
1. 用户函数按照返回值类型不同可以分为数值型(Numeric),布尔型(Bool),字符串(String)三种基本类型,三种类型用户函数在调用时需要将返回值赋予类型 相同的变量。
2. 按照用户函数属性不同,用户函数可以分为内建用户函数和其他用户函数两种,内建用户函数是交易开拓者提供的,用于支持公式系统运行的预置公式, 您可以查看和调用内建用户函数,但是不能删除和修改内建公式。
TB公式入门
![TB公式入门](https://img.taocdn.com/s3/m/10c6ba36192e45361066f5f3.png)
TB公式入门交易开拓者公式基础Bar数据:公式在进行计算时,都是建立在基本数据源(Bar数据)之上,我们这里所谓的Bar 数据,是指商品在不同周期下形成的序列数据,在单独的每个Bar上面包含开盘价、收盘价、最高价、最低价、成交量及时间。
期货等品种还有持仓量等数据。
所有的Bar按照不同周期组合,并按照时间从先到后进行排列,由此形成为序列数据,整个序列称之为Bar 数据。
公式如何执行:TradeBlazer公式在计算时按照Bar数据的Bar数目,从第一个Bar到最后一个Bar,依次进行计算,如果公式中出现了调用Bar数据函数的,则取出当前Bar的相应值,进行运算。
公式执行从上至下,Bar从左到右执行。
公式执行顺序公式执行顺序TradeBlazer公式的HelloWorld!/forum/thread-63-1-1.htmlBeginFileAppend("c:\\Formula.log","hello world");End公式的种类指标K线形态特征走势交易指令函数公式环境的组织层次(1)公式环境的组织层次(2)建立一个最简单的指标:画零线BeginPlotNumeric(“Line1”,0);EndBegin和End宣告公式正文的开始和结束,公式语句应该放到Begin和End之间。
PlotNumeric表示输出一个数值型组成的数组。
技术指标属性的设置再画一条线…BeginPlotNumeric(“Line1”,5);End参数一根线ParamsNumeric Length(0);BeginPlotNumeric(“Line1”,length);EndN根线ParamsNumeric Length1(0);Numeric Length2(5);BeginPlotNumeric(“Line1”,length1);PlotNumeric(“Line2”,length2);End取较大值ParamsNumeric Length1(0);Numeric Length2(5);Beginif(Length1 >= Length2){PlotNumeric(“Line1”,length1);}else{PlotNumeric(“Line1”,length1);}EndPlotNumeric由输出的名字来区分是否为同一条线。
TB编程整理
![TB编程整理](https://img.taocdn.com/s3/m/a4a2cf417f21af45b307e87101f69e314232fa5e.png)
TB编程整理索引:1) 图表的第一根k线,或者是新的一天2) 求当天第一根Bar到现在的BAR数3) TB的时间表示4) 收盘平仓的例子5) 限制连续建仓6) 主动的加仓示例7) CurrentContracts函数获得当前持仓的持仓合约数。
8) 止损止盈的编写9) buy,sell函数注意事项内容:1) 图表的第一根k线,或者是新的一天If(CurrentBar == 0 || Date != Date[1])2) 求当天第一根Bar到现在的BAR数// 使用普通变量VarsNumeric TodayBars;BeginTodayBars = 0;While ( CurrentBar > TodayBars anddate[TodayBars] == date[TodayBars+1] ){TodayBars = T odayBars + 1;}Commentary("T odayBars = " + text(T odayBars)); End// 使用序列变量VarsNumericSeries ReBars;BeginIf(CurrentBar == 0 || Date != Date[1]){ReBars = 0;}Else{ReBars = ReBars + 1;}Return ReBars;End3) TB的时间表示Time()函数表示当前公式应用商品在当前Bar的时间, 如果当前时间为11:34:21.356,Time返回值为0.113421356函数中传递时间的时候可以传个整形,然后乘以一个小数, 如:Numeric TradeEndTime(145500);if (Time <= RangeEndTime * 0.000001)4) 收盘平仓的例子// 收盘平仓If ((Date[-1]!=InvalidInteger && Date!=Date[-1])||(Date[-1]==InvalidInteger&& Date < CurrentDate)) //代码中将消失的信号补上{Sell(0,Close);BuyToCover(0,Close);}Else If (Date==CurrentDate && Time==0.1455 && CurrentTime>=0.1459){Sell(0,Close);BuyToCover(0,Close);}5) 限制连续建仓MarketPosition获得当前持仓状态。
使用交易开拓者构建交易系统
![使用交易开拓者构建交易系统](https://img.taocdn.com/s3/m/36909782d0d233d4b14e690b.png)
课程安排
交易开拓者软件介绍 交易开拓者编程基础 交易系统构建和评测基础
使用交易开拓者构建交易系统
3
内容
控制语句 交易系统的构建 如何在交易中使用交易系统
4
IF语句的应用
IF else 语句举例
条件语句——IF ElseIF语句
条件语句的用途
条件语句多用在各种条件的判断中,在交易 系统构建中经常见到的如“交叉”、“突破 ”、“上涨”、“下跌”等 注意事项:IF语句后不能以分号结束,否则 会出现逻辑错误
逻辑判断符
“与”判断and——多个条件要同时满足才返回“ 真”,否则为“假”。如A and B,需要A和B条件 同时满足才算满足 “或”判断or——只要有一个条件满足即返回“真” ,所有条件不满足才返回“假”。如A or B,只要A 满足或者B满足就算满足 逻辑判断的叠加——使用括号进行叠加,优先计算 括号内的判断,再计算括号外的判断。如(A or B )and C
自动化交易需要注意的问题
模型加载是否正确 自动化交易是否启动 信号出现时发单是否成交 交易数量是否设定正确 总持仓头寸是否正确 合约转换
TB的学习资源
软件自带的公式范例 TB帮助文件(F1) TB公式开发指南
TB系统交易论坛
TB交易网校
最好的学习方法就是自己动手实验
42
43
构建工作区
可以单个合约使用一个工作区 也可以将多个合约共同置于一个工作区中
在每个合约图表上加载模型公式
点击每个合约图表 输入模型公式代码 加载后图表上应有信号指示 不断重复,直到所有图标上都已加载公式
TB公式的编程官方教程3
![TB公式的编程官方教程3](https://img.taocdn.com/s3/m/fb2b8e60f46527d3240ce0d8.png)
九、用户函数编写9-1、TB用户函数的编写以求平均值(例6)和极值(例7)为例例6:这是求平均值的内建用户函数,其中就调用了summation函数ParamsNumericSeries Price(1);Numeric Length(10);VarsNumeric AvgValue;BeginAvgValue = Summation(Price, Length) / Length;Return AvgValue;End例7:求极值Sample10:这是求极值的内建用户函数,其中就用到了引用参数ParamsNumericSeries Price(1);Numeric Length(10);Bool bMax(True);NumericRef ExtremeBar;VarsNumericSeries MyVal;NumericSeries MyBar;Numeric i;BeginMyVal = Price;MyBar = 0;If ( CurrentBar <= Length - 1 || MyBar[1] == Length - 1){ for i = 1 to Length - 1 { If (bMax ){ If ( Price[i] > MyVal) { MyVal = Price[i]; MyBar = i; } } Else { If ( Price[i] < MyVal) { MyVal = Price[i]; MyBar = i; } } } }Else { If ( bMax ) { If ( Price >= MyVal[1]) { MyVal = Price; MyBar = 0; }{ MyVal = MyVal[1];MyBar = MyBar[1] + 1; } }Else { If ( Price <= MyVal[1]) { MyVal = Price; MyBar = 0; }Else { MyVal = MyVal[1]; MyBar = MyBar[1] + 1; } } }ExtremeBar = MyBar;Return MyVal;End9-2、交易指令(Buy/Sell)针对当前公式应用的帐户、商品发送委托单。
TB公式编程官方基础教程1
![TB公式编程官方基础教程1](https://img.taocdn.com/s3/m/a73e8557a8956bec0975e3d8.png)
TradeBlazer公式的结构与编程目录页码一、TB的程序化交易的功能与特点 41-1、TB程序化交易的功能 4 1-2、TB公式说明 4 1-3、TB编程步骤 5 二、数据的说明与使用 62-1、Bar数据 6 2-2、计算方法 6 2-3、叠加数据 8 2-4、行情数据 9 2-5、属性数据 9 三、TB公式编程基础知识 93-1、TB的公式的结构 9 3-2、公式名称规则 11 3-3、语句写法 11 四、参数的说明与应用 214-1、参数说明 22 4-2、参数的使用与说明 22 4-3、参数的默认值 23 4-4、参数使用例子 24 4-5、变量参数 24 五、变量的类型与使用 255-1、变量参数 25 5-2、变量声明 26 5-3、变量的默认值 27 5-4、变量赋值 27 5-5、序列变量 28 5-6、变量、数据与函数的回溯 28 六、系统函数的使用 316-1、标点符号 31 6-2、控制语句 32 6-3、循环语句 37 七、用户函数的使用与说明 407-1、TB用户函数 40 7-2、序列函数 42 7-3、使用内建用户函数 42 7-4、用户函数的调用 44 7-5、用默认参数调用用户函数 44 八、技术指标编写 458-1、技术指标与应用 45 8-2、常用的技术指标应用举例 48 8-3、自编指标的输出 56 8-4、指标编写常见问题 58 九、用户函数编写 589-1、TB用户函数的编写 58 9-2、交易指令(Buy/Sell) 61 9-3、叠加多个商品合约进行交易 62 9-4、交易常用系统函数介绍 62 十、交易策略的程序实现与实例 6510-1、利用技术指标的交易策略 6510-2、止赢止损 7010-3、加仓减仓 7710-4、多品种交易 8010-5、集合竞价数据过滤 8210-6、函数下单撤单和全局变量操作 8310-7、数据库读写 83十一、其他注意事项 88 11-1、信号消失问题及解决办法 9111-2、盘中和盘后公式运行的差别 94十二、策略评估的常用指标 94正文一、TB程序化交易的功能与特点TradeBlazer公式(简称TB),新推出的V4公式,运行效率大幅提高,除支持多线程应用功能,在程序交易的主要特点如下:1-1、TB程序化交易的功能➢所使用的TBL(TradeBlazer Language)语言功能强大、语法简明易懂;➢TB的公式执行机制是在每根BAR上都会执行一遍公式,能实现公式和算法的精确控制;➢具有结构化的控制语句,支持复合语句—IF语句和FOR,WHILE语句;➢提供了丰富的系统函数,支持用户函数,便于实现程序的模块化设计;➢提供A函数、Q函数等,可实时获取当前交易账户的账户信息,并能对叠加商品进行发单和撤单,便于实现头寸调整、风险控制、资金管理以及套利交易的程序化;➢支持单图表叠加多个商品的交易和测试;➢技术指标源代码公开,便于指标算法的改进;➢强大的图表化、多维度的交易模型测试分析报告及参数优化功能,可实现多品种、多策略、多图表周期的组合测试,提供了丰富的、和实战密切相关的系统评估指标;➢支持交易模型的导入导出,支持交易模型的加密和无源码模式导出,便于模型研发后的商业应用。
TB网校_交易开拓者实战入门_乐丁_20120426
![TB网校_交易开拓者实战入门_乐丁_20120426](https://img.taocdn.com/s3/m/e6eb4815a2161479171128d9.png)
1、程序化交易方法
完整性
具有完整癿交易逻辑,从开仓进场到平仓出场形成一个完整癿交易过 程 开仓觃则、平仓觃则、止损觃则、二次进场觃则
客观性
移动平均线系统:短期均线上穿长期均线买入,短期均线下穿长期均 线卖出 KD指标系统:K上穿D买入,K下穿D卖出 通道突破系统:上穿30分钟周期高点买入,下穿30分钟周期低点卖 出
改良后的经典模型绩效
投资组合
思考: 如何才能获利最大化、风险 最小化? 如何实现稳定获利?
27
团队组合
唐僧师徒四人 各自有各自鲜明癿缺点和优点
而他们最终叏得真经,为什么?
实盘程序化交易策略投资组合
1 2 2 3 4
投资组合癿优势 投资组合方法 实盘投资组合分析
42
投资组合
商品组合
策略组合
商品 1
商品 2
策略 1
策略 2 产生稳定收益 减少最大回撤
商品 n
策略 n
实盘程序化投资组合构建之路
投资组合癿实施、维护
投资组合癿执行不修正
构建投资组合
交易策略癿组合 单个策略初步测试和优化
交易策略癿评估
交易思想癿量化
制定交易策略幵公式化
稳健投资组合的特性
参数符合常理
交易开拓者实战入门
乐丁(黄永剑)@上海中期投资咨询部 2012年4月
随机的零和博弈市场 如何才能生存和发展
?
主观交易?程序化交易?
主观交易 情绪化 随意性 市场应变能力强 程序化交易 客观化 一致性 木讷呆板反应迟钝
难复制
一招鲜 十年寒窗未必成功
可复制
多元化 成功早知道
利用程序化交易克服人性弱点 坚持程序化交易是获得成功癿捷径
TB编程基础知识
![TB编程基础知识](https://img.taocdn.com/s3/m/85a965ce58f5f61fb7366648.png)
普通交易指令信号
多头开仓 多头平仓 空头开仓 空头平仓
MinMove最小变动量 行情函数 Q函数 帐户函数A函数 枚举函数Enum_Buy 交易函数EntryPrice、 EntryPrice 其他函数
• PlotNumeric在当前Bar输出一个数值。Numeric PlotNumeric(String Name,Numeric Number,Integer Color=1,Integer BarsBack=0) • PlotString在当前Bar输出一个字符串。String PlotString(String Name,String str,Integer Color=-1,Integer BarsBack=0) • PlotBar在当前Bar输出两个值,用于在图表中当前Bar上画 出连接两个值的线条。PlotBar(String Name,Numeric Value1,Numeric Value2,Integer Color=-1,Integer BarsBack=0) • PlotBool在当前Bar输出一个布尔值。Bool PlotBool(String Name,Bool bPlot,Integer Color=-1,Integer BarsBack=0)
参数、变量的声明
• 声明参数、变量 Params(Vars) 类型 变量名1(初值); 类型 变量名2(初值); 类型 变量名3(初值);
• 变量声明例子:
TB交易网校2011.12.29课程:交易开拓者公式编写基础(一)
![TB交易网校2011.12.29课程:交易开拓者公式编写基础(一)](https://img.taocdn.com/s3/m/9199eaf29e314332396893e8.png)
----- 输出值的名称 ----- 输出的字符串; ----- 输出值的定位点; ----- 输出值的颜色; ----从当前BAR回溯的 BAR数
4
序列数据
序 列 变 量 N
序 列 变 量
序 列 变 量
序 列 变 量 …
序 列 变 量 …
序 列 变 量 …
序 列 变 量 …
序 列 变 量
…
序 列 变 量
…
序 列 变 量 2
序 列 变 量 1
序 列 变 量 0
5
N-1 …
非序列变量(简单变量)
非序列变量
6
TB公式运行机制
从左到右,从上到下
Bar数据 Date 当前K线的日期 含义
Time Open
High Low Close Vol OpenInt CurrentBar BarStatus
当前K线的开始时间 当前K线的开盘价
当前K线的最高价 当前K线的最低价 当前K线的收盘价(最新价) 当前K线成交量 当前K线持仓量 当前K线的索引值(K线的编号,从0开始) 当前K线的状态值(0—第一根K线、2—最后即最新 一根K线、1—其他K线)
While循环
While语句在条件为真的时候重复执行某一项操作。即, 只要条件表达式的值为真(True)时,就重复执行某个动 作。直到行情信息改变以致条件为假 (False)时,循环 才结束。 语法如下: While (Condition) { TradeBlazer公式语句; } Continue 和 Break
交易开拓者代码学习各种买卖指令及实例
![交易开拓者代码学习各种买卖指令及实例](https://img.taocdn.com/s3/m/16b73bed65ce05087732132d.png)
SetBreakEven(0,2000,True);当前所有持仓的盈利达到2000之后,启动所有持仓位置的保本平仓。(此时是计算所有持仓的盈利数)
触发价格:触发单设定的条件价格,通过比较现价和触发价格确定是否下单。下单之后,该触发单会从交易服务器中删除;
执行价格:条件满足之后,发送委托的价格,设定为0可自动获取当时的叫买/卖价;
过期时间:设定触发单的过期时间,到这个时间还没有触发的订单会被设为过期,不再进行监控。
吊买
吊买是指当现价向下跌破触:吊卖
备注产生一个空头建仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于空头建仓,其处理规则如下:
如果当前持仓状态为持平,即MarketPosition = 0时,该函数按照参数进行空头建仓。
如果当前持仓状态为多仓,即MarketPosition = 1时,该函数首先平掉所有多仓,达到持平的状态,然后再按照参数进行空头建仓。
注意:触发单在发送之后将会生效,该委托单在服务器上运行,此时您关闭程序或电脑不会影响触发单的执行。
SetPercentTrailing(2000,0.2,True);又是一个宝
SetPercentTrailing(2000,0.2,True);当前所有持仓盈利在大于2000之后回落,当回落百分比达到20%之后,执行所有持仓位置的百分比回落平仓。(此时是计算所有持仓的盈利数)
参数Share买入数量,为整型值,默认为使用系统设置参数;
Price买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);
TB交易网校2012.1.5课程:交易开拓者公式编写基础(二)
![TB交易网校2012.1.5课程:交易开拓者公式编写基础(二)](https://img.taocdn.com/s3/m/fd85b86ea45177232f60a2b3.png)
价格百分比的止盈或止损的写法:
TargetPrice = EntryPrice * (1+ TakeProfit * 0.01); StopPrice = EntryPrice * (1 – Stoploss * 0.01);
应注意的问题
如果单根K线的最高价和最低价相差很大,有可 能出现止盈和止损同时满足的情况,解决办法:
用能保持结果不变的数据做判断
比如:用High、Low、Open等做判断
突破代码: If (High>High[1]) { buy(1, Max(Open, High[1])); } 止损代码: if (Low < Stopline) { Sell(0, Min(Open, Stopline)); }
TB用户函数的编写
常用指标交易系统的实现
2
信号消失问题及解决办法Fra bibliotek产生的原因:
使用BUY/Sell指令进行自动交易; 交易(开仓或平仓)判断条件中使用了变化的数据
后果:
导致历史回测结果失真;
导致后续交易指令出现问题;
解决办法:
用确定不变的数据来做为判断条件;
用能保持结果不变的数据来做为判断条件;
除非算法需要否则建议不要在条件语句内循环语句内以及包含逻辑运算符的条件表达式中使用序列函所以编写一个基于技术指标的交易系统在tb中是非常简单的第一步复制技术指标的代码粘贴到新建的公式应用中
交易开拓者公式编写基础 (二)
蔡云华 深圳开拓者科技有限公司
1
内容概要
公式编写应注意的问题及解决办法 止损止盈、跟踪止盈代码的编写
代码中将消失的信号补上
开拓者代码及函数三篇
![开拓者代码及函数三篇](https://img.taocdn.com/s3/m/d5e6854f192e45361166f52a.png)
开拓者代码及函数三篇篇一:学习各种买卖指令及实例Buy说明产生一个多头建仓操作。
语法 Buy(Numeric Share=0,Numeric Price=0,Bool Delay=False> b5E2RGbCAP参数 Share 买入数量,为整型值,默认为使用系统设置参数;Price 买入价格,为浮点数,默认 =0 时为使用现价 ( 非最后 Bar 为 Close> ;Delay 买入动作是否延迟,默认为当前 Bar 发送委托,当 Delay=True ,在下一个 Bar 执行。
备注产生一个多头建仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于多头建仓,其处理规则如下:如果当前持仓状态为持平,即 MarketPosition = 0 时,该函数按照参数进行多头建仓。
如果当前持仓状态为空仓,即 MarketPosition = -1 时,该函数首先平掉所有空仓,达到持平的状态,然后再按照参数进行多头建仓。
p1EanqFDPw如果当前持仓状态为多仓,即 MarketPosition = 1 时,该函数将继续建仓,但具体是否能够成功建仓要取决于系统中关于连续建仓的设置,以及资金,最大持仓量等限制。
DXDiTa9E3d示例在 MarketPosition=0 的情况下:Buy(50,10.2,1> 表示用 10.2 的价格买入 50 张合约,延迟到下一个 Bar 发送委托。
Buy(10,Close> 表示用当前 Bar 收盘价买入 10 张合约,马上发送委托。
Buy(5,0> 表示用现价买入 5 张合约,马上发送委托。
BuyToCover说明产生一个空头平仓操作。
语法 BuyToCover(Numeric Share=0,Numeric Price=0,Bool Delay=False> RTCrpUDGiT参数 Share 买入数量,为整型值,默认为平掉当前所有持仓;Price 买入价格,为浮点数,默认 =0 时为使用现价 ( 非最后 Bar 为 Close> ;Delay 买入动作是否延迟,默认为当前 Bar 发送委托,当 Delay=True, 在下一个 Bar 执行。
tb编程基础详解1
![tb编程基础详解1](https://img.taocdn.com/s3/m/8a6675ff81c758f5f61f67cd.png)
•
• • •
•
•
•
在公式的编写中,经常会遇到当前Bar的数据和上一个Bar,上N个Bar数据进行比较, 计算的情况,针对这种情况,TradeBlazer公式提供了一种处理机制:回溯。即对数据 的向前引用,比如,获取上一个Bar的收盘价:Close[1],获取10天前的成交量: Vol[10]。以下提供一个简单的例子来说明如何进行回溯处理。 假定有如下语句: If (Close > Close[1]) { Buy(1,Close);} 以上公式执行一个简单的操作,当前Bar的收盘价大于上一个Bar的收盘价,即执行按 照当前收盘价买入1手的动作。根据上表的数据,公式将在CurrentBar为2和3的时候调 用Buy指令。 如果您足够仔细的话,您会发现:对于上面的一段公式的执行,有一个小小的问题, 当第一次计算公式时,即CurrentBar = 0时,这个时候需要获取上一个Bar的数据,但 是当前Bar已经是第一个Bar,这个时候就存在着问题,如何来获取此时的Close[1]呢, TradeBlazer公式将默认Close[1]为无效值,即系统函数中的InvalidNumeric,Close > Close[1]的表达式计算结果是一个Bool值,其结果也是一个无效值,对于Bool值,我们 将False作为其无效值。因此,第一个Bar计算时,Buy指令不会被执行。 对于技术分析这类公式来说,假定Bar数据的总数共有100,相同的代码将从 CurrentBar = 0到CurrentBar = 99 共执行100遍,分别输出公式中的结果值。 注意:在执行TradeBlazer公式时,可能出现数据不存在的情况,可通过系统函数 HistoryDataExist进行判断,如果该函数返回True,即为Bar数据有效。
交易开拓者代码学习各种买卖指令及实例
![交易开拓者代码学习各种买卖指令及实例](https://img.taocdn.com/s3/m/be54182110661ed9ad51f397.png)
交易开拓者代码学习各种买卖指令及实例(TB)(转)2012年07月27日22:35原文地址:交易开拓者代码学习各种买卖指令及实例(TB)(转)作者:竹本无青各种买卖指令Buy说明产生一个多头建仓操作。
语法Buy(Numeric Share=0,Numeric Price=0,Bool Delay=False)参数Share 买入数量,为整型值,默认为使用系统设置参数;Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
备注产生一个多头建仓操作,无返回值,该函数仅支持交易指令。
该函数仅用于多头建仓,其处理规则如下:如果当前持仓状态为持平,即MarketPosition = 0 时,该函数按照参数进行多头建仓。
如果当前持仓状态为空仓,即MarketPosition = -1 时,该函数首先平掉所有空仓,达到持平的状态,然后再按照参数进行多头建仓。
如果当前持仓状态为多仓,即MarketPosition = 1 时,该函数将继续建仓,但具体是否能够成功建仓要取决于系统中关于连续建仓的设置,以及资金,最大持仓量等限制。
示例在MarketPosition=0的情况下:Buy(50,10.2,1) 表示用10.2的价格买入50张合约,延迟到下一个Bar发送委托。
Buy(10,Close) 表示用当前Bar收盘价买入10张合约,马上发送委托。
Buy(5,0) 表示用现价买入5张合约,马上发送委托。
BuyToCover说明产生一个空头平仓操作。
语法BuyToCover(Numeric Share=0,Numeric Price=0,Bool Delay=False)参数Share 买入数量,为整型值,默认为平掉当前所有持仓;Price 买入价格,为浮点数,默认=0时为使用现价(非最后Bar为Close);Delay 买入动作是否延迟,默认为当前Bar发送委托,当Delay=True,在下一个Bar执行。
TradeBlazer编程入门教程
![TradeBlazer编程入门教程](https://img.taocdn.com/s3/m/c1c6bf06eff9aef8941e06f4.png)
关于条件表达式
逻辑操作符
逻辑运算符常常用于比较两个 True/False 的表达式,共有三个逻辑操作符:AND(&&),OR(||),NOT(!)。
关于 PlotNumeric 的使用 函数原形:
Numeric PlotNumeric(String Name,Numeric Number,Integer Color=-1,Integer BarsBack=0) 参数:
Name 输出值的名称,不区分大小写; Number 输出的数值; Color 输出值的显示颜色,默认表示使用属性设置框中的颜色; BarsBack 从当前 Bar 向前回溯的 Bar 数,默认值为当前 Bar。
这就清楚地显示了 FileAppend 函数分别在每个一个 BAR 上都执行了一遍,一共执行了 5 遍。
你可能认为公式理所当然地应该执行 5 遍,因为有 5 个 BAR 啊。并非如此!不同的软件,不同的语言公式 架构是不同的。类分析家语言,比如文华、飞狐等等,都只执行一遍!
我们把一个公式看成是一个整体黑盒,类分析家语言是把 5 根 BAR 作为一个整体输入,公式里的每个语句 都只执行一遍,整个公式也只执行一遍,然后便输出了。所以,在类分析家语言中是无法实现 IF 语句和 WHILE 循环语句的,所有的复合语句都无法实现。要做就只能在底层用 C 语言遍成函数做特殊处理。如果 你是程序员,你大概早就会很奇怪为什么几乎所有语言都有 IF 语句和 WHILE、FOR 语句,而分析家、文 华、飞狐中却只有 IF 函数呢?原因就就在这里了。
开拓者TB的RangeBreak交易模型源码
![开拓者TB的RangeBreak交易模型源码](https://img.taocdn.com/s3/m/2d9e1b1a16fc700abb68fcb8.png)
开拓者TB的RangeBreak交易模型源码日内效果不如隔日来得好ParamsNumeric PercentOfRange(0.5); //突破系数Numeric ExitOnCloseMins(14.55); //最后交易时间Numeric MinRange(0.002); //开盘价的百分比Numeric Lots(1); //开仓量VarsNumeric MyExitPrice;Numeric DayOpen;Numeric preDayRange;Numeric UpperBand; //上轨Numeric LowerBand; //下轨Numeric MyPrice;BeginDayOpen = OpenD(0);preDayRange = HighD(1)-LowD(1); //昨日波幅 PreDayRange = Max(PreDayRange,DayOpen*MinRange);UpperBand = DayOpen+PreDayRange*PercentOfRange; //求出上轨LowerBand = DayOpen-PreDayRange*PercentOfRange; //求出下轨PlotNumeric("UpperBand",UpperBand);PlotNumeric("LowerBand",LowerBand);If(MarketPosition!=1 && High>=UpperBand && Time<ExitOnCloseMins/100) //开多条件价格高于上轨,时间小于0.145500{MyPrice = Max(UpperBand,Open);Buy(Lots,MyPrice);Return;}If(MarketPosition!=-1 && Low<=LowerBand &&Time<ExitOnCloseMins/100){MyPrice = Min(LowerBand,Open);SellShort(Lots,MyPrice);Return;}If( MarketPosition==1 && Low<LowerBand) //多头中如果下破下轨止损{MyExitPrice=Min(Open,LowerBand);Sell(Lots,MyExitPrice);Return;}If( MarketPosition==-1 && High>UpperBand) //空头中如果上穿上轨止损 {MyExitPrice=Max(Open,UpperBand);BuytoCover(Lots,MyExitPrice);Return;}EndTB技术人员:本帖最后由rookies 于2012-7-21 11:25 编辑隔日情况下,允许二次开仓,可以提高盈利率ParamsNumeric PercentOfRange(0.5);Numeric ExitOnCloseMins(14.50);Numeric MinRange(0.002);Numeric Lots(1);Numeric StopPointUpper(1);Numeric StopPointLower(1);Numeric Length(12);Numeric TakeStart(0.1);Numeric TakeStop(0.5);VarsNumeric LastTradeMins(14.00);NumericSeries Ma;Numeric MyExitPrice;Numeric DayOpen;Numeric preDayRange;Numeric UpperBand;Numeric LowerBand;Numeric MyPrice;Numeric StopLine;BoolSeries UpperStoped;BoolSeries LowerStoped;NumericSeries HigherAfterEntry;NumericSeries LowerAfterEntry;String BoolSet;BeginMa=Average(Close,Length);DayOpen = OpenD(0);preDayRange = HighD(1)-LowD(1);PreDayRange = Max(PreDayRange,DayOpen*MinRange);Commentary("DayOpen="+Text(DayOpen));Commentary("preDayRange="+Text(preDayRange));UpperBand = DayOpen+PreDayRange*PercentOfRange;LowerBand = DayOpen-PreDayRange*PercentOfRange;Commentary("UpperBand="+Text(DayOpen+PreDayRange*PercentOfRange));Commentary("UpperBand="+Text(DayOpen-PreDayRange*PercentOfRange));PlotNumeric("UpperBand",UpperBand);PlotNumeric("LowerBand",LowerBand);If(Date!=Date[1]){UpperStoped=True;LowerStoped=True;}If(UpperStoped && LowerStoped){If(MarketPosition!=1 && High>=UpperBand && Time<ExitOnCloseMins/100){MyPrice = Max(UpperBand,Open);Buy(Lots,MyPrice);UpperStoped=False;Return;}}If(!UpperStoped){If(MarketPosition!=1 && High>=UpperBand && High>=HigherAfterEntry && Time<ExitOnCloseMins/100){MyPrice = Max(UpperBand,Open);MyPrice = Max(HigherAfterEntry,MyPrice);Buy(Lots,MyPrice);PlotString("二次建仓","二次建仓");Return;}If(LowerStoped && MarketPosition==1 && Low<=LowerBand && Time<Exit OnCloseMins/100){MyPrice = Min(LowerBand,Open);Sell(Lots,MyPrice);LowerStoped=False;PlotString("反向建仓","反向建仓");Return;}}If(UpperStoped && LowerStoped){If(MarketPosition!=-1 && Low<=LowerBand &&Time<ExitOnCloseMins/100)/ / && Time<=ExitOnCloseMins/100){MyPrice = Min(LowerBand,Open);SellShort(Lots,MyPrice);LowerStoped=False;Return;}}If(!LowerStoped){If(MarketPosition!=-1 && Low<=LowerBand && Low<=LowerAfterEntry &&T ime<ExitOnCloseMins/100){MyPrice = Min(LowerBand,Open);MyPrice = Min(LowerAfterEntry,MyPrice);SellShort(Lots,MyPrice);PlotString("二次建仓","二次建仓");Return;}If(UpperStoped && MarketPosition==-1 && High>=UpperBand && Time<E xitOnCloseMins/100){MyPrice = Max(UpperBand,Open);BuyToCover(Lots,MyPrice);UpperStoped=False;PlotString("反向建仓","反向建仓");Return;}}End∙TB客服:本帖最后由rookies 于2012-7-21 11:14 编辑应学友要求加入反向平仓和二次建仓 RU000 5分测试效果如图,如果做得更细一些的话会有更好的效果 15分上效果更好一些∙网友回复:本帖最后由rookies 于2012-7-21 11:25 编辑加入动态止盈和止损ParamsNumeric PercentOfRange(0.5);Numeric ExitOnCloseMins(14.50);Numeric MinRange(0.002);Numeric Lots(1);Numeric StopPointUpper(1);Numeric StopPointLower(1);Numeric Length(12);Numeric TakeStart(0.1);Numeric TakeStop(0.5);VarsNumeric LastTradeMins(14.00);NumericSeries Ma;Numeric MyExitPrice;Numeric DayOpen;Numeric preDayRange;Numeric UpperBand;Numeric LowerBand;Numeric MyPrice;Numeric StopLine;BoolSeries UpperStoped;BoolSeries LowerStoped;NumericSeries HigherAfterEntry;NumericSeries LowerAfterEntry;String BoolSet;BeginMa=Average(Close,Length);DayOpen = OpenD(0);preDayRange = HighD(1)-LowD(1);PreDayRange = Max(PreDayRange,DayOpen*MinRange);Commentary("DayOpen="+Text(DayOpen));Commentary("preDayRange="+Text(preDayRange));UpperBand = DayOpen+PreDayRange*PercentOfRange;LowerBand = DayOpen-PreDayRange*PercentOfRange;Commentary("UpperBand="+Text(DayOpen+PreDayRange*PercentOfRange));Commentary("UpperBand="+Text(DayOpen-PreDayRange*PercentOfRange));PlotNumeric("UpperBand",UpperBand);PlotNumeric("LowerBand",LowerBand);If(Date!=Date[1]){UpperStoped=True;LowerStoped=True;}If(UpperStoped && LowerStoped){If(MarketPosition!=1 && High>=UpperBand && Time<ExitOnCloseMins/100){MyPrice = Max(UpperBand,Open);Buy(Lots,MyPrice);UpperStoped=False;Return;}}If(!UpperStoped){If(MarketPosition!=1 && High>=UpperBand && High>=HigherAfterEntry && Time<ExitOnCloseMins/100){MyPrice = Max(UpperBand,Open);MyPrice = Max(HigherAfterEntry,MyPrice);Buy(Lots,MyPrice);PlotString("二次建仓","二次建仓");Return;}If(LowerStoped && MarketPosition==1 && Low<=LowerBand && Time<Exit OnCloseMins/100){MyPrice = Min(LowerBand,Open);Sell(Lots,MyPrice);LowerStoped=False;PlotString("反向建仓","反向建仓");Return;}}If(UpperStoped && LowerStoped){If(MarketPosition!=-1 && Low<=LowerBand &&Time<ExitOnCloseMins/100)/ / && Time<=ExitOnCloseMins/100){MyPrice = Min(LowerBand,Open);SellShort(Lots,MyPrice);LowerStoped=False;Return;}}If(!LowerStoped){If(MarketPosition!=-1 && Low<=LowerBand && Low<=LowerAfterEntry &&Time<ExitOnCloseMins/100){MyPrice = Min(LowerBand,Open);MyPrice = Min(LowerAfterEntry,MyPrice);SellShort(Lots,MyPrice);PlotString("二次建仓","二次建仓");Return;}If(UpperStoped && MarketPosition==-1 && High>=UpperBand && Time<Ex itOnCloseMins/100){MyPrice = Max(UpperBand,Open);BuyToCover(Lots,MyPrice);UpperStoped=False;PlotString("反向建仓","反向建仓");Return;}}If(MarketPosition<>0 && BarsSinceEntry==1){HigherAfterEntry=AvgEntryPrice;LowerAfterEntry=AvgEntryPrice;}Else If(BarsSinceEntry>1){HigherAfterEntry=Max(HigherAfterEntry,High[1]);LowerAfterEntry=Min(LowerAfterEntry,Low[1]);}Commentary("HigherAfterEntry"+Text(HigherAfterEntry));Commentary("LowerAfterEntry"+Text(LowerAfterEntry));If(MarketPosition==1){If(HigherAfterEntry>=AvgEntryPrice+DayOpen*TakeStart*0.01){StopLine=HigherAfterEntry-DayOpen*TakeStop*0.01;Commentary("StopLineHigherAftetEntry"+Text(StopLine));}Else{StopLine=UpperBand-DayOpen*StopPointUpper*0.01;Commentary("StopLine"+Text(StopLine));}If(Low<=StopLine){MyExitPrice=Min(StopLine,Open);Sell(Lots,MyExitPrice);}}If(MarketPosition==-1){If(LowerAfterEntry<=AvgEntryPrice-DayOpen*TakeStart*0.01){StopLine=LowerAfterEntry+DayOpen*TakeStop*0.01;Commentary("StopLineLowerAfterEntry"+Text(StopLine));}Else{StopLine=LowerBand+DayOpen*StopPointLower*0.01;Commentary("StopLine"+Text(StopLine));}If(High>=StopLine){MyExitPrice=Max(StopLine,Open);BuyToCover(Lots,MyExitPrice);}}End。
国内流行程序化交易平台交易开拓者使用教程
![国内流行程序化交易平台交易开拓者使用教程](https://img.taocdn.com/s3/m/acf3f540eef9aef8941ea76e58fafab068dc445b.png)
国内流行程序化交易平台交易开拓者使用教程程序化交易平台是指利用计算机程序来实现自动交易的平台。
而国内流行的程序化交易平台交易开拓者(以下简称TB)是一款功能强大、易于使用的交易平台。
本文将为大家详细介绍TB的使用教程,包括平台的注册、登录、交易策略的编写和执行等。
希望能够帮助大家更好地使用TB进行交易。
第一部分:平台的注册和登录注册完成后,我们可以使用注册时所填写的用户名和密码进行登录。
在TB官方网站上找到登录入口,输入用户名和密码,点击登录按钮即可成功进入TB平台。
第二部分:交易策略的编写在登录成功后,点击左上角的交易策略管理按钮,进入交易策略编写界面。
首先,我们需要定义交易策略的基本信息,包括策略名称、交易品种、交易周期等。
点击基本信息选项卡,填写相关信息。
接下来,我们需要定义交易的入场条件和出场条件。
点击入场条件或出场条件选项卡,选择相应的条件,例如移动平均线交叉、指标超买超卖等,填写具体参数即可。
除了基本的入场和出场条件,我们还可以定义止损和止盈条件。
点击止损条件或止盈条件选项卡,填写相应的条件和参数。
第三部分:交易策略的执行在交易策略编写完成后,我们需要将其保存,并进行回测。
点击保存按钮,保存交易策略。
回到交易策略管理界面,我们可以看到保存的交易策略列表。
点击回测按钮,选择回测开始和结束的时间段,点击开始回测按钮即可进行回测。
回测完成后,我们可以查看回测结果并进行优化。
点击回测结果选项卡,查看交易的收益曲线、胜率等指标。
根据回测结果,我们可以对交易策略进行优化,提高交易的盈利能力。
最后,当我们对交易策略进行了充分的优化后,可以将其执行在实盘上。
点击交易按钮,选择需要执行的交易策略,点击开始交易按钮即可开始实盘交易。
总结:以上就是TB程序化交易平台的使用教程。
通过注册登录、交易策略的编写和执行等步骤,我们可以在TB上进行自动化交易,并通过回测和优化提高交易的盈利能力。
希望本教程能够帮助大家更好地使用TB进行交易,获取更好的交易体验和效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交易开拓者(TB)期货程序化交易编程本文仅是写给完全不懂编程的朋友的,仅是最基本的入门资料。
TB里面代码执行1,代码从第一根K线开始执行,一直到最后一根K线;2,在每一根K线上,代码都是从第一行开始执行,一直到最后一行;我们就写个输出每日的收盘价的例子;打开TB,在左边的TB公式里面,点击新建技术指标,然后在出来的公式编辑器里面输入BeginEnd注意,除了参数和变量定义外,所有的代码都必须包含在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.log,这个文件的路径在哪里呢?就是c:\\a.log 里面的C盘,且在这个文件里面添加一行东西,这行东西的内容就是你后面所写的Text(Year)+"年"+Text(Month)+"月"+Text(Day)+"日的收盘价等于"当然,如果这个文件已经存在,他就不会添加文件了,仅仅在这个文件的后面添加一行上面你写的内容好了,再看看Text,Text的意思就是把那些不是字符串的东西如数字啊,等变成字符串.而Year,Month,Day就代表了正在执行你写的代码的那一根K线的年,月,日,年月日是数字,我们当然要用Text把它搞成字符串CloseK线的收盘价啊,如果代码执行到最后的那根K线我们点公式编辑器上面的工具栏的第五个按钮(打勾的那个东西),校验保存公式,稍微等一下,就OK了我们在回到K线图里面,TB把K线图叫做超级图表在K线图里面右键,选择商品设置,然后吧里面的样本数由默认的300改成5,意思是让在超级图表里面仅仅显示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日的收盘价等于671602007年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文件里面,于是就输出了"67280"好了,代码在第一根K线上执行完毕,于是再转到第二根K线,再执行第一行代码,再执行第二行代码.........我一直非常愿意帮助客户们解答在编程中的难点,但是却不大愿意帮助客户写完整的公式策略。
这其中有三个原因:1、别人写的交易策略,你难以调整它。
据统计,90%以上的交易策略会在2年半之内由于种种原因失效或者效率降低。
通常的做法是一个季度左右,交易员就需要微调其策略,调整参数或改动某些条件。
如果策略不是自己编写的,调整起来就会有困难。
2、别人写的交易策略,你很难彻底执行它。
系统交易最重要的好处在于它的执行能力。
它可以使你的交易摆脱人性的弱点,摆脱心理因素的干扰。
然而这一切的基础,在于自信。
人只会信任自己了解的东西,这是人性。
如果一个交易策略是别人写的,无论它的测试报告是多么天花乱坠,你都不会信任它,因为你不了解它。
一旦市场出现了危机情况,你就会坐立不安,你就会总怀疑是不是策略有问题,然后就又把策略扔到一边,回到凭感觉去操作的老路上去了。
3、最重要的一点在于:编程就是理解,编写交易策略调试交易策略的过程其实就是理解市场的过程。
这是一种非常宝贵的积累。
大多数人都是通过在市场中亏钱,靠爆仓来理解市场的。
成本高昂,而且难以总结。
使用这种方法来了解市场,往往就算你亏了很多钱,交了大把学费,你仍然不知道自己到底输在哪里。
你总结不出来,你就不可能有长进,就不可能赢。
而通过写交易策略来了解市场你不需要交什么学费,从历史测试报告里很容易分析出来自己到底错在哪里,如此你就很容易改进。
把编好的交易策略与模拟帐户交易结合起来就可以为你带来足够逼真的实战经验。
编程其实是一种思想,编程的目的是把你的思想用各种图形表现出来而已我们期货编程的目的是表现我们的交易思想是为思想而编程,不是为编程而编程!现在开始写数据类型,变量和赋值.数据类型分字符串类型,数值型,还有布尔型字符串类型很简单,用分号" "括起来的东西就叫做字符串类型的数据,如"I love you",如"3345",.....数值型数据类型也同样的简单,数值大家知道吧,如1542啊,1.021啊....这些东西就是数值型的数据类型当然,如果把一个数值型的东西用分号""括起来了那他就不再是数值型数据了,而是字符串类型的数据如1688是数值型数据,但是"1688"就是字符串类型的数据了还有就是布尔型,当然,没有接触过编程的朋友可能不明白布尔型的意思说白点,布尔型就是真假型,意思就是布尔类型的数据只能取真(True)或假(False)值.比如2>1,这个东西就是布尔类型的数据,因为2是大于1啊,所以这个表达式返回True(真)也是,因为2大于1啊,所以2<1是错误的,就返回False(假)大家明白了吧,就这三个类型,其中最只要的就是数值型数据类型用的最多的也是数值型数据类型如果明白了,那么请您就记住在TB里面数值型Numeric看下TB的帮助,数据类型里面还有个序列型,如果数值序列型,字符串序列型,布尔序列型序列这个东西看起来很难理解比如我们的K线图上有10跟K线,Close就是收盘价但是这个Close包含了第一根K线的收盘价,也包含了第二根K线的收盘价.......一直包含到第五根K线的收盘价也就是说序列型的数据在每根K线上都有一个值的说说变量变量就是一个可以改变的东西现在这个变量的值是100,但是等下我可以把它改成20, 只要您喜欢,你可以随心所欲的改变这个值能够修改他的值的东西就叫做变量了记住:在TB里面变量都是要先定义的!而且有着他独到的定义方法,而且这个定义必须放到Begin的前面如我们定义一个数值型变量a.就应该这样VarsNumeric a;Begin......End当然你也可以定义两个或者多个变量,如VarsNumeric a;Numeric b;//.........更多变量定义Begin......End大家也许想到了我定义这个变量a,我要让他等于2,这个东西很简单你可以在变量定义的时候就给他赋初值让他一开始被定义就等于2,也可以在Begin下面写.如VarsNumeric a(2);Numeric b;//.........更多变量定义Begin......End明白了么|?那么变量b呢?我们没有用括号()扩个东西啊,那么这个时候b这个变量等于什么呢?很简单,如果你在定义变量的时候没有给他初值,那么b这个时候等于0再看在Begin里面怎么修改这个变量的值VarsNumeric a(2);//.........更多变量定义Begina = 3;b = 100;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的值!这点千万注意啊变量赋值其实我们上面已经说了,记住=和==的区别=就是把=右边的东西赋给=左边的东西如a = 100;就是把=右边的100赋给左边的变量a就是把9赋给变量b等于的符号是==if(a==b)//就是如果a等于b{//做某件事情}再看在Begin里面怎么修改这个变量的值VarsNumeric a(2);Numeric b;//.........更多变量定义Begina = 3;b = 100;End现在我们说说TB中的流程控制流程控制就是控制代码执行的流程还说的明白点就是如果满足什么条件就做什么事情或者不满足什么条件的时候做什么事情简单说流程控制就是控制语句控制代码控制语句中分为逻辑控制语句(就是条件控制语句)和循环控制语句条件控制语句中大家记住If这个关键字,翻译成中文就是如果循环控制语句中大家记住For,就是开始循环了先说If.假设一个这样的条件:如果(收盘价>开盘价)则输出:今日收红阳线我们先把这个东西翻译成TB如果翻译成If收盘价和开盘价大家都知道会翻译成Close和Open输出语句就是FileAppend,则翻译成TB就是:If(Close>Open){FileAppend("c:\\a.log","今日收红阳线");}是不是很简单呢?大家记住一点,凡是if(如果)语句中的代码,都给我用{}括起来我们再把上面的条件加上一点:如果(收盘价>开盘价)则输出:今日收红阳线否则如果(收盘价==开盘价)则输出:今日收十字线我们再翻译成TB,把否则翻译成Else,如果翻译成If{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","今日收十字线");}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循环语句.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周期的最高值// 类别: 用户函数// 类型: 用户函数// 输出: 数值型//------------------------------------------------------------------------ParamsNumeric Length(5);VarsNumeric highestValue(0);Numeric minDay;Numeric i;BeginminDay = Min(CurrentBar,Length-1);for i=0 to minDay{ highestValue=Max(highestValue,c[i]);}Commentary("最高价"+text(highestValue));End现在说说参数与函数,说完了这个东西,就要进入实践阶段了,就要准备开始实打实的独立编写指标了首先我们必须明白,参数仅仅存在于函数里面,如果函数里面存在着参数,那么当你调用这个函数的时候必须要先传递参数给这个函数函数就是帮助我们完成某一件事情,并且完成这件事情以后会返回个东西给我们的一个方法.比如一个这样的函数请注意,这仅仅是个假想的函数,仅为了帮助理解函数是什么: GetCloseFromTrader我们就很明白,这个函数就是帮助我们到交易所跑一趟,然后把收盘价返回给我们;有点明白了吧,但是仔细一想,这个东西似乎有点问题,比如返回收盘价,交易所那么多的品种,且每个品种都有那么多的月份,他到底返回的是什么东西的收盘价啊?那么我们这样写:GetCloseFromTrader(Cu0801)现在应该完全明白了,这个函数就是从交易所返回某个品种的收盘价,到底是什么品种什么月份的收盘价呢? Cu0801就是拉.其实,这里面的Cu0801就是这个函数所需要的参数!我们于是就可以这样理解:函数是帮助用户完成某一件事情且返回用户所需要的数据的方法;那么参数呢?参数就是参到函数里面去的数,也就是说必须要传递给函数的数;我们现在不要求一定能够自己写函数,但是必须要懂得的是要看懂这个函数是做什么用的,且知道如何去调用这个函数!我们先看看下面的这个函数,这个函数的名字叫:HHV,是根据轮回老大的建议改写的,我们必须要读懂这个函数,且知道怎么样去CODE://------------------------------------------------------------------------// 简称: HHV// 名称: 求N周期的最高值// 类别: 用户函数// 类型: 用户函数// 输出: 数值型//------------------------------------------------------------------------ParamsNumericSeries Price(0);Numeric Length(5);VarsNumeric highestValue(0);Numeric minDay;Numeric i;BeginminDay = Min(CurrentBar,Length-1);for i=0 to minDay{highestValue=Max(highestValue,Price[i]);}Return highestValue;End我们一行一行的读,一行一行的理解;首先我们都知道,//后面的代表是注释,什么是注释通过注释我们可以粗略的明白这个函数是干什么的?代表了什么意思:这个函数的名字HHV,他的作用是求N周期的最高值,并且会把这个最高值返回给调用这个函数的用户通过此,我们就能够想到,这个N是个参数,比如5个周期或者10个周期或者其他周期的最高值,再仔细一想,是什么价格的最高值啊?是收盘价的最高值还是开盘价的最高值?或者是最高价的最高值呢?于是我们也就想到了这个函数的另外个参数:价格,比如5个周期的收盘价的最高值,或者10个周期的最高价的最高值紧接着,这个函数开始定义参数了,Params后面定义的就是参数,一个代表要得到什么价格的最高值,一个代表要得到什么周期的最高值;参数定义完了,这个函数就开始定义变量,对于函数,我们首先定义一个变量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 minDay;再看代码:CODE:for i=0 to minDay{highestValue=Max(highestValue,Price[i]);}很明显,这是一个前面我们所说的For循环,在For循环里面我们必须要先定义一个变量i(可以是其他名字),代表从什么基数开始循环;于是再到定义变量的地方去定义这个i变量:VarsNumeric highestValue(0);Numeric minDay;Numeric i;再看这个For循环,当i是0的时候,看这个时候0是不是小于等于最小周期minDay,如果条件成立,就执行:highestValue=Max(highestValue,Price[i]);Price[0]代表今天的价格,先比较今天的价格和最高值,取最大的那个保存;再把i+1于是这个时候i为1了,再比较是不是小于等于最小周期minDay,如果条件成立,再执行:CODE:highestValue=Max(highestValue,Price[i]);这个时候Price[1]就代表了昨天的价格,把昨天的价格和保存的最高值比较,取他们的最高的那个再次保存; 依次循环,我们是不是就得到了某个周期某个价格的最高值了呢?最后面,我们用代码:Return highestValue;把这个得到的最高值返回给用户,Return就是返回调用这个函数的时候就更简单了,比如求10个周期的收盘价的最高值:HHV(Close,10);求20个周期的最高价的最高值:HHV(High,20);大家在看看和分析这个文章里面的函数就会完全明白了的我们现在来写一个飞狐的DMA函数原文出自这里:QUOTE:请编飞狐DMA函数.函数:DMA(X,N)别名:动态移动平均参数:X为数组,N为计算周期返回:返回数组说明:求X的动态移动平均。