Если я правильно понимаю, то желтым вы выделили не время выполнения, а время на компиляцию этого кода. Компиляция происходит один раз, после этого вы запускаете на графике или в тестере уже скомпилированный файл. Поэтому можно не особо переживать за этот показатель. Он не отражает, насколько медленно или быстро будет работать советник на графике.
Если я правильно понимаю, то желтым вы выделили не время выполнения, а время на компиляцию этого кода. Компиляция происходит один раз, после этого вы запускаете на графике или в тестере уже скомпилированный файл. Поэтому можно не особо переживать за этот показатель. Он не отражает, насколько медленно или быстро будет работать советник на графике.
Здравствуйте, Юрий! Разве время компиляции этого кода будет сильно отличаться от времени исполнения? Честно говоря, не силён в этом вопросе. Хорошо, что если онотак и есть, как Вы написали. ) Решил прямо сейчас ещё разпроверить время компиляции своего кода и неожиданно получил совершенно другой результат:
Здравствуйте, Юрий! Разве время компиляции этого кода будет сильно отличаться от времени исполнения? Честно говоря, не силён в этом вопросе. Хорошо, что если онотак и есть, как Вы написали. ) Решил прямо сейчас ещё разпроверить время компиляции своего кода и неожиданно получил совершенно другой результат:
Компиляция, грубо говоря, - это процесс преобразования написанного вами кода на языке MQL5 в закодированные нулями и единицами команды, которые умеет выполнять процессор. Её выполняет MetaEditor, когда вы нажимаете кнопку "Компилировать". Поэтому длительность этого процесса зависит в основном от количества строк в написанной программе и подключаемых к ней библиотечных файлов .mqh. Но также ещё на длительность влияет текущая загрузка вашего компьютера другими фоновыми процессами в момент компиляции. Например, если вы параллельно слушаете музыку (на том же компьютере), то на её воспроизведение требуется часть вычислительных ресурсов, которая может быть отобрана у процесса компиляции. Но помимо музыки, обычно в фоновом режиме выполняются десятки других процессов, запущенных операционной системой. В разное время эти процессы создают разную нагрузку на процессор, из-за чего и длительность компиляции в разное время может быть отличаться.
При запуске программы, например, советника в терминале, повторной компиляции не происходит. Поэтому время на компиляцию не прибавляется к времени выполнения при каждом запуске. В этом отличие компилируемых языков от интерпретируемых.
На счёт того, есть ли зависимость между временем компиляции и временем выполнения, представьте себе такой пример:
int OnInit() {
double x = 0.0;
while (x < 100) {
x = x - 0.1;
}
return0;
}
С точки зрения количества операций, которые нуждаются в кодировании при компиляции, их очень мало: несколько арифметических, условных операций и операций перехода к определенной операции. Поэтому компиляция такого кода займет очень мало времени. А при запуске на выполнение такого кода получится, что цикл while будет бесконечным, так как значение x только уменьшается и никогда не станет больше 100. Поэтому время выполнения может быть сколь угодно долгим.
Понятно, что это намеренно преувеличенный пример. Однако в реальных программах довольно часто бывает, что достаточно компактный исходный код требует значительного времени на выполнение.
Юрий все правильно написал, связи между этими временами нет. Но желание делать код более легким - это отлично. Поскольку судьба советника - длительная оптимизация, нужно добиться максимальной скорости. Долой все циклы, подготавливаем данные таким образом, чтобы ими можно было воспользоваться на следующем тике без циклов. Ну или почти. Всё.
Тут на днях мне нужно было придумать функцию, которая бы отслеживала время "жизни" каждой открытой позиции. Например, открыто пять разных позиций, в разное время, в разных направлениях и нужно. чтобы каждая из них "жила" не более 10-ти суток. Набросал вот такой код:
Вопрос к настоящим программистам - подскажите, пжл, какой-нибудь более простой и более быстрый по исполнению вариант.
С уважением, Владимир.
Привет Владимир. Замечание 1:
datetime date_time = TimeCurrent(); // получим последнее известное время сервераMqlDateTime mql_datatime = {}; // объявим и инициализируем переменную mql_datatime для упрощенного доступа к структуре MqlDateTimeTimeToStruct(date_time, mql_datatime); // конвертируем из значения типа datetime в переменную типа структуры MqlDateTime
лучше записать так
MqlDateTime mql_datatime = {}; // объявим и инициализируем переменную mql_datatime для упрощенного доступа к структуре MqlDateTimedatetime date_time = TimeCurrent(mql_datatime ); // получим последнее известное время сервера // в переменную типа структуры MqlDateTime
Замечание 2:
Может проще посчитать количество дневных баров, чем учитывать время выходных?
intBars(
string symbol_name, // имя символа ENUM_TIMEFRAMES timeframe, // период datetime start_time, // с какой даты datetime stop_time // по какую дату
);
Примерно так:
bool TimeClosePos()
{
MqlDateTime mql_datatime = {},
mql_pos_open; // объявим и инициализируем переменную mql_datatime для упрощенного доступа к структуре MqlDateTimedatetime 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); // время закрыть позицию ещё не наступило
}
Компиляция, грубо говоря, - это процесс преобразования написанного вами кода на языке MQL5 в закодированные нулями и единицами команды, которые умеет выполнять процессор...........
Понятно, что это намеренно преувеличенный пример. Однако в реальных программах довольно часто бывает, что достаточно компактный исходный код требует значительного времени на выполнение.
Юрий, спасибо Вам за подробное объяснение. Буду теперь знать. Век живи - век учись!!! ))
Aleksei Stepanenko #: Долой все циклы, подготавливаем данные таким образом, чтобы ими можно было воспользоваться на следующем тике без циклов. Ну или почти. Всё.
Было бы здорово, Алексей, но пока у меня ещё не получается обойтись без циклов. ) За подсказку - спасибо!
Лучший вариант я переписал, цикл запускается только один раз при удалении позиции и нахождении новой даты.
Это понятно.
С уважением, Владимир.
... Однако код получился очень долгим по времени исполнения.
Почти секунда (выделил желтым цветом).
Здравствуйте, Владимир.
Если я правильно понимаю, то желтым вы выделили не время выполнения, а время на компиляцию этого кода. Компиляция происходит один раз, после этого вы запускаете на графике или в тестере уже скомпилированный файл. Поэтому можно не особо переживать за этот показатель. Он не отражает, насколько медленно или быстро будет работать советник на графике.
вы выделили не время выполнения, а время на компиляцию этого кода
Здравствуйте, Владимир.
Если я правильно понимаю, то желтым вы выделили не время выполнения, а время на компиляцию этого кода. Компиляция происходит один раз, после этого вы запускаете на графике или в тестере уже скомпилированный файл. Поэтому можно не особо переживать за этот показатель. Он не отражает, насколько медленно или быстро будет работать советник на графике.
Здравствуйте, Юрий! Разве время компиляции этого кода будет сильно отличаться от времени исполнения? Честно говоря, не силён в этом вопросе. Хорошо, что если оно так и есть, как Вы написали. ) Решил прямо сейчас ещё раз проверить время компиляции своего кода и неожиданно получил совершенно другой результат:
Теперь вообще ничего не понял, почему получилась такая существенная разница времени компиляции по сравнению со вчерашними данными. ))
С уважением, Владимир.
Здравствуйте, Юрий! Разве время компиляции этого кода будет сильно отличаться от времени исполнения? Честно говоря, не силён в этом вопросе. Хорошо, что если оно так и есть, как Вы написали. )
Решил прямо сейчас ещё раз проверить время компиляции своего кода и неожиданно получил совершенно другой результат:
Компиляция, грубо говоря, - это процесс преобразования написанного вами кода на языке MQL5 в закодированные нулями и единицами команды, которые умеет выполнять процессор. Её выполняет MetaEditor, когда вы нажимаете кнопку "Компилировать". Поэтому длительность этого процесса зависит в основном от количества строк в написанной программе и подключаемых к ней библиотечных файлов .mqh. Но также ещё на длительность влияет текущая загрузка вашего компьютера другими фоновыми процессами в момент компиляции. Например, если вы параллельно слушаете музыку (на том же компьютере), то на её воспроизведение требуется часть вычислительных ресурсов, которая может быть отобрана у процесса компиляции. Но помимо музыки, обычно в фоновом режиме выполняются десятки других процессов, запущенных операционной системой. В разное время эти процессы создают разную нагрузку на процессор, из-за чего и длительность компиляции в разное время может быть отличаться.
При запуске программы, например, советника в терминале, повторной компиляции не происходит. Поэтому время на компиляцию не прибавляется к времени выполнения при каждом запуске. В этом отличие компилируемых языков от интерпретируемых.
На счёт того, есть ли зависимость между временем компиляции и временем выполнения, представьте себе такой пример:
С точки зрения количества операций, которые нуждаются в кодировании при компиляции, их очень мало: несколько арифметических, условных операций и операций перехода к определенной операции. Поэтому компиляция такого кода займет очень мало времени. А при запуске на выполнение такого кода получится, что цикл while будет бесконечным, так как значение x только уменьшается и никогда не станет больше 100. Поэтому время выполнения может быть сколь угодно долгим.
Понятно, что это намеренно преувеличенный пример. Однако в реальных программах довольно часто бывает, что достаточно компактный исходный код требует значительного времени на выполнение.
Всем доброго вечера и хорошего настроения!
Тут на днях мне нужно было придумать функцию, которая бы отслеживала время "жизни" каждой открытой позиции. Например, открыто пять разных позиций, в разное время, в разных направлениях и нужно. чтобы каждая из них "жила" не более 10-ти суток. Набросал вот такой код:
Однако код получился очень долгим по времени исполнения.
Почти секунда (выделил желтым цветом).
Вопрос к настоящим программистам - подскажите, пжл, какой-нибудь более простой и более быстрый по исполнению вариант.
С уважением, Владимир.
Привет Владимир. Замечание 1:
лучше записать так
Замечание 2:
Может проще посчитать количество дневных баров, чем учитывать время выходных?
Примерно так:
Компиляция, грубо говоря, - это процесс преобразования написанного вами кода на языке MQL5 в закодированные нулями и единицами команды, которые умеет выполнять процессор...........
Понятно, что это намеренно преувеличенный пример. Однако в реальных программах довольно часто бывает, что достаточно компактный исходный код требует значительного времени на выполнение.
Юрий, спасибо Вам за подробное объяснение. Буду теперь знать. Век живи - век учись!!! ))
С уважением, Владимир.
Долой все циклы, подготавливаем данные таким образом, чтобы ими можно было воспользоваться на следующем тике без циклов. Ну или почти. Всё.
Было бы здорово, Алексей, но пока у меня ещё не получается обойтись без циклов. ) За подсказку - спасибо!
С уважением, Владимир.
Привет Владимир. Замечание 1:
лучше записать так
Замечание 2:
Может проще посчитать количество дневных баров, чем учитывать время выходных?
Примерно так:
Привет, Алексей! Спасибо за подсказки. Обязательно протестирую твой вариант. )
С уважением, Владимир.