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

 
Martingeil:
Сделай вот так.

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

Вот с этой строкой непонятки. На мой взгляд она здесь  вообще не нужна. Или я не прав?

 
valenok2003:

Вот с этой строкой непонятки. На мой взгляд она здесь вообще не нужна. Или я не прав?

Нужна чтобы отсечь маджик именно этого символа

при поиске она ищет с начало ордера просто по символу без маджика, если нет таковых функция прекращает работу......... если находит ордера с таким символом, то далее перебирает среди них на поиск маджика, и закрывает те которые соответствуют маджику, если торговый поток свободен.

 
valenok2003:

Вот с этой строкой непонятки. На мой взгляд она здесь вообще не нужна. Или я не прав?

если речь о удалении всех ордеров, то эта строчка не нужна, насчет нормализации, с чего ты взял, что встроенные скрипты такие что с них надо брать пример?
 
Martingeil:

Нужна чтобы отсечь маджик именно этого символа

при поиске она ищет сперва ордера просто по символу без маджика, если нет таковых, прекращает работу функция, если есть ордера с таким символом перебирает их, и находит те которые соответствуют маджику, и закрывает их если торговый поток свободен.

А откуда нам заранее известно MagicNumber, ведь его мы получаем с помощью OrderMagicNumber(). И кроме того строка
OrderSymbol() == Symbol()

дублируется.

Так же эта строка

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

по-моему лишняя, информация о закрытии и так заносится в журнал.

 
Techno:
если речь о удалении всех ордеров, то эта строчка не нужна, насчет нормализации, с чего ты взял, что встроенные скрипты такие что с них надо брать пример?


ну, Маркс, все-таки.
 
Martingeil:

Нужна чтобы отсечь маджик именно этого символа

при поиске она ищет с начало ордера просто по символу без маджика, если нет таковых функция прекращает работу......... если находит ордера с таким символом, то далее перебирает среди них на поиск маджика, и закрывает те которые соответствуют маджику, если торговый поток свободен.

вот так понятно, просто я веду речь о закрытии всех ордеров, поэтому не въехал сразу

Я позволил себе твой пример вот так переделать:

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

а для закрытия всех ордеров

  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:


ну, Маркс, все-таки.
да хоть Энгельс ) не нужно культов личности, пишите в расчете на свои знания)
 
valenok2003:
Если вы имеете ввиду это

то здесь лишняя переменая для прозрачности кода.

Или может вы говорите о чем-то другом?

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

В данном случае об этом.

Для С\С++ "общепринятый стандарт" такой : 

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

Разница в количестве операций. Если в данном случае это не сильно сказывается, то, например, разница в стилях для тестера окажет существенное влияние на время оптимизации. Для реала - на скорость работы, иногда это критично.

Особенно тормозит такая конструкция (у Вас не видел, но почему-то ее большинство предпочитает ? ) :

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

Здесь на каждом проходе цикла вызывается функция. Самая "дорогая" с точки зрения вычислительных затрат операция.

 

Удачи. 

 ЗЫ Да я смотрю Вы коды в этом смысле поправили.

 

В итоге получился такой скрипт

//+------------------------------------------------------------------+
//|                                           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);
}
//+------------------------------------------------------------------+
Вопрос  - Почему он не всегда закрывает все ордера? Например я открываю три Sell подряд, потом пытаюсь закрыть скриптом, он может закрыть один или два или все. В чём причина?
 

Блин это ж надо -- из всех вариантов выбрать один из неправильных. Вам, батенька, противопоказано кодировать.

А не закрывает все из-за реквотов.

Причина обращения: