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

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


Если надо что-то закрыть, а что-то модифицировать, тогда тем более конструкция for (i=0; i<OrderTotals(); i++) неверна.

Надо двигаться от OrdersTotal()-1 к 0.

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




 

т.е. корректной будет такая конструкция?

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

Однако мне всё равно не понятно с нормализацией. 

Ведь одно дело, если я вычисляю цену, тогда понятно, что её нужно привести к разрядности терминала.

Но здесь же происходит закрытие  по текущей цене, полученной из потока, а она, естественно, не может быть длиннее чем Digits.

 
valenok2003:

Но здесь же происходит закрытие по текущей цене, полученной из потока, а она, естественно, не может быть длиннее чем Digits.

Это для тестера с ненормализованными котировками.
 
valenok2003:

Однако мне всё равно не понятно с нормализацией.

Ведь одно дело, если я вычисляю цену, тогда понятно, что её нужно привести к разрядности терминала.

Но здесь же происходит закрытие по текущей цене, полученной из потока, а она, естественно, не может быть длиннее чем Digits.

в том то и прикол, что может. иногда при Digits=4 Вid может быть равен 1.32343545654 случается такое. Не часто, но бывает
 
Techno:
в том то и прикол, что может. иногда при Digits=4 Вid может быть равен 1.32343545654 случается такое. Не часто, но бывает


Век живи, век учись. Спасибо.
 
valenok2003:

т.е. корректной будет такая конструкция?

 


    Не совсем: нет проверки на "символ" инструмента. Если ордера будут открыты по нескольким инструментам, то Вы рискуете ордера одного инструмента закрывать по ценам другого. Если надо закрыть ордера того инструмента, на график которого кинут эксперт, то нужно использовать "символ" графика, если нужно закрыть все ордера, не зависимо от того на какой чарт накинут эксперт, то считать "символ" ордера и запрашивать аски и биды соответствующего "символа". Да и в коде есть лишние действия.

Удачи. 

 
valenok2003:

т.е. корректной будет такая конструкция?

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);            
         }
      }
   }
}
Сделай вот так.
 
VladislavVG:


  Да и в коде есть лишние действия.

Если вы имеете ввиду это
int Total = OrdersTotal();

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

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

 
Techno:
в том то и прикол, что может. иногда при Digits=4 Вid может быть равен 1.32343545654 случается такое. Не часто, но бывает

Однако, в примере скрипта закрытия close.mq4, (в стандартной поставке МТ4),  нормализация отсутствует.

   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;
           }
        }
     }
Причина обращения: