Хотелось бы узнать мнение KimIV. - страница 3

 
khorosh:
Не понял, что означает на "наличие фильтров". Поясните пожалуйста.

if(sy!=""&&sy==OrderSymbol()){
if(mn >0 &&mn==OrderMagicNumber()){

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

if(sy!=""){// если не выполняется это условие дальнейшая проверка на соответствие символа не проводится, и приступаем к нижестоящим фильтрам
   if(OrderSymbol()!=sy){
      continue;// пропускаем не нужный ордер (не заходим в нижестоящие проверки)
   }
}

 
Integer:

Можно не проверять тип через if, считать в массив

cnt[OrderType()] ++;


Не понял... Чето туплю... Можно подробнее ?
 
FAQ:

Не понял... Чето туплю... Можно подробнее ?

Типы ордеров от 0 до 5. Массив cnt[6]. В каждом элементе массива будут учитываться ордера своего типа. Это для подсчета, если же что-то другое с ордерами делать, то только через if.
 
FAQ:

Ну к вам остается только просьба, выяснить у метаквостов было ли это сделано специально или это ошибка. Жду с нетерпением.

Вообще сильно озадачил себя последнее время именно скоростью исполнения, и в совах вообще планирую делать 2 части, для реала и для тестера if(IsTesting()) real(); else tester(); =)

Для тестов обсуждаемая функция сводится вообще к одной строке, что значительно увеличит скорость:

if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)) return(OrderLots());
 
FAQ:



if(sy!=""&&sy==OrderSymbol()){
if(mn >0 &&mn==OrderMagicNumber()){

То есть выносить эти предварительные проверки за пределы цикла, и писать несколько циклов для каждого набора условий 
Не понятно как можно
OrderSymbol() и OrderMagicNumber() для каждого ордера определять вне цикла?
 
khorosh:
Не понятно как можно

я имел ввиду
if(sy!="') или if(mn >0){}
 
keep87:

Ну к вам остается только просьба, выяснить у метаквостов было ли это сделано специально или это ошибка. Жду с нетерпением.

Вообще сильно озадачил себя последнее время именно скоростью исполнения, и в совах вообще планирую делать 2 части, для реала и для тестера if(IsTesting()) real(); else tester(); =)

Для тестов обсуждаемая функция сводится вообще к одной строке, что значительно увеличит скорость:



Я вопрос задал в теме о 418 (правда ее уже снесли), и в сервис дек - ответа пока нет.
 
khorosh:
Не понятно как можно

Тоже не докумекал пока)
 
OnGoing:
Тоже не докумекал пока)


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

      if (OrderSymbol()==sy || sy=="") {<----
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {<-----
          if (op<0 || OrderType()==op) {<----
            if (mn<0 || OrderMagicNumber()==mn) {<---

то есть по 8 ифов на проход

идеальным вариантом была бы такая конструкция :

if(sy!=""){
   if(mn<0){
      if(typ<0){
         // тело цикла только с нужными условиями
      }else{
         // тело цикла только с нужными условиями
      }
   }else{
      if(typ<0){
         // тело цикла только с нужными условиями
      }else{
         // тело цикла только с нужными условиями
      }   
   }
}else{
   if(mn<0){
      if(typ<0){
         // тело цикла только с нужными условиями
      }else{
         // тело цикла только с нужными условиями
      }   
   }else{
      if(typ<0){
         // тело цикла только с нужными условиями
      }else{
         // тело цикла только с нужными условиями
      }   
   }
}

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

if(sy!=""){// если не выполняется это условие дальнейшая проверка на соответствие символа не проводится, и приступаем к нижестоящим фильтрам
   if(OrderSymbol()!=sy){
      continue;// пропускаем не нужный ордер (не заходим в нижестоящие проверки)
   }
}

 

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

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

int GetTicketLastClosePos_(string sy="", int op=-1, int mn=-1) {
  double   t=-1;
  int      i, k=OrdersHistoryTotal(),type;
   
  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        type=OrderType();
        if (type==OP_BUY || type==OP_SELL) {
          if (op<0 || type==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              t=OrderTicket();
              break;
            }
          }
        }
      }
    }
  }
  return(t);
}
Причина обращения: