Quale disegno è corretto? - pagina 6

 
valenok2003:
Nel codice while , solo per ritardare mentre il thread è occupato.

Poi è necessario aggiornare i tassi: RefreshRates(). Altrimenti userete i vecchi valori di asc e bid. Oppure chiedere asc\bid di MarketInfo.
 
VladislavVG:

Poi è necessario aggiornare i tassi: RefreshRates(). Altrimenti userete i vecchi valori di Ask e Bid. Oppure chiedete su MarketInfo.

Quindi è qui che il cane è al lavoro.

Questo progetto ha funzionato:

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

Almeno ha funzionato bene la prima volta.

Grazie!

 
VladislavVG:

Poi è necessario aggiornare i tassi: RefreshRates(). Altrimenti userete i vecchi valori di asc e bid. Oppure chiedete di asc\bid su MarketInfo.

Grazie!

Lo sistemerò anche nel mio EA.

 
valenok2003:



Ecco dove si trova il cane.

Questo è il tipo di design che funziona.

Almeno ha funzionato bene la prima volta.


Quasi - un'altra condizione deve essere corretta:


  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    if(!OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) break;
    ...........................
Se l'ordine non è uscito, non c'è niente da fare.

Buona fortuna.

 
VladislavVG:


Quasi - un'altra condizione deve essere corretta:

Se il mandato non esce, non c'è niente da fare.

Sì, questo ha senso. Questa è una svista del ciclo
while(OrdersTotal()>0)
 
valenok2003:
cinque
Lì avete avuto slippage = 5, e questo non è sufficiente per le quotazioni a cinque cifre.
 

Quindi, in sintesi:


//+------------------------------------------------------------------+
//|                                           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 ci saranno altri commenti?

 
khorosh:
Lì avete avuto slippage = 5, e questo non è sufficiente per le quotazioni a cinque cifre.
In un mercato relativamente calmo, 5 è sufficiente IMHO.
 
Un tempo, il codebase pubblicava il proprio set per chiudere diversi tipi.
File:
 
https://www.mql5.com/ru/code/mt4