Ошибки, баги, вопросы - страница 214

 
Ashes:

Напомню, результат получен на простейшем советнике, который практически не тратит времени на какой-либо анализ и не использует индикаторы, т.е., на рабочем советнике результаты были бы ещё печальнее.

Код советника опубликуйте пожалуйста.
 
Ashes:

Напомню, результат получен на простейшем советнике, который практически не тратит времени на какой-либо анализ и не использует индикаторы, т.е., на рабочем советнике результаты были бы ещё печальнее.

Для сравнения:

Прогон этого теста с 10000 сделок на машине Windows 7, Intel Pentium Dual-Core E5400 @ 2.70 GHz, 2038 MB (PR111) занял 472866 мс.

В свете вышесказанного есть некоторая вероятность того, что часть кандидатов на участие в чемпионате 2010 могла быть незаслуженно отсеяна из-за 15-минутного барьера и особенностей тестера (если было достаточно много сделок).

** - при проведении тестов несколько раз по завершении теста не отображался график символа с отображением сделок.

 

Мне не удалось написать "простого советника", который показывал бы такие результаты. Вот мой код:

//+------------------------------------------------------------------+
//|                                                  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));
  }
//+------------------------------------------------------------------+


Вот результаты оптимизации, в колонке Result показывается время прогона в миллисекундах.


 
Rosh:

Мне не удалось написать "простого советника", который показывал бы такие результаты. Вот мой код:

Вот результаты оптимизации, в колонке Result показывается время прогона в миллисекундах.

 

Интересно...

 

Alexander:
Код советника опубликуйте пожалуйста.

Советник на основе шаблона из статьи Как быстро написать советник для Automated Trading Championship 2010.

Используется класс CExpertAdvisor без каких-либо изменений. Может быть, это побочный эффект использования классов? По результатам тестирования складывается впечатление, что замедление начинается после превышения некого порога. Может быть, это таблица под сделки ограниченного размера, после исчерпания которой начинает сказываться перераспределение памяти/сборка мусора?

PS. Ещё раз напоминаю, что советник использует особенность счёта Alpari-Demo (нулевая маржа), иначе может измениться количество трейдов.  

Файлы:
 
Rosh:

Мне не удалось написать "простого советника", который показывал бы такие результаты. Вот мой код:

Вот результаты оптимизации, в колонке Result показывается время прогона в миллисекундах. 

 

С выводом в XLSX тоже нет проблем?

 
Rosh:

Мне не удалось написать "простого советника", который показывал бы такие результаты. Вот мой код:

Вот результаты оптимизации, в колонке Result показывается время прогона в миллисекундах.

 

 

Таблица - результат работы оптимизатора:  Журнал ВЫКЛЮЧЕН?. Побочный эффект ведения журнала?

 
Ashes:


Советник на основе шаблона из статьи Как быстро написать советник для Automated Trading Championship 2010.

Используется класс 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? Тут уж код  эксперта ни при чём?

Это место будет исправлено. Разработчики в курсе, спасибо.
Причина обращения: