[MT4指标][讨论] 秃鹫老师请进, 请教如何将两个指标的运算组合在一起...
之前拜读了您为网友们提供的MQL4语言编程指导, 获益匪浅, 我非常佩服您的专业知识, 最近我设计了一个技术指标, 希望可以和您探讨下.
这个指标分成两部分, 第一部分是一个"价格过滤器", 显示效果有点像 "抛物线转向指标Parabolic SAR".
其意义是通过计算历史行情波动百分比, 得出如果价格突破最高/最低价加上多少个点可以判断是真突破.
第二部分是从MQL代码基地下载的一个LW_Fractal指标, 这个指标的概念如下:
当某个高点左侧的2根K线, 和右侧的2根K线都要低于该高点时, 称该高点为"分形"点, 如果突破分形点, 就是比尔·威廉姆斯的"鳄鱼线"系统中的买入信号.
这两部分结合起来, 就是在"鳄鱼线"系统的基础上添加一个"价格过滤器"来更好地过滤假突破.
目前我已经通过下载和改写制作了两个部分各自的指标代码, 我所遇到的困难就是如何将他们结合起来.
即让"价格过滤器"的标记及其对应"价格"只显示在符合"分形"要求的对应K线上, 而不是每根K线都显示.
如您能拨冗查看, 乃至更进一步提供您的宝贵意见, 我将万分感激.
两个指标各自的代码在这里附上, 供您参考.
"价格过滤器"的代码如下:
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Teal
#property indicator_color2 Teal
extern int r=3600;
double Buffer1;
double Buffer2;
double HL;
int init() {
SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,Buffer2);
SetIndexBuffer(2,HL);
SetIndexStyle(0,DRAW_ARROW);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexArrow(1,159);
IndicatorDigits(6);
return(0);
}
int start() {
int limit,t;
int counted_bars=IndicatorCounted();
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(t=0; t=cntdown) cnt=cntup;
if (cntup0) cbars--;
pos=0;
if (cbars > (Bars-cnt-1)) pos=(Bars-cnt-1);
else pos=cbars+nRightUp;
//---
while(pos>=nRightUp)
{
FractalsUp[pos] =NULL;
FractalsDown[pos]=NULL;
//o?AEOAE AAA?O
r=nRightUp; //i?iaa?yai i?aao? noi?iio o?aeoaea
for(i=1;i<=r;i++)
{
if (High[pos]<=High[pos-i]) break;
}
//anee ni?aaa ana IE oi i aie?ii auou ?aaii r+1
if (i==r+1) //FractalsUp[pos]=High[pos];
{
l=nLeftUp; //i?iaa?yai eaao? noi?iio o?aeoaea
e=Equals;
for(j=1;j<=l+Equals;j++)
{
if (High[pos] < High[pos+j]) break;
if (High[pos] > High[pos+j]) l--;
if (High[pos]==High[pos+j])e--;
if (l==0)
{
FractalsUp[pos]=High[pos];
break;
}
if (e<0) break;
}
}
//O?AEOAE AIEC
r=nRightDown; //i?iaa?yai i?aao? noi?iio o?aeoaea
for(i=1;i<=r;i++)
{
if (Low[pos]>=Low[pos-i]) break;
}
if (i==r+1) //FractalsUp[pos]=High[pos];
{
l=nLeftDown; //i?iaa?yai eaao? noi?iio o?aeoaea
e=Equals;
for(j=1;j<=l+Equals;j++)
{
if (Low[pos] > Low[pos+j]) break;
if (Low[pos] < Low[pos+j]) l--;
if (Low[pos]==Low[pos+j])e--;
if (l==0)
{
FractalsDown[pos]=Low[pos];
break;
}
if (e<0) break;
}
}
pos--;
}
//----
return(0);
}
//+------------------------------------------------------------------+Frac.GIFPFilter.GIF
2楼
补充下整合后指标的运算思路:
1) 用LW_Fractals的公式把"分形"点算出来
2) 因为LW_Fractals的取值都是以对应K线的最高点和最低点取值的, 所以直接对这些已经算出来的"分形"点进行Price Filter的运算.
3) Price Filter的运算中iMAOnArray这个函数的平均值样本集合对象使用最近的相邻K线, 而不是对最近的相邻"分形"点求平均值, 这点很重要.
试了几次都没报错, 只能向秃鹫老师和各位高手求助了, 谢谢!
发表于:2008-08-10 08:33只看该作者
3楼
提供一个思路:
先用Price Filter中的语句计算Buffer1、Buffer2的值,然后再用LW_Fractals中的语句对Buffer1、Buffer2求分形高点和低点。
计算Buffer1、Buffer2语句可以不改。由于原LW_Fractals公式中是对High、Low求分形高点和分形低点的,而现在是要对Buffer1、Buffer2求分形高点和低点,所以只要把High和Low替换为Buffer1、Buffer2就可以了