新建的604中的测试器不能正确工作 - 页 4

 

创建了这个简单的EA,在509和604上进行测试,都是在MQ模拟账户444的同一个服务器上,在相同的日期进行回测。

  • EA进行交替的买入卖出的交易
  • 固定SL/TP。基于账户余额 的手数大小。源代码如下。
  • 509编译,在509上测试
  • 600在604上编译并在604上测试
策略测试者报告
测试EA 509
MetaQuotes-新MT4测试(Build 509)。

符号欧元兑美元(欧元对美元)
时间1小时(H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
模型每个点(基于所有可用的最小时间框架的最精确方法)
测试中的条数1384模擬的點數1448514建模质量46.42%
不匹配的图表错误0
初始存款10000.00
总净利润-1199.25毛利润20200.90毛损失-21400.15
利润系数0.94预期回报率-8.75
绝对缩水2515.20最大跌幅3725.52 (33.23%)相对缩减33.23% (3725.52)
交易总额137空头头寸(赢利%)68 (41.18%)多头头寸(韩元%)69 (44.93%)
盈利交易(占总数的百分比)59 (43.07%)亏损交易(占总数的百分比)78 (56.93%)
最大的盈利交易394.33亏损交易-337.74
平均数盈利交易342.39亏损交易-274.36
最多连胜(以金钱计算的利润)4 (1494.97)连续亏损(以金钱计算的亏损)12 (-3337.77)
最大的连续盈利(赢钱的次数)1494.97 (4)连续亏损(亏损数)-3337.77 (12)
平均数连赢2连败2
平均数连胜2连败2

 
测试EA 600+
MetaQuotes-新MT4测试(Build 604)。

符号欧元兑美元(欧元对美元)
时间1小时(H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
模型每个点(基于所有可用的最小时间框架的最精确方法)
测试中的条数1384模擬的點數1459801建模质量46.42%
不匹配的图表错误0
初始存款10000.00点差当前 (6)
总净利润-1985.08毛利润19147.44毛亏损-21132.52
利润系数0.91预期回报率-14.81
绝对缩水2677.75最大跌幅4021.28 (35.45%)相对缩减35.45% (4021.28)
总交易量134空头头寸(赢得%)67 (40.30%)多头头寸(韩元%)67 (44.78%)
盈利交易(占总数的百分比)57 (42.54%)亏损交易(占总数的百分比)77 (57.46%)
最大的盈利交易394.33亏损交易-337.74
平均数盈利交易335.92亏损交易-274.45
最多连胜(以金钱计算的利润)4 (1494.97)连续亏损(以金钱计算的亏损)12 (-3336.50)
最大的连续盈利(赢钱的次数)1494.97 (4)连续亏损(亏损数)-3336.50 (12)
平均数连赢2连败2
 
//========================================================================
//|                                                      Test EA 509.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"

//========================================================================
  int start()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return(0);
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return(0);
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 509 Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 
//========================================================================
//|                                                     Test EA 600+.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"
#property version   "1.00"
#property strict
//========================================================================
  void OnTick()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return;
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return;
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 600+ Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 

509图。

604图。

 

除了最后一个季度,它们似乎运行了相同的测试,我认为这是因为我在同一服务器上运行了一个测试版(尽管是不同的模拟账户),可能是实时数据,其中可能有间隙,干扰了测试。我打算删除图表历史,让两个终端下载相同的图表历史,然后重新进行测试。

编辑:我可能已经知道这本身就是一个试验。很好,MQ的1分钟图表数据可以追溯到1974年,但我并不想要所有的数据!!!"。这就像你可以没有任何数据,也可以多到你的电脑需要一半的硅谷!!我的终端现在正在运行700MB的内存 *rollseyes*

 
SDC:

除了最后一个季度,它们似乎运行了相同的测试,我认为这是因为我在同一服务器上运行了一个测试版(尽管是不同的模拟账户),可能是实时数据,其中可能有间隙,干扰了测试。我打算删除图表历史,让两个终端下载相同的图表历史,然后重新进行测试。

编辑:我可能已经知道这本身就是一个试验。很好,MQ的1分钟图表数据可以追溯到1974年,但我并不想要所有的数据!!!"。它就像你可以完全没有,或者多到你需要在你的电脑里有一半的silcon valley!我的终端现在正在运行700mb RAM *rollseyes*


你好,你能试一下M15和M1的测试吗?你是否将代码从旧的mq4转换到新的mq4? 你能用一个旧的复杂的mq4 EA试试,并转换到新的mq4。

包括其他数据类型,如数据时间等,包括内部和自定义指标......我在这段代码中没有看到任何指标。

604可能存在的问题是,对于指标和其他数字来说,一些数字的精确性丢失。

我需要开发一个数字测试方法来比较两个环境中变量的精确值......

 

可能不是你问题的根本原因,但在60x中,你是否需要在某个地方加入ResetLastError()?(在while循环内的第一条命令?)

 
cbalta:


你好,你能试一下M15和M1的测试吗?你是否将代码从旧的mq4转换到新的mq4?你能用一个旧的复杂的mq4 EA试试,并转换到新的mq4。

包括其他数据类型,如数据时间等,包括内部和自定义指标,我看不到这段代码中使用的任何指标。

604可能存在的问题是,对于指标和其他数字来说,一些数字的精确性丢失。

我需要开发一种数字测试方法来比较两个环境中变量的精确值......


我使用了我发布的相同的源代码,我在509元编辑器上编译了509的测试代码,我在604元编辑器上编译了600的源代码,两者之间唯一的区别是,新的使用void OnTick(),旧的使用start()

我没有使用任何指标,因为我想这是一个基本的测试,有尽可能少的未知数,如果你想扩大测试参数,我们可以修改EA的使用指标和其他交易标准。

 
ydrol:

可能不是你问题的根本原因,但在60x中,你是否需要在某个地方加入ResetLastError()?(在while循环内的第一条命令?)

我不确定我是否需要?我会去查的,EA的测试没有错误,所以我没有看到GetLastError()在新终端中的表现。我的大量内存使用(最大超过1GB)是由于当我点击历史中心的下载按钮时,从metaquotes演示服务器下载了几十年的1分钟图表数据,我不得不删除其中一些。