Чудный ордер - страница 3

 
Нету RefreshRates. А значит закрытие будет по неактуальным ценам. Я уже не говорю про "торговля запрещена" и т.п.
 
Mathemat:

Код можно заменить таким:

А где тут зависание в онлайне?

Если ордер не будет подлежать закрытию: например, не тот магик или инструмент - Вы все время выбираете ордер с постоянным номером == 0.

ЗЫ об эффективности говорить не буду: опять в условии цикла вызов функции.

 
VladislavVG:
Если ордер не будет подлежать закрытию: например, не тот магик или инструмент - Вы все время выбираете ордер с постоянным номером.
В исходном варианте такой проблемы нет.
 
Да, интересно. Но код действительно очень странный: переменную счетчика не принято изменять в теле цикла for().
 
Mathemat:
Да, интересно. Но код действительно очень странный: переменную счетчика не принято изменять в теле цикла for().
Это правильно, но так и не надо - Вы же приводили рабочий и методологически верный код: перебор в обратную сторону.
 
Не, это маразм -- обсуждать недостатки кривого кода, когда уже есть нормальный.
 

Здрасьте! Эта функция работает чётко. Не помню уже, где намыл:

void CloseOrder(int ticket,double numLots,double close_price, int slippage, color arrow_color)
{
  int CloseCnt, err;
  CloseCnt = 0;
  while(CloseCnt < 3)
  {
    if(OrderClose(ticket,numLots,close_price,slip*Point,White))
    {
      CloseCnt = 3;
    }
    else
    {
      err = GetLastError();
      Print(CloseCnt," #",ticket," Error closing order : (", err , ") " + ErrorDescription(err));
      Sleep(5000);
      RefreshRates();
      if(err > 0) CloseCnt++;
} } }

Проверьте, может и тут что-нибудь не так!

 
//+------------------------------------------------------------------+
//|  Удаляет рыночные и отложенные ордера.                           |
//|  Как отдельные по тикету, так и по фильтру в цикле поиска        |
//|  Фильтры по магику,типу,символу. Если вызвать с символом "All" - |
//|  То удалит все, подобно функции DeleteAll()                      |
//+------------------------------------------------------------------+
bool OrdClose(int magik  = -1,
              int type   = -1,//=10 удаление всех рыночных; =11 удаление всех отложенных 
              int ticket = -1,
           string symb   = "",
           double cLot   = -1      
              ){int   digit = MarketInfo(Symbol(),MODE_DIGITS);double lot;
//+------------------------------------------------------------------+
   if(cLot==0){return;}
   if(symb==""){symb=Symbol();}
   int slip = MarketInfo(symb,MODE_SPREAD);
   double ltstp = MarketInfo(Symbol(),MODE_LOTSTEP);
   if(ltstp == 0.1){int ltdg = 1;}
   if(ltstp == 0.01){   ltdg = 2;} 
   if(ticket>0){
      GetLastError();
      RefreshRates();
      if(OrderSelect(ticket,SELECT_BY_TICKET)){
         if(OrderCloseTime()!=0){return;}
         if(OrderType()<2){
                lot = OrderLots();
                if(cLot>0){
                        lot = NormalizeDouble(cLot,ltdg);
                        if(lot>OrderLots()){lot=OrderLots();}
                        if(lot<MarketInfo(Symbol(),MODE_MINLOT)){lot=MarketInfo(Symbol(),MODE_MINLOT);}
                }
            if(!OrderClose(OrderTicket(),
                                     lot,
       NormalizeDouble(OrderClosePrice(),MarketInfo(symb,MODE_DIGITS)),
                                    slip,
                          GetOrdCl(type)
                          )
            ){
               Fun_Error(GetLastError());
               return(false);              
            }else{
               GetInfo("Order "+GetNameOP(OrderType())+" closed");
               return(true);
            }                          
         }else{
            if(!OrderDelete(OrderTicket(),GetOrdCl(type))){
               Fun_Error(GetLastError());
               return(false);              
            }else{
               GetInfo("Order "+GetNameOP(OrderType())+" closed");
               return(true);
            }
         }
      }
   }else{
//+------------------------------------------------------------------+
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderCloseTime()!=0){continue;}
         if(symb!="All"){
            if(OrderSymbol()!=symb){continue;}
            if(type>=0&&type<6){if(OrderType()!=type){continue;}}
            if(type==10){if(OrderType()>1){continue;}}
            if(type==11){if(OrderType()<2){continue;}}
            if(magik>0){if(OrderMagicNumber()!=magik){continue;}}
         }
         if(OrderType()<2){
                lot = OrderLots();
                if(cLot>0){
                        lot = NormalizeDouble(cLot,ltdg);
                        if(lot>OrderLots()){lot=OrderLots();}
                        if(lot<MarketInfo(Symbol(),MODE_MINLOT)){lot=MarketInfo(Symbol(),MODE_MINLOT);}
                }
                Print("Close for opposite ",type,"  ",OrderType());
            if(!OrderClose(OrderTicket(),
                                     lot,
       NormalizeDouble(OrderClosePrice(),MarketInfo(symb,MODE_DIGITS)),
                                    slip,
                          GetOrdCl(type)
                          )
            ){
               Fun_Error(GetLastError());
               return(false);              
            }else{
               GetInfo("Order "+GetNameOP(OrderType())+" closed");
            }                          
         }else{
            if(!OrderDelete(OrderTicket(),GetOrdCl(type))){
               Fun_Error(GetLastError());
               return(false);              
            }else{
               GetInfo("Order "+GetNameOP(OrderType())+" closed");
            }
         }
      }
   }          
//-----+
}   
return(true);}
 
Пришел к выводу, что пытаться обработать ошибки все и вся - чаще всего совершенно не нужно.

Ну не вошли сразу, войдем на следующим тике, и уже по лучшей цене! Вот это условие как раз стОит организовать.

А проверка с зацикливанием на ордерсенд положение все равно не спасет. Войти когда не дают - все равно не сможет)

То же самое с закрытием.

 
Закрытие всех с нужным магиком : OrdClose(MagicNum);
Все рыночные и магик           : OrdClose(MagicNum,10);
Только отложенные и магик      : OrdClose(MagicNum,11);
Нужный тип ордеров и магик     : OrdClose(MagicNum,Typ);
Без фильтра по магику, но с фильтром по типу 
все Рыночные                   : OrdClose(-1,10);
все Отложенные                 : OrdClose(-1,11);)
только нужный тип              : OrdClose(-1,Typ);
Закрыть отдельный ордер с нужным тикетом
                               : OrdClose(-1,-1,Ticket);
То же что и первое но добавляем фильтр по символу
Закрытие всех с нужным магиком : OrdClose(MagicNum,-1,-1,"EURUSD");
Все рыночные и магик           : OrdClose(MagicNum,10,-1,"EURUSD");
Только отложенные и магик      : OrdClose(MagicNum,11,-1,"EURUSD");
Нужный тип ордеров и магик     : OrdClose(MagicNum,Typ,-1,"EURUSD");
Указываем какое количество лотов в ордере надо закрыть 
Закрытие всех с нужным магиком : OrdClose(MagicNum,-1,-1,"AUDUSD",Lots);
Все рыночные и магик           : OrdClose(MagicNum,10,-1,"GBPUSD",Lots);
Только отложенные и магик      : OrdClose(MagicNum,11,-1,"USDCHF",Lots);
Нужный тип ордеров и магик     : OrdClose(MagicNum,Typ,-1,"USDCAD",Lots);
Закрыть нах все ордера         : OrdClose(-1,-1,-1,"All");
Причина обращения: