错误、漏洞、问题 - 页 214

 
Ashes:

让我提醒你,这个结果是用一个简单的专家顾问得到的,它实际上没有花时间做任何分析,也没有使用指标,也就是说,如果用一个工作的EA,结果会更悲哀。

请公布该EA的代码。
 
Ashes:

让我提醒你,这个结果是在一个简单的专家顾问上得到的,它实际上没有花时间进行任何分析,也没有使用指标,也就是说,在一个工作的专家顾问上,结果会更悲哀。

作为比较。

在Windows 7机器上进行10000次交易的测试,英特尔奔腾双核E5400 @ 2.70 GHz, 2038 MB (PR111)花了472866ms。

鉴于上述情况,2010年锦标赛 的一些候选人有可能因为15分钟的障碍和测试仪的特殊性而被不公正地淘汰(如果有很多交易)。

** - 有几次,测试者未能在测试结束时显示带有交易的符号图。

我无法编写一个能显示这种结果的 "简单EA"。以下是我的代码。

//+------------------------------------------------------------------+
//|                                                  TimeOnDeals.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      deals=1000;
input double   lot=0.01;
uint start;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   start=GetTickCount();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   PrintFormat("deals=%d  time=%d",deals,(GetTickCount()-start));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
   return(GetTickCount()-start);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int done_deals=0;
//---
   if(done_deals<deals)
     {
      if(Buy(lot)) done_deals++;
      else Print("Не удалось выполнить Buy, ошибка ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Buy(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_BUY;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool Sell(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_SELL;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));
  }
//+------------------------------------------------------------------+


下面是优化的结果,结果一栏显示了运行时间,单位是毫秒。


 
Rosh:

我还没能写出一个显示这些结果的 "简单EA"。以下是我的代码。

下面是优化的结果,结果一栏显示了运行时间,单位是毫秒。

有趣的是...

亚历山大
请公布顾问的代码。

该专家顾问是基于《如何为2010年自动交易锦标赛快速编写专家顾问》一文中的模板。

CExpertAdvisor类的使用没有任何变化。也许这是使用类的一个副作用?测试结果给人的印象是,在超过某个阈值后,速度开始减慢。也许它是一个大小有限的事务表,之后内存重新分配/垃圾收集开始生效?

PS。我想再次提醒您,专家顾问使用Alpari-Demo账户功能(零保证金),否则交易数量可能会改变。

附加的文件:
 
Rosh:

我还没能写出一个显示这些结果的 "简单EA"。以下是我的代码。

下面是优化的结果,结果一栏显示了运行时间,单位是毫秒。

输出到XLSX也没有问题?

 
Rosh:

我还没能写出一个显示这些结果的 "简单EA"。以下是我的代码。

下面是优化的结果,结果一栏显示了运行时间,单位是毫秒。

表 - 优化器的结果:记录关闭?伐木的副作用?

 
Ashes:


基于《如何为2010年自动交易锦标赛编写快速EA》一文中的模板而制作的EA。

CExpertAdvisor类的使用没有任何变化。也许这是使用类的一个副作用?测试结果给人的印象是,在超过某个阈值后,速度开始减慢。也许它是一个大小有限的事务表,之后内存重新分配/垃圾收集开始生效?

PS。我想再次提醒您,专家顾问使用Alpari-Demo账户的一个功能(零保证金),否则交易数量可能会发生变化。

该类包含GetDealByOrder(ulong order)方法。

ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки 
     }
   return(0);
  }

在每笔交易中都会被调用。因此,每次都要对整个交易历史进行检查,测试时间的减慢与交易数量的平方成正比。

这种东西最好不要用在需要优化或测试的专家顾问中,因为时间损失是不可避免的。对于这些情况,最好用算法来替换这些调用。

 
Rosh:

该类包含GetDealByOrder(ulong order)方法。

这是在每个交易中调用的。因此,每次都要搜索整个交易历史,测试时间会变慢,与交易数量的平方成正比。

你最好不要在需要优化或测试的专家顾问中使用这种东西,因为你将不可避免地失去时间。对于这些情况,最好用算法来替换这些调用。

也就是说,所有使用专家顾问模板的人都受到 "影响"...

那么XLSX呢?这与专家顾问的代码没有关系,是吗?

 
Rosh:

该类包含GetDealByOrder(ulong order)方法。

 ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки
     }
   return(0);
  } 

在每个交易中都会被调用。因此,在这个专家顾问中,在这些特定的条件 下,每次都会搜索整个交易历史,而与交易数量的平方成正比的测试时间也在减慢。

这种东西最好不要用在需要优化或测试的专家顾问中,因为时间损失是不可避免的。对于这些情况,最好用算法来替换这些调用。

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER))。

这种方法是否搜索整个历史记录,而不仅仅是历史记录中与开放职位 相关的那一部分?如果我有不超过5个与未平仓合约相关的交易,我认为使用HistorySelectByPosition比查看整个历史HistorySelect(0,TimeCurrent()) 更好。

P.S. CExpertAdvisor没有看

 
Konstantin83:

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER))。

这种方法是对整个历史进行搜索吗? 而不仅仅是与一个开放立场有关的那部分历史?如果我有不超过5个与未平仓合约相关的交易,我认为使用HistorySelectByPosition比查看整个历史HistorySelect(0,TimeCurrent()) 更好。

P.S. CExpertAdvisor没有看

在这种情况下,我们在一个位置上有成千上万的交易,而且它们都有相同的POSITION_IDENTIFIER 位置标识。因此, 在这种情况下 ,对HistorySelectByPosition 的调用相当于对HistorySelect(0,TimeCurrent())调用 ,对这些交易的枚举导致了对历史中所有交易的搜索

比方说 ,用文章中的模式做了一个不幸的例子。这就像西伯利亚人和日本电锯的故事一样。

 
Ashes:

那么XLSX呢?EA代码与此有什么关系吗?

这个地方将被修复。开发商已经意识到了这一点,谢谢你。