Какая конструкция правильная? - страница 6

 
valenok2003:
В коде while только для задержки, пока поток занят.

    Потом нужно обновить рейты: RefreshRates(). Иначе будете использовать старые значения аск и бид. Или запросить аск\бид по МаркетИнфо.
 
VladislavVG:

  Потом нужно обновить рейты: RefreshRates(). Иначе будете использовать старые значения аск и бид. Или запросить по МаркетИнфо. 

Так вот где собака порылась.

Эта конструкция заработала:

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

во всяком случае с первого раза правильно сработала.

Благодарю! 

 
VladislavVG:

Потом нужно обновить рейты: RefreshRates(). Иначе будете использовать старые значения аск и бид. Или запросить аск\бид по МаркетИнфо.

Спасибо!

Тоже исправлю в советнике своем..

 
valenok2003:



Так вот где собака порылась.

Вот такая конструкция заработала.

во всяком случае с первого раза правильно сработала.

 


Почти - нужно  поправить еще одно условие :


  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    if(!OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) break;
    ...........................
Если ордер не выбрался - делать нечего.

 Удачи.

 
VladislavVG:


Почти - нужно  поправить еще одно условие :

Если ордер не выбрался - делать нечего.

 

Да, логично. Это недосмотр перебравшийся из цикла   
while(OrdersTotal()>0)
 
valenok2003:
пять
Там у Вас слиппаж был = 5, а для пятиразрядных котировок этого недостаточно.
 

Итак в итоге:


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

 или будут ещё какие-то замечания?

 
khorosh:
Там у Вас слиппаж был = 5, а для пятиразрядных котировок этого недостаточно.
При относительно спокойном рынке 5 вполне достаточно ИМХО.
 
В свое время в кодебазе публиковал свой набор на закрытие разных типов.
Файлы:
 
https://www.mql5.com/ru/code/mt4
Причина обращения: