Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1590

 
Yuriy Bykov #:

Здравствуйте, Владимир.

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

Здравствуйте, Юрий! Разве время компиляции этого кода будет сильно отличаться от времени исполнения? Честно говоря, не силён в этом вопросе. Хорошо, что если оно так и есть, как Вы написали. ) Решил прямо сейчас ещё раз проверить время компиляции своего кода и неожиданно получил совершенно другой результат:

Test_3.mq5                      
code generated  
0 errors, 0 warnings, 442 msec elapsed, cpu='X64 Regular'

Теперь вообще ничего не понял, почему получилась такая существенная разница времени компиляции по сравнению со вчерашними данными. ))

С уважением, Владимир.

 
MrBrooklin #:

Здравствуйте, Юрий! Разве время компиляции этого кода будет сильно отличаться от времени исполнения? Честно говоря, не силён в этом вопросе. Хорошо, что если оно так и есть, как Вы написали. )
Решил прямо сейчас ещё раз проверить время компиляции своего кода и неожиданно получил совершенно другой результат:

Компиляция, грубо говоря, - это процесс преобразования написанного вами кода на языке MQL5 в закодированные нулями и единицами команды, которые умеет выполнять процессор. Её выполняет MetaEditor, когда вы нажимаете кнопку "Компилировать". Поэтому длительность этого процесса зависит в основном от количества строк в написанной программе и подключаемых к ней библиотечных файлов .mqh. Но также ещё на длительность влияет текущая загрузка вашего компьютера другими фоновыми процессами в момент компиляции. Например, если вы параллельно слушаете музыку (на том же компьютере), то на её воспроизведение требуется часть вычислительных ресурсов, которая может быть отобрана у процесса компиляции. Но помимо музыки, обычно в фоновом режиме выполняются десятки других процессов, запущенных операционной системой. В разное время эти процессы создают разную нагрузку на процессор, из-за чего и длительность компиляции в разное время может быть отличаться.

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

На счёт того, есть ли зависимость между временем компиляции и временем выполнения, представьте себе такой пример:

int OnInit() {
   double x = 0.0;
   while (x < 100) {
      x = x - 0.1;
   }
   return 0;
}

С точки зрения количества операций, которые нуждаются в кодировании при компиляции, их очень мало: несколько арифметических, условных операций и операций перехода к определенной операции. Поэтому компиляция такого кода займет очень мало времени. А при запуске на выполнение такого кода получится, что цикл while будет бесконечным, так как значение x только уменьшается и никогда не станет больше 100. Поэтому время выполнения может быть сколь угодно долгим.

Понятно, что это намеренно преувеличенный пример. Однако в реальных программах довольно часто бывает, что достаточно компактный исходный код требует значительного времени на выполнение.  

 
Юрий все правильно написал, связи между этими временами нет. Но желание делать код более легким - это отлично. Поскольку судьба советника - длительная оптимизация, нужно добиться максимальной скорости. Долой все циклы, подготавливаем данные таким образом, чтобы ими можно было воспользоваться на следующем тике без циклов. Ну или почти. Всё. 
 
MrBrooklin #:

Всем доброго вечера и хорошего настроения!

Тут на днях мне нужно было придумать функцию, которая бы отслеживала время "жизни" каждой открытой позиции. Например, открыто пять разных позиций, в разное время, в разных направлениях и нужно. чтобы каждая из них "жила" не более 10-ти суток. Набросал вот такой код:

Однако код получился очень долгим по времени исполнения.

Почти секунда (выделил желтым цветом).

Вопрос к настоящим программистам - подскажите, пжл, какой-нибудь более простой и более быстрый по исполнению вариант.

С уважением, Владимир.

Привет Владимир. Замечание 1:

   datetime date_time = TimeCurrent(); // получим последнее известное время сервера
   MqlDateTime mql_datatime = {}; // объявим и инициализируем переменную mql_datatime для упрощенного доступа к структуре MqlDateTime
   TimeToStruct(date_time, mql_datatime); // конвертируем из значения типа datetime в переменную типа структуры MqlDateTime

