设为首页收藏本站

 找回密码
 注册
查看: 29626|回复: 26
打印 上一主题 下一主题

新建用户函数,对应文华,飞狐等的相关函数 [复制链接]

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
跳转到指定楼层
1#
发表于 2007-9-24 19:17:20 |只看该作者 |倒序浏览
如果您需要什么函数,请提出
但是为了阅读的方便,您的提问将在函数写出后删除;

//------------------------------------------------------------------------
// 简称: HHV
// 名称: 求N周期的最高值
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
        NumericSeries Price(0);
        Numeric Length(5);
Vars
        NumericSeries highestValue(0);
Begin
        If(CurrentBar < Length -1)
        {
               
                        highestValue=Highest(Price,CurrentBar+1);
     
        }Else
        {
                        highestValue = Highest(Price,Length);
        }
        Return highestValue;
End


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


根据轮回老大的建议并且参考他的代码,重新写下成如下的HHV,这个HHV有几个好处:
1,速度快,2,支持以变量作为周期传递

  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. //------------------------------------------------------------------------
复制代码

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

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
2#
发表于 2007-9-24 19:17:43 |只看该作者
//------------------------------------------------------------------------
// 简称: LLV
// 名称: 求N周期的最低值
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
        NumericSeries Price(0);
        Numeric Length(5);
Vars
        NumericSeries lowestValue(0);
Begin
        If(CurrentBar < Length -1)
        {
               
                        lowestValue = Lowest(Price,CurrentBar+1);
     
        }Else
        {
                        lowestValue = Lowest(Price,Length);
        }
        Return lowestValue;
End


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


根据轮回老大的建议并且参考他的代码,重新写下成如下的HHV,这个HHV有几个好处:
1,速度快,2,支持以变量作为周期传递
  1. //------------------------------------------------------------------------
  2. // 简称: LLV
  3. // 名称: 求N周期的最低值
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------
  8. Params
  9.    NumericSeries Price(0);
  10.    Numeric Length(5);
  11. Vars
  12.    Numeric lowestValue(10000000);
  13.    Numeric minDay;
  14.    Numeric i;
  15. Begin
  16.    minDay = Min(CurrentBar,Length-1);
  17.    for i=0 to minDay
  18.    {
  19.           lowestValue=Min(lowestValue,Price[i]);
  20.    }
  21.    Return lowestValue;
  22. End


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

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

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
3#
发表于 2007-9-24 19:17:56 |只看该作者
看了下文华和飞狐的SMA的说明,严格的说来,SMA不能够称为加权移动平均线,而应该称为指数平滑移动平均线
关于指数平滑移动平均线,书上是这样说的:
指数平滑移动平均线的计算方法是(以5日收盘价指数平滑移动平均线为例):
首先以算术平均计算出前5日的简单算术平均,从第六日开始的指数平滑移动平均线的算法是:
SMA6 = SMA5*4/5+CLOSE*5/4;
所以写成下面的代码:

//------------------------------------------------------------------------
// 简称: SMA
// 名称: 求N周期的指数平滑移动平均
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
        NumericSeries Price(1);  
        Numeric Length(10);
        Numeric Weight(1);
Vars
        NumericSeries SMAValue;
Begin
        If ( CurrentBar < Length || SMAValue[1] == InvalidNumeric)
        {
        SMAValue = Summation(Price, CurrentBar+1)/(CurrentBar+1);
        }Else
        {
        SMAValue = (SMAValue[1]*(Length-Weight)+Price*Weight)/Length;
        }
        Return SMAValue;
End

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

[ 本帖最后由 pwqzc 于 2007-9-24 21:57 编辑 ]

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
4#
发表于 2007-9-25 08:42:58 |只看该作者
加权移动平均线WMA,请区别SMA,WMA的计算方法是:
假设求5日的收盘价的WMA
WMA5=(一天CLOSE*1+第二天CLOSE*2+..+第五天CLOSE*5)/(1+2+3+4+5)
在TB里面,加权移动平均的用户函数是WAverage,但是这个函数有个缺点,就是假设求5天的加权移动平均
那么前面四根K线他会输出N/A,
我修改了一下,如果K线数量小于Length,则仅求前面K线数量的加权平均

//------------------------------------------------------------------------
// 简称: WMA
// 名称: 求N周期的加权移动平均
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------

Params
        NumericSeries Price(1);  
        Numeric Length(10);
Vars
        NumericSeries WMAValue;
Begin
        If ( CurrentBar < Length - 1 || WMAValue[1] == InvalidNumeric)
        {
                   WMAValue = WAverage(Price,CurrentBar+1);
        }Else
        {
           WMAValue = WAverage(Price,Length);
        }
        Return WMAValue;
End


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

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
156
积分
130
帖子
23
主题
3
阅读权限
40
注册时间
2007-8-20
最后登录
2019-3-31
5#
发表于 2007-9-29 16:48:30 |只看该作者
直接作成系统函数就好。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
314
积分
1160
帖子
247
主题
105
阅读权限
60
注册时间
2007-9-9
最后登录
2008-3-3
6#
发表于 2007-10-1 12:33:17 |只看该作者
说实话:看不太懂,我也会编程啊。。。可是还是看不懂。。。

比如:在HHV函数中,你定义了一个参数,Price,默认值是0,然后在Highest函数中引用了这个参数,我看了关于Highest函数的介绍后就不太明白了,这里Price是干什么的,代表:High,Close,Open还是????

另外:if(CurrentBar < Length-1) 这一句作何解释,用来起什么作用啊???另外:CurrentBar是K线的索引,那么它是从0开始的吗?

[ 本帖最后由 wg3k99 于 2007-10-1 12:41 编辑 ]

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
7#
发表于 2007-10-1 14:11:04 |只看该作者
Price是一个序列变量的名称,因为是序列变量,所以初值是无意义的,因为TB的语法要求参数必须赋初值,所以随便填了个0。当Highest被其它公式调用时,传入一般为High,Close,Open,Low这样的值,当然也可以是其它任意的序列变量。

if(CurrentBar < Length-1)这句话主要来控制当K线数目不够时的特殊处理。举个例子吧,您求5个周期的平均值。但是当CurrentBar =0,1,2,3时,这个时候,有效的K线还不够5个,所以需要进行一些特殊的处理。

CurrentBar从0开始计数,是K线的索引。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
314
积分
1160
帖子
247
主题
105
阅读权限
60
注册时间
2007-9-9
最后登录
2008-3-3
8#
发表于 2007-10-1 15:01:16 |只看该作者
那我还有个问题,当在编写系统交易公式或者平台整理等公式时,如果需要调用HHV()函数,那么怎样给它传递参数呢?

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
9#
发表于 2007-10-1 15:36:43 |只看该作者
HHV(Close,10),求10周期的Close的最大值。
也可直接用Highest(Close,10),差别就在前面10个Bar是否有效。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
314
积分
1160
帖子
247
主题
105
阅读权限
60
注册时间
2007-9-9
最后登录
2008-3-3
10#
发表于 2007-10-1 16:48:36 |只看该作者
是不是可以这样理解:
1,在创建一个用户函数时候,定义的参数顺序,对应调用这个用户函数时候,给它传递实参的顺序,比如上例子中:HHV(Close,10),其中Close对应Price,10对应:Length

使用道具 举报

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

bottom

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

GMT+8, 2024-4-26 06:49

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部