Закрытие ордеров

 

Здравствуйте уважаемые господа трейдеры и программисты!

Столкнулся с таким явлением, как правильно закрывать ордера. Допустим, что в рынке 4 ордера бай, и 3 ордера селл. При достижении определенного профита, все ордера должны закрыться по одной цене! Так и должно быть. Но у меня закрывает так:

То есть на каждом тике. Что у меня не правильно в коде?

Вариант закрытия

if(Close[0]>=TpStop(OP_BUY))
   if(Profit()>0){
    CloseOrders(OP_BUY,MAGIC,clrGray);
    CloseOrders(OP_SELL,MAGIC,clrGray);
  }

Сама функция закрытия

//------------------------Функция закрытия ордеров-------------------+  
bool CloseOrders(int Op,int magic, color Clcol){
 double price;
   string op;
  if(Op==OP_BUY){
   RefreshRates();
   price=NormalizeDouble(Bid,Digits);
   op="BUY";
  }
  if(Op==OP_SELL){
   RefreshRates();
   price=NormalizeDouble(Ask,Digits);
   op="SELL";
   }
 for(int i=0; i<=OrdersTotal(); i++){ 
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
   if(OrderType()==Op)
    if(OrderMagicNumber()==magic){
     RefreshRates();
     if(OrderClose(OrderTicket(),OrderLots(),price,Slip,Clcol)){
      Print("Ордер №",OrderTicket()," : ",op," : "," закрыт по цене = ",price); 
      return(true);
     }
      Print("Ордер №",OrderTicket()," : ",op," : "," не закрыт! Ошибка: ",GetLastError());
    }
   } 
  }
  return(false);
}
 
Vadim Kazakevich:

Здравствуйте уважаемые господа трейдеры и программисты!

Столкнулся с таким явлением, как правильно закрывать ордера. Допустим, что в рынке 4 ордера бай, и 3 ордера селл. При достижении определенного профита, все ордера должны закрыться по одной цене! Так и должно быть. Но у меня закрывает так:

То есть на каждом тике. Что у меня не правильно в коде?

Для циклического закрытия нужно развернуть цикл. Иначе после закрытия одного ордера происходит пропуск следующего.

for (int i = OrdersTotal() - 1; i >= 0; --i)
 
Ihor Herasko:

Для циклического закрытия нужно развернуть цикл. Иначе после закрытия одного ордера происходит пропуск следующего.

Ничего не выходит. Даже не все ордера закрывает!


 
Vadim Kazakevich:

Ничего не выходит. Даже не все ордера закрывает!

Покажите, как пытаетесь.

 
Ihor Herasko:

Покажите, как пытаетесь.

С закрытием всех ордеров разобрался. А так закрывает на каждом тике.

У меня два варианта закрытия. Про профиту Buy и по профиту Sell. Профит это линии, при достижении которых должны закрыться все ордера.

Примеры кода:

 if(TpStop(OP_BUY)>0)//профит buy
  if(Profit()>0){
  if(Bid>=TpStop(OP_BUY))CloseOrders(OP_BUY,MAGIC,clrGray); 
  if(Ask>=TpStop(OP_BUY))CloseOrders(OP_SELL,MAGIC,clrGray);
 }
  
 if(TpStop(OP_SELL)>0)//профит Sell
  if(Profit()>0){
   if(Bid<=TpStop(OP_SELL))CloseOrders(OP_BUY,MAGIC,clrGray);
   if(Ask<=TpStop(OP_SELL))CloseOrders(OP_SELL,MAGIC,clrGray);
  } 
//------------------------Функция закрытия ордеров-------------------+  
bool CloseOrders(int Op,int magic, color Clcol){
 double price;
   string op;
  if(Op==OP_BUY){
   RefreshRates();
   price=NormalizeDouble(Bid,Digits);
   op="BUY";
  }
  if(Op==OP_SELL){
   RefreshRates();
   price=NormalizeDouble(Ask,Digits);
   op="SELL";
   }
 for(int i=OrdersTotal()-1; i>=0;--i){ 
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
   if(OrderType()==Op)
    if(OrderMagicNumber()==magic){
     RefreshRates();
     if(OrderClose(OrderTicket(),OrderLots(),price,Slip,Clcol)){
      Print("Ордер №",OrderTicket()," : ",op," : "," закрыт по цене = ",price); 
      return(true);
     }
      Print("Ордер №",OrderTicket()," : ",op," : "," не закрыт! Ошибка: ",GetLastError());
    }
   } 
  }
  return(false);
}


Закрытие всех ордеров происходит по одному на каждом тике.

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

Вернее так должно быть!

 

Открывайте локирующий ордер и далее закрывайте всё через CloseBy

 
Vadim Kazakevich:

Закрытие всех ордеров происходит по одному на каждом тике.

Тогда уберите return после успешного закрытия ордера. В этом случае не будете ждать следующего тика.

 
Ihor Herasko:

Тогда уберите return после успешного закрытия ордера. В этом случае не будете ждать следующего тика.

Вот это реально помогло! Спасибо!
Причина обращения: