TradeBlazer公式入门教程.docx
- 文档编号:24837208
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:50
- 大小:49.26KB
TradeBlazer公式入门教程.docx
《TradeBlazer公式入门教程.docx》由会员分享,可在线阅读,更多相关《TradeBlazer公式入门教程.docx(50页珍藏版)》请在冰豆网上搜索。
TradeBlazer公式入门教程
TradeBlazer公式入门教程
(1)
Step1、在开始写公式之前,我们先了解以下基本概念
Bar数据:
公式在进行计算时,都是建立在基本数据源(Bar数据)之上,我们这里所谓的Bar数据,是指商品在不同周期下形成的序列数据,在单独的每个Bar上面包含开盘价、收盘价、最高价、最低价、成交量及时间。
期货等品种还有持仓量等数据。
所有的Bar按照不同周期组合,并按照时间从先到后进行排列,由此形成为序列数据,整个序列称之为Bar数据。
公式如何执行:
TradeBlazer公式在计算时按照Bar数据的Bar数目,从第一个Bar到最后一个Bar,依次进行计算,如果公式中出现了调用Bar数据函数的,则取出当前Bar的相应值,进行运算。
公式执行从上至下,Bar从左到右执行。
Step2、接下来,我们从TradeBlazer公式的HelloWorld开始
该贴前期已经发过,因此在此只给出链接:
TradeBlazer公式的HelloWorld!
Step3、建立一个简单的指标:
成交量
对于交易开拓者界面不熟悉的朋友可以参看以下帖子:
如何在交易开拓者中编写技术指标?
新建指标简称:
MyVol
1.Begin
2. PlotNumeric("Vol",Vol);
3.End
复制代码
Begin和End宣告公式正文的开始和结束,公式语句应该放到Begin和End之间。
并且总是以";"作为语句结束的标志。
PlotNumeric表示输出一个数值型组成的数组;公式中“”内所引用的是字符串的常量,内容文字即在图表中所输出的技术指标的名称
关于PlotNumeric的使用
函数原形:
NumericPlotNumeric(StringName,NumericNumber,IntegerColor=-1,IntegerBarsBack=0)
参数:
Name输出值的名称,不区分大小写;
Number输出的数值;
Color输出值的显示颜色,默认表示使用属性设置框中的颜色;
BarsBack从当前Bar向前回溯的Bar数,默认值为当前Bar。
技术指标属性的设置
在属性里的常规下填写公式的简称、名称、分类以及注释。
也可更改参数等设置:
在“线型”里选择更改技术指标的输出形态,如线条、柱状图、十字图等,并且选择自己爱好的颜色,
以更加个性化的表现形式来迎合您的看盘习惯。
Step4:
前面我们所建的技术指标MyVol,可以输出成交量,但成交量只能设置为属性所选的一种颜色。
如下图:
很多朋友习惯于看红绿色表示涨跌的成交量。
下面我们来实现带红绿颜色的成交量指标,代码如下:
1.Begin
2. PlotNumeric(“Vol”,Vol,IIf(Close>=Open,Red,Green));
3.End
复制代码
使用的情形如下:
关于IIF
函数原形:
NumericIIF(BoolConditon,NumericTrueValue,NumericFalseValue)
参数:
Conditon条件表达式;
TrueValue条件为True时的返回值;
FalseValue条件为False时的返回值。
针对上面的使用IIF进行成交量颜色指定的脚本,我们还有另外一种写法:
1.Begin
2. If(Close>=Open)
3. PlotNumeric(“Vol”,Vol,Red);
4. Else
5. PlotNumeric(“Vol”,Vol,Green);
6.End
复制代码
PlotNumeric由输出的名字来区分是否为同一条线!
关于IF语句
If语句是一个条件语句,当特定的条件满足后执行一部分操作。
语法如下:
If(Condition)
{
TradeBlazer公式语句;
}
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
Step5
关于条件表达式
逻辑操作符
逻辑运算符常常用于比较两个True/False的表达式,共有三个逻辑操作符:
AND(&&),OR(||),NOT(!
)。
表达式1AND表达式2
表达式1OR表达式2
NOT表达式1
如下图表所示可以让大家更清晰地理解逻辑操作符在表达式中的运算结果
Step6
前面第一贴已经讲过了IF语句,接下来要讲解条件语句的另外三种表达方式:
If-Else
If-Else-If
If-Else的嵌套
关于If-Else语句
If-Else语句是对指定条件进行判断,如果条件满足执行If后的语句。
否则执行Else后面的语句。
语法如下:
1.If(Condition)
2.{
3. TradeBlazer公式语句1;
4.}Else
5.{
6. TradeBlazer公式语句2;
7.}
复制代码
Condition是一个逻辑表达式,当Condition为True的时候,TradeBlazer公式语句1将会被执行;Condition为False时,TradeBlazer公式语句2将会被执行。
Condition可以是多个条件表达式的逻辑组合,Condition必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
例如,比较当前Bar和上一个Bar的收盘价,如果Close>Close[1],Value1=Value1+Vol;否则Value1=Value1-Vol,脚本如下:
1.If(Close>Close[1])
2. Value1=Value1+Vol;
3.Else
4. Value1=Value1-Vol;
复制代码
关于If-Else-If的语句
If-Else-If是在If-Else的基础上进行扩展,支持条件的多重分支。
语法如下:
1.If(Condition1)
2.{
3. TradeBlazer公式语句1;
4.}ElseIf(Condition2)
5.{
6. TradeBlazer公式语句2;
7.}Else
8.{
9. TradeBlazer公式语句3;
10.}
复制代码
Condition1是一个逻辑表达式,当Condition1为True的时候,TradeBlazer公式语句1将会被执行,Condition1为False时,将会继续判断Condition2的值,当Condition2为True时,TradeBlazer公式语句2将会被执行。
Condition2为False时,TradeBlazer公式语句3将会被执行。
Condition1,Condition2可以是多个条件表达式的逻辑组合,条件表达式必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
If-Else-If的语句可以根据需要一直扩展,在最后的Else之后再加If(Condition)和新的执行代码即可。
当然您也可以省略最后的Else分支,语法如下:
1.If(Condition1)
2.{
3. TradeBlazer公式语句1;
4.}ElseIf(Condition2)
5.{
6. TradeBlazer公式语句2;
7.}
复制代码
If-Else的嵌套
If-Else的嵌套是在If-Else的执行语句中包含新的条件语句,即一个条件被包含在另一个条件中。
语法如下:
1.If(Condition1)
2.{
3. If(Condition2)
4. {
5. TradeBlazer公式语句1;
6. }Else
7. {
8. TradeBlazer公式语句2;
9. }
10.}Else
11.{
12. If(Condition3)
13. {
14. TradeBlazer公式语句3;
15. }Else
16. {
17. TradeBlazer公式语句4;
18. }
19.}
复制代码
Condition1是一个逻辑表达式,当Condition1为True的时候,将会继续判断Condition2的值,当Condition2为True时,TradeBlazer公式语句1将会被执行。
Condition2为False时,TradeBlazer公式语句2将会被执行。
当Condition1为False的时候,将会继续判断Condition3的值,当Condition3为True时,TradeBlazer公式语句3将会被执行。
Condition3为False时,TradeBlazer公式语句4将会被执行。
Condition1,Condition2,Condition3可以是多个条件表达式的逻辑组合,条件表达式必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}。
例如,在一个交易指令中,条件设置如下:
当前行情上涨的时候,如果收盘价高于开盘价时,则产生一个以收盘价买入1张合约;否则产生一个以开盘价买入1张合约。
当前行情没有上涨的时候,如果收盘价高于开盘价,则产生一个以收盘价卖出1张合约;否则产生一个以开盘价卖出1张合约。
脚本如下:
1.If(Open>High[1])
2.{
3. If(Close>Open)
4. {
5. Buy(1,close);
6. }Else
7. {
8. Buy(1,open);
9. }
10.}Else
11.{
12. If(Close>Open)
13. {
14. Sell(1,close);
15. }Else
16. {
17. Sell(1,open);
18. }
19.}
复制代码
Step7
现在再回到成交量指标
有人喜欢在成交量指标上加均线,我们来看如何实现这样的功能。
1.Begin
2. PlotNumeric(“Vol”,Vol);
3. PlotNumeric(“AvgVol5”,AverageFC(Vol,5));
4.End
复制代码
如下图中所示便是加了均线的成交量
Step8
关于Average和AverageFC
Average和AverageFC都是内建的用户函数,目的都是用来求N个Bar以来的平均值,您可以直接看到实现的代码。
如下:
Average
1.Params
2. NumericSeriesPrice
(1);
3. NumericLength(10);
4.Vars
5. NumericAvgValue;
6.Begin
7. AvgValue=Summation(Price,Length)/Length;
8. ReturnAvgValue;
9.End
复制代码
AverageFC
1.Params
2. NumericSeriesPrice
(1);
3. NumericLength(10);
4.Vars
5. NumericAvgValue;
6.Begin
7. AvgValue=SummationFC(Price,Length)/Length;
8. ReturnAvgValue;
9.End
复制代码
Average和AverageFC有什么不同呢?
AverageFC是指FastCalculate,即快速计算。
当这两个函数的第二个变量,即N个Bar是常量时,使用AverageFC,提高计算效率。
当N是不确定的变量时,则必须使用Average,否则会出现计算问题。
单看Average和AverageFC似乎是一样的,唯一不同的是AvgValue的计算方式用到的是Summation和SumamtionFC。
Summation和SumamtionFC
现在再来看看Summation与SumamtionFC的不同之处。
公式表达如下:
Summation
1.Params
2. NumericSeriesPrice
(1);
3. NumericLength(10);
4.Vars
5. NumericSumValue(0);
6. Numerici;
7.Begin
8. If(CurrentBar>=Length-1)
9. {
10. fori=0toLength-1
11. {
12. SumValue=SumValue+Price[i];
13. }
14. }Else
15. {
16. SumValue=InvalidNumeric;
17. }
18. ReturnSumValue;
19.End
复制代码
SummationFC
1.Params
2. NumericSeriesPrice
(1);
3. NumericLength(10);
4.Vars
5. NumericSeriesSumValue(0);
6. Numerici;
7.Begin
8. If(CurrentBar 9. { 10. fori=0toLength-1 11. { 12. SumValue=SumValue+Price[i]; 13. } 14. }Else 15. { 16. SumValue=SumValue[1]+Price-Price[Length]; 17. } 18. ReturnSumValue; 19.End 复制代码 关于Average函数的参数 NumericAverage(NumericSeriesPrice,NumericLength); Price 需要进行平均的序列变量 Length 平均时回溯的Bar数量 Step9 接下来我们再说一下常量与变量的定义 常量 是用来代替一个数或字符串的名称,在公式整个执行过程中不发生改变。 变量 是一个存储值的地址,当变量被声明之后,就可以在脚本中使用变量,可以对其赋值,也可以在其他地方引用变量的值进行计算,要对变量进行操作,直接使用变量名称即可。 变量的主要用处在于它可以存放计算或比较的结果,以方便在之后的脚本中直接引用运算的值,而无需重现计算过程。 例如,我们定义一个变量Y,我们把一个收盘价(Close)乘上8%的所得的值存储在Y中,即Y=Close*8%。 那么一旦计算出Close*8%的值,便赋给变量Y。 而无需在公式中输入计算过程,只需调用变量名称即可引用变量的值。 变量有助于程序的优化,这是TradeBlazer公式必须重复调用一些数据,这些数据可能是某些函数(如: Bar数据),或通过表达式执行计算和比较的值。 因此,在表达式频繁使用的地方使用变量可提高程序的运行速度和节约内存空间。 使用变量也可以避免输入错误,使程序的可读性提高,示例如下: 未使用变量的公式代码: 1.If(Close>High[1]+Average(Close,10)*0.5) 2.{ 3. Buy(100,High[1]+Average(Close,10)*0.5); 4.} 复制代码 如果使用变量,则整个代码变得简洁: 1.Value1=High[1]+Average(Close,10)*0.5; 2.If(Close>Value1) 3.{ 4. Buy(100,Value1); 5.} 复制代码 如果一些表达式的组合经常在不同的公式中被调用,这个时候变量就不能实现功能,变量只能在单个公式的内部使用,这个时候我们需要建立用户函数来完成这些功能,详细说明参见用户函数(在TB软件里按F1便会出现联机帮助--公式系统--公式应用--用户函数)。 变量类型 TradeBlazer公式支持有三种基本数据类型: 数值型(Numeric)、字符串(String)、布尔型(Bool)。 为了通过用户函数返回多个值,我们对三种数据类型进行了扩展,增加了引用数据类型。 另外,为了对变量,参数进行回溯,我们增加了序列数据类型。 因此,我们的数据类型共有九种。 但对于变量定义,引用类型是无效的,剩余六种数据类型中分为简单和序列两大类,简单类型变量是单个的值,不能对其进行回溯,序列类型变量是和Bar长度一致的数据排列,我们可以通过回溯来获取当前Bar以前的任意值。 9种数据类型 Bool 布尔型。 BoolRef 布尔型引用。 BoolSeries 和周期长度一致的Bool型序列值。 Numeric 数值型。 NumericRef 数值型引用。 NumericSeries 和周期长度一致的Numeric型序列值。 String 字符串。 StringRef 字符串引用。 StringSeries 和周期长度一致的String型序列值。 变量声明 在使用变量之前,必须对变量进行声明,TradeBlazer公式使用关键字"Vars"来进行变量宣告,并指定变量类型。 可以选择赋默认值,也可以不赋默认值。 变量定义的语法如下: 1.Vars 2. 变量类型变量名1(初值); 3. 变量类型变量名2(初值); 4. 变量类型变量名3(初值); 复制代码 下面是一些变量定义的例子: 1.Vars 2. NumericSeries MyVal1(0); //定义数值型序列变量MyVal1,默认值为0; 3. Numeric MyVal2(0); //定义数值型变量MyVal2,默认值为0; 4. Bool MyVal3(False); //定义布尔型变量MyVal3,默认值为False; 5. String MyVal4("Test"); //定义字符串变量MyVal4,默认值为Test。 复制代码 变量定义的个数没有限制,变量名称的命名规范详细说明参见命名规则。 整个公式中只能出现一个Vars宣告,并且要放到公式的开始部分,在参数定义之后,正文之前。 变量的默认值 在声明变量时,通常会赋给变量一个默认值。 例如上例中的0,False,"Test"等就是变量的默认值。 如果某个变量没有赋予默认值,系统将会自动给该变量赋予默认值。 数值型变量的默认值为0,布尔型变量的默认值为False,字符串的默认值为空串。 变量的默认值是在当公式在执行时,给该变量赋予的初值,使该变量在引用时存在着有效的值。 在该公式每个Bar的执行过程中,改变量的默认值都会被重新赋值。 变量赋值 变量声明完成之后,您可以在脚本正文中给变量指定一个值。 语法如下: 1.Name=Expression; 复制代码 "Name"是变量的名称,表达式的类型可以是数值型、布尔型、字符串中的任何一种。 不过表达式的类型一定要和变量的数据类型相匹配。 如果变量被指定为是数值型的,那么表达式一定要是数值型的表达式。 例如: 下面的语句将Close的10周期平均值赋值给变量Value1: 1.Value1=Average(Close,10); 复制代码 在下面这个语句中,声明了一个名为"KeyReversal"的逻辑型变量,然后又把计算的值赋给它。 1.Vars 2. Bool KeyReversal(False); 3.Begin 4. KeyReversal=Low 5. ... 6.End 复制代码 变量使用 变量定义、赋值之后,在表达式中直接使用变量名就可以引用变量的值。 例如在下面的语句中计算了买入价格后,把值赋给数值型变量EntryPrc,在买入指令中便可直接应用变量名,通过变量名便可引用变量的值: 1.Vars 2. NumericEntryPrc(0); 3.Begin 4. EntryPrc=Highest(High,10); 5. If(MarkerPosition<>1) 6. { 7. Buy(1,EntryPrc); 8. } 9.End 复制代码 接下来的例子,我们计算最近10个Bar最高价中的最大值(不包括当前Bar),对比当前High,然后通过If语句,产生报警信息。 1.Vars 2. Bool Con1(False); 3.Begin 4. Con1=High>Highest(High[1],10); 5. If(Con1) 6. { 7. Alert("New10-barhigh"); 8. } 9.End 复制代码 其实我们并不一定都要应用条件为True的情况,有时候我们需要
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TradeBlazer 公式 入门教程