设为首页收藏本站

 找回密码
 注册
楼主: pwqzc

从一无所知开始学习TB编程 [复制链接]

Rank: 2

精华
0
UID
447
积分
92
帖子
1
主题
0
阅读权限
30
注册时间
2007-9-29
最后登录
2007-12-12
发表于 2007-10-5 00:20:08 |显示全部楼层
从头学起,感谢版主细心+耐心教我这样一点基础都没有的学生

使用道具 举报

Rank: 4

精华
0
UID
41
积分
498
帖子
67
主题
8
阅读权限
50
注册时间
2007-7-25
最后登录
2019-3-24
发表于 2007-10-7 06:49:57 |显示全部楼层
看了,学了,收获不少,不断消化ING。。。
谢谢斑竹!


但是编程不是一件很容易的事情,当然,如果您入门了,你会发觉TB编程其实和泡妞一样的简单,就看你敢不敢下手了

如1688是数值型数据,但是"1688"就是字符串类型的数据了啊

说白点,布尔型就是真假型,意思就是布尔类型的数据只能取真(True)或假(False)值.

序列这个东西看起来很难理解
想个办法来理解他吧
比如我们的K线图上有10跟K线,Close大家知道吧,就是收盘价
但是这个Close包含了第一根K线的收盘价,也包含了第二根K线的收盘价.......一直包含到第五根K线的收盘价
也就是说序列型的数据在没根K线上都有一个值的

在TB里面变量都是要先定义的!而且有着他独到的定义方法,而且这个定义必须放到Begin的前面

那么变量b呢?我们没有用括号()扩个东西啊,那么这个时候b这个变量等于什么呢?
很简单,如果你在定义变量的时候没有给他初值,那么b这个时候等于0咯
好了
再看在Begin里面怎么修改这个变量的值
Vars
  Numeric a(2);
  Numeric b;
  //.........更多变量定义
Begin
  a = 3;
  b = 100;
End


现在大家应该知道了变量是什么东西了吧
对了,忘记告诉大家了,在Begin下面给变量复制仅仅只对当前正在执行你的代码的K线有效咯,到下一根K线他就是初始值了啊
写个例子吧
Vars
  Numeric a(100);//定义一个变量,类型是数值类型,变量名字是a,变量的初始值是100
Begin
  if(CurrentBar == 0)//如果是第一根K线,就把变量a的值变为1
  {
      a = 1;
   }
  FileAppend("C:\\a.Log",Text(a));
End

我们再来看看输出结果:
1
100
100
100
100
我们再来理解下这个结果(当然这个时候我们的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;
就是把9赋给变量b
我们在日常中一直把=当成等于,千万急着在TB里面=就是赋值!!!
真正的等于的符号是==
if(a==b)//就是如果a等于b
{
   //做某件事情
}

[ 本帖最后由 东方 于 2007-10-7 07:00 编辑 ]

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
发表于 2007-10-10 08:43:22 |显示全部楼层
本帖最后由 pwqzc 于 2013-10-9 16:47 编辑

现在我们说说TB中的流程控制
流程控制就是控制代码执行的流程
还说的明白点就是如果满足什么样的条件就做什么事情
或者不满足什么条件的时候做什么事情
简单说流程控制就是控制语句控制代码

控制语句中分为逻辑控制语句(就是条件控制语句)和循环控制语句
条件控制语句中大家记住If这个关键字,翻译成中文就是如果
循环控制语句中大家记住For,就是开始循环了

先说If.
假设一个这样的条件:
如果(收盘价>开盘价)
  则输出:今日收红阳线
我们先把这个东西翻译成TB
如果翻译成If
收盘价和开盘价大家都知道会翻译成Close和Open
输出语句就是FileAppend,则翻译成TB就是:
If(Close>Open)
  {
     FileAppend("c:\\a.log","今日收红阳线");
  }
是不是很简单呢?
大家记住一点,凡是if(如果)语句中的代码,都给我用{}括起来
我们再把上面的条件加上一点:
如果(收盘价>开盘价)
  则输出:今日收红阳线
否则如果(收盘价==开盘价)
  则输出:今日收十字线
我们再翻译成TB,把否则翻译成Else,如果翻译成If
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","今日收十字线");
  }
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语句的语法格式:
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周期的最高值
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
   NumericSeries Price(0);
   Numeric Length(5);
Vars
   Numeric highestValue(0);
   Numeric minDay;
   Numeric i;
Begin
   minDay = Min(CurrentBar,Length-1);
   for i=0 to minDay
   {
           highestValue=Max(highestValue,Price);
   }
   Return highestValue;
End


//------------------------------------------------------------------------
// 编译版本        GS2004.06.12
// 用户版本        2007/09/24 08:29
// 版权所有        pwqzc
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------

[ 本帖最后由 pwqzc 于 2007-10-13 11:15 编辑 ]

使用道具 举报

Rank: 2

精华
1
UID
35
积分
111
帖子
22
主题
5
阅读权限
30
注册时间
2007-7-24
最后登录
2012-10-28
发表于 2007-10-17 07:24:03 |显示全部楼层
谢谢版主,深入浅出,请继续呀!
新年祝语: 少碰止损 多碰止盈

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
发表于 2007-10-17 08:27:22 |显示全部楼层
谢谢
虽然很忙
但是我会争取每礼拜更新一篇
下次说参数与函数

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
377
积分
1827
帖子
222
主题
29
阅读权限
70
注册时间
2007-9-19
最后登录
2021-12-9
发表于 2007-10-18 19:09:03 |显示全部楼层
大哥 我们以后就跟你混了

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
201
积分
1356
帖子
197
主题
8
阅读权限
60
注册时间
2007-8-26
最后登录
2013-11-2
发表于 2007-10-18 23:19:13 |显示全部楼层
继续学习!  

