Lógica de aprendizaje - página 12

 

Víctor, creo que el cambio es mejor aquí, es más rápido y más 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);
}


Ah, por cierto... una optimización razonable del trabajo en el probador... lo he estado usando últimamente.

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

Por cierto, la función se llama FindLastOpenTime y devuelve un ticket.

¿Sería mejor así?

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

Víctor, creo que el cambio es mejor aquí, es más rápido y claro.


Es realmente más claro.
 

TheXpert:

Por cierto, la función se llama FindLastOpenTime, ...

La idea es que
if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
podría empezar a funcionar justo en -1, no estoy muy seguro de por qué necesita un if...else externo. Volver, en mi opinión, es realmente mejor lOrderOpenTime, a continuación, devolver -1 permitirá atrapar el error.
 
Sí, no lo hice.
 

¿es lógico utilizar este tipo de cosas?

int Z[];

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

  Z++;
....

return(Z);
}
start()
{
   .......
   Z[f]=3;
   ......
}
 
No. La lógica z (pequeña) en el interior. En general, es mejor no meterse con estas cosas.
 

siempre mató la lógica de tal construcción en 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 ayuda :

La sentencia continue transfiere el control al inicio de la sentencia externa while o for más cercana, provocando el inicio de la siguiente iteración. Este operador es el opuesto a la ruptura.

No está nada claro, y si una orden no pasa las condiciones ¿entonces qué? ¿Salir del bucle? si el operador continue es directamente opuesto al operador break...

Para mí, la lógica estándar es más clara y comprensible :

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:

Pinchazo #2. La lógica (lógica) y la brevedad tienen poca correlación.

Un ejemplo claro de MQL, que, por cierto, mucha gente no tiene reparos en utilizar.

Esto no es lógica... es un asesinato de la lógica. Además, es un caldo de cultivo potencial para los errores implícitos.


¿No estás seguro de dónde está el pinchazo? ¿Y por qué el segundo? Si es la segunda, ¿dónde está la primera?
 
Integer:
Para los que no tienen oficina o cremallera.

Dima añade algo para los que no tienen metaeditor.exe :-)

 
Vinin:


Victor, ¡felicidades de nuevo!