开拓者期货期权程序化系统交易论坛

标题: 新建用户函数,对应文华,飞狐等的相关函数 [打印本页]

作者: pwqzc    时间: 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 编辑 ]
作者: pwqzc    时间: 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 编辑 ]
作者: pwqzc    时间: 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 编辑 ]
作者: pwqzc    时间: 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公式修改和重写的权利
//------------------------------------------------------------------------
作者: zzgmm888    时间: 2007-9-29 16:48:30

直接作成系统函数就好。
作者: wg3k99    时间: 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 编辑 ]
作者: nopain    时间: 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线的索引。
作者: wg3k99    时间: 2007-10-1 15:01:16

那我还有个问题,当在编写系统交易公式或者平台整理等公式时,如果需要调用HHV()函数,那么怎样给它传递参数呢?
作者: nopain    时间: 2007-10-1 15:36:43

HHV(Close,10),求10周期的Close的最大值。
也可直接用Highest(Close,10),差别就在前面10个Bar是否有效。
作者: wg3k99    时间: 2007-10-1 16:48:36

是不是可以这样理解:
1,在创建一个用户函数时候,定义的参数顺序,对应调用这个用户函数时候,给它传递实参的顺序,比如上例子中:HHV(Close,10),其中Close对应Price,10对应:Length
作者: nopain    时间: 2007-10-1 16:56:20

是的,建议您看看帮助文件中关于参数和变量的部分。加深理解!
作者: sandsky1977    时间: 2007-10-9 23:19:40

能否提供EMA函数?
作者: nopain    时间: 2007-10-10 11:21:51

EMA是指数平均么?
如果是XAverage就可以代替
作者: ccirsi    时间: 2007-10-17 17:56:56

请编飞狐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)
表示求以该周期震幅为平滑因子的平均价
作者: pwqzc    时间: 2007-10-21 09:29:47

写好了,很抱歉,让您等这么久!sorry
请见:
http://www.tradeblazer.net/forum/viewthread.php?tid=588&page=3&extra=page%3D1

[ 本帖最后由 pwqzc 于 2007-11-3 12:49 编辑 ]
作者: ccirsi    时间: 2007-12-6 15:20:33

请编文华函数TRMA和TSMA


TRMA(X,N),求X在N周期内的三角移动平均。
三角的计算方法:第1种可能先算(奇数+1)/2周期移动平均,得出值再算这个值的(奇数+1)/2周期的移动平均。第2种可能先算偶数/2周期移动平均,得出值再算这个值的(偶数/2+1)周期的移动平均。




TSMA(X,N) 求X在N周期内的时间序列移动平均。
计算方法:TSMA(X,N)= FOCAST(X,N)+SLOPE(X,N)

[ 本帖最后由 ccirsi 于 2007-12-6 15:24 编辑 ]
作者: wg3k99    时间: 2007-12-15 18:40:07

建议直接写成系统函数,提高运行效率,也能方便使用
作者: slpb    时间: 2008-2-15 16:11:10

能否提供“当前返回第几根K线”“线性回归预测值”“协方差”“标准差”“相关系数”的函数
作者: nopain    时间: 2008-2-15 16:17:33

您应该仔细看看用户函数的帮助,您说的好像大部分都有
作者: slpb    时间: 2008-2-15 16:23:14

那还真不错
作者: b8866    时间: 2008-3-5 18:39:30

在检验保存公式时Return返回值类型和公式定义的返回值不符?
//------------------------------------------------------------------------
// 简称: 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公式修改和重写的权利
//------------------------------------------------------------------------
作者: tradeblazer    时间: 2008-3-5 22:08:07

用户函数的属性设置里面,返回值类型选择数值型
作者: yk1234    时间: 2008-3-25 10:17:47     标题: 回复 #3 pwqzc 的帖子

文华的SMA请参考

http://www.tradeblazer.net/forum/thread-1472-3-1.html
作者: ctishen    时间: 2008-8-11 10:23:15     标题: VALUEWHEN这个函数很好,几乎所有的交易系统都包含。

VALUEWHEN这个函数很好,几乎所有的交易系统都包含。帮忙建一个,谢谢!!

VALUEWHEN(COND,DATA)
当条件COND满足时,取当时的DATA的值,否则取得VALUEWHEN的前一个值。

作者: QQ985200780    时间: 2010-10-23 14:25:01

比模型 看起来 复杂的多,偶还得在这多学学
作者: bjzq8650299    时间: 2013-12-8 13:00:37

pwqzc 发表于 2007-9-24 19:17
//------------------------------------------------------------------------
// 简称: LLV
// 名称: 求N ...

收了 学习
作者: fly1398    时间: 2016-12-13 14:03:47

在开始学习了,谢谢!琢磨了好久,终于弄明白了HHV函数例子的运行原理。




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2