设为首页收藏本站

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

Highest函数当第二个参数为变量时无法返回准确值 [复制链接]

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
跳转到指定楼层
1#
发表于 2007-10-4 14:37:27 |只看该作者 |倒序浏览
今日在写一个指标的时候老是感觉什么地方不对
后来用FileAppend函数一行一行调试
终于发现了问题
但是我无法解决这个问题
恳请老大们能够帮忙
非常感谢

比如下面的代码,假设FlagToToday已经定义为数值型变量
FlagToToday = 20;
         FileAppend("C:\\a.Log",Text(Month)+"月"+Text(Day)+"日,全局索引是"+Text(GetGlobalVar(1))+"FlagToToday的值是"+Text(FlagToToday)+"最高收盘价是"+Text(Highest(Close,FlagToToday)));
         FileAppend("C:\\a.Log","");//换行
         FlagToToday = CurrentBar-GetGlobalVar(1)+1;
         FileAppend("C:\\a.Log",Text(Month)+"月"+Text(Day)+"日,全局索引是"+Text(GetGlobalVar(1))+"FlagToToday的值是"+Text(FlagToToday)+"最高收盘价是"+Text(Highest(Close,FlagToToday)));

按理说,如果当CurrentBar-GetGlobalVar(1)+1的值等于20的时候,输出的最高收盘价两条语句应该是一样的
但是实际情况不是这样的,第二条语句输出的是从数据开始的第一天到当前Bar的最高收盘价

一直不得其解,恳请各位老大能够帮忙,真不知道是什么地方的故障l了
谢谢

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
2#
发表于 2007-10-4 14:45:20 |只看该作者
此代码非常准确的取到了CurrentBar和GetGlobalVar的值
也很准确的吧CurrentBar-GetGlobalVar(1)+1的值赋给了FlagToToday
但是执行Highest(Close,FlagToToday)的时候就出现问题

为了便于观察我吧代码重新写写:
FlagToToday = 20;
         FileAppend("C:\\a.Log",Text(Month)+"月"+Text(Day)+"日,全局索引是"+Text(GetGlobalVar(1))+"当前索引是"+Text(CurrentBar)+"FlagToToday的值是"+Text(FlagToToday)+"最高收盘价是"+Text(Highest(Close,FlagToToday)));
         FlagToToday = CurrentBar-GetGlobalVar(1)+1;
         FileAppend("C:\\a.Log",Text(Month)+"月"+Text(Day)+"日,全局索引是"+Text(GetGlobalVar(1))+"当前索引是"+Text(CurrentBar)+"FlagToToday的值是"+Text(FlagToToday)+"最高收盘价是"+Text(Highest(Close,FlagToToday)));
         FileAppend("C:\\a.Log","");//换行

输出结果如下:
3月9日,全局索引是769当前索引是788FlagToToday的值是20最高收盘价是3393
3月9日,全局索引是769当前索引是788FlagToToday的值是20最高收盘价是3948

很明显,FlagToToday的值都是20,那么输出的最高收盘价应该是一样的
但是结果不是这样
请问是什么原因呢?
非常感谢

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
3#
发表于 2007-10-4 15:38:51 |只看该作者
是这样的,当Highest,Lowest第二个参数为变量时,须采取不优化的算法,就类似于Average和AverageFC一样。只是以前的系统里面没有用到Highest为周期参数变量的情况,所以没有提供这个版本。

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
4#
发表于 2007-10-4 16:38:39 |只看该作者
谢谢nopain
请问老大的意思是不是自己去解决这个问题?
好像TB没有提供类似的函数啊

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
20
积分
810
帖子
153
主题
19
阅读权限
60
注册时间
2007-7-22
最后登录
2013-7-9
5#
发表于 2007-10-4 17:11:40 |只看该作者
用我贴的HHV和LLV试一试.
天生我才必有用
不拘一格交英才

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
6#
发表于 2007-10-4 17:36:26 |只看该作者
感谢轮回
吧你的代码稍微修改了下:

  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 val;
  14.    Numeric i;
  15. Begin
  16.    val = Min(CurrentBar,Length-1);      
  17.    for i=0 to val
  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. //------------------------------------------------------------------------

  30. //------------------------------------------------------------------------
  31. // 简称: LLV
  32. // 名称: 求N周期内的最低价
  33. // 类别: 用户函数
  34. // 类型: 用户函数
  35. // 输出: 数值型
  36. //------------------------------------------------------------------------
  37. Params
  38.    NumericSeries Price(0);
  39.    Numeric Length(5);
  40. Vars
  41.    Numeric lowestValue(10000000);
  42.    Numeric val;
  43.    Numeric i;
  44. Begin
  45.    val = Min(CurrentBar,Length-1);        
  46.    for i=0 to val
  47.       {
  48.               lowestValue=Min(lowestValue,Price[i]);
  49.       }
  50.    Return LowestValue;
  51. End
  52. //------------------------------------------------------------------------
  53. // 编译版本        GS2004.06.12
  54. // 用户版本        2007/10/04 17:12
  55. // 版权所有        pwqzc
  56. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  57. //                        每一版本的TrabeBlazer公式修改和重写的权利
  58. //------------------------------------------------------------------------
复制代码


现在测试看他支持变量不
测试结果对变量这次的很好

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

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
20
积分
810
帖子
153
主题
19
阅读权限
60
注册时间
2007-7-22
最后登录
2013-7-9
7#
发表于 2007-10-4 17:55:45 |只看该作者
不明白你为什么要改,你用的是下面更新的吗?
http://www.tradeblazer.net/forum/thread-241-6-3.html
天生我才必有用
不拘一格交英才

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
8#
发表于 2007-10-4 17:59:44 |只看该作者
轮回老大
感谢您的帮助
我要修改的原因是:
把Length修改成Length-1更加能够显示周期
加上if语句的判断是如果当K线数目小于你传入的Length的时候会输出N/A
而加入了if判断后出现这样的情况的时候也能返回你所需要的值
明白我的意思了吗?轮回老大
再次感谢您的帮助

使用道具 举报

Rank: 5Rank: 5

精华
1
UID
20
积分
810
帖子
153
主题
19
阅读权限
60
注册时间
2007-7-22
最后登录
2013-7-9
9#
发表于 2007-10-4 18:17:45 |只看该作者
当CurrentBar < Length 时,基本上在应用就没有多大意义.这在用户初始化时一般都限制了.
如果要这样用,只需在循环前加一条
VAL=MIN(CurrentBar,LENGTH);
然后再
for i=0 to VAL;
这样编译后的代码和速度都会比你那个更好.


[ 本帖最后由 轮回 于 2007-10-4 18:25 编辑 ]
天生我才必有用
不拘一格交英才

使用道具 举报

Rank: 6Rank: 6

精华
2
UID
390
积分
2142
帖子
286
主题
45
阅读权限
70
注册时间
2007-9-21
最后登录
2019-4-1
10#
发表于 2007-10-4 18:36:55 |只看该作者
再次感谢轮回老大的赐教!
添加个Val确实比用if来判断高效
再次修改!

使用道具 举报

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

bottom

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

GMT+8, 2024-5-23 21:37

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部