关于IndicatorCounted()函数在程序中使用的具体问题,请高手解答。

 
//+------------------------------------------------------------------+
//|                                               十字星蜡烛连线.mq4 |
//|                                                               vx |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "vx"
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1 //定义一个图层缓冲
double Cross.Buffer[]; //定义十字星缓冲
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 设置十字星模型
SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,1,Red);
SetIndexBuffer(0,Cross.Buffer);
SetIndexLabel(0,"十字星价位");
//----
ArrayInitialize(Cross.Buffer,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectsDeleteAll();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   if (counted_bars<0) return (-1); //检查可能出现错误
   if (counted_bars>0) counted_bars--; //最后数的柱子将被重数
   int limit=Bars-counted_bars;
//画一级连线 阳线阴线归类,十字星单列
for(int i=limit;i>0;i--) //不理会当前蜡烛
{
//判断上一个蜡烛类型
if(Close[i]==Open[i]) Cross.Buffer[i]=Close[i]; //如果收盘价等于开盘价,蜡烛为十字星
}
   
//----
   return(0);
  }
//+------------------------------------------------------------------+


代码如上,问题如下:

假设该程序运行的图表中,共有10根K线,且从左到右,只有第1和第5根K线是十字星,且收盘价分别为10.01和10.05。 

1. 以上程序运行时,新价格第一次被更新后,indicatorCounted()首次运行时返回0值,并赋给counted_bars;接下来两个if语句均未被触发,则limit=bars-0=10;然后进入for循环,i 初始值为10,然后递减为0;整个过程中,使得Cross.Buffer[9]=10.01,Cross.Buffer[5]=10.05,然后Cross.Buffer[10]=Cross.Buffer[8]= Cross.Buffer[7]= Cross.Buffer[6]= Cross.Buffer[4]= Cross.Buffer[3]= Cross.Buffer[2]= Cross.Buffer[1]= Cross.Buffer[0] =0.0. 是这样吗?如果是,那为什么画线的时候,只有连接Cross.Buffer[9]和Cross.Buffer[5]的线段,而没有连接其它值为0.0的线段,我的意思是程序是如何识别不需要连接0.0值得,毕竟他们都是在同一个数组中。

2. 当价格再次被更新后,indicatorCounted()返回值为10,并赋值给counted_bars,则第二个 if 语句被触发,counted_bars=9;则limit=1;然后进入 for 循环,则重新写入Cross.Buffer[1]的值;问题是,当新K线出现以后,被更新的永远是Cross.Buffer[1]值,即Cross.Buffer[1]记录了刚刚形成的十字星的收盘价,而上一个十字星(10根K线以后形成的)的收盘价将丢失。所以我想以上运行追踪应该有问题,因为实际并非如此,请问是哪里的问题?

3. indicatorCounted()被运行一次以后,其返回值和Bars一样吗?indicatorCounted()还有其他作用吗?

谢谢!


 

1 MQL会认为那是缺省值,不需要绘制

2 -1是你自己要这样,意味着你要重新计算(你认为原来的有误差或不可信?), 上一个十字星(10根K线以后形成的)的收盘价将丢失?收盘价在Close中,可能只是你就在Cross.Buffer的你给修改了。 一般没有问题,要知道 一般的误差至少也得一根线! 没有精准无比的东西,只有误差多少的问题 包括值和时间。

3 没有,它的用处就是 对付 时间价格的更新变化重算, 或者你自己想个办法怎么对付 时间的变化.....

提醒: mql自身并不完美。

原因: