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

 
fxsaber:

Вопрос по ArrayResize. Делаю сразу Reserve на несколько гигабайтов. И постепенно увеличиваю Size, который меньше исходного Reserve.

По какой причине TaskManager показывает увеличение потребления памяти во время увеличения Size?

Специально, мы ничего для этого не предпринимаем - это особенность ОС (а действительно ли пользователю нужны гигабайты?

Если хотите иметь "горячую" память в критически важной точке программы, надо перед этой точкой "пробежаться" по страницам выделенного куска, чтобы страницы виртуальной памяти процесса получили физические.


Но, из MQL, доступа к зарезервированному участку массива нет.

 
Ilyas:

Специально, мы ничего для этого не предпринимаем - это особенность ОС (а действительно ли пользователю нужны гигабайты?

Если хотите иметь "горячую" память в критически важной точке программы, надо перед этой точкой "пробежаться" по страницам выделенного куска, чтобы страницы виртуальной памяти процесса получили физические.


Но, из MQL, доступа к зарезервированному участку массива нет.

Спасибо. Интересно, как должно сказываться на производительности, если делать сразу полноценный ArrayResize на гигабайты.

 
void OnStart()
{  datetime m_stoptime = 0;
//1.
   if(m_stoptime < TimeCurrent())
   {
      //расчеты   
   }


//2.
   MqlTick last_tick;
   if(SymbolInfoTick(_Symbol, last_tick))
   {  if(m_stoptime < last_tick.time) 
      {
         //расчеты
      }
   }
//3. 
      const int start = 0;
      const int count = 1;
      datetime time[1];
      if(CopyTime(_Symbol,PERIOD_M1,start,count,time)>0)
      {
        if(m_stoptime < time[0]) 
         {
         //расчеты
         }
      }
}

протестировал, запустил полный перебор при оптимизации своего советника на 5000 проходов, посчитал просто по логу тестера

1. 14:04:28.365  - 14:15:47.481 = 11 м 19 сек

2. 13:49:56.885 - 14:00:30.819 = 10 м 34 сек

3. 14:28:35.89 - 14:41:11.659 = 12 м 36 сек


в принципе как и ожидал вариант №2 быстрее, на 5000 проходов выигрыш около 30 секунд,тоже довольно не плохо

 

Прошу помочь вызвать это меню через WinAPI.

Строку с выбранным именем советника получить получается. Там в ComboBox она всего одна, в отличие от MT4.

А вот вызвать меню - не выходит. BM_CLICK не помогает.


ЗЫ Чем отслеживаете Messages в x64?


Решил задачу через WM_LBUTTONDOWN.

 
Это ошибка или нет, что нулевой статик им не является?
int Array0[] = {};
 
Будет ли возможность в мобильном терминале накладывать индикаторы из подвала прямо на график?
 
Igor Makanu:

в принципе как и ожидал вариант №2 быстрее, на 5000 проходов выигрыш около 30 секунд,тоже довольно не плохо

Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.

 
fxsaber:

Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.

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

но ветку открыть не готов....воспитание плохое, чувство ответственности переполнять будет, а поддерживать в актуальном состоянии топик... я не уверен, что сумею (((

ЗЫ: по примеру выше.... вчера не решил опять писать в этот топик нужно в примере № 2 SymbolInfoTick() на SymbolInfoInteger(_Symbol, SYMBOL_TIME)

ЗЫЗЫ: вот пример где использую, мне удобнее в оптимизаторе искать время с дискретностью в 5 минут - меньше проходов, поэтому время в оптимизаторе вообще сделал на 2 байта в ushort , если 0 - то не используется эта опция, есть еще задел - проверить как с байтами бывтрее работать, но не сейчас - в моем примере один раз в OnInit() на байты разбиваю - не критично

class CWorkTime
{
private:
   int               m_starthour, m_stophour, m_startmin, m_stopmin;
   datetime          m_starttime, m_stoptime;
   bool              UseThisSession, NotIntraDay;
   void              setTodayWorkTime();
public:
   void              CWorkTime(const ushort worktime);
   bool              Disable(); };
//+------------------------------------------------------------------+
void CWorkTime::CWorkTime(const ushort worktime): UseThisSession(true)
{  union UShortToByte { ushort u_short; uchar byte[2]; } ShortToByte;
   if(worktime == 0)
   {  UseThisSession = false;
      Print("EA working time is not used"); }
   else
   {  ShortToByte.u_short = worktime;
      int t = (int)(ShortToByte.byte[0] * 5.625);
      m_starthour = (int)(t / 60);
      m_startmin = t % 60;

      t = (int)(ShortToByte.byte[1] * 5.625);
      m_stophour = (int)(t / 60);
      m_stopmin = t % 60;
      NotIntraDay = m_starthour > m_stophour ? true : false;
      setTodayWorkTime();
      printf("EA working time start: %d h %d min , end: %d h %d min", m_starthour, m_startmin, m_stophour, m_stopmin); } }
//+------------------------------------------------------------------+
void CWorkTime::setTodayWorkTime()
{  MqlDateTime dtstart, dtstop;
   TimeCurrent(dtstart);
   dtstop         = dtstart;
   dtstart.hour   = m_starthour;
   dtstart.min    = m_startmin;
   dtstop.hour    = m_stophour;
   dtstop.min     = m_stopmin;
   m_starttime    = StructToTime(dtstart);
   m_stoptime     = StructToTime(dtstop);
   if(NotIntraDay) m_stoptime += 86400; }
//+------------------------------------------------------------------+
bool CWorkTime::Disable(void)
{  bool result    = false;
   if(UseThisSession)
   {  datetime time = (datetime)SymbolInfoInteger(_Symbol, SYMBOL_TIME);
      if(m_stoptime < time) setTodayWorkTime();
      result      = time >= m_starttime && time <= m_stoptime ? false : true; }
   return(result); };
//+------------------------------------------------------------------+

использование:

int OnInit()
  {
   WorkTime=new CWorkTime(EA_Time);
   }

void OnTick()
  {
    bool DisableTradingByTime=WorkTime.Disable();
.....
    if(DisableTradingByTime) return;

т.е. результат метода Disable() - труе не рабочее время, фалсе - работаем

 
fxsaber:

Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.

Есть похожая по тематике:

Алгоритмы, методы решений, сравнение их производительности
Алгоритмы, методы решений, сравнение их производительности
  • 2017.12.10
  • www.mql5.com
В данной ветке будем обсуждать разные способы решения тех, или иных задач, сравнивать производительность предложенных решений...
 

Можно ли иметь некоторые подробности: почему SocketTlsReadAvailable () возвращает ошибку (5273 ERR_NETSOCKET_IO_ERROR), когда Socket подключен (SocketIsConnected () вернул true)?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alain Verleyen, 2019.08.29 01:17

О функциях mql SocketXXX () это сообщение предназначено в основном для разработчиков Metaquotes: @Renat Fatkhullin, @Slava, @Ilyas

Я использую приведенный ниже код для управления приемом сообщений через защищенное соединение.

int socket;
//+------------------------------------------------------------------+
//| void OnTimer()                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   string message;
   if(receive(message))
     {
      //--- ...     
     }
  }
//+------------------------------------------------------------------+
//| Call every X ms                                                  |
//+------------------------------------------------------------------+
bool receive(string &message)
  {
//--- ...
   char response[];
   message="";

   ResetLastError();
   uint len=SocketIsReadable(socket);
   if(len>1)
     {
      int read=SocketTlsReadAvailable(socket,response,len);

      //--- analyze the response 
      if(read>0)
        {
         //--- ...

         message=CharArrayToString(response,0,read);
         return(true);
        }
      else if(read==-1)
        {
         if(SocketIsConnected(socket))
           {
            printf("ERROR: %i, socket(%i) read: len=%i",_LastError,socket,len);
           }
         else
           {
            printf("ERROR: %i, socket(%i) not connected. len=%i",_LastError,socket,len);
            //--- ...            
           }
        }
     }
   else
     {
      if(_LastError!=0)
         printf("ERROR: %i (SocketIsReadable).",_LastError);
     }
//--- ...
   return(false);
  }

Большую часть времени это работает правильно. Однако время от времени я получал сообщение об ошибке, хотя сокет подключен, и через некоторое время (от 1 до 5/6 ошибок) он продолжает работать.

... данные / сообщения получены правильно

2019.08.29 00: 45: 43.019 XXXX (EURUSD, H1) ОШИБКА: 5273, гнездо (1), считано: len = 437
2019.08.29 00: 45: 43.237 XXXX (EURUSD, H1) ОШИБКА: 5273, гнездо (1), считано: len = 1242

... данные / сообщения получены правильно

Ошибка 5273 очень общая и мало помогает. Можно ли получить больше информации о таких ошибках?