Вопрос разработчикам: оптимизация работы эксперта

 
С MQL работаю недавно, по старой привычке из других языков, если нужно многократно использовать результаты какой-то функции, заранее выполняю её, записав результат в переменную, а затем использую значение переменной, полагая что так эксперт будет работать быстрее (более оптимально). Например:
//Заранее вычисляем OrdersTotal()
int Total = OrdersTotal();
int Pos;
if (...) {
    for (Pos = 0; Pos < Total; Pos++) {
        if (OrderSelect(Pos, SELECT_BY_POS, MODE_TRADES)) {
            //делаем одно
        }
    }
} else {
    for (Pos = 0; Pos < Total; Pos++) {
         if (OrderSelect(Pos, SELECT_BY_POS, MODE_TRADES)) {
             //делаем другое
        }
    }
}
или
//Заранее узнаём тип ордера
CurrOrderType = OrderType();
if (CurrOrderType >= 2) {//Ордер отложен и не открыт
    if ((CurrOrderType == OP_BUYLIMIT) || (CurrOrderType == OP_BUYSTOP)) {
        //если ордер направлен вверх
    } else {
        //если ордер направлен вниз
    }
}

Но, изучая некоторые статьи, форум и чужой код, я заметил, что люди пренебрегают подобным подходом. Например:
//Многократное вычисление OrdersTotal() в цикле
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) {
    ...
}
 
//Многократный вызов OrderType()
if (OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES))
   {
   if ((OrderType()==OP_BUY)||(OrderType()==OP_SELL)) counter++;
   }
}

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

И в целом хотелось бы узнать, какие вообще есть советы по программированию на MQL или хотя бы общие принципы, которыми желательно руководствоваться? Где можно ознакомиться с этой информацией?

Заранее благодарю.
 
//Многократное вычисление OrdersTotal() в цикле
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) {   
 
// насколько я понимаю, здесь нет многократного вычисления OrdersTotal()
 
    ...
}
 
//Многократный вызов OrderType()
if (OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES))
   {
   if ((OrderType()==OP_BUY)||(OrderType()==OP_SELL)) counter++;
   }
 
// Многократный вызов OrderType()  - а если у вас открыт не один ордер?
// То как раз перебирая с помощью OrderSelect все ордера и проверяя OrderType() - вы ищите то что вам нужно:)
 
 
}
Можно почитать статьи на этом сайте, и статьи Rosh'a.
 
sashken:
//Многократное вычисление OrdersTotal() в цикле
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--) {   
// насколько я понимаю, здесь нет многократного вычисления OrdersTotal()
    ...
}
С этим можно поспорить (но лучше знать точно). Например в Delphi функции занесённые в условие цикла вычисляются столько раз, сколько производится итерация (и это правильно). По поводу C++ не знаю точно, но подозреваю, что так же, т. к. там есть аналогичный «хороший тон» вынесения функций из цикла, не зависящих от итерации. По поводу того, что с OrdersTotal начинается цикл, а не заканчивается по нему, это просто мой неудачный пример, можно поставить его в условие завершения.

sashken:
//Многократный вызов OrderType()
if (OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES))
   {
   if ((OrderType()==OP_BUY)||(OrderType()==OP_SELL)) counter++;
   }
// Многократный вызов OrderType()  - а если у вас открыт не один ордер?
// То как раз перебирая с помощью OrderSelect все ордера и проверяя OrderType() - вы ищите то что вам нужно:)
}
В данном случае видно, что с помощью OrderSelect был выбран один конкретный ордер, и вызов функции OrderType два раза применяется к нему.

sashken писал (а):
Можно почитать статьи на этом сайте, и статьи Rosh'a.

Вы можете посоветовать что-нибудь конкретное? А то по сайту я вроде походил, ничего по теме особо не нашел. Интересует именно советы, связанные с внутренним представлением и функционированием эксперта, которые знают, скорее всего, только разработчики.

 
polecat:
В связи с этим вопрос, имеет ли смысл вычислять заранее значение многократно используемых функций или же все подобные функции вычисляются заранее и потому многократные их вызовы по скорости равны обращению к переменной?

И в целом хотелось бы узнать, какие вообще есть советы по программированию на MQL или хотя бы общие принципы, которыми желательно руководствоваться? Где можно ознакомиться с этой информацией?

Да, имеет смысл.

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

 
stringo:

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


Спасибо, понятно. В общем всё как в нормальном языке. :)
Причина обращения: