Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий - страница 5

 

Поссле апдейта, терминал стал записывать в лог

настройки эксперта

2018.06.17 16:57:39.743 Message 
2018.06.17 16:57:39.743 Message Уникальный номер: 5134484358464471040
2018.06.17 16:57:39.743 Message Использовать основного эксперта: false
2018.06.17 16:57:39.743 Message Использовать отложенные ордера: true
2018.06.17 16:57:39.743 Message Количество ошибок до остановки эксперта: 2
2018.06.17 16:57:39.743 Message Количество модификаций ордера: 2
2018.06.17 16:57:39.743 Message Объём ордера на вход: 0
2018.06.17 16:57:39.743 Message Объём ордера на выход: 0
2018.06.17 16:57:39.743 Message Время след. фьючерса: 3

  Зачем?

 

Функция Bars стала работать очень медленно. Причем если раньше медленно работала когда должна была возвращать 0, то теперь очень часто при нормально запрашиваемом диапазоне время выполнение - около секунды . 

void OnStart()
  {
   ENUM_TIMEFRAMES TF[21]=
     {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
     };
   ulong i=0,t0,t1=0,t2=0;
   while(!IsStopped())
     {
      ENUM_TIMEFRAMES tf_cur=TF[rand()%21];
      int ps=PeriodSeconds(tf_cur);
      bool exact=rand()%2;
      datetime ft=(datetime)(SeriesInfoInteger(_Symbol,tf_cur,SERIES_FIRSTDATE)*0.9);
      datetime tc=(datetime)(SeriesInfoInteger(_Symbol,tf_cur,SERIES_LASTBAR_DATE)*1.1);
      datetime t,dt,temp;
      if(tc!=ft)
        {
         t=datetime(ft+(ulong(uchar(rand()%256)<<24)|ulong(uchar(rand()%256)<<16)|ulong(uchar(rand()%256)<<8)|ulong(uchar(rand())%256))%(tc-ft));
         dt=datetime(ft+(ulong(uchar(rand()%256)<<24)|ulong(uchar(rand()%256)<<16)|ulong(uchar(rand()%256)<<8)|ulong(uchar(rand())%256))%(tc-ft));
        }
      else continue;
      if(t>dt) {temp=t; t=dt; dt=temp;}

      t0=GetMicrosecondCount();
      int i1=Bars(_Symbol,tf_cur,t,dt);
      t0=GetMicrosecondCount()-t0; t2+=t0;
      i++;
      if(t0>100) Print("Время выполнения функции Bars("+_Symbol+", "+EnumToString(tf_cur)+" , "+TimeToString(t,TIME_DATE|TIME_SECONDS)+" , "
                 +TimeToString(dt,TIME_DATE|TIME_SECONDS)+") = "+(string)t0+" микросекунд, проход № "+(string)i+" , значение = "+(string)i1);
     }
  }

Результат: 

2018.06.17 21:41:06.438 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M5 , 2006.06.09 21:06:30 , 2019.08.06 00:08:44) = 1043799 микросекунд, проход № 5 , значение = 888669
2018.06.17 21:41:07.489 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H12 , 2020.07.15 15:48:52 , 2022.01.22 07:13:45) = 1050300 микросекунд, проход № 9 , значение = 0
2018.06.17 21:41:08.544 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H12 , 1971.10.16 07:24:35 , 2019.05.21 05:56:03) = 1055257 микросекунд, проход № 30 , значение = 17085
2018.06.17 21:41:09.652 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_MN1 , 2005.03.20 08:50:29 , 2021.08.22 16:38:08) = 1107413 микросекунд, проход № 39 , значение = 159
2018.06.17 21:41:10.703 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_W1 , 2008.04.05 21:18:57 , 2021.03.26 21:36:34) = 1051631 микросекунд, проход № 46 , значение = 533
2018.06.17 21:41:11.756 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M3 , 1979.02.27 21:22:15 , 2022.05.18 07:24:24) = 1052405 микросекунд, проход № 48 , значение = 2393207
2018.06.17 21:41:12.806 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H3 , 1980.05.15 21:07:30 , 2022.04.01 00:02:21) = 1050062 микросекунд, проход № 55 , значение = 45203
2018.06.17 21:41:13.855 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H6 , 1973.05.21 17:44:00 , 2021.01.08 10:53:00) = 1048322 микросекунд, проход № 56 , значение = 26787
2018.06.17 21:41:14.905 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_W1 , 1979.12.01 14:45:19 , 2019.06.25 23:35:56) = 1050237 микросекунд, проход № 71 , значение = 2012
2018.06.17 21:41:15.957 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_D1 , 2000.09.20 14:33:01 , 2022.07.05 15:03:40) = 1051507 микросекунд, проход № 72 , значение = 4613
2018.06.17 21:41:17.007 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H12 , 1991.06.17 23:35:53 , 2019.09.12 11:15:20) = 1050039 микросекунд, проход № 73 , значение = 12079
2018.06.17 21:41:18.060 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H1 , 2007.10.17 02:53:31 , 2022.10.05 18:25:27) = 1053584 микросекунд, проход № 78 , значение = 65971
2018.06.17 21:41:19.111 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H6 , 1988.01.27 12:03:12 , 2020.07.27 22:42:59) = 1050634 микросекунд, проход № 82 , значение = 23050
2018.06.17 21:41:20.176 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M1 , 1979.07.19 16:55:36 , 2019.08.04 06:57:56) = 1064312 микросекунд, проход № 85 , значение = 6972866
2018.06.17 21:41:21.226 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M3 , 1996.06.05 22:07:53 , 2021.08.29 22:49:43) = 1050529 микросекунд, проход № 86 , значение = 2388766
2018.06.17 21:41:22.274 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H4 , 2009.12.31 11:46:27 , 2020.03.17 06:31:35) = 1047735 микросекунд, проход № 87 , значение = 13157
2018.06.17 21:41:23.325 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M15 , 1991.12.04 23:01:42 , 2018.12.29 10:42:56) = 1050228 микросекунд, проход № 94 , значение = 483550
2018.06.17 21:41:24.379 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_D1 , 1984.08.14 17:25:14 , 2019.04.29 06:37:15) = 1053783 микросекунд, проход № 121 , значение = 8774
2018.06.17 21:41:25.430 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H12 , 2003.01.24 10:08:53 , 2022.10.15 07:39:12) = 1051156 микросекунд, проход № 127 , значение = 7999
2018.06.17 21:41:26.477 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H2 , 1984.04.13 15:51:57 , 2018.08.14 21:33:44) = 1046955 микросекунд, проход № 132 , значение = 64363
2018.06.17 21:41:27.528 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H6 , 1980.11.24 03:14:44 , 2022.06.09 16:56:28) = 1051253 микросекунд, проход № 135 , значение = 24885
2018.06.17 21:41:28.578 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H3 , 1977.04.05 20:32:51 , 2020.03.01 05:54:50) = 1049176 микросекунд, проход № 144 , значение = 45999
2018.06.17 21:41:29.624 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M4 , 1996.02.23 04:36:42 , 2019.07.12 04:39:25) = 1046737 микросекунд, проход № 145 , значение = 1796923
2018.06.17 21:41:30.676 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M6 , 1992.10.20 19:18:28 , 2022.10.30 18:52:24) = 1051520 микросекунд, проход № 150 , значение = 1202254
2018.06.17 21:41:31.725 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H8 , 1993.05.27 04:58:22 , 2019.09.03 04:50:11) = 1049230 микросекунд, проход № 163 , значение = 16623
2018.06.17 21:41:32.775 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_M5 , 1993.09.05 05:32:49 , 2020.07.23 13:16:41) = 1049168 микросекунд, проход № 166 , значение = 1440600
2018.06.17 21:41:33.826 TestiBars (EURUSD,M4)   Время выполнения функции Bars(EURUSD, PERIOD_H2 , 1980.06.13 06:52:05 , 2020.03.29 17:54:06) = 1050710 микросекунд, проход № 170 , значение = 65340
 
Antony Smirnov:

После обновления прошло часов 10, но загрузка процессора никуда не уходит. Котировок нет из-за выходных, ни одного графика не открыто, сторонние индикаторы/эксперты не присутствуют в системе вообще.

2018.06.17 23:25:11.674 Terminal Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i7-7700HQ  @ 2.80GHz, Memory: 11461 / 16302 Mb, Disk: 114 / 237 Gb, GMT+3


Чудеса, у меня проц слабее, меняется от 0.1% до 1.5%, в среднем 0.8%

2018.06.18 07:31:41.265 Terminal Windows 10 (build 17134) x64, IE 11, UAC, AMD FX-4170 Quad-Core Processor , Memory: 2278 / 8138 Mb, Disk: 110 / 1325 Gb, GMT+3


 
Antony Smirnov:

После обновления прошло часов 10, но загрузка процессора никуда не уходит. Котировок нет из-за выходных, ни одного графика не открыто, сторонние индикаторы/эксперты не присутствуют в системе вообще.

2018.06.17 23:25:11.674 Terminal Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i7-7700HQ  @ 2.80GHz, Memory: 11461 / 16302 Mb, Disk: 114 / 237 Gb, GMT+3


У меня в портабле работает, попробуйте, чем черт..

 
fxsaber:
DEAL_SL и DEAL_TP? Как через MQL получить эти значения?

PositionClose всегда можно было делать так, чтобы SL/TP уровни закрытой позиции сохранялись. Для этого требовалось определенным образом формировать ордер закрытия.

Сейчас же можно не беспокоиться о формировании таких ордеров.. Однако, значения SL/TP доступны только через GUI. В MQL их не увидеть. Эту брешь заделают в следующих билдах или есть какой-то иной способ узнать SL/TP закрытых позиций?

 
Dmitry Belunskiy:
При апдейте до 1860 перестал работать оптимизатор. Ордера ставит, стрелочки в визуализаторе рисует, а результат 0.00. Рынок ФОРТС, брокер БКС, ОС Windows10.
Какая у Вас выставлена валюта депозита в настройках тестера?
 

После апдейта перестал работать WebRequest, который в предыдущих билдах работал.
Что-то поменялось?

Теперь при тех же настройках возвращает ошибку 5203

 
Ilia Gontmakher:

После апдейта перестал работать WebRequest, который в предыдущих билдах работал.
Что-то поменялось?

Теперь при тех же настройках возвращает ошибку 5203

тоже наткнулся на такую ошибку. Методом дебага, выяснил что функция TimeToString()  вернула дату в другом формате.

 
Volokola:

тоже наткнулся на такую ошибку. Методом дебага, выяснил что функция TimeToString()  вернула дату в другом формате.

А причем тут TimeToString()? У меня ее вообще не было.
Перехватил отосланный запрос WireShark-ом и вижу, что хедеры не передались.
Третий параметр в функции WebRequest()
 

Не знаю связано-ли это с обновлением платформы но я пишу именно о последнем билде, может кто подскажет выход из ситуации.

Ситуация следующая..Мне нужно было дашборд с данными RSI для найденных в терминале пар по отдельной группе.

Сделать для мт4 не составило ни какого труда, а вот когда дошло дело до мт5, возникли трудности.

Оказывается чтобы запросить данные с индикатора RSI по например 10 парам и по 9 основным тайфреймам нужно времени столько,что можно можно смело идти курить,

а если попытаться прервать операцию удалив эксперта,то в 50% случаев получим Абнормал терминейшион,хотя в цикле присутствует !IsStopped() .

Естественно в момент запроса данных (который делается в цикле таймере) все Chart Event-ы не работают,тоесть про нажатие кнопочек на дашборде можно забыть..ну да бог с ними с кнопочками, это решаемо, но

что делать с обновлениями индикатора? Чесно говоря до этого не делал дашбордов для мт5 и был неприятно удивлён тормознутостью работы с индикаторами.

Так мне про дашборрд работающий в реал-тайме на мт5 можно забыть?  Так медленно и раньше было или это с обновлением связано?

P.S. Для сравнения на мт4 по 30 парам по всем тайфреймам цикл пробегается за 100 миллисекунд.

Кстати прилетел 61 билд. iBarShift пофиксили?

//+------------------------------------------------------------------+
//|                                                 Test_RSI_MT5.mq5 |
//|                                   Copyright 2018, Dray Stanislav |
//|                               https://www.mql5.com/ru/users/fan9 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Dray Stanislav"
#property link      "https://www.mql5.com/ru/users/fan9"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
input int SymbolsNum=10;//Кол-во тестируемых символов
string SymbolArr[];
ENUM_TIMEFRAMES TIMEFRAMES[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
int OnInit()
  {
  
   ArrayResize(SymbolArr,SymbolsNum);
   ZeroMemory(SymbolArr);
   int SyTotal =SymbolsTotal(false);
   int f=0;
   for(int i = 0; i < SyTotal && f<SymbolsNum; i++)
   {
     string CurrentSymbol=SymbolName(i,false);
     if(!SymbolInfoInteger(CurrentSymbol,SYMBOL_SELECT)){
        if(GetLastError()==4301 || !SymbolSelect(CurrentSymbol,true)) {
          continue;
        }
      }   
      SymbolArr[f] = CurrentSymbol;
      f++;
   }  
//--- create timer
   EventSetTimer(60); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  uint Timer=GetTickCount();
  ResetLastError();
  double Buff[1];
  for (int i=0; i<SymbolsNum && !IsStopped(); i++)
  {
             
       for(int p=0;p<9;p++)
       {
         
         int handle=iRSI(SymbolArr[i],TIMEFRAMES[p],14,PRICE_CLOSE);
         if(handle==INVALID_HANDLE) 
         { 
            PrintFormat("INVALID_HANDLE iRSI %s/%s, error %d", 
                        SymbolArr[i], 
                        EnumToString(TIMEFRAMES[p]), 
                        GetLastError());
            ResetLastError();            
            continue;
         }
                  
         if(CopyBuffer(handle,0,0,1,Buff)<0) 
         {  
           PrintFormat("CopyBuffer iRSI, error %d",GetLastError()); 
           ResetLastError();
           IndicatorRelease(handle);            
           continue; 
         }else{
           PrintFormat("[ %s  %s ] = %s",SymbolArr[i],EnumToString(TIMEFRAMES[p]),(string)Buff[0]);
         } 
         IndicatorRelease(handle);        
       }
          
    }
    Print("Получение Rsi данных на ",SymbolsNum," символах длилось: ",(GetTickCount()-Timer));
   
  }
Причина обращения: