菜鸟问题——这个简单的程序哪里有错误?

 

我写了几行代码,是想在遇到锤子K线的时候买进,结果测试了一下,没有下任何订单,并且报错如下 :

 2016.02.16 21:12:17.112 2016.01.01 00:00  K线交易1 test started

2016.02.16 21:12:17.118 2016.01.04 02:00  K线交易1 EURUSD,H1: zero divide in 'K线交易1.mq4' (58,74)

2016.02.16 21:12:17.118 2016.01.04 02:00  Testing pass stopped due to a critical error in the EA

2016.02.16 21:12:17.118 EURUSD,H1: 1 tick events (1710 bars, 2738817 bar states) processed in 0:00:00.000 (total time 0:00:02.277)

代码如下: 

#property copyright "liuliang"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#include <WinUser32.mqh>
void sig1_Tduo(int sig);
extern int sig1=0;

//定义1个整型数,以后监测是否满足进场条件用。

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {

  }
void OnTick()
  {
   sig1_Tduo(sig1);

   if(sig1==2)//sig1==2说明自定义函数中的两个条件满足了,可以开仓了。
   {
      Print("当前时间 ", TimeToStr(TimeCurrent()));
      OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"锤子线反转买入",0,0,clrNONE);
      sig1=0;//sig1归0,以备接下来遇到锤子线的时候继续买入。
   }
  }
  
void sig1_Tduo(int sig)
{
   if((MathAbs(iClose(Symbol(),PERIOD_H1,0)-iOpen(Symbol(),PERIOD_H1,0))/MathAbs(iClose(Symbol(),PERIOD_H1,0)-iLow(Symbol(),PERIOD_H1,0)))<0.3)//如果这根K线是锤子线(空转多信号)
   sig++;
   if((iClose(Symbol(),PERIOD_H1,0)>iOpen(Symbol(),PERIOD_H1,0)) && (iClose(Symbol(),PERIOD_H1,0)>iClose(Symbol(),PERIOD_H1,1)))//如果这根锤子线
   sig++;

}

请前辈指教,谢谢。


 

自动交易和策略测试
自动交易和策略测试
  • www.mql5.com
MQL5:MetaTrader 5客户端内置的交易策略语言。语言允许编写您自己的自动交易系统,技术指标,脚本和函数程序库
 
自己分析一下先:我在调试时把打印字符语句分别放到主函数中调用自定义语句的前面和后面,发现是到调用自定义语句代码出错了。所以我分析可能是自己的自定义函数没弄好,另外,我这个程序也没有考虑对一根锤子线信号出现后就在下一根K线里不停地连续开仓的问题,这个问题接下来再解决。
 

// 分母不能为0

void sig1_Tduo(int & sig) 
{

 

  if( iClose(Symbol(),PERIOD_H1,0)!=iLow(Symbol(),PERIOD_H1,0) )  // 分母不能为0

 { 

  if((MathAbs(iClose(Symbol(),PERIOD_H1,0)-iOpen(Symbol(),PERIOD_H1,0))/MathAbs(iClose(Symbol(),PERIOD_H1,0)-iLow(Symbol(),PERIOD_H1,0)))<0.3)//如果这根K线是锤子线(空转多信号)
   sig++;
   if((iClose(Symbol(),PERIOD_H1,0)>iOpen(Symbol(),PERIOD_H1,0)) && (iClose(Symbol(),PERIOD_H1,0)>iClose(Symbol(),PERIOD_H1,1)))//如果这根锤子线
   sig++;

 } 

}

 


 
Ziheng Zhuang:

// 分母不能为0

 


您好,按照您说的改了,我的确忽视了您说的分母为0的问题。不过改了之后测试一个月数据,没有产生订单,日志提示是这样的:

2016.02.17 16:21:57.312 EURUSD,H1: 2772822 tick events (1729 bars, 2773823 bar states) processed in 0:00:01.328 (total time 0:00:35.828)

2016.02.17 16:21:55.984 2016.01.01 00:00  K线交易1 inputs: sig1=0; 

2016.02.17 16:21:55.937 TestGenerator: unmatched data error (high value 1.12344 at 2016.02.15 03:00 is not reached from the least timeframe, high price 1.12338 mismatches)

2016.02.17 16:21:48.984 History: download EURUSD,M1 [2016.02.02 02:36]

2016.02.17 16:21:43.984 History: download EURUSD,M1 [2016.02.02 11:08] 

2016.02.17 16:21:41.484 History: download EURUSD,M1 [2016.02.02 19:40]

……

请问是哪里错了呢? 



 
Ziheng Zhuang:

// 分母不能为0

 


我又调整了一下,看来是忽略了自定义函数中的指针符号&。添加上了以后,执行有效,谢谢。
原因: