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

 
valenok2003:
En el código while , sólo para retrasar mientras el hilo está ocupado.

A continuación, es necesario actualizar las tasas: RefreshRates(). De lo contrario, utilizará los valores antiguos de asc y bid. O bien, pida que le asciendan por MarketInfo.
 
VladislavVG:

A continuación, es necesario actualizar las tasas: RefreshRates(). De lo contrario, utilizará los valores antiguos de Ask y Bid. O pregunta en MarketInfo.

Así que ahí es donde el perro está en el trabajo.

Este diseño funcionó:

//+------------------------------------------------------------------+
//|                                           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);
      RefreshRates();
      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);
}
//+------------------------------------------------------------------+

Al menos funcionó bien la primera vez.

Gracias.

 
VladislavVG:

A continuación, es necesario actualizar las tasas: RefreshRates(). De lo contrario, utilizará los valores antiguos de asc y bid. O pregunte por asc\bid en MarketInfo.

Gracias.

Yo también lo arreglaré en mi EA.

 
valenok2003:



Así que ahí está el perro.

Este es el diseño que lo hace funcionar.

Al menos funcionó bien la primera vez.


Casi - una condición más necesita ser corregida :


  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    if(!OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) break;
    ...........................
Si la orden no salió, no hay nada que hacer.

Buena suerte con eso.

 
VladislavVG:


Casi - una condición más necesita ser corregida :

Si la orden no sale, no hay nada que hacer.

Sí, eso tiene sentido. Esto es un descuido del bucle
while(OrdersTotal()>0)
 
valenok2003:
cinco
Ahí tenías deslizamiento = 5, y eso no es suficiente para las cotizaciones de cinco dígitos.
 

Así que en resumen:


//+------------------------------------------------------------------+
//|                                           CloseThisSymbolAll.mq4 |
//+------------------------------------------------------------------+
int start()
{
//----
  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    if(!OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) break;
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      RefreshRates();
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slippage, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slippage, CLR_NONE);
    }
  }
//----
   return(0);
}
//+------------------------------------------------------------------+

o ¿habrá algún otro comentario?

 
khorosh:
Ahí tenías deslizamiento = 5, y eso no es suficiente para las cotizaciones de cinco dígitos.
En un mercado relativamente tranquilo, 5 es suficiente, según mi opinión.
 
En un momento dado, el código base publicó su propio conjunto para cerrar diferentes tipos.
Archivos adjuntos:
 
https://www.mql5.com/ru/code/mt4