Скорость выполнения советника

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

во-первых, некорректно написаные индикаторы, основная проблема длительности советников. (для корректной проверки скорости рекомендую использовать встроенные индикаторы, и только потом подключать дополнительные)
во-вторых, некорректные циклы, либо циклы с большим количеством проходов, например иногда в эксперте каждый раз проверяются в цикле все бары от 0 до Bars, в таком случае вариант либо не использовать данные циклы, (но иногда они все же нужны), либо ограничивать их, например в 1000 циклов (тогда каждый раз будет просчитываться только последняя тысяча баров, а не все имеющиеся)
в-третьих, кроме использования некорректных индикаторов, иногда возникает проблема использования большого количества индикаторов, (для меня, большое - это больше трех)
в-четвертых, использование холостых циклов, (циклов не имеющих значение), например, вы при оптимизации эксперта сделали цикл в виде if(какое-то условие) {заносим куда-нибудь какое-ибудь значение}, пусть это было сделано для проверки эксперта во время работы, но если такой цикл не несет никакой информации влияющей на работу финальной версии эксперта, то перед компиляцией его лучше исключить.
в-пятых, оптимизировать имеющиеся параметры, т.е. если у вас в программе 10 циклов, то лучше использовать для всех какой-нибудь один предопределенный параметр, типа int i = 0, нежели для каждого цикла создавать свою переменную, i, j, x, y,a ,b и.т.д.
в-шестых, оптимизировать вывод функций, т.е. пример: у вас есть условие в виде, if(iAC()!=10&&iAC()i!=20&&iAC()!=30....), правильнее будет предопределить некую переменную double i = iAC(..) и далее делать условие if(i!=10&&i!=20&&i!=30...)

p.s. все вышенаписанное лишь моя точка зрения на оптимизациюэкспертов и ее следует воспринимать как информацию, а не как руководство к действию

 
А всё таки, как вывести время выполнения эксперта
 
Попробуйте взять Time[0] (или как вариант TimeLocal()) в init(), если оно там валидно, и это же значение в deinit(), разница между ними по идее и есть общее время работы советника.
 
спасибо, попробую
 
int GetTickCount( )
Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы. Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней.
Пример:
  int start=GetTickCount();
// некие серьёзные вычисления...
Print("Время вычисления ", GetTickCount()-start, " миллисекунд.");
 
Rosh:
int GetTickCount( )
Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы. Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней.
Пример:
  int start=GetTickCount();
// некие серьёзные вычисления...
Print("Время вычисления ", GetTickCount()-start, " миллисекунд.");
Благодарю.
 
Rosh:
int GetTickCount( )
Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы. Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней.
Пример:
  int start=GetTickCount();
// некие серьёзные вычисления...
Print("Время вычисления ", GetTickCount()-start, " миллисекунд.");
Если смысл разделять эксперт на множество функций для удобности его читания и универсальности в применении
Не страдает ли при этом скорость его выполнения
  Есть ли ещё какие нибудь  нюансы при написании экспертов, чтобы избежать его замедления и увеличить его эффективность
 
Желаю всем успешного Нового Года !!!
 
Разбиение эксперта на логически законченные функции удобно прежде всего программисту. Когда у вас будет советник не 500 строк, а 5000, тогда только благодаря грамотному разделению эксперта на логически обоснованные функции вы ещё сможете как-то его понимать и совершенствовать. Конечно же нужно понимать степень выделения функции, не нужно слишком мельчить! То есть если у вас есть какой-то цикл for(i=0;i<1000:i++) {a=a*i;}, который встречается очень часто в эксперте, то возможно, что выносить его в функцию нет смысла, так как возможна дополнительная потеря времени на вызов функции, которая ничем не обоснована. Но если у вас есть какие-то повторяющиеся куски кода, которые производят определённые действия и логически завершены, то в функции им было бы удобнее находиться, пускай даже вы проиграете какие-то несколько миллисекунд времени при этом. Но зато в будущем вы эту функцию всего лишь в одном месте можете поправить, не вспоминая о том где нужно поправить ещё в повторяющихся кусках кода в программе.
Я думаю, что в принципе вы самостоятельно разберётесь с вынесением кода в отдельные функции как только начнёте программировать. Вы это будете просто чувствовать - когда нужно, а когда нет выносить тот или иной код в отдельную функцию ;o)))!
Причина обращения: