请教MetaQuotes版主和DxdCn!急!

 
烦请DxdCn版主指教!下面是我自己写的一个在主图显示的指标,这个指标的问题有两个:
1,在主图添加指标后不会显示,必须在代码编译器里点击编译按钮才会在主图显示,这个情况不知道您遇到过没有?如何解决?请赐教!
2,这个指标会显示两条线,其中超买线是红色的,当它显示在主图中时,黄色线正常计算但是红色线出现随价格变化慢慢变小的情况,
这个挺为难了,学生不才实在找不到原因了,请您帮忙看看是哪里出现了错误?先谢谢您,麻烦了!!
//+------------------------------------------------------------------+
//|                                               摆动指标预测器.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2

#property indicator_color1 Red
#property indicator_color2 Yellow

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
extern int  mas=7;
extern int barss=130;


IndicatorBuffers(6);


double ind_buffer1[];
double ind_buffer2[];

double ind_buffer4[];
double ind_buffer5[];
double SMAX7[];
double SMIN8[];

int init()
  {
  
   SetIndexBuffer(0,ind_buffer1);
   SetIndexBuffer(1,ind_buffer2);
  
   SetIndexBuffer(2,ind_buffer4);
   SetIndexBuffer(3,ind_buffer5);
   SetIndexBuffer(4,SMAX7);
   SetIndexBuffer(5,SMIN8);
   SetIndexShift(0,1);
   SetIndexShift(1,1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexDrawBegin(0,200);
   SetIndexDrawBegin(1,200);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   IndicatorShortName("摆动指标预测器("+mas+")");
   SetIndexLabel(0,"摆动指标预测器");
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
  int limit;
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
  
   for (int i=0;i<limit;i++)
       {
        ind_buffer4[i]=iMA(NULL,0,mas,0,MODE_SMA,PRICE_CLOSE,i);
        
        ind_buffer5[i]=Close[i]-ind_buffer4[i+1];
       }
       ArraySort(ind_buffer5,barss,1,MODE_DESCEND);
//---- signal line counted in the 2-nd buffer
   limit=Bars-counted_bars;
   for (i=0;i<limit;i++)
       {
        SMAX7[i]=(ind_buffer5[1]+ind_buffer5[2]+ind_buffer5[3])/3*0.88;
      
       }
   for (i=0;i<limit;i++)
       {
        SMIN8[i]=(ind_buffer5[barss-1]+ind_buffer5[barss-2]+ind_buffer5[barss-3])/3*0.88;
       }
      
   for (i=0;i<limit;i++)
       {
        ind_buffer1[i]=SMAX7[i]+ind_buffer4[i];
        ind_buffer2[i]=SMIN8[i]+ind_buffer4[i];
        
       }
    
      
  
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

IndicatorBuffers(6);

在init 内部。

ArraySort(ind_buffer5,barss,1,MODE_DESCEND);
这是要干什么?为什么? 指标数组好象不能排序吧,排后成什么了?

你似乎是要找最近130个bar 以来的Close和MA的差值的最大值, 那就编程查找,不要用sort吧。

或者使用自定义数组,复制130个,再排,不要用指标数组排序

 
DxdCn 写道 >>

IndicatorBuffers(6);

在init 内部。

ArraySort(ind_buffer5,barss,1,MODE_DESCEND);
这是要干什么?为什么? 指标数组好象不能排序吧,排后成什么了?

你似乎是要找最近130个bar 以来的Close和MA的差值的最大值, 那就编程查找,不要用sort吧。

或者使用自定义数组,复制130个,再排,不要用指标数组排序

“你似乎是要找最近130个bar 以来的Close和MA的差值的最大值”,不仅如此,我还要找他们依次的三个“峰值”的平均数值!所以才要排序,

但是没想到这个ArraySort不能给指标数值排序的。没想到要这么复杂,按照我上边的虽然导入到图表编译后可以显示,但是有时会有错误。

所以还是要请教您“ 那就编程查找,不要用sort”中编程的逻辑算法,这个没想出来(抱歉我没学过编程,只是自学了下MQL4=_=)!

另外“使用自定义数组,复制130个”这个方式我还没见过怎么复制,有没有指标的例子?或者您给一段代码?谢谢!麻烦您了!!

 

double array1[130];

ArrayCopy(array1,ind_buffer5,0,0,130);

ArraySort(array1,WHOLE_ARRAY,0,MODE_DESCEND);

然后这个用来计算SMAX7。

至于SMIN8用什么算,我不明白你的意思,既然排序了,ind_buffer5[barss-1]是什么?没排的? 那么下次呢?



 
DxdCn 写道 >>

double array1[130];

ArrayCopy(array1,ind_buffer5,0,0,130);

ArraySort(array1,WHOLE_ARRAY,0,MODE_DESCEND);

然后这个用来计算SMAX7。

至于SMIN8用什么算,我不明白你的意思,既然排序了,ind_buffer5[barss-1]是什么?没排的? 那么下次呢?

谢谢您的回复!“SMIN8用什么算”也是这个意思,不过我用“ind_buffer5[barss-1]“ 是用的从小到大数的三个数组

barss-1 就是倒数第二个,barss-2 是倒数第三个,不知这样用对否?

 

谢谢DxdCn 老师的指点,根据您的方法,我的问题“2,黄色线正常计算但是红色线出现随价格变化慢慢变小的情况”解决了,

但是问题“1,在主图添加指标后不会显示,必须在代码编译器里点击编译按钮才会在主图显示,”还是没能够解决,看来还要麻烦您!

请见谅!我把重新编辑好的文件传上来,您下载了看下,这个问题到底是怎么个原因?

在主图添加指标后不会显示

必须在代码编译器里点击编译按钮才会在主图显示,输出数据正常。

但切换图表周期后同样不显示,输出数据是错误的,如下图:

附加的文件:
pcxmcxj.mq4  4 kb
 
!“SMIN8用什么算”也是这个意思,不过我用“ind_buffer5[barss-1]“ 是用的从小到大数的三个数组

barss-1 就是倒数第二个,barss-2 是倒数第三个,

也是这个意思 是什么意思? 要知道排序会不到移动顺序, 那么随时间推移,barss-1附近实际大约是有记录以来排序后的从高到低的第barss-1个值。 这部分代码意思 跟那  130个最近值的最大值 完全不同。所以我不知道你什么意思。

???三个数组?

你的 barss=130; 倒数? 从哪里数是倒数? 又是从哪里排序的?排的什么?

问问题,请首先自己表达清晰,不然无法网络交流的。请自己修改吧。

刷新问题,请在init里或者start里使用 RefreshRates();

 

您好,我的意思就是这样的,如上图:图中标出了过去图表中的相对依次3个峰值和最低值,我就是取的这三个点的值,

所以用了您给的方法,复制了数组后排序,不知道排序后我选取的数值是否如我上图中取的上下各三个点的位置?

从指标显示的形态来看,编译后计算是正确的,

但是切换图表周期后就输出计算错误了,我又依照您的指示在“init里或者start里使用 RefreshRates();”

但问题依然如故,还是得麻烦您呢?

 
我帮人学习,不帮人编程, 前面告诉你的足够你自己编了