使用道具 举报

Rank: 2

精华
0
UID
543
积分
73
帖子
17
主题
4
阅读权限
30
注册时间
2007-10-15
最后登录
2019-4-5
发表于 2007-10-19 09:02:40 |显示全部楼层
谢谢,加快进度,喜欢看你的东东,深入浅出!!

使用道具 举报

Rank: 2

精华
0
UID
574
积分
63
帖子
6
主题
1
阅读权限
30
注册时间
2007-10-20
最后登录
2007-10-28
发表于 2007-10-20 23:27:58 |显示全部楼层
谢谢!通俗易懂!有点明白了.

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
发表于 2007-10-21 10:03:24 |显示全部楼层
现在说说参数与函数,说完了这个东西,就要进入实践阶段了咯,就要准备开始实打实的独立编写指标了
首先我们必须明白,参数仅仅存在于函数里面,如果函数里面存在着参数,那么当你调用这个函数的时候必须要先传递参数给这个函数

看起来似乎有点深奥和晦涩,那么我们先来明白函数是什么就很容易明了
函数就是帮助我们完成某一件事情,并且完成这件事情以后会返回个东西给我们的一个方法.
比如一个这样的函数请注意,这仅仅是个假想的函数,仅为了帮助理解函数是什么):
GetCloseFromTrader
我们就很明白,这个函数就是帮助我们到交易所跑一趟,然后把收盘价返回给我们;
有点明白了吧,但是仔细一想,这个东西似乎有点问题,比如返回收盘价,晕死,交易所
那么多的品种,且每个品种都有那么多的月份,他到底返回的是什么东西的收盘价啊?
呵呵,那么我们这样写:
GetCloseFromTrader(Cu0801)
现在应该完全明白了,这个函数就是从交易所返回某个品种的收盘价,到底是什么品种什么月份的收盘价呢?
Cu0801就是拉.
其实,这里面的Cu0801就是这个函数所需要的参数!
我们于是就可以这样理解:函数是帮助用户完成某一件事情且返回用户所需要的数据的方法;
那么参数呢?参数就是参到函数里面去的数,也就是说必须要传递给函数的数;
我们现在不要求一定能够自己写函数,但是必须要懂得的是要看懂这个函数是做什么用的,且知道如何去调用这个函数!

我们先看看下面的这个函数,这个函数的名字叫:HHV,是根据轮回老大的建议改写的,我们必须要读懂这个函数,且知道怎么样去
调用这个函数,如果真懂了,这课就圆满的完成了!
  1. //------------------------------------------------------------------------
  2. // 简称: HHV
  3. // 名称: 求N周期的最高值
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params
  9.    NumericSeries Price(0);
  10.    Numeric Length(5);
  11. Vars
  12.    Numeric highestValue(0);
  13.    Numeric minDay;
  14.    Numeric i;
  15. Begin
  16.    minDay = Min(CurrentBar,Length-1);
  17.    for i=0 to minDay
  18.    {
  19.            highestValue=Max(highestValue,Price[i]);
  20.    }
  21.    Return highestValue;
  22. End


  23. //------------------------------------------------------------------------
  24. // 编译版本        GS2004.06.12
  25. // 用户版本        2007/09/24 08:29
  26. // 版权所有        pwqzc
  27. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  28. //                        每一版本的TrabeBlazer公式修改和重写的权利
  29. //------------------------------------------------------------------------
复制代码
我们一行一行的读,一行一行的理解;
首先我们都知道,//后面的代表是注释,什么是注释?我狂晕!
通过注释我们可以粗略的明白这个函数是干什么的?代表了什么意思:
这个函数的名字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;

再看代码:
  1. for i=0 to minDay
  2.    {
  3.            highestValue=Max(highestValue,Price[i]);
  4.    }
复制代码
很明显,这是一个前面我们所说的For循环,在For循环里面我们必须要先定义一个变量i(可以是其他名字),代表从什么基数开始循环;
于是再到定义变量的地方去定义这个i变量:
Vars
   Numeric highestValue(0);
   Numeric minDay;
   Numeric i;
再看这个For循环,
当i是0的时候,看这个时候0是不是小于等于最小周期minDay,如果条件成立,就执行:
  1. highestValue=Max(highestValue,Price[i]);
复制代码
Price[0]代表今天的价格,先比较今天的价格和最高值,取最大的那个保存;再把i+1
于是这个时候i为1了,再比较是不是小于等于最小周期minDay,如果条件成立,再执行:
  1. highestValue=Max(highestValue,Price[i]);
复制代码
这个时候Price[1]就代表了昨天的价格,把昨天的价格和保存的最高值比较,取他们的最高的那个再次保存;
依次循环,我们是不是就得到了某个周期某个价格的最高值了呢?
呵呵
最后面,我们用代码:
Return highestValue;
把这个得到的最高值返回给用户,Return就是返回拉.

明白了吗?
调用这个函数的时候就更简单了,比如求10个周期的收盘价的最高值:
HHV(Close,10);
求20个周期的最高价的最高值:
HHV(High,20);
呵呵
大家在看看和分析这个文章里面的函数就会完全明白了的
http://www.tradeblazer.net/forum/thread-520-1-1.html

[ 本帖最后由 pwqzc 于 2007-10-21 10:04 编辑 ]

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-3-29 12:36

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部