лучше записать так

   MqlDateTime mql_datatime = {}; // объявим и инициализируем переменную mql_datatime для упрощенного доступа к структуре MqlDateTime
   datetime date_time = TimeCurrent(mql_datatime ); // получим последнее известное время сервера //  в переменную типа структуры MqlDateTime

Замечание 2:

Может проще посчитать количество дневных баров, чем учитывать время выходных?

int  Bars( 
   string           symbol_name,     // имя символа 
   ENUM_TIMEFRAMES  timeframe,       // период 
   datetime         start_time,      // с какой даты 
   datetime         stop_time        // по какую дату 
   );

Примерно так:

bool TimeClosePos()
 {
  MqlDateTime mql_datatime = {},
              mql_pos_open; // объявим и инициализируем переменную mql_datatime для упрощенного доступа к структуре MqlDateTime
  datetime date_time = TimeCurrent(mql_datatime); // получим последнее известное время сервера
//---
  for(int i = PositionsTotal()-1; i >= 0; i--) // переберём все позиции
   {
    ulong pos_ticket = PositionGetTicket(i);  // получим тикет позиции
    datetime time_pos_open = 0;
    TimeToStruct((time_pos_open=(datetime)PositionGetInteger(POSITION_TIME)),mql_pos_open); // получим время открытия позиции
    if(Bars(_Symbol,PERIOD_D1,time_pos_open,date_time)>10 && mql_datatime.hour>mql_pos_open.hour && mql_datatime.min>mql_pos_open.min)
      return(true); // наступило время закрыть позицию
   }
  return(false);      // время закрыть позицию ещё не наступило
 }
 
Yuriy Bykov #:

Компиляция, грубо говоря, - это процесс преобразования написанного вами кода на языке MQL5 в закодированные нулями и единицами команды, которые умеет выполнять процессор...........

Понятно, что это намеренно преувеличенный пример. Однако в реальных программах довольно часто бывает, что достаточно компактный исходный код требует значительного времени на выполнение.  

Юрий, спасибо Вам за подробное объяснение. Буду теперь знать. Век живи - век учись!!! ))

С уважением, Владимир.

 
Aleksei Stepanenko #:
Долой все циклы, подготавливаем данные таким образом, чтобы ими можно было воспользоваться на следующем тике без циклов. Ну или почти. Всё. 

Было бы здорово, Алексей, но пока у меня ещё не получается обойтись без циклов. ) За подсказку - спасибо!

С уважением, Владимир.

 
Alexey Viktorov #:

Привет Владимир. Замечание 1:

лучше записать так

Замечание 2:

Может проще посчитать количество дневных баров, чем учитывать время выходных?

Примерно так:

Привет, Алексей! Спасибо за подсказки. Обязательно протестирую твой вариант. )

С уважением, Владимир.

 

Всем доброго вечера и хорошего настроения!

Уже давно привык к слову хендл, а вот как кратко описать его истинное значение? Поисковиками всякое перелопатил и нашёл на мой взгляд самое лучшее объяснение. Хотя могу и заблуждаться!

Взято из Википедии и специально сжато до приемлемого для меня понятия:

Хендл (дескриптор - тоже не самое лучше название!) - это указатель на источник дальнейшего извлечения информации.

Уважаемые программисты!!! А как бы Вы кратко охарактеризовали слово хендл?

С уважением, Владимир.

 
MrBrooklin #:
А как бы Вы кратко охарактеризовали слово хендл?
Число)
 
Aleksei Stepanenko #:
Число)

Понятно. ) А если серьёзно? Вот взято из документации:

iMA

Возвращает хэндл индикатора скользящего среднего. Всего один буфер.

int  iMA( 
   string               symbol,            // имя символа 
   ENUM_TIMEFRAMES      period,            // период 
   int                  ma_period,         // период усреднения 
   int                  ma_shift,          // смещение индикатора по горизонтали 
   ENUM_MA_METHOD       ma_method,         // тип сглаживания 
   ENUM_APPLIED_PRICE   applied_price      // тип цены или handle 
   );
 

Алексей, исходя из Вашего определения хэндла поучается, что iMA возвращает число индикатора скользящего среднего? )) Абракадабра получается, да и только... )

С уважением, Владимир.