设为首页收藏本站

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

公布一个计算波峰波谷的程序,希望能得到进一步改进 [复制链接]

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
跳转到指定楼层
1#
发表于 2010-9-8 13:30:35 |只看该作者 |倒序浏览
我编了一段求前两个波峰和波谷的程序(可在交易指令下测试),
但效果还不满意,希望能得到高手的改进,谢谢!
  1. Params
  2.         Numeric MyMinLength(5);
  3.         // GV10 最近波峰与当前Bar的Bar计数
  4.         // GV11 最近波峰的值
  5.         // GV12 最近波谷与当前Bar的Bar计数
  6.         // GV13 最近波谷的值
  7.         // GV14 前一个波峰与当前Bar的Bar计数
  8.         // GV15 前一个波峰的值
  9.         // GV16 前一个波谷与当前Bar的Bar计数
  10.         // GV17 前一个波谷的值
  11.        
  12. Vars
  13.         Numeric MyLength;
  14.         Numeric MyHighBar;
  15.         Numeric MyHigh;
  16.         Numeric MyLow;
  17.         Numeric MyLowBar;
  18. Begin

  19.         If (BarStatus==0)
  20.         {        SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
  21.                 SetGlobalVar(12,0); SetGlobalVar(13,Low);  //最近波谷Bar,Low
  22.                 SetGlobalVar(14,0); SetGlobalVar(15,High);
  23.                 SetGlobalVar(16,0); SetGlobalVar(17,Low);
  24.         }
  25.        
  26.         MyLength = GetGlobalVar(12)+1;//取上一波谷到当前Bar的个数
  27.         MyLength = IIF(MyLength<=MyMinLength,MyMinLength+1,MyLength);//至少保持最小的波峰距离为5个Bar
  28.         MyHighBar = HighestBar(High,MyLength);
  29.         MyHigh = Highest(High,MyLength);
  30.        
  31.         If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength or MyHigh>GetGlobalVar(11))
  32.         {        If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength)
  33.                 {        SetGlobalVar(14,GetGlobalVar(10)); //保留前一个波峰
  34.                         SetGlobalVar(15,GetGlobalVar(11));
  35.                 }
  36.                 SetGlobalVar(10,MyHighBar);//从上个低谷开始的最高价所在的Bar序数
  37.                 SetGlobalVar(11,MyHigh);   //从上个低谷开始的最高价
  38.         } Else SetGlobalVar(10,GetGlobalVar(10)+1);

  39.         MyLength = GetGlobalVar(10)+1;//取上一波峰到当前Bar的个数
  40.         MyLength = IIF(MyLength<MyMinLength,MyMinLength+1,MyLength);
  41.         MyLowBar = LowestBar(Low,MyLength);
  42.         MyLow = Lowest(Low,MyLength);
  43.         If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength or MyLow<GetGlobalVar(13))
  44.         {        If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength)
  45.                 {        SetGlobalVar(16,GetGlobalVar(12)); //保留前一个波谷
  46.                         SetGlobalVar(17,GetGlobalVar(13));
  47.                 }
  48.                 SetGlobalVar(12,MyLowBar);//从上个波峰开始的最低价所在的Bar序数
  49.                 SetGlobalVar(13,MyLow);//从上个波峰开始的最低价
  50.         } Else SetGlobalVar(12,GetGlobalVar(12)+1);

  51.         //验证显示
  52.         Commentary("CurrBar "+Text(CurrentBar));
  53.         Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
  54.         Commentary("LowestNear  "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
  55.         Commentary("HighestFar  "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
  56.         Commentary("LowestFar   "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
  57.        
  58. End
复制代码
上善若水,无欲则刚

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
2#
发表于 2010-9-8 13:37:29 |只看该作者
请教为什么在实时(BarStatus==2)时,最后一个Bar的计算值的不对的,请高手帮助。谢谢!
上善若水,无欲则刚

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
2
UID
4130
积分
20901
帖子
6519
主题
17
阅读权限
200
注册时间
2009-4-15
最后登录
2019-4-12
3#
发表于 2010-9-8 15:30:59 |只看该作者
最后一个bar的high和low不断在变化,所以有可能不对的

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
4#
发表于 2010-9-8 16:43:36 |只看该作者
本帖最后由 efrog 于 2010-9-8 20:45 编辑

谢谢,问题就出在这里。增加了BarStatus==1的限制,让最后一个Bar不参与计算,问题就解决了。
实际上最后Bar的High与Low要参与波峰、波谷的比较,在比较之前还不能直接修正目前的波峰、波谷。
修正的程序如下:
  1. Params
  2.         Numeric MyMinLength(5);
  3.         // GV10 最近波峰与当前Bar的Bar计数
  4.         // GV11 最近波峰的值
  5.         // GV12 最近波谷与当前Bar的Bar计数
  6.         // GV13 最近波谷的值
  7.         // GV14 前一个波峰与当前Bar的Bar计数
  8.         // GV15 前一个波峰的值
  9.         // GV16 前一个波谷与当前Bar的Bar计数
  10.         // GV17 前一个波谷的值
  11. Vars
  12.         Numeric MyLength;
  13.         Numeric MyHighBar;
  14.         Numeric MyHigh;
  15.         Numeric MyLow;
  16.         Numeric MyLowBar;
  17. Begin
  18.         If (BarStatus==0)
  19.         {        SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
  20.                 SetGlobalVar(12,0); SetGlobalVar(13,Low);  //最近波谷Bar,Low
  21.                 SetGlobalVar(14,0); SetGlobalVar(15,High);
  22.                 SetGlobalVar(16,0); SetGlobalVar(17,Low);
  23.         }
  24.        
  25.         If (BarStatus==1)
  26.         {        MyLength = GetGlobalVar(12)+1;//取上一波谷到当前Bar的个数
  27.                 MyLength = IIF(MyLength<=MyMinLength,MyMinLength+1,MyLength);//至少保持最小的波峰距离为5个Bar
  28.                 MyHighBar = HighestBar(High,MyLength);
  29.                 MyHigh = Highest(High,MyLength);
  30.        
  31.                 If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength or MyHigh>GetGlobalVar(11))
  32.                 {        If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength)
  33.                         {        SetGlobalVar(14,GetGlobalVar(10)); //保留前一个波峰
  34.                                 SetGlobalVar(15,GetGlobalVar(11));
  35.                         }
  36.                         SetGlobalVar(10,MyHighBar+1);//从上个低谷开始的最高价所在的Bar序数
  37.                         SetGlobalVar(11,MyHigh);   //从上个低谷开始的最高价
  38.                 } Else SetGlobalVar(10,GetGlobalVar(10)+1);

  39.                 MyLength = GetGlobalVar(10)+1;//取上一波峰到当前Bar的个数
  40.                 MyLength = IIF(MyLength<MyMinLength,MyMinLength+1,MyLength);
  41.                 MyLowBar = LowestBar(Low,MyLength);
  42.                 MyLow = Lowest(Low,MyLength);
  43.                 If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength or MyLow<GetGlobalVar(13))
  44.                 {        If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength)
  45.                         {        SetGlobalVar(16,GetGlobalVar(12)); //保留前一个波谷
  46.                                 SetGlobalVar(17,GetGlobalVar(13));
  47.                         }
  48.                         SetGlobalVar(12,MyLowBar+1);//从上个波峰开始的最低价所在的Bar序数
  49.                         SetGlobalVar(13,MyLow);//从上个波峰开始的最低价
  50.                 } Else SetGlobalVar(12,GetGlobalVar(12)+1);
  51.         }
  52.         //验证显示
  53.         Commentary("CurrBar "+Text(CurrentBar));
  54.         Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
  55.         Commentary("LowestNear  "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
  56.         Commentary("HighestFar  "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
  57.         Commentary("LowestFar   "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
  58. End
复制代码
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
5#
发表于 2010-9-8 16:48:32 |只看该作者
目前还有二个问题:
(1)HighestFar、LowestFar的Bar计算有问题
(2)由于使用了Highest和Lowest用户函数,当最远的Bar前有更高或更低值时,这两个函数找到的并不是波峰和波谷。
上善若水,无欲则刚

使用道具 举报

Rank: 4

精华
0
UID
3136
积分
331
帖子
61
主题
11
阅读权限
50
注册时间
2008-12-23
最后登录
2013-10-13
6#
发表于 2010-9-8 16:55:46 |只看该作者
你们有什么好的思想 可以实现判断背离吗?

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
7#
发表于 2010-9-8 20:55:34 |只看该作者
没有。我的想法是突破前期波峰而又有效回落到波峰一下,或者未有效突破前期波峰而回落,则做空。如有效突破,则少量做多。
反之在谷底,与上述情况类似,则做多。有效突破谷底则少量做空。因为假突破的概率大。
欢迎大家讨论!
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
8#
发表于 2010-9-8 21:17:34 |只看该作者
以下代码解决了Bar的计算问题。下一步打算第二个问题,自己编一个函数来同时统计Highest和相应的Bar位置,克服绝对长度的限制。
  1. Params
  2.         Numeric MyMinLength(5);
  3.         // GV10 最近波峰与当前Bar的Bar计数
  4.         // GV11 最近波峰的值
  5.         // GV12 最近波谷与当前Bar的Bar计数
  6.         // GV13 最近波谷的值
  7.         // GV14 前一个波峰与当前Bar的Bar计数
  8.         // GV15 前一个波峰的值
  9.         // GV16 前一个波谷与当前Bar的Bar计数
  10.         // GV17 前一个波谷的值
  11. Vars
  12.         Numeric MyLength;
  13.         Numeric MyHighBar;
  14.         Numeric MyHigh;
  15.         Numeric MyLow;
  16.         Numeric MyLowBar;
  17. Begin
  18.         If (BarStatus==0)
  19.         {        SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
  20.                 SetGlobalVar(12,0); SetGlobalVar(13,Low);  //最近波谷Bar,Low
  21.                 SetGlobalVar(14,0); SetGlobalVar(15,High);
  22.                 SetGlobalVar(16,0); SetGlobalVar(17,Low);
  23.         }
  24.        
  25.         If (BarStatus==1)
  26.         {        MyLength = GetGlobalVar(12)+1;//取上一波谷到当前Bar的个数
  27.                 MyLength = IIF(MyLength<=MyMinLength,MyMinLength+1,MyLength);//至少保持最小的波峰距离为5个Bar
  28.                 MyHighBar = HighestBar(High,MyLength);
  29.                 MyHigh = Highest(High,MyLength);
  30.        
  31.                 If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength or MyHigh>GetGlobalVar(11))
  32.                 {        If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength)
  33.                         {        SetGlobalVar(14,GetGlobalVar(10)); //保留前一个波峰
  34.                                 SetGlobalVar(15,GetGlobalVar(11));
  35.                         }
  36.                         SetGlobalVar(10,MyHighBar);//从上个低谷开始的最高价所在的Bar序数
  37.                         SetGlobalVar(11,MyHigh);   //从上个低谷开始的最高价
  38.                 }
  39.                 SetGlobalVar(10,GetGlobalVar(10)+1); //原有错误,不论是否有新的波峰出现,原有的波峰均无条件远离1Bar
  40.                 SetGlobalVar(14,GetGlobalVar(14)+1);

  41.                 MyLength = GetGlobalVar(10)+1;//取上一波峰到当前Bar的个数
  42.                 MyLength = IIF(MyLength<MyMinLength,MyMinLength+1,MyLength);
  43.                 MyLowBar = LowestBar(Low,MyLength);
  44.                 MyLow = Lowest(Low,MyLength);
  45.                 If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength or MyLow<GetGlobalVar(13))
  46.                 {        If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength)
  47.                         {        SetGlobalVar(16,GetGlobalVar(12)); //保留前一个波谷
  48.                                 SetGlobalVar(17,GetGlobalVar(13));
  49.                         }
  50.                         SetGlobalVar(12,MyLowBar);//从上个波峰开始的最低价所在的Bar序数
  51.                         SetGlobalVar(13,MyLow);//从上个波峰开始的最低价
  52.                 }
  53.                 SetGlobalVar(12,GetGlobalVar(12)+1);
  54.                 SetGlobalVar(16,GetGlobalVar(16)+1);
  55.         }
  56.         //验证显示
  57.         Commentary("CurrBar "+Text(CurrentBar));
  58.         Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
  59.         Commentary("LowestNear  "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
  60.         Commentary("HighestFar  "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
  61.         Commentary("LowestFar   "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
  62. End
复制代码
上善若水,无欲则刚

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
5525
积分
1473
帖子
429
主题
93
阅读权限
60
注册时间
2009-9-22
最后登录
2022-5-23
9#
发表于 2010-9-11 11:21:07 |只看该作者
上次想自编函数代替Highest、HighestBar、Lowest、LowestBar,后来仔细思考没有必要,还不如直接在程序中实现来的简单。以下的程序虽然读起来费劲(利用了多重循环,可惜TB没有递归算法,只好将就),但是使用来却很简单,而且克服了上述四个函数只能得到固定长度范围内极值的缺陷。
希望向我一样在梦想的朋友有所收获。
  1. Params
  2.         Numeric MyMinLength(6);
  3.         // GV10 最近波峰与当前Bar的Bar计数
  4.         // GV11 最近波峰的值
  5.         // GV12 最近波谷与当前Bar的Bar计数
  6.         // GV13 最近波谷的值
  7.         // GV14 前一个波峰与当前Bar的Bar计数
  8.         // GV15 前一个波峰的值
  9.         // GV16 前一个波谷与当前Bar的Bar计数
  10.         // GV17 前一个波谷的值
  11. Vars
  12.         Numeric MyHighBar;
  13.         Numeric MyHigh;
  14.         Numeric MyLow;
  15.         Numeric MyLowBar;
  16.         Numeric ii(0); //控制波距至少保持>=MyMinLength
  17.         Numeric jj(0); //防止特殊走势下程序死循环
  18.         Bool         LoopCon; //循环控制变量
  19. Begin
  20.         If (BarStatus==0)
  21.         {        SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
  22.                 SetGlobalVar(12,0); SetGlobalVar(13,Low);  //最近波谷Bar,Low
  23.                 SetGlobalVar(14,0); SetGlobalVar(15,High);
  24.                 SetGlobalVar(16,0); SetGlobalVar(17,Low);
  25.         }
  26.        
  27.         If (BarStatus==1)
  28.         {       
  29.                 SetGlobalVar(10,GetGlobalVar(10)+1); //原波峰均无条件远离1Bar
  30.                 SetGlobalVar(12,GetGlobalVar(12)+1);
  31.                 SetGlobalVar(14,GetGlobalVar(14)+1);
  32.                 SetGlobalVar(16,GetGlobalVar(16)+1);

  33.                 LoopCon = true; //找最近俩个波峰
  34.                 MyHighBar = 0;
  35.                 MyHigh = High;
  36.                 jj=0;
  37.                 while (LoopCon and jj<MyMinLength*10)
  38.                 {        jj=jj+1;
  39.                         ii=0;
  40.                         While (ii<MyMinLength && High[MyHighBar+ii]<=MyHigh) {ii=ii+1;jj=jj+1;}
  41.                         If (High[MyHighBar+ii]>MyHigh && ii<MyMinLength)
  42.                         {        MyHigh = High[MyHighBar+ii];
  43.                                 MyHighBar=MyHighBar+ii;
  44.                         }
  45.                         if (ii>=MyMinLength or MyHighBar+ii>=BarCount) {LoopCon=False;}
  46.                 }
  47.                 If (GetGlobalVar(10)-MyHighBar>=MyMinLength)
  48.                 {        SetGlobalVar(14,GetGlobalVar(10)); //推进一个波峰
  49.                         SetGlobalVar(15,GetGlobalVar(11));
  50.                 }
  51.                 // 保留原波峰,或以更高的波峰取代最近波峰
  52.                 SetGlobalVar(10,MyHighBar); SetGlobalVar(11,MyHigh);

  53.                 LoopCon = true; //找最近两个波谷
  54.                 MyLowBar = 0;
  55.                 MyLow = Low;
  56.                 jj=0;
  57.                 while (LoopCon and jj<MyMinLength*10)
  58.                 {        jj=jj+1;
  59.                         ii=0;
  60.                         While (ii<MyMinLength && Low[MyLowBar+ii]>=MyLow) {ii=ii+1;jj=jj+1;}
  61.                         If (Low[MyLowBar+ii]<MyLow && ii<MyMinLength)
  62.                         {        MyLow = Low[MyLowBar+ii];
  63.                                 MyLowBar=MyLowBar+ii;
  64.                         }
  65.                         if (ii>=MyMinLength or MyLowBar+ii>=BarCount) {LoopCon=False;}
  66.                 }
  67.                 If (GetGlobalVar(12)-MyLowBar>=MyMinLength)
  68.                 {        SetGlobalVar(16,GetGlobalVar(12)); //推进一个波谷
  69.                         SetGlobalVar(17,GetGlobalVar(13));
  70.                 }
  71.                 // 保留原波谷,或以更低的波谷取代最近波谷
  72.                 SetGlobalVar(12,MyLowBar); SetGlobalVar(13,MyLow);

  73.                 //验证显示
  74.                 Commentary("CurrBar "+Text(CurrentBar));
  75.                 Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
  76.                 Commentary("LowestNear  "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
  77.                 Commentary("HighestFar  "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
  78.                 Commentary("LowestFar   "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
  79.         }
  80.                        
  81. End
复制代码
上善若水,无欲则刚

使用道具 举报

Rank: 4

精华
0
UID
15288
积分
382
帖子
86
主题
18
阅读权限
50
注册时间
2010-8-20
最后登录
2010-10-14
10#
发表于 2010-9-11 14:46:02 |只看该作者
可以求不固定范围内的极值?
怎么用?
TB程序化交易研讨群121136207
纯拉皮条者谢绝。哈哈

使用道具 举报

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

bottom

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

GMT+8, 2024-5-13 22:21

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部