设为首页收藏本站

 找回密码
 注册
楼主: pwqzc

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

Rank: 1

精华
0
UID
632
积分
20
帖子
2
主题
0
阅读权限
10
注册时间
2007-10-28
最后登录
2007-10-31
发表于 2007-10-30 23:22:07 |显示全部楼层
谢谢斑竹啊,学到不少新东西,
期待继续

[ 本帖最后由 xaioyi257 于 2007-10-30 23:23 编辑 ]

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
发表于 2007-10-31 14:20:23 |显示全部楼层
我们现在来写一个飞狐的DMA函数
原文出自这里:
请编飞狐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的描述吧,这样清楚点:



很简单,我们可以看出,如果要写这个用户函数,则我们必须要先定义两个参数,
一个是上面的X,代表价格,我们用Price来表示,一个是N,代表动态因子,我们用Length来表示
当然,您可以用任意你喜欢的名字来表示;
好的,开始吧!
我们先新建一个用户函数,简称写DMA,名称写:求动态移动平均,分类选用户函数,模板任意(我选bool),然后确定;
出来如下东西:
Params
        Numeric Num(10);
Vars
        Bool Con1;
Begin
        Con1 = Close > Num;
        Return Con1;
End
我们把那些没用的东西删除,仅留下下面的内容
Params
       
Vars
       
Begin
       
End
在定义参数的时候我们首先考虑下参数的数据类型
我们先看价格参数,很明显我们应该把它定义为数值序列型,因为Close啊,Open...啊,都是数值序列型的
对于动态因子,同样简单,应该是数值型,于是,我们在Params关键字后面写定义参数的代码,如下:
Params
    NumericSeries Price(100);
    Numeric Length(0.5);
Vars
       
Begin
       
End
我们首先应该明白,我们写函数的目的是要他帮我们做点事情并且返回个什么东西给我们,所以我们
再定义一个变量ReturnValue,代表这个函数要返回的数据,到时候当这个函数执行完的时候我们就把这个东西返回给调用者
于是我们再在Vars后面定义一个变量ReturnVlaue,数据类型是数值序列型,因为每根K线上都有的,所以定义成序列型,代码如下:
Params
    NumericSeries Price(100);
    Numeric Length(0.5);
Vars
    NumericSeries ReturnValue(0);
Begin
       
End
好拉,现在我们开始写这个函数的工作代码了;
看看这个函数的意思,我们就很明白,今日的动态移动平均=昨日的动态移动平均*(1-动态因子)+今日的价格*动态因子;然后再把这个值Return返回就Ok了;
于是我们在Begin后面写代码:
Params
    NumericSeries Price(100);
    Numeric Length(0.5);
Vars
    NumericSeries ReturnValue(0);
Begin
    ReturnValue = ReturnValue[1]*(1-Length)+Price*Length;
    Return ReturnValue;
End

好了,这个函数就写好了啊,是不是very very 简单啊?
呵呵
但是细心的朋友可能会发现,这个函数还有点小问题,就是如果是第一根K线,那么这根K线的昨日的动态移动平均没有啊?
这样做是不是会出错啊?
对,非常对,会出错的啊,所以我们要先判断一下这根K线是不是第一根K线,用什么来判断是不是第一根K线呢?请看这个函数:
Integer BarStatus()
当前公式应用商品当前Bar的状态值,返回值0表示为第一个Bar,返回值为1表示为中间的普通Bar,返回值为2表示最后一个Bar。
呵呵,就用BarStatus这个函数,如果他返回0,就代表第一根K线啊
于是我们再改写完善上面的代码为:
//------------------------------------------------------------------------
// 简称: DMA
// 名称: 求动态移动平均
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
        NumericSeries Price(100);
    Numeric Length(0.5);
Vars
        NumericSeries ReturnValue(0);
Begin
    If(BarStatus==0)
    {
       ReturnValue = Price;//如果是第一根K线就直接把Price赋值
    }
    Else
    {
       ReturnValue = ReturnValue[1]*(1-Length)+Price*Length;
    }
    Return ReturnValue;
End

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


在编译这个用户函数的时候我碰到了一个小麻烦,大家都知道,我在上面新建这个函数的时候模板选择的是布尔型
所以我编译的时候老是提示:
C0122 Return语句的返回值类型与公式定义的返回值类型不符
非常郁闷,后面我在公式编辑器里面的文件----属性设置-----返回类型里面改成数值型确定后,再编译通过,
不知道这是不是TB的一个小Bug,难道模板决定一切?这是个很郁闷的问题啊

