быстродействие MQL ( MQL4 MQL5 )

 

1-обычно нам лень разбираться

с таким делом как быстродействие


попробуем рассчитать средний ход пары от хая до лова - 365 дней

внутри расчета устроим цикл - задержку - при извлечении данных разными методами

что бы померить скорость исполнения разных методов


простой пример, результаты теста


2009.09.17 13:14:51 tt EURUSD,Daily: 0.01923104 1253178890 1253178890 Rates время исполнения 2: [ 0 ]
2009.09.17 13:14:51 tt EURUSD,Daily: >> 1253178890
2009.09.17 13:14:51 tt EURUSD,Daily: 0.01923104 1253178881 1253178890 iLOW iHigh время исполнения 1 [ 9 ]
2009.09.17 13:14:42 tt EURUSD,Daily: >> 1253178881


очевидно что работа с ArrayCopyRates на порядки быстрее


при создании экспертов, особенно те которые достаточно сложны и долго оптимизируются

лучше исключить iLow iHigh или Low High


таким образом - можно исключить из тела эксперта медленные блоки и ваша оптимизация

и тестовые прогоны значительно вырастут по скорости исполнения





//+------------------------------------------------------------------+
//|                                                 testtimework.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern int pHistorDay = 365;
static int pusk = 0;

int init()
  {
   if ( Period() != PERIOD_M5 )
   {
      pusk++;
      Print(" пускать на M5 ");
      Comment(" пускать на M5 ");
   }
   return(0);
  }
int deinit()
  {
   return(0);
  }
int start()
  {

     
     if ( pusk == 0 )
     {
       if ( IsConnected() == true ) // нам нужен коннект
       {
          if ( AccountNumber() > 0 && StringLen(AccountName()) > 0) // мы уже точно вошли ?
          {
             pusk++;
             DrawHistor();  // первый способ традиционный iLow iHigh
             DrawHistor1();  
          }
       }
     }
   return(0);
  }
//+------------------------------------------------------------------+

// метод iLow iHigh
void             DrawHistor() 
{
   double sr;
   datetime timebeg = TimeCurrent();
   Print( ">> "+timebeg );
   for ( int i = 0; i <= 29000; i++) // задержка
   {
      sr = 0;
      for ( int iD = 0; iD <= pHistorDay; iD++)
      {
         sr = sr + iHigh( Symbol(), PERIOD_D1, iD ) - iLow ( Symbol(), PERIOD_D1, iD );
      }
      sr = sr / pHistorDay;
   }
   datetime timeend = TimeCurrent();
   Print( " "+ sr +" "+ timebeg+" "+timeend+"iLOW iHigh      время исполнения 1 [ "+ (timeend-timebeg)+" ]" );
}

//
// метод работаем с ArrayCopyRates
//
void             DrawHistor1()
{
   double array1[][6];
   double sr;
   datetime timebeg = TimeCurrent();   // начинаем измерение
   Print( ">> "+timebeg );
   int lNum = ArrayCopyRates(array1,Symbol(), PERIOD_D1);
   for ( int i = 0; i <= 29000; i++) // задержка
   {

      sr = 0;
      for ( int iD = 0; iD <= pHistorDay; iD++)
      {
         sr = sr + array1[iD][3]-array1[iD][2] ; 
      }
      sr = sr / pHistorDay;
   }
   datetime timeend = TimeCurrent();
   Print( " "+sr +" "+ timebeg+" "+timeend+"ArrayCopyRates время исполнения 2: [ "+ (timeend-timebeg)+" ]" );
}

 
YuraZ писал(а) >>

лучше исключить iLow iHigh или Low High

У меня обращение к Low, High, Close, Open абсолютно одинаково по быстодействию. И исключить эти обащения невозможно, ибо с чем работать будем?) А вот обращение к тем же данным посредством iLow, iHigh, iClose, iOpen на порядок тормознее, его действительно лучше избегать по возможности...

 
Figar0 >>:

У меня обращение к Low, High, Close, Open абсолютно одинаково по быстодействию. И исключить эти обащения невозможно, ибо с чем работать будем?) А вот обращение к тем же данным посредством iLow, iHigh, iClose, iOpen на порядок тормознее, его действительно лучше избегать по возможности...

верно

если вы берет данные только с текущего ТФ ! ДА


Low и High верно - они берутся с текущего ТФ и тут скорость соизмерима

а если эксперт стоя на одном ТФ читает другой ТФ, то iLow, которую лучше заменить на ArrayCopyRates

---

у меня нередко эксперты берут данные с разных ТФ

и разных пар

---

исключить можно... посмотрите - при расчете одного и того же результата я взял ArrayCopyRates и iLow iHigh

ведь в примере очевидно что iLow ( Symbol(), PERIOD_D1, iD) и array1[ iD] [2] это одно и то же

только работа c ArrayCopyRates идет на порядки быстрее

при условии, что данные берем с другого ТФ

 

int ArrayCopyRates( double &dest_array[], string symbol=NULL, int timeframe=0)

Копирует в двухмерный массив, вида RateInfo[][6], данные баров текущего графика и возвращает количество скопированных баров, либо -1 в случае неудачи.

....
Если копируются данные "чужого" инструмента и/или таймфрейма, то возможна ситуация отсутствия требуемых данных.В этом случае в переменную last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку копирования.

Получается, что необходимо иметь открытые графики всех таймфреймов. Иначе выдаст ошибку

 
YuraZ >>:

точнее GetTickCount() вместо TimeCurrent().

получилось ArrayCopyRates раз в 20 быстрее .

Вряд ли это существенно повлияет на время тестирования эксперта,

если только обращений к таймсериям очень многа)

Причина обращения: