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

 
Techno:
PapaYozh, estas dos opciones son sólo para el cierre, pero ¿qué pasa con la modificación? ¿Es mejor tener2 ticks para el procesamiento completo que 2 bucles diferentes para el cierre y la modificación?


Si hay que cerrar algo y modificar algo, entonces la construcción for (i=0; i<OrderTotals(); i++) es aún más incorrecta.

Tenemos que pasar de OrdersTotal()-1 a 0.

for ( i=OrderTotals()-1; i>=0; i-- )
{ 




 

es decir, ¿es este el diseño correcto?

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

Sin embargo, sigo sin entender la normalización.

Una cosa es que calcule el precio, entonces está claro que hay que llevarlo a los dígitos del terminal.

Pero en este caso, estamos cerrando al precio actual obtenido del flujo y, por supuesto, no puede ser mayor que Dígitos.

 
valenok2003:

Pero aquí también se cierra al precio actual derivado del flujo, que por supuesto no puede ser más largo que Dígitos.

Esto es para un probador con cotizaciones no normalizadas.
 
valenok2003:

Sin embargo, sigo sin entender la normalización.

Una cosa es que calcule el precio, entonces está claro que hay que llevarlo a los dígitos del terminal.

Pero en este caso, estamos cerrando al precio actual obtenido del flujo y, por supuesto, no puede ser mayor que Dígitos.

A veces con Dígitos=4 la oferta puede ser igual a 1,32343545654. No es frecuente, pero ocurre.
 
Techno:
A veces cuando Digits=4 Bid puede ser 1.32343545654 esto sucede. No es frecuente, pero ocurre.


Vive y aprende. Gracias.
 
valenok2003:

es decir, ¿es este el diseño correcto?


En realidad no: no hay ninguna comprobación del "símbolo" del instrumento. Si las órdenes estarán abiertas para más de un instrumento, entonces se corre el riesgo de cerrar las órdenes de un instrumento por los precios del otro. Si necesita cerrar la orden del símbolo, en cuyo gráfico se ha movido el Asesor Experto, entonces tiene que usar el "símbolo" del gráfico. Si necesita cerrar todas las órdenes, sin importar a qué gráfico se ha movido el EA, tiene que leer el "símbolo" de la orden y pedir que se usen las Ofertas y Demandas del "símbolo" correspondiente. Y hay acciones innecesarias en el código.

Buena suerte.

 
valenok2003:

es decir, ¿es este el diseño correcto?

void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         while (!IsTradeAllowed()) Sleep(1000);
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, Red);
            Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);            
         }
      }
   }
}
Hazlo así.
 
VladislavVG:


Sí y hay acciones adicionales en el código.

Si te refieres a esto
int Total = OrdersTotal();

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

¿O tal vez se refiere a otra cosa?

 
Techno:
A veces en Digits=4 Bid puede ser igual a 1.32343545654. No es frecuente, pero ocurre.

Sin embargo, en el ejemplo del script close .mq4(en la entrega estándar de MT4), no hay normalización.

   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      cmd=OrderType();
      //---- first order is buy or sell
      if(cmd==OP_BUY || cmd==OP_SELL)
        {
         while(true)
           {
            if(cmd==OP_BUY) price=Bid;
            else            price=Ask;
            result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
            if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
            else error=0;
            if(error==135) RefreshRates();
            else break;
           }
        }
     }