下载MetaTrader 5
要添加评论,请登录注册
从理论到实际。代码库会帮助您!
秋风踏浪
166
秋风踏浪 2010.01.17 20:01 

自己做一个EA,代码如下:

int start() 
    {
        int ticket;

        ......

        if(iClose(0,timeCycle,0) >= iMA(0,timeCycle,mySMA,0,MODE_SMA,PRICE_CLOSE,0) 
               && iLow(0,timeCycle,1) < iMA(0,timeCycle,mySMA,0,MODE_SMA,PRICE_CLOSE,1))
          {
               ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0, "MA_CROSS", MagicMA, 0, CLR_NONE);
          }

        ......

        return(0);
    }

以上代码在测试时完全正常,但是把开仓条件改成自定义函数,在测试时就没有任何订单会成交,测试结果是空白的。例如下面的代码:

int start() 
    {
        int ticket;

        ......

        if(iClose(0,timeCycle,0) >= cont(0) 
               && iLow(0,timeCycle,1) <  cont(1))
          {
              ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0, "MA_CROSS", MagicMA, 0, CLR_NONE);
          }

        ......

        return(0);

    }


//---- 自定义函数 ----------------------------------------------+
double cont(int i)
{ 
  double Y;
  
  Y = (iClose(NULL,timeCycle,i)+iClose(NULL,timeCycle,i+1))/2;
  
  return(Y);
  
}
  
           

以上两段代码只是换了一下判断条件,为什么用MT4自带的函数做为判断条件一切都正常,而用自定义的函数做为判断条件就得不到任何测试结果。

望各位高手指教。

秋风踏浪
166
秋风踏浪 2010.01.17 21:00  
抱歉,刚才把可以正常运行的第一段代码逐渐向上加一些代码,当在 int start() 中加入如下代码时,开始不能测试出任何结果:
int start()
{ 
        ......
       
        int counted_bars=IndicatorCounted();
        int limit;
        if (counted_bars<0) return(-1);
        if (counted_bars>0) counted_bars--;
        limit=Bars-31;
        if(counted_bars>=31) 
        limit=Bars-counted_bars-1;

        ......
}

加入这段代码是为了得到自定义函数的一系列值,这段代码以及自定义函数在指标代码中都能正常运行,能画出一条指标线,但这些代码加到EA里,不知道为什么就得不到正常的测试结果,一个开仓的订单都不会产生。

望各位高手指点。

谢谢。

okwh
1629
okwh 2010.01.18 05:02  

EA和指标不同,最好不要在EA中做复杂指标计算,除非你很清楚指标和EA的不同。

IndicatorCounted()可能在EA中无效。 你print counted_bars试试。

秋风踏浪
166
秋风踏浪 2010.01.18 07:01  
DxdCn 写道 >>

EA和指标不同,最好不要在EA中做复杂指标计算,除非你很清楚指标和EA的不同。

IndicatorCounted()可能在EA中无效。 你print counted_bars试试。

谢谢。现在已经把计算指标的代码去掉了,在网上查出在EA中用自定义指标,需要用iCustom()函数调用自定义指标,可是用iCustom()函数调用自定义指标后出现了另外的问题。

int start() 
    {
      ......
    
      //---- 如果是空仓
        if (total < 1) 
        {
            
            if(MM(0)!= EMPTY_VALUE) 
               
               //开多仓                  
             
            if(GG(0) != EMPTY_VALUE)
               
               //开空仓
        }
        
        //---- 如果有持仓
        if( total >=1 ) 
        {
            ......
                if(MM(0)!= EMPTY_VALUE)
                  
                  //平空仓,开多仓 
                 
                if(GG(0) != EMPTY_VALUE))
                  
                  //平多仓,开空仓
        }

   }

//---- 自定义函数 ------------------------------------------+

double MM(int i)
{
   double Y;
   Y = iCustom(NULL,timeCycle,"myTradTest",250,0,i);
   return(Y); 
}

double GG(int i)
{
   double Y;
   Y = iCustom(NULL,timeCycle,"myTradTest",250,1,i);
   return(Y); 
}

上述代码在EA测试中已经得出了测试结果,但开仓、平仓都不是按判断条件,而是不停地开仓平仓。

myTradTest是一个在主图上画买卖箭头的指标,只有当它的第一个数组不为 EMPTY_VALUE 时,才画做多的箭头,只有它的第二个数组不为EMPTY_VALUE时,才画做空的箭头。不知道在EA里用它做判断条件为什么不起作用,不论条件数组的值是否为EMPTY_VALUE,EA都在不停地开仓、平仓。

期待各位指点。

okwh
1629
okwh 2010.01.18 10:51  

用Print(i," ", Y)调试呀,看你得到iCustom到底是什么??

编程第一就是要会调试。MT提供了Print调试手段。

秋风踏浪
166
秋风踏浪 2010.01.18 15:04  
DxdCn 写道 >>

用Print(i," ", Y)调试呀,看你得到iCustom到底是什么??

编程第一就是要会调试。MT提供了Print调试手段。

以前也知道打印函数,但没用过,刚才打印一下,原来得到的值全是零,因为自定义指标文件不能打开。

最后发现是自定义函数文件名少敲了一个字母,文件名不对。 myTradeTest写成了myTradTest,

真诚感谢您的指点,谢谢。

/
要添加评论,请登录注册