开拓者期货期权程序化系统交易论坛
标题:
公布一个计算波峰波谷的程序,希望能得到进一步改进
[打印本页]
作者:
efrog
时间:
2010-9-8 13:30:35
标题:
公布一个计算波峰波谷的程序,希望能得到进一步改进
我编了一段求前两个波峰和波谷的程序(可在交易指令下测试),
但效果还不满意,希望能得到高手的改进,谢谢!
Params
Numeric MyMinLength(5);
// GV10 最近波峰与当前Bar的Bar计数
// GV11 最近波峰的值
// GV12 最近波谷与当前Bar的Bar计数
// GV13 最近波谷的值
// GV14 前一个波峰与当前Bar的Bar计数
// GV15 前一个波峰的值
// GV16 前一个波谷与当前Bar的Bar计数
// GV17 前一个波谷的值
Vars
Numeric MyLength;
Numeric MyHighBar;
Numeric MyHigh;
Numeric MyLow;
Numeric MyLowBar;
Begin
If (BarStatus==0)
{ SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
SetGlobalVar(12,0); SetGlobalVar(13,Low); //最近波谷Bar,Low
SetGlobalVar(14,0); SetGlobalVar(15,High);
SetGlobalVar(16,0); SetGlobalVar(17,Low);
}
MyLength = GetGlobalVar(12)+1;//取上一波谷到当前Bar的个数
MyLength = IIF(MyLength<=MyMinLength,MyMinLength+1,MyLength);//至少保持最小的波峰距离为5个Bar
MyHighBar = HighestBar(High,MyLength);
MyHigh = Highest(High,MyLength);
If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength or MyHigh>GetGlobalVar(11))
{ If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength)
{ SetGlobalVar(14,GetGlobalVar(10)); //保留前一个波峰
SetGlobalVar(15,GetGlobalVar(11));
}
SetGlobalVar(10,MyHighBar);//从上个低谷开始的最高价所在的Bar序数
SetGlobalVar(11,MyHigh); //从上个低谷开始的最高价
} Else SetGlobalVar(10,GetGlobalVar(10)+1);
MyLength = GetGlobalVar(10)+1;//取上一波峰到当前Bar的个数
MyLength = IIF(MyLength<MyMinLength,MyMinLength+1,MyLength);
MyLowBar = LowestBar(Low,MyLength);
MyLow = Lowest(Low,MyLength);
If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength or MyLow<GetGlobalVar(13))
{ If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength)
{ SetGlobalVar(16,GetGlobalVar(12)); //保留前一个波谷
SetGlobalVar(17,GetGlobalVar(13));
}
SetGlobalVar(12,MyLowBar);//从上个波峰开始的最低价所在的Bar序数
SetGlobalVar(13,MyLow);//从上个波峰开始的最低价
} Else SetGlobalVar(12,GetGlobalVar(12)+1);
//验证显示
Commentary("CurrBar "+Text(CurrentBar));
Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
Commentary("LowestNear "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
Commentary("HighestFar "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
Commentary("LowestFar "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
End
复制代码
作者:
efrog
时间:
2010-9-8 13:37:29
请教为什么在实时(BarStatus==2)时,最后一个Bar的计算值的不对的,请高手帮助。谢谢!
作者:
lh948
时间:
2010-9-8 15:30:59
最后一个bar的high和low不断在变化,所以有可能不对的
作者:
efrog
时间:
2010-9-8 16:43:36
本帖最后由 efrog 于 2010-9-8 20:45 编辑
谢谢,问题就出在这里。增加了BarStatus==1的限制,让最后一个Bar不参与计算,问题就解决了。
实际上最后Bar的High与Low要参与波峰、波谷的比较,在比较之前还不能直接修正目前的波峰、波谷。
修正的程序如下:
Params
Numeric MyMinLength(5);
// GV10 最近波峰与当前Bar的Bar计数
// GV11 最近波峰的值
// GV12 最近波谷与当前Bar的Bar计数
// GV13 最近波谷的值
// GV14 前一个波峰与当前Bar的Bar计数
// GV15 前一个波峰的值
// GV16 前一个波谷与当前Bar的Bar计数
// GV17 前一个波谷的值
Vars
Numeric MyLength;
Numeric MyHighBar;
Numeric MyHigh;
Numeric MyLow;
Numeric MyLowBar;
Begin
If (BarStatus==0)
{ SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
SetGlobalVar(12,0); SetGlobalVar(13,Low); //最近波谷Bar,Low
SetGlobalVar(14,0); SetGlobalVar(15,High);
SetGlobalVar(16,0); SetGlobalVar(17,Low);
}
If (BarStatus==1)
{ MyLength = GetGlobalVar(12)+1;//取上一波谷到当前Bar的个数
MyLength = IIF(MyLength<=MyMinLength,MyMinLength+1,MyLength);//至少保持最小的波峰距离为5个Bar
MyHighBar = HighestBar(High,MyLength);
MyHigh = Highest(High,MyLength);
If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength or MyHigh>GetGlobalVar(11))
{ If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength)
{ SetGlobalVar(14,GetGlobalVar(10)); //保留前一个波峰
SetGlobalVar(15,GetGlobalVar(11));
}
SetGlobalVar(10,MyHighBar+1);//从上个低谷开始的最高价所在的Bar序数
SetGlobalVar(11,MyHigh); //从上个低谷开始的最高价
} Else SetGlobalVar(10,GetGlobalVar(10)+1);
MyLength = GetGlobalVar(10)+1;//取上一波峰到当前Bar的个数
MyLength = IIF(MyLength<MyMinLength,MyMinLength+1,MyLength);
MyLowBar = LowestBar(Low,MyLength);
MyLow = Lowest(Low,MyLength);
If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength or MyLow<GetGlobalVar(13))
{ If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength)
{ SetGlobalVar(16,GetGlobalVar(12)); //保留前一个波谷
SetGlobalVar(17,GetGlobalVar(13));
}
SetGlobalVar(12,MyLowBar+1);//从上个波峰开始的最低价所在的Bar序数
SetGlobalVar(13,MyLow);//从上个波峰开始的最低价
} Else SetGlobalVar(12,GetGlobalVar(12)+1);
}
//验证显示
Commentary("CurrBar "+Text(CurrentBar));
Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
Commentary("LowestNear "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
Commentary("HighestFar "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
Commentary("LowestFar "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
End
复制代码
作者:
efrog
时间:
2010-9-8 16:48:32
目前还有二个问题:
(1)HighestFar、LowestFar的Bar计算有问题
(2)由于使用了Highest和Lowest用户函数,当最远的Bar前有更高或更低值时,这两个函数找到的并不是波峰和波谷。
作者:
bjcifco
时间:
2010-9-8 16:55:46
你们有什么好的思想 可以实现判断背离吗?
作者:
efrog
时间:
2010-9-8 20:55:34
没有。我的想法是突破前期波峰而又有效回落到波峰一下,或者未有效突破前期波峰而回落,则做空。如有效突破,则少量做多。
反之在谷底,与上述情况类似,则做多。有效突破谷底则少量做空。因为假突破的概率大。
欢迎大家讨论!
作者:
efrog
时间:
2010-9-8 21:17:34
以下代码解决了Bar的计算问题。下一步打算第二个问题,自己编一个函数来同时统计Highest和相应的Bar位置,克服绝对长度的限制。
Params
Numeric MyMinLength(5);
// GV10 最近波峰与当前Bar的Bar计数
// GV11 最近波峰的值
// GV12 最近波谷与当前Bar的Bar计数
// GV13 最近波谷的值
// GV14 前一个波峰与当前Bar的Bar计数
// GV15 前一个波峰的值
// GV16 前一个波谷与当前Bar的Bar计数
// GV17 前一个波谷的值
Vars
Numeric MyLength;
Numeric MyHighBar;
Numeric MyHigh;
Numeric MyLow;
Numeric MyLowBar;
Begin
If (BarStatus==0)
{ SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
SetGlobalVar(12,0); SetGlobalVar(13,Low); //最近波谷Bar,Low
SetGlobalVar(14,0); SetGlobalVar(15,High);
SetGlobalVar(16,0); SetGlobalVar(17,Low);
}
If (BarStatus==1)
{ MyLength = GetGlobalVar(12)+1;//取上一波谷到当前Bar的个数
MyLength = IIF(MyLength<=MyMinLength,MyMinLength+1,MyLength);//至少保持最小的波峰距离为5个Bar
MyHighBar = HighestBar(High,MyLength);
MyHigh = Highest(High,MyLength);
If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength or MyHigh>GetGlobalVar(11))
{ If (GetGlobalVar(10)+1-MyHighBar>=MyMinLength)
{ SetGlobalVar(14,GetGlobalVar(10)); //保留前一个波峰
SetGlobalVar(15,GetGlobalVar(11));
}
SetGlobalVar(10,MyHighBar);//从上个低谷开始的最高价所在的Bar序数
SetGlobalVar(11,MyHigh); //从上个低谷开始的最高价
}
SetGlobalVar(10,GetGlobalVar(10)+1); //原有错误,不论是否有新的波峰出现,原有的波峰均无条件远离1Bar
SetGlobalVar(14,GetGlobalVar(14)+1);
MyLength = GetGlobalVar(10)+1;//取上一波峰到当前Bar的个数
MyLength = IIF(MyLength<MyMinLength,MyMinLength+1,MyLength);
MyLowBar = LowestBar(Low,MyLength);
MyLow = Lowest(Low,MyLength);
If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength or MyLow<GetGlobalVar(13))
{ If (GetGlobalVar(12)+1-MyLowBar>=MyMinLength)
{ SetGlobalVar(16,GetGlobalVar(12)); //保留前一个波谷
SetGlobalVar(17,GetGlobalVar(13));
}
SetGlobalVar(12,MyLowBar);//从上个波峰开始的最低价所在的Bar序数
SetGlobalVar(13,MyLow);//从上个波峰开始的最低价
}
SetGlobalVar(12,GetGlobalVar(12)+1);
SetGlobalVar(16,GetGlobalVar(16)+1);
}
//验证显示
Commentary("CurrBar "+Text(CurrentBar));
Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
Commentary("LowestNear "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
Commentary("HighestFar "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
Commentary("LowestFar "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
End
复制代码
作者:
efrog
时间:
2010-9-11 11:21:07
上次想自编函数代替Highest、HighestBar、Lowest、LowestBar,后来仔细思考没有必要,还不如直接在程序中实现来的简单。以下的程序虽然读起来费劲(利用了多重循环,可惜TB没有递归算法,只好将就),但是使用来却很简单,而且克服了上述四个函数只能得到固定长度范围内极值的缺陷。
希望向我一样在梦想的朋友有所收获。
Params
Numeric MyMinLength(6);
// GV10 最近波峰与当前Bar的Bar计数
// GV11 最近波峰的值
// GV12 最近波谷与当前Bar的Bar计数
// GV13 最近波谷的值
// GV14 前一个波峰与当前Bar的Bar计数
// GV15 前一个波峰的值
// GV16 前一个波谷与当前Bar的Bar计数
// GV17 前一个波谷的值
Vars
Numeric MyHighBar;
Numeric MyHigh;
Numeric MyLow;
Numeric MyLowBar;
Numeric ii(0); //控制波距至少保持>=MyMinLength
Numeric jj(0); //防止特殊走势下程序死循环
Bool LoopCon; //循环控制变量
Begin
If (BarStatus==0)
{ SetGlobalVar(10,0); SetGlobalVar(11,High); //最近波峰Bar,High
SetGlobalVar(12,0); SetGlobalVar(13,Low); //最近波谷Bar,Low
SetGlobalVar(14,0); SetGlobalVar(15,High);
SetGlobalVar(16,0); SetGlobalVar(17,Low);
}
If (BarStatus==1)
{
SetGlobalVar(10,GetGlobalVar(10)+1); //原波峰均无条件远离1Bar
SetGlobalVar(12,GetGlobalVar(12)+1);
SetGlobalVar(14,GetGlobalVar(14)+1);
SetGlobalVar(16,GetGlobalVar(16)+1);
LoopCon = true; //找最近俩个波峰
MyHighBar = 0;
MyHigh = High;
jj=0;
while (LoopCon and jj<MyMinLength*10)
{ jj=jj+1;
ii=0;
While (ii<MyMinLength && High[MyHighBar+ii]<=MyHigh) {ii=ii+1;jj=jj+1;}
If (High[MyHighBar+ii]>MyHigh && ii<MyMinLength)
{ MyHigh = High[MyHighBar+ii];
MyHighBar=MyHighBar+ii;
}
if (ii>=MyMinLength or MyHighBar+ii>=BarCount) {LoopCon=False;}
}
If (GetGlobalVar(10)-MyHighBar>=MyMinLength)
{ SetGlobalVar(14,GetGlobalVar(10)); //推进一个波峰
SetGlobalVar(15,GetGlobalVar(11));
}
// 保留原波峰,或以更高的波峰取代最近波峰
SetGlobalVar(10,MyHighBar); SetGlobalVar(11,MyHigh);
LoopCon = true; //找最近两个波谷
MyLowBar = 0;
MyLow = Low;
jj=0;
while (LoopCon and jj<MyMinLength*10)
{ jj=jj+1;
ii=0;
While (ii<MyMinLength && Low[MyLowBar+ii]>=MyLow) {ii=ii+1;jj=jj+1;}
If (Low[MyLowBar+ii]<MyLow && ii<MyMinLength)
{ MyLow = Low[MyLowBar+ii];
MyLowBar=MyLowBar+ii;
}
if (ii>=MyMinLength or MyLowBar+ii>=BarCount) {LoopCon=False;}
}
If (GetGlobalVar(12)-MyLowBar>=MyMinLength)
{ SetGlobalVar(16,GetGlobalVar(12)); //推进一个波谷
SetGlobalVar(17,GetGlobalVar(13));
}
// 保留原波谷,或以更低的波谷取代最近波谷
SetGlobalVar(12,MyLowBar); SetGlobalVar(13,MyLow);
//验证显示
Commentary("CurrBar "+Text(CurrentBar));
Commentary("HighestNear "+Text(GetGlobalVar(11))+" Bar "+Text(GetGlobalVar(10)));
Commentary("LowestNear "+Text(GetGlobalVar(13))+" Bar "+Text(GetGlobalVar(12)));
Commentary("HighestFar "+Text(GetGlobalVar(15))+" Bar "+Text(GetGlobalVar(14)));
Commentary("LowestFar "+Text(GetGlobalVar(17))+" Bar "+Text(GetGlobalVar(16)));
}
End
复制代码
作者:
顺势顺心
时间:
2010-9-11 14:46:02
可以求不固定范围内的极值?
怎么用?
作者:
efrog
时间:
2010-9-12 22:14:50
可以的。把代码复制到函数框架内,把Commentary语句删除,即可使用该函数。
所需的值在10~17这8个公共变量中。代码中有说明的。
作者:
yee365
时间:
2010-12-12 13:57:20
牛
作者:
allin
时间:
2011-4-6 10:42:53
佩服佩服!
作者:
zhuwjjun
时间:
2011-4-15 14:20:00
灰常不错
作者:
读书山林
时间:
2011-8-10 10:09:20
好贴必须顶起
作者:
forfree
时间:
2011-8-10 10:12:51
这个不错。
作者:
读书山林
时间:
2011-8-10 11:19:58
回复
9#
efrog
为什么9楼得代码在当前bar没有数值输出,8楼得bar在当前的bar有数值输出,而且目测看9楼得输出值+1=8楼的 这要做的原因是什么,为什么舍弃当前的bar。楼主给解惑下吧
作者:
genesisdate
时间:
2012-1-26 22:09:30
好贴,牛,顶一个
作者:
yml6363
时间:
2012-8-10 09:14:32
好贴,牛,顶一个
作者:
ktz13517870872
时间:
2017-11-20 15:35:18
请教大侠,如何把代码中的波峰波谷用红绿线的K线中画出来或者标示出来??我是菜鸟
作者:
amosquito007
时间:
2018-11-24 21:56:54
我怎么看不见代码
欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/)
Powered by Discuz! X2