¿Qué diseño es el correcto? - página 4

 
Martingeil:
Hazlo así.

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

Es esta línea la que es confusa. No creo que sea necesario aquí en absoluto. ¿O me equivoco?

 
valenok2003:

Es esta línea la que es confusa. No creo que sea necesario aquí en absoluto. ¿O me equivoco?

Es para cortar el símbolo mágico

Al buscar, primero busca órdenes simplemente por el símbolo sin magik, si no hay tales órdenes la función deja de trabajar........., si encuentra órdenes con tal símbolo, entonces busca entre ellas para encontrar magik, y cierra las que coinciden con el magik, si el flujo de negociación está libre.

 
valenok2003:

Es esta línea la que es confusa. No creo que sea necesario aquí en absoluto. ¿O me equivoco?

Si estamos hablando de borrar todas las órdenes, entonces esta línea es innecesaria, en cuanto a la normalización, ¿qué te hace pensar que los scripts incorporados son tales que deben ser tomados como ejemplo?
 
Martingeil:

Necesario para cortar la majadería de ese personaje en particular

Al buscar, primero busca las órdenes simplemente por el símbolo sin mayúscula, si no las hay, detiene la función, si hay órdenes con dicho símbolo, las recorre, y encuentra las que coinciden con la mayúscula, y las cierra si el flujo comercial está libre.

Y cómo sabemos de antemano MagicNumber, porque lo obtenemos usando OrderMagicNumber(). Y además de la línea
OrderSymbol() == Symbol()

está duplicado.

También esta línea

Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);

Si no hay tal majik, la función deja de funcionar y los busca si hay tal majik.

 
Techno:
Si estamos hablando de borrar todos los pedidos, entonces esta línea es innecesaria, en cuanto a la normalización, ¿qué te hace pensar que los scripts incorporados son tales que deben tomarse como ejemplo?


bueno, marx, después de todo.
 
Martingeil:

Necesario para cortar la magia de este símbolo en particular

al buscar una orden, primero busca una orden sin número mágico; si no hay tales órdenes, la función dejará de funcionar......... si encuentra una orden con tal número, entonces pasa por todas ellas para encontrar un número mágico y cierra todas las que coinciden con un número mágico si el flujo comercial está libre.

Ya veo, sólo hablo de cerrar todos los pedidos, por eso no lo entendí al principio

Me he tomado la libertad de reordenar tu ejemplo así:

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      if (OrderMagicNumber() == MagicNumber)
      {
        while (!IsTradeAllowed()) Sleep(1000);
        if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
        if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
      }
    }
  }

pero para cerrar todos los pedidos

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
 
valenok2003:


Bueno, Marx, después de todo.
incluso Engels ) no es necesario el culto a la personalidad, escribe en base a tus conocimientos)
 
valenok2003:
Si te refieres a esto

entonces hay una variable extra aquí para la transparencia del código.

¿O quizás te refieres a otra cosa?

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total; i >=1; i--)                                                        
  {                                                                                          
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}

En este caso es esto.

El "estándar común" para C/C++ es :

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total-1; i >=0; i--)                                                        
  {                                                                                          
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}

La diferencia en el número de operaciones. Si no afecta mucho en este caso, la diferencia de estilos para el probador, por ejemplo, tendrá un efecto notable en el tiempo de optimización. Para el mundo real, afecta a la velocidad, que a veces es crítica.

Especialmente el frenado es un diseño de este tipo (no lo he visto en su sitio, pero por alguna razón la mayoría de la gente lo prefiere ? ) :

for (int i=0; i<OrdersTotal(); i++)

Aquí se llama a una función en cada pasada del bucle. Es la operación más "cara" en términos de costes informáticos.

Buena suerte.

Veo que han arreglado los códigos en ese sentido.

 

El resultado es este script

//+------------------------------------------------------------------+
//|                                           CloseThisSymbolAll.mq4 |
//+------------------------------------------------------------------+
int start()
{
//----
  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
//----
   return(0);
}
//+------------------------------------------------------------------+
Pregunta - ¿Por qué no se cierran siempre todos los pedidos? Por ejemplo, si abro tres órdenes de venta seguidas e intento cerrarlas con el script, puede cerrar una, dos o todas. ¿Cuál es la razón?
 

Tío, qué manera de elegir la equivocada de entre todas las opciones. Se supone que no debes codificar, chico.

No se está cerrando por las re-citas.