请指点,这个均线的写法是否正确???

 
bool 金叉() //5根K线范围内是否出现金叉
   {
      double ma10,ma20,ma101,ma201;
      for(int i=0;i<5;i++)
         {
            ma10=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i);
            ma20=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i);
            ma101=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i+1);
            ma201=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i+1);
            if(ma10>ma20 && ma101<ma201)return(true);
         }
      return(false);
   }



思路:判断当前K线0开始,至前5根K线,范围内,是否出现 短期均线 上穿 长期均线。 这个写法是否正确?

另外:iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,0); 获得的当前MA数值,为何和MT4软件均线(方法、均线设置相同,鼠标放均线上的提示数值)上的不同呢?

 
int Crossed()
  {
   double EmaLongPrevious=iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar+1);
   double EmaLongCurrent=iMA(NULL,0,LongEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar);
   double EmaShortPrevious=iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar+1);
   double EmaShortCurrent=iMA(NULL,0,ShortEma,0,MODE_EMA, PRICE_CLOSE, CurrentBar);
//----
   if (EmaShortPrevious<EmaLongPrevious && EmaShortCurrent>EmaLongCurrent)    return(1); //up trend
   if (EmaShortPrevious>EmaLongPrevious && EmaShortCurrent<EmaLongCurrent)    return(2); //down trend
//----
   return(0); //elsewhere
  }

应该是对的。但是遍历5根K线的意义何在?当前时间出现的信号和过五分钟后的信号是一回事吧。

第二个问题可能和仿真器的输入参数有关。

另外,下次粘贴代码前,点击Aa左边的那个按钮。好像这个论坛的网管特别在意这个事情,不这样粘贴,没有大佬给答复。

 

感谢楼上的指点!


我在测试的时候,发现如下问题:

1、使用PRINT打印显示iMA()的数值,和MT4电脑上鼠标提示的数值,完全不同。

2、测试不同的时间周期,发现有的金叉可以正确显示,有的死叉也显示成金叉。有的超过了5根K线还是显示金叉。

3、因为这个数值不同,造成回测的时候开单不正常。

十分郁闷,不知道咋回事,请大神们指点指点。

 

似乎问题较复杂。

先把FOR循环拿掉,把PRICE_OPEN改成PRICE_CLOSE,再验证一下数值的不同和金叉死叉的问题。

另外,PRICE_CLOSE在shift==0时等同于当前的即时价格。

 
void OnTick()
  {
      Print("金叉:"+金叉());
      Print("死叉:"+死叉());
  }

bool 金叉()//5根K线范围内出现是否出现金叉
   {
      double ma10,ma20,ma101,ma201;
      for(int i=0;i<5;i++)
         {
            ma10=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i);
            ma20=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i);
            ma101=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i+1);
            ma201=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i+1);
            Print(i);
            Print("ma10:"+ma10);
            if(ma10>ma20 && ma101<ma201)return(true);
         }
      return(false);
   }


bool 死叉()
   {
      double ma10,ma20,ma101,ma201;
      for(int i=0;i<5;i++)
         {
            ma10=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i);
            ma20=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i);
            ma101=iMA(NULL,0,10,0,MODE_EMA,PRICE_OPEN,i+1);
            ma201=iMA(NULL,0,20,0,MODE_EMA,PRICE_OPEN,i+1);
            Print(i);
            Print("ma10:"+ma10);
            if(ma10<ma20 && ma101>ma201)return(true);
         }
      return(false);
   }




这是完整的代码,计算5根K线内,是否出现金叉或者死叉。

也参照了网上同样的均线代码,思考代码并没有错误,但是实际测试的时候,发现 金叉 、死叉 并不正确,不知道具体原因,请大侠指点指点。。。

 
已经找到原因。