Как закрыть открытий ордер.

 
Ребятки!!! подскажите как правильно, коректно, лаконично и главное коротко написать код закрытия открытой позиции, перед тем как открыть новую. Тоесть сделать перевёртыш. Вот советник Решетова..... Попробовал сделать, но чёто и ошибки не выдаёт и не закрывает почемуто. Помогите, буду очень признателен..... Спасибо!!!!
Файлы:
tdtrader.mq4  4 kb
 

Да чёто не очень то и помогло......

for (int i = 0; i < total; i++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      OrderClose(OrderTicket(),OrderLots(),Ask,5,Red); 
     
       
   }
Вот как я пробовал их закрыть, но ни ошибок, ни закрытия ордера не происходит....
 

почти на все случаи подходит

//Закрываем позиции
int CloseAllPosALL(int ticket)
{
for(int i=0;i<OrdersTotal();i++){
if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{if(OrderSymbol()==Symbol() && OrderMagicNumber()==magicnumer)
{ int TYPE=OrderType();
if(TYPE==OP_BUY && (ticket==0||ticket==OrderTicket())){OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow);i--;}
if(TYPE==OP_SELL && (ticket==0||ticket==OrderTicket())){OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow);i--;}
}}
}// end for
//=====
return(0);
}

 
//функция закрытия ордеров
void CloseAllOrders(int type)
{
   int total = OrdersTotal();
        for(int pos = 0;pos < total; pos++){
           if(OrderSelect(pos, SELECT_BY_POS) == true){
           if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true){
           if (OrderSymbol() == Symbol()){
                                int err = 0;
                                int count = 0;
                                while ((err != 1) && (count < 10))
                                 {
                         if (OrdersTotal() == 0) return(0);
                                   count++;
                                        RefreshRates();
                                        if (OrderType() == type)
                                        if(type == OP_BUY) err = OrderClose(OrderTicket(),OrderLots(),Ask,slip,Violet); //Close position
                                        else if(type == OP_SELL) err = OrderClose(OrderTicket(),OrderLots(),Bid,slip,Violet); //Close position
                              }//while
                           }//Symbol()
                   }//OrderSelect
           }//OrderSelect
   }//for
}//CloseAllOrders
 

Или вот так, в принципе и та и эта функции пока не подводили... обработки ошибок в случае не удачи нет, но можно добавить при желании, только смысл есть ли, если не дают значит кто то на том проводе не хочет что бы вы закрылись.)))

//функция закрытия ордеров================================================================================================
void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      if(!OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) break;
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         while (!IsTradeAllowed()) Sleep(1000);
            RefreshRates();
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,digits), slipCl, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,digits), slipCl, Red);           
         }
      }
   }
}
 

Ну кто же закрывает все позиции перебором в + надо же с OrdersTotal до 0 .

Сколько об этом уже говорили,что повторять смешно.

 
SJS:

почти на все случаи подходит

//Закрываем позиции
int CloseAllPosALL(int ticket)
{
for(int i=0;i<OrdersTotal();i++){
if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{if(OrderSymbol()==Symbol() && OrderMagicNumber()==magicnumer)
{ int TYPE=OrderType();
if(TYPE==OP_BUY && (ticket==0||ticket==OrderTicket())){OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow);i--;}
if(TYPE==OP_SELL && (ticket==0||ticket==OrderTicket())){OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow);i--;}
}}
}// end for
//=====
return(0);
}



Чето ошибка со скобками, никак не пойту.....
 

Попробуйте вот так . Гарантированно закрывает всё что есть.

#include <WinUser32.mqh>
int ret,ORD=0,ic;
//+------------------------------------------------------------------+
//| script "Close all positions"                                   |
//+------------------------------------------------------------------+
int start()
  {
  int MM=MessageBox(" Вы Уверены в удалении всех ордеров"+"\n        "+Symbol(), "Question", MB_YESNO|MB_ICONQUESTION);
  if (MM==IDNO)
  {MessageBox("    Отменено");return(0);} 
Comment("ЗАКРЫВАЕМ ВСЁ");  
 while (Ord_Tot_Sym()>0) 
 {
 RefreshRates();
                  for(ic=OrdersTotal()-1;ic>=0;ic--)
                   {
                  if(OrderSelect(ic,SELECT_BY_POS,MODE_TRADES)==false) continue;
                  if (OrderSymbol()==Symbol())
                  {
                  if (OrderType()==OP_BUY)
                  {
                  ret=OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);
                  if (IsTradeAllowed()) continue;
                  else Sleep(1000);
                  }
                                    
                  if (OrderType()==OP_SELL)
                  {
                  ret=OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);
                  if (IsTradeAllowed()) continue;
                  else Sleep(1000);
                  }}}
//--------- Закрыли все позиции теперь закроем все ордера ------------------------                  
                  for(ic=OrdersTotal()-1;ic>=0;ic--)
                   {
                  if(OrderSelect(ic,SELECT_BY_POS,MODE_TRADES)==false) continue;
                  if (OrderSymbol()==Symbol())
                  {                  
                  if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP ||
                     OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
                  ret=OrderDelete(OrderTicket());
                  }}
                  
      PlaySound("alert.wav" );
      }
   return(0);
  }
//+------------------------------------------------------------------+
//----------------  Функция -----------------------------------------
int Ord_Tot_Sym()
{
int O_T=0;
      for(int rr=0;rr<OrdersTotal();rr++) //  
      {
      if(OrderSelect(rr,SELECT_BY_POS,MODE_TRADES)==false)    continue;
      if(OrderSymbol()==Symbol())
      {
   O_T++;    
      }}
      if (O_T>0) return(1);
      else return(0);
}
 
zhuki:

Попробуйте вот так . Гарантированно закрывает всё что есть.

а че прям без проскальзывания закроет?)
 
Martingeil:
а че прям без проскальзывания закроет?)

Если ДЦ позволяет,то закроет.

Как в анекдоте "Вам шашечки или ехать" .

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