Учимся логике - страница 12

 

Виктор, имхо здесь лучше switch -- и быстрее и нагляднее.

bool IsOrderType(int type)
{
   switch (type)
   {
      case OP_BUY:
      case OP_SELL:
      case OP_BUYLIMIT:
      case OP_SELLLIMIT:
      case OP_BUYSTOP:
      case OP_SELLSTOP:
         return (true);
   }
   return (false);
}


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

int FindLastOpenTime(int tip, int imagic) 
{
   int Res=-1;
   int lOrderOpenTime=-1;
   
   for (int i = OrdersTotal() - 1; i >= 0; i--) 
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))   continue;
      if (OrderSymbol() != Symbol())                     continue;
      if (OrderMagicNumber() != imagic)                  continue;
      if (!(tip==-1 || isOrderType(tip)))                continue;

      if (IsTesting()) return (OrderTicket());  // тут

      if (lOrderOpenTime==-1) { 
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      } else if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
   }
   return (Res);
}

Кстати, функция называется FindLastOpenTime, а возвращает тикет.

Может лучше так?

datetime FindLastOpenTime(int tip, int imagic, int& ticket) 
{
   //...
}
 
TheXpert:

Виктор, имхо здесь лучше switch -- и быстрее и нагляднее.


Он действительно нагляднее.
 

TheXpert:

Кстати, функция называется FindLastOpenTime, ...

По идее
if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
прямо с -1 может начать работать, внешний if...else не совсем понятно зачем здесь. Возвращать, имхо, действительно лучше lOrderOpenTime, тогда возврат -1 позволит засечь ошибку.
 
Да, не подсек.
 

логично ли использование подобного рода?

int Z[];

int Fn()
{
....
  int Z = 0;

  Z++;
....

return(Z);
}
start()
{
   .......
   Z[f]=3;
   ......
}
 
Нет. логично z (маленькое) внутри. А вообще с такими вещами лучше не шутить.
 

всегда убивала логикой такая конструкция в циклических операндах :

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != imagic) continue;
if (!(tip==-1 || isOrderType(tip))) continue;

смотрим справку :

Оператор continue передает управление в начало ближайшего внешнего оператора цикла while или for, вызывая начало следующей итерации. Этот оператор по действию противоположен оператору break.

совершенно не понятно, а если ордер не проходит по условиям тогда что ? выход из цикла ? если оп continue прямо противоположен оп break ...

как по мне то стандартная логика и виднее и понятнее :

int FindLastOpenTime(int type, int imagic){int time = 0;
  for(int i = OrdersTotal() -1 ;i>=0;i--){
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol()){
           if(OrderType()==type){
              if(OrderMagicNumber()==magic){
                 if(OrderOpenTime()>time){
                    time=OrderOpenTime();
                 }
              }
           }
        }
     }
  }
  return(time);
}  
 
TheXpert:

Прокол №2. Логика (логичность) и краткость слабо коррелируют.

Яркий пример прямо из MQL, которым, кстати, многие не брезгуют пользоваться.

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


Не понял где прокол? И почему второй? Если это второй, то где же первый?
 
Integer:
Еще для особо находчивых, у кого нет ни офиса ни зипа.

Дима добавь, что то для тех у кого нет metaeditor.exe :-)

 
Vinin:


Виктор, еще раз прими поздравления !