Lógica de aprendizagem - página 12

 

Victor, eu acho que o interruptor é melhor aqui - é mais rápido e mais visual.

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);
}


Oh, a propósito -- otimização razoável do trabalho no testador -- tenho usado isso ultimamente.

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);
}

A propósito, a função é chamada FindLastOpenTime e retorna um bilhete.

Seria melhor assim?

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

Victor, eu acho que o interruptor é melhor aqui - é mais rápido e mais claro.


É realmente mais claro.
 

TheXpert:

A propósito, a função é chamada FindLastOpenTime, ...

A idéia é que
if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
pode começar a trabalhar logo em -1, não sei bem por que precisa de um externo se...senão... Retornar, imho, é realmente melhor lOrderOpenTime, então o retorno -1 permitirá apanhar o erro.
 
Sim, eu não fiz isso.
 

é lógico usar este tipo de coisa?

int Z[];

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

  Z++;
....

return(Z);
}
start()
{
   .......
   Z[f]=3;
   ......
}
 
Não. O z (pequeno) lógico dentro. Em geral, é melhor não mexer com essas coisas.
 

sempre matou a lógica de tal construção em operandos cíclicos :

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

ver ajuda :

A declaração contínua transfere o controle para o início da declaração externa mais próxima enquanto ou para declaração, causando o início da próxima iteração. Este operador é o oposto de uma pausa.

Não está nada claro, e se uma ordem não passar as condições, então o quê? Sair do laço? se continuar operando é diretamente o oposto de quebrar a operadora ...

Para mim, a lógica padrão é mais clara e mais compreensível:

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:

Punção nº 2. A lógica (lógica) e a brevidade têm pouca correlação.

Um excelente exemplo logo fora da MQL, que, a propósito, muitas pessoas não são reticentes ao uso.

Isto não é lógica - é um assassinato da lógica. Além disso, é um terreno potencialmente fértil para erros implícitos.


Não tem certeza de onde está o furo? E por que o segundo? Se é o segundo, onde está o primeiro?
 
Integer:
Para aqueles que não têm um escritório ou um zíper.

Dima acrescentar algo para aqueles que não têm metaeditor.exe :-)

 
Vinin:


Victor, parabéns novamente!