写这么久了,下次我们就整一个交易模型出来啊

[ 本帖最后由 pwqzc 于 2007-11-3 12:45 编辑 ]
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
发表于 2007-11-14 09:36:57 |显示全部楼层
这段时间,寒舍装修了一下,还有这段时间朋友的电脑出问题特别多,加之其他一些莫名其妙的问题,
让本文更新的速度极慢,连自己都感觉到很过意不去了,让我严肃的对大家说一声,用洋玩意儿来说一声:Sorry

这篇文章我将写一个简单的交易模型,说起交易模型,大家都会想到在K线上的那些信号箭头,但是对于TB,我似乎不喜欢这样做.
基于以下两点:
一是如果把K线比喻成多姿多彩的美女,那么这个信号箭头应该是这个美女头上的一朵花,但是TB的那些箭头我怎么看都不舒服,就好比妓女的叫床:哦啊快点,啊哦快点,让人兴奋但又无可奈何,恶心极了;
二是TB支持全自动下单,我对TB的这个方面还没有任何研究,且暂时现在也没有进行全自动交易的打算,没有调查就没有发言权啊,呵呵

俺不是学文学的,俺现在能够找到的唯一能够证明俺有那么一把刷子的东西就仅存一个初中毕业证了,不好,俺要回家看看才好,不会被俺小崽拿去折四角板玩吧?如果真是那样,我可要狠狠的批评且严肃的警告他:现在你把老子的毕业证折四角板玩,等你小学毕业了,老子要把你的毕业证拿来卷烟抽!

言归正题,我比较喜欢而且非常喜欢把交易模型做成变色的K线,红色代表买,绿色代表卖,非常的简单明了,但是一看就又很能明白是什么意思,K线本来就是一位大大的美女,如果把红色的K线练成一块,把绿色的K线练成一块,那是多少爽的一件事情啊!!!

于是我们就要先学会画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,简称随意,俺写成哈哈,类型随意选,模板空,确定,写下如下代码:

  1. //------------------------------------------------------------------------
  2. // 简称: MyKLine
  3. // 名称: 哈哈
  4. // 类别: 技术指标
  5. // 类型: 其它类
  6. // 输出:
  7. //------------------------------------------------------------------------

  8. Begin
  9.    if(CurrentBar>150)
  10.    {
  11.       //如果是第151根K线画绿色
  12.           PlotNumeric("High",High);
  13.       PlotNumeric("Low",Low);
  14.       PlotNumeric("Open",Max(Close,Open));
  15.       PlotNumeric("Close",Min(Close,Open));
  16.    }
  17.    Else
  18.    {
  19.       //如果是151根K线以前的Kurtosis线画红色
  20.           PlotNumeric("High",High);
  21.       PlotNumeric("Low",Low);
  22.       PlotNumeric("Close",Max(Close,Open));
  23.       PlotNumeric("Open",Min(Close,Open));
  24.    }
  25. End

  26. //------------------------------------------------------------------------
  27. // 编译版本        GS2004.06.12
  28. // 用户版本        2007/11/14 13:51
  29. // 版权所有        pwqzc
  30. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  31. //                        每一版本的TrabeBlazer公式修改和重写的权利
  32. //------------------------------------------------------------------------
复制代码

然后在文件---属性设置----默认-----默认显示改成主图显示,点编译按钮完成编译,然后再在超级图表里面调用这个技术指标,
娃哈哈,效果出来了咯!!
很爽对不?呵呵,但是如果你是个完美主义者,肯定你会发觉这中间稍有缺陷?在哪里?就是当K线是十字星的时候K线会是白色的拉.
怎么办?我们首先要明白为什么会出现这样的现象的原因是收盘价=开盘价的时候会出现这样的问题.那么如何去解决这个问题呢?
有两种方法:第一种是强烈要求TB修改系统的底层去实现,怕怕.
还有就是自己向办法实现,nopain老大提供了个思路,very very good!真的是长江后浪推前浪,前浪死在沙滩上啊,俺们老了,还是nopain这样的年轻人脑子反应快咯~~~
下面是按照nopain老大的思路实现的代码:

  1. //------------------------------------------------------------------------
  2. // 简称: MyKLine
  3. // 名称: 哈哈
  4. // 类别: 技术指标
  5. // 类型: 其它类
  6. // 输出:
  7. //------------------------------------------------------------------------
  8. Vars
  9.    Numeric OpenIsClose;//当开盘等于收盘价的时候
  10. Begin
  11.    if(CurrentBar>150)
  12.    {
  13.       //如果是第151根K线画绿色
  14.           PlotNumeric("High",High);
  15.       PlotNumeric("Low",Low);
  16.           if(Open==Close)
  17.           {
  18.                   //如果收盘价等于开盘价
  19.                   OpenIsClose = Close-PriceScale*MinMove;
  20.                   PlotNumeric("Open",Open);
  21.                   PlotNumeric("Close",OpenIsClose);
  22.           }
  23.           Else
  24.           {
  25.          PlotNumeric("Open",Max(Close,Open));
  26.          PlotNumeric("Close",Min(Close,Open));
  27.           }
  28.    }
  29.    Else
  30.    {
  31.       //如果是151根K线以前的Kurtosis线画红色
  32.           PlotNumeric("High",High);
  33.       PlotNumeric("Low",Low);
  34.           if(Open==Close)
  35.           {
  36.                   OpenIsClose = Close+PriceScale*MinMove;
  37.                   PlotNumeric("Close",OpenIsClose);
  38.                   PlotNumeric("Open",Open);
  39.           }
  40.           Else
  41.           {
  42.          PlotNumeric("Close",Max(Close,Open));
  43.          PlotNumeric("Open",Min(Close,Open));
  44.           }
  45.    }
  46. End

  47. //------------------------------------------------------------------------
  48. // 编译版本        GS2004.06.12
  49. // 用户版本        2007/11/14 13:51
  50. // 版权所有        pwqzc
  51. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  52. //                        每一版本的TrabeBlazer公式修改和重写的权利
  53. //------------------------------------------------------------------------
复制代码

上面有两个函数PriceScale和MinMove,他们相乘的结果得到当前品种的最小变动价位,比如铜是10,胶是5......(这两个函数的具体意义以及他们的乘积为什么会得到这个结果请看TB的函数帮助)
也就是说当开盘==收盘的时候在收盘价的基础上上下浮动一个变动价位来画K线,呵呵大家看下效果,是不是很完美的解决了这个问题呢?

本想晚上继续,但是晚上约了个客户,完后又上同事家弄电脑,我完全被郁闷死了,那个讨嫌的没有半点良心的雨过天晴电脑保护系统可把我害死了!记得我买那个硬盘的时候硬盘厂家送了个雨过天晴保护系统,明明说可以使用一年,但是3个月后就提示到期了无法使用了,于是只好卸载雨过天晴,在卸载过程中我选择了回复电脑到最开始的状态,当重新启动后,我的大脑一片空白!!!!!!天啊,所有的数据没有了!!!!!!花了几个小时才把数据找回,到半夜12点才完全弄好,本来俺的睡眠就非常差劲,于是......

不说了,我们有了上面的画变色K线的基础,现在来做个简单的变色K线系统吧,是非常非常简单的;
曾听说有人用两条均线打天下,我们就做这个打天下的变色K线交易模型;
假设两条均线是5日均线和10日均线,于是就有两个变量,MaFive和MaTen,5日上穿10日买,5日下穿10日卖;
写成代码如下:
  1. //------------------------------------------------------------------------
  2. // 简称: MyKLine
  3. // 名称: 哈哈
  4. // 类别: 技术指标
  5. // 类型: 其它类
  6. // 输出:
  7. //------------------------------------------------------------------------
  8. Vars
  9.    Numeric OpenIsClose;//当开盘等于收盘价的时候
  10.    NumericSeries MaFive;//5日均线
  11.    NumericSeries MaTen;//10日均线
  12. Begin
  13.    MaFive = SAverage(Close,5);//5天移动平均
  14.    MaTen = SAverage(Close,10);//10天移动平均
  15.    if(MaFive<MaTen)
  16.    {
  17.       //如果是第151根K线画绿色
  18.           PlotNumeric("High",High);
  19.       PlotNumeric("Low",Low);
  20.           if(Open==Close)
  21.           {
  22.                   //如果收盘价等于开盘价
  23.                   OpenIsClose = Close-PriceScale*MinMove;
  24.                   PlotNumeric("Open",Open);
  25.                   PlotNumeric("Close",OpenIsClose);
  26.           }
  27.           Else
  28.           {
  29.          PlotNumeric("Open",Max(Close,Open));
  30.          PlotNumeric("Close",Min(Close,Open));
  31.           }
  32.    }
  33.    Else If(MaFive>MaTen)
  34.    {
  35.       //如果是151根K线以前的Kurtosis线画红色
  36.           PlotNumeric("High",High);
  37.       PlotNumeric("Low",Low);
  38.           if(Open==Close)
  39.           {
  40.                   OpenIsClose = Close+PriceScale*MinMove;
  41.                   PlotNumeric("Close",OpenIsClose);
  42.                   PlotNumeric("Open",Open);
  43.           }
  44.           Else
  45.           {
  46.          PlotNumeric("Close",Max(Close,Open));
  47.          PlotNumeric("Open",Min(Close,Open));
  48.           }
  49.    }
  50. End

  51. //------------------------------------------------------------------------
  52. // 编译版本        GS2004.06.12
  53. // 用户版本        2007/11/14 13:51
  54. // 版权所有        pwqzc
  55. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  56. //                        每一版本的TrabeBlazer公式修改和重写的权利
  57. //------------------------------------------------------------------------
复制代码


好了,编译,然后插入这个技术指标,看看效果,天啊,效果是非常的不错的拉!!!
呵呵;
请注意上面的一个函数:SAverage的帮助说明:
Numeric SAverage(NumericSeries Price,Numeric Length)
比如:
SAverage (Close, 12); 计算12周期以来的收盘价的平滑平均值;
该函数计算指定周期内的数值型序列值的平滑平均值,返回值为浮点数;
当序列值的CurrentBar小于Length时,该函数返回无效值

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

使用道具 举报

Rank: 6Rank: 6

精华
0
UID
232
积分
1532
帖子
152
主题
6
阅读权限
70
注册时间
2007-8-31
最后登录
2019-3-31
发表于 2007-11-14 10:27:52 |显示全部楼层

谢谢了

谢谢了,又解决一个问题
当你退回到根本原来这一切都已经只是有障眼法
水无形而利万物

使用道具 举报

Rank: 1

精华
0
UID
757
积分
21
帖子
6
主题
0
阅读权限
10
注册时间
2007-11-15
最后登录
2008-4-15
发表于 2007-11-15 19:41:04 |显示全部楼层
不错不错,真的不错,向楼主学习一下

使用道具 举报

初级大户

公安部御准--超级警察 ...

Rank: 5Rank: 5

精华
0
UID
690
积分
1069
帖子
188
主题
59
阅读权限
60
注册时间
2007-11-6
最后登录
2023-1-26
发表于 2007-11-16 14:17:10 |显示全部楼层
:@ :@
楼主的更新速度要加强啊,这么多弟兄瞪着你那
我知道。。。。。。我很帅!!

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
发表于 2007-11-16 15:20:39 |显示全部楼层
仅仅是[fly]...[/fly]是飞不起来的啊

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
826
积分
1407
帖子
118
主题
46
阅读权限
60
注册时间
2007-11-25
最后登录
2013-12-24
发表于 2007-12-1 17:22:08 |显示全部楼层

不敢苟同:

我自己办了一个饲料公司,我需要的是生产设备的公司给我生产的先进的机械,我可以了解该机械的原理,工作流程,操作规范,维修方法等,但我应该自己去生产饲料机械吗,不---坚决不应该,那实际上是浪费,对自己时间的浪费,对别人专业的蔑视,我始终认为,每个人应该在自己范围内,把专业做到极致,那就是成功,对于需要别人帮助的自己非专业的东西,那一定要别人帮忙,我相信墨菲如果去做期货,他也要请人写程序-------此为笑谈,请不要当真.

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
862
积分
124
帖子
21
主题
3
阅读权限
40
注册时间
2007-12-2
最后登录
2019-4-1
发表于 2007-12-3 00:13:34 |显示全部楼层
人各有志,就我而言,凡是和期货有关的都是我的专业范围,强烈顶贴!

使用道具 举报

Rank: 1

精华
0
UID
792
积分
13
帖子
1
主题
0
阅读权限
10
注册时间
2007-11-20
最后登录
2019-4-5
发表于 2007-12-7 10:26:31 |显示全部楼层
楼主辛苦了! 向楼主好好学习!!

使用道具 举报

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

bottom

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

GMT+8, 2024-4-19 06:02